diff --git a/apps/zhi-docs-vitepress/.gitignore b/apps/zhi-docs-vitepress/.gitignore index 10c14d2c..330a9065 100644 --- a/apps/zhi-docs-vitepress/.gitignore +++ b/apps/zhi-docs-vitepress/.gitignore @@ -1,2 +1,5 @@ +api node_modules -.vitepress/cache \ No newline at end of file +.temp +cache +docs/api diff --git a/apps/zhi-docs-vitepress/.vitepress/config.ts b/apps/zhi-docs-vitepress/.vitepress/config.ts deleted file mode 100644 index 20209886..00000000 --- a/apps/zhi-docs-vitepress/.vitepress/config.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { defineConfig } from 'vitepress' - -// https://vitepress.dev/reference/site-config -export default defineConfig({ - title: "Docs for Zhi Framework", - description: "The ultimate framework for building blog and theme", - themeConfig: { - // https://vitepress.dev/reference/default-theme-config - nav: [ - { text: 'Home', link: '/' }, - { text: 'Examples', link: '/markdown-examples' } - ], - - sidebar: [ - { - text: 'Examples', - items: [ - { text: 'Markdown Examples', link: '/markdown-examples' }, - { text: 'Runtime API Examples', link: '/api-examples' } - ] - } - ], - - socialLinks: [ - { icon: 'github', link: 'https://github.com/vuejs/vitepress' } - ] - } -}) diff --git a/apps/zhi-docs-vitepress/docs/.vitepress/config.ts b/apps/zhi-docs-vitepress/docs/.vitepress/config.ts new file mode 100644 index 00000000..974a0f28 --- /dev/null +++ b/apps/zhi-docs-vitepress/docs/.vitepress/config.ts @@ -0,0 +1,33 @@ +import { defineConfig } from "vitepress" +import typedocSidebar from "../api/typedoc-sidebar.json" + +// https://vitepress.dev/reference/site-config +export default defineConfig({ + title: "Zhi Framework", + description: "The ultimate framework for building blog and theme", + themeConfig: { + // https://vitepress.dev/reference/default-theme-config + nav: [ + { text: "Home", link: "/" }, + { text: "Examples", link: "/markdown-examples" }, + { text: "Blog", link: "/blog/" }, + { text: "API", link: "/api/" }, + ], + + sidebar: [ + { + text: "Examples", + items: [ + { text: "Markdown Examples", link: "/markdown-examples" }, + { text: "Runtime API Examples", link: "/api-examples" }, + ], + }, + { + text: "API", + items: typedocSidebar as any[], + }, + ], + + socialLinks: [{ icon: "github", link: "https://github.com/terwer/zhi" }], + }, +}) diff --git a/apps/zhi-docs-vitepress/.vitepress/theme/index.ts b/apps/zhi-docs-vitepress/docs/.vitepress/theme/index.ts similarity index 75% rename from apps/zhi-docs-vitepress/.vitepress/theme/index.ts rename to apps/zhi-docs-vitepress/docs/.vitepress/theme/index.ts index 07970be5..bdf810ac 100644 --- a/apps/zhi-docs-vitepress/.vitepress/theme/index.ts +++ b/apps/zhi-docs-vitepress/docs/.vitepress/theme/index.ts @@ -1,7 +1,7 @@ // https://vitepress.dev/guide/custom-theme -import { h } from 'vue' -import Theme from 'vitepress/theme' -import './style.css' +import { h } from "vue" +import Theme from "vitepress/theme" +import "./style.css" export default { ...Theme, @@ -12,5 +12,5 @@ export default { }, enhanceApp({ app, router, siteData }) { // ... - } + }, } diff --git a/apps/zhi-docs-vitepress/.vitepress/theme/style.css b/apps/zhi-docs-vitepress/docs/.vitepress/theme/style.css similarity index 100% rename from apps/zhi-docs-vitepress/.vitepress/theme/style.css rename to apps/zhi-docs-vitepress/docs/.vitepress/theme/style.css diff --git a/apps/zhi-docs-vitepress/api-examples.md b/apps/zhi-docs-vitepress/docs/api-examples.md similarity index 100% rename from apps/zhi-docs-vitepress/api-examples.md rename to apps/zhi-docs-vitepress/docs/api-examples.md diff --git a/apps/zhi-docs-vitepress/docs/api-nav.json b/apps/zhi-docs-vitepress/docs/api-nav.json new file mode 100644 index 00000000..e7fb9554 --- /dev/null +++ b/apps/zhi-docs-vitepress/docs/api-nav.json @@ -0,0 +1,56 @@ +[ + { + "title": "child-package", + "url": "child-package/index.md", + "children": [ + { + "title": "Index", + "url": "child-package/module.child-package.md" + }, + { + "title": "Namespaces", + "children": [ + { + "title": "Validation", + "url": "child-package/namespaces/namespace.Validation/namespace.Validation.md", + "children": [ + { + "title": "Variables", + "children": [ + { + "title": "numberRegexp", + "url": "child-package/namespaces/namespace.Validation/variables/variable.numberRegexp.md" + } + ] + } + ] + } + ] + }, + { + "title": "Variables", + "children": [ + { + "title": "hello", + "url": "child-package/variables/variable.hello.md" + } + ] + } + ] + }, + { + "title": "child-package-2", + "url": "child-package-2/module.child-package-2.md", + "children": [ + { + "title": "Variables", + "children": [ + { + "title": "hello", + "url": "child-package-2/variables/variable.hello.md" + } + ] + } + ] + } +] \ No newline at end of file diff --git a/apps/zhi-docs-vitepress/docs/blog/index.md b/apps/zhi-docs-vitepress/docs/blog/index.md new file mode 100644 index 00000000..8615e34c --- /dev/null +++ b/apps/zhi-docs-vitepress/docs/blog/index.md @@ -0,0 +1,3 @@ +# This is blog + +- [zhi 0.1.1 is on the way](./zhi-0-1-0-is-on-the-way.md) \ No newline at end of file diff --git a/apps/zhi-docs-vitepress/docs/blog/zhi-0-1-0-is-on-the-way.md b/apps/zhi-docs-vitepress/docs/blog/zhi-0-1-0-is-on-the-way.md new file mode 100644 index 00000000..03b25cf2 --- /dev/null +++ b/apps/zhi-docs-vitepress/docs/blog/zhi-0-1-0-is-on-the-way.md @@ -0,0 +1,12 @@ +--- +sidebar: true +--- + +# zhi 0.1.0 is on the way + +Zhi `0.1.0` is on the way, please wait ... + +## Modules + +- zhi-env +- zhi-log \ No newline at end of file diff --git a/apps/zhi-docs-vitepress/index.md b/apps/zhi-docs-vitepress/docs/index.md similarity index 80% rename from apps/zhi-docs-vitepress/index.md rename to apps/zhi-docs-vitepress/docs/index.md index f09a553c..4fc228c5 100644 --- a/apps/zhi-docs-vitepress/index.md +++ b/apps/zhi-docs-vitepress/docs/index.md @@ -3,9 +3,9 @@ layout: home hero: - name: "Docs for Zhi Framework" - text: "The ultimate framework for building blog and theme" - tagline: My great project tagline + name: "Zhi Framework" + text: "" + tagline: The ultimate framework for building blog and theme actions: - theme: brand text: Markdown Examples diff --git a/apps/zhi-docs-vitepress/markdown-examples.md b/apps/zhi-docs-vitepress/docs/markdown-examples.md similarity index 100% rename from apps/zhi-docs-vitepress/markdown-examples.md rename to apps/zhi-docs-vitepress/docs/markdown-examples.md diff --git a/apps/zhi-docs-vitepress/package-lock.json b/apps/zhi-docs-vitepress/package-lock.json new file mode 100644 index 00000000..4c01c6ea --- /dev/null +++ b/apps/zhi-docs-vitepress/package-lock.json @@ -0,0 +1,1890 @@ +{ + "name": "vitepress", + "version": "1.0.0", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "vitepress", + "version": "1.0.0", + "license": "ISC", + "devDependencies": { + "vitepress": "^1.0.0-alpha.75" + } + }, + "node_modules/@algolia/autocomplete-core": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.8.2.tgz", + "integrity": "sha512-mTeshsyFhAqw/ebqNsQpMtbnjr+qVOSKXArEj4K0d7sqc8It1XD0gkASwecm9mF/jlOQ4Z9RNg1HbdA8JPdRwQ==", + "dev": true, + "dependencies": { + "@algolia/autocomplete-shared": "1.8.2" + } + }, + "node_modules/@algolia/autocomplete-preset-algolia": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.8.2.tgz", + "integrity": "sha512-J0oTx4me6ZM9kIKPuL3lyU3aB8DEvpVvR6xWmHVROx5rOYJGQcZsdG4ozxwcOyiiu3qxMkIbzntnV1S1VWD8yA==", + "dev": true, + "dependencies": { + "@algolia/autocomplete-shared": "1.8.2" + }, + "peerDependencies": { + "@algolia/client-search": ">= 4.9.1 < 6", + "algoliasearch": ">= 4.9.1 < 6" + } + }, + "node_modules/@algolia/autocomplete-shared": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.8.2.tgz", + "integrity": "sha512-b6Z/X4MczChMcfhk6kfRmBzPgjoPzuS9KGR4AFsiLulLNRAAqhP+xZTKtMnZGhLuc61I20d5WqlId02AZvcO6g==", + "dev": true + }, + "node_modules/@algolia/cache-browser-local-storage": { + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.17.0.tgz", + "integrity": "sha512-myRSRZDIMYB8uCkO+lb40YKiYHi0fjpWRtJpR/dgkaiBlSD0plRyB6lLOh1XIfmMcSeBOqDE7y9m8xZMrXYfyQ==", + "dev": true, + "dependencies": { + "@algolia/cache-common": "4.17.0" + } + }, + "node_modules/@algolia/cache-common": { + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.17.0.tgz", + "integrity": "sha512-g8mXzkrcUBIPZaulAuqE7xyHhLAYAcF2xSch7d9dABheybaU3U91LjBX6eJTEB7XVhEsgK4Smi27vWtAJRhIKQ==", + "dev": true + }, + "node_modules/@algolia/cache-in-memory": { + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.17.0.tgz", + "integrity": "sha512-PT32ciC/xI8z919d0oknWVu3kMfTlhQn3MKxDln3pkn+yA7F7xrxSALysxquv+MhFfNAcrtQ/oVvQVBAQSHtdw==", + "dev": true, + "dependencies": { + "@algolia/cache-common": "4.17.0" + } + }, + "node_modules/@algolia/client-account": { + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.17.0.tgz", + "integrity": "sha512-sSEHx9GA6m7wrlsSMNBGfyzlIfDT2fkz2u7jqfCCd6JEEwmxt8emGmxAU/0qBfbhRSuGvzojoLJlr83BSZAKjA==", + "dev": true, + "dependencies": { + "@algolia/client-common": "4.17.0", + "@algolia/client-search": "4.17.0", + "@algolia/transporter": "4.17.0" + } + }, + "node_modules/@algolia/client-analytics": { + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.17.0.tgz", + "integrity": "sha512-84ooP8QA3mQ958hQ9wozk7hFUbAO+81CX1CjAuerxBqjKIInh1fOhXKTaku05O/GHBvcfExpPLIQuSuLYziBXQ==", + "dev": true, + "dependencies": { + "@algolia/client-common": "4.17.0", + "@algolia/client-search": "4.17.0", + "@algolia/requester-common": "4.17.0", + "@algolia/transporter": "4.17.0" + } + }, + "node_modules/@algolia/client-common": { + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.17.0.tgz", + "integrity": "sha512-jHMks0ZFicf8nRDn6ma8DNNsdwGgP/NKiAAL9z6rS7CymJ7L0+QqTJl3rYxRW7TmBhsUH40wqzmrG6aMIN/DrQ==", + "dev": true, + "dependencies": { + "@algolia/requester-common": "4.17.0", + "@algolia/transporter": "4.17.0" + } + }, + "node_modules/@algolia/client-personalization": { + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-4.17.0.tgz", + "integrity": "sha512-RMzN4dZLIta1YuwT7QC9o+OeGz2cU6eTOlGNE/6RcUBLOU3l9tkCOdln5dPE2jp8GZXPl2yk54b2nSs1+pAjqw==", + "dev": true, + "dependencies": { + "@algolia/client-common": "4.17.0", + "@algolia/requester-common": "4.17.0", + "@algolia/transporter": "4.17.0" + } + }, + "node_modules/@algolia/client-search": { + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.17.0.tgz", + "integrity": "sha512-x4P2wKrrRIXszT8gb7eWsMHNNHAJs0wE7/uqbufm4tZenAp+hwU/hq5KVsY50v+PfwM0LcDwwn/1DroujsTFoA==", + "dev": true, + "dependencies": { + "@algolia/client-common": "4.17.0", + "@algolia/requester-common": "4.17.0", + "@algolia/transporter": "4.17.0" + } + }, + "node_modules/@algolia/logger-common": { + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.17.0.tgz", + "integrity": "sha512-DGuoZqpTmIKJFDeyAJ7M8E/LOenIjWiOsg1XJ1OqAU/eofp49JfqXxbfgctlVZVmDABIyOz8LqEoJ6ZP4DTyvw==", + "dev": true + }, + "node_modules/@algolia/logger-console": { + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.17.0.tgz", + "integrity": "sha512-zMPvugQV/gbXUvWBCzihw6m7oxIKp48w37QBIUu/XqQQfxhjoOE9xyfJr1KldUt5FrYOKZJVsJaEjTsu+bIgQg==", + "dev": true, + "dependencies": { + "@algolia/logger-common": "4.17.0" + } + }, + "node_modules/@algolia/requester-browser-xhr": { + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.17.0.tgz", + "integrity": "sha512-aSOX/smauyTkP21Pf52pJ1O2LmNFJ5iHRIzEeTh0mwBeADO4GdG94cAWDILFA9rNblq/nK3EDh3+UyHHjplZ1A==", + "dev": true, + "dependencies": { + "@algolia/requester-common": "4.17.0" + } + }, + "node_modules/@algolia/requester-common": { + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.17.0.tgz", + "integrity": "sha512-XJjmWFEUlHu0ijvcHBoixuXfEoiRUdyzQM6YwTuB8usJNIgShua8ouFlRWF8iCeag0vZZiUm4S2WCVBPkdxFgg==", + "dev": true + }, + "node_modules/@algolia/requester-node-http": { + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.17.0.tgz", + "integrity": "sha512-bpb/wDA1aC6WxxM8v7TsFspB7yBN3nqCGs2H1OADolQR/hiAIjAxusbuMxVbRFOdaUvAIqioIIkWvZdpYNIn8w==", + "dev": true, + "dependencies": { + "@algolia/requester-common": "4.17.0" + } + }, + "node_modules/@algolia/transporter": { + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.17.0.tgz", + "integrity": "sha512-6xL6H6fe+Fi0AEP3ziSgC+G04RK37iRb4uUUqVAH9WPYFI8g+LYFq6iv5HS8Cbuc5TTut+Bwj6G+dh/asdb9uA==", + "dev": true, + "dependencies": { + "@algolia/cache-common": "4.17.0", + "@algolia/logger-common": "4.17.0", + "@algolia/requester-common": "4.17.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.21.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.8.tgz", + "integrity": "sha512-6zavDGdzG3gUqAdWvlLFfk+36RilI+Pwyuuh7HItyeScCWP3k6i8vKclAQ0bM/0y/Kz/xiwvxhMv9MgTJP5gmA==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@docsearch/css": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.3.4.tgz", + "integrity": "sha512-vDwCDoVXDgopw/hvr0zEADew2wWaGP8Qq0Bxhgii1Ewz2t4fQeyJwIRN/mWADeLFYPVkpz8TpEbxya/i6Tm0WA==", + "dev": true + }, + "node_modules/@docsearch/js": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@docsearch/js/-/js-3.3.4.tgz", + "integrity": "sha512-Xd2saBziXJ1UuVpcDz94zAFEFAM6ap993agh0za2e3LDZLhaW993b1f9gyUL4e1CZLsR076tztG2un2gVncvpA==", + "dev": true, + "dependencies": { + "@docsearch/react": "3.3.4", + "preact": "^10.0.0" + } + }, + "node_modules/@docsearch/react": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.3.4.tgz", + "integrity": "sha512-aeOf1WC5zMzBEi2SI6WWznOmIo9rnpN4p7a3zHXxowVciqlI4HsZGtOR9nFOufLeolv7HibwLlaM0oyUqJxasw==", + "dev": true, + "dependencies": { + "@algolia/autocomplete-core": "1.8.2", + "@algolia/autocomplete-preset-algolia": "1.8.2", + "@docsearch/css": "3.3.4", + "algoliasearch": "^4.0.0" + }, + "peerDependencies": { + "@types/react": ">= 16.8.0 < 19.0.0", + "react": ">= 16.8.0 < 19.0.0", + "react-dom": ">= 16.8.0 < 19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.17.18", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.18.tgz", + "integrity": "sha512-EmwL+vUBZJ7mhFCs5lA4ZimpUH3WMAoqvOIYhVQwdIgSpHC8ImHdsRyhHAVxpDYUSm0lWvd63z0XH1IlImS2Qw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.17.18", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.18.tgz", + "integrity": "sha512-/iq0aK0eeHgSC3z55ucMAHO05OIqmQehiGay8eP5l/5l+iEr4EIbh4/MI8xD9qRFjqzgkc0JkX0LculNC9mXBw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.17.18", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.18.tgz", + "integrity": "sha512-x+0efYNBF3NPW2Xc5bFOSFW7tTXdAcpfEg2nXmxegm4mJuVeS+i109m/7HMiOQ6M12aVGGFlqJX3RhNdYM2lWg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.17.18", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.18.tgz", + "integrity": "sha512-6tY+djEAdF48M1ONWnQb1C+6LiXrKjmqjzPNPWXhu/GzOHTHX2nh8Mo2ZAmBFg0kIodHhciEgUBtcYCAIjGbjQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.17.18", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.18.tgz", + "integrity": "sha512-Qq84ykvLvya3dO49wVC9FFCNUfSrQJLbxhoQk/TE1r6MjHo3sFF2tlJCwMjhkBVq3/ahUisj7+EpRSz0/+8+9A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.17.18", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.18.tgz", + "integrity": "sha512-fw/ZfxfAzuHfaQeMDhbzxp9mc+mHn1Y94VDHFHjGvt2Uxl10mT4CDavHm+/L9KG441t1QdABqkVYwakMUeyLRA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.17.18", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.18.tgz", + "integrity": "sha512-FQFbRtTaEi8ZBi/A6kxOC0V0E9B/97vPdYjY9NdawyLd4Qk5VD5g2pbWN2VR1c0xhzcJm74HWpObPszWC+qTew==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.17.18", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.18.tgz", + "integrity": "sha512-jW+UCM40LzHcouIaqv3e/oRs0JM76JfhHjCavPxMUti7VAPh8CaGSlS7cmyrdpzSk7A+8f0hiedHqr/LMnfijg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.17.18", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.18.tgz", + "integrity": "sha512-R7pZvQZFOY2sxUG8P6A21eq6q+eBv7JPQYIybHVf1XkQYC+lT7nDBdC7wWKTrbvMXKRaGudp/dzZCwL/863mZQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.17.18", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.18.tgz", + "integrity": "sha512-ygIMc3I7wxgXIxk6j3V00VlABIjq260i967Cp9BNAk5pOOpIXmd1RFQJQX9Io7KRsthDrQYrtcx7QCof4o3ZoQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.17.18", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.18.tgz", + "integrity": "sha512-bvPG+MyFs5ZlwYclCG1D744oHk1Pv7j8psF5TfYx7otCVmcJsEXgFEhQkbhNW8otDHL1a2KDINW20cfCgnzgMQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.17.18", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.18.tgz", + "integrity": "sha512-oVqckATOAGuiUOa6wr8TXaVPSa+6IwVJrGidmNZS1cZVx0HqkTMkqFGD2HIx9H1RvOwFeWYdaYbdY6B89KUMxA==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.17.18", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.18.tgz", + "integrity": "sha512-3dLlQO+b/LnQNxgH4l9rqa2/IwRJVN9u/bK63FhOPB4xqiRqlQAU0qDU3JJuf0BmaH0yytTBdoSBHrb2jqc5qQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.17.18", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.18.tgz", + "integrity": "sha512-/x7leOyDPjZV3TcsdfrSI107zItVnsX1q2nho7hbbQoKnmoeUWjs+08rKKt4AUXju7+3aRZSsKrJtaRmsdL1xA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.17.18", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.18.tgz", + "integrity": "sha512-cX0I8Q9xQkL/6F5zWdYmVf5JSQt+ZfZD2bJudZrWD+4mnUvoZ3TDDXtDX2mUaq6upMFv9FlfIh4Gfun0tbGzuw==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.17.18", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.18.tgz", + "integrity": "sha512-66RmRsPlYy4jFl0vG80GcNRdirx4nVWAzJmXkevgphP1qf4dsLQCpSKGM3DUQCojwU1hnepI63gNZdrr02wHUA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.17.18", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.18.tgz", + "integrity": "sha512-95IRY7mI2yrkLlTLb1gpDxdC5WLC5mZDi+kA9dmM5XAGxCME0F8i4bYH4jZreaJ6lIZ0B8hTrweqG1fUyW7jbg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.17.18", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.18.tgz", + "integrity": "sha512-WevVOgcng+8hSZ4Q3BKL3n1xTv5H6Nb53cBrtzzEjDbbnOmucEVcZeGCsCOi9bAOcDYEeBZbD2SJNBxlfP3qiA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.17.18", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.18.tgz", + "integrity": "sha512-Rzf4QfQagnwhQXVBS3BYUlxmEbcV7MY+BH5vfDZekU5eYpcffHSyjU8T0xucKVuOcdCsMo+Ur5wmgQJH2GfNrg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.17.18", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.18.tgz", + "integrity": "sha512-Kb3Ko/KKaWhjeAm2YoT/cNZaHaD1Yk/pa3FTsmqo9uFh1D1Rfco7BBLIPdDOozrObj2sahslFuAQGvWbgWldAg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.17.18", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.18.tgz", + "integrity": "sha512-0/xUMIdkVHwkvxfbd5+lfG7mHOf2FRrxNbPiKWg9C4fFrB8H0guClmaM3BFiRUYrznVoyxTIyC/Ou2B7QQSwmw==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.17.18", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.18.tgz", + "integrity": "sha512-qU25Ma1I3NqTSHJUOKi9sAH1/Mzuvlke0ioMJRthLXKm7JiSKVwFghlGbDLOO2sARECGhja4xYfRAZNPAkooYg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@types/web-bluetooth": { + "version": "0.0.17", + "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.17.tgz", + "integrity": "sha512-4p9vcSmxAayx72yn70joFoL44c9MO/0+iVEBIQXe3v2h2SiAsEIo/G5v6ObFWvNKRFjbrVadNf9LqEEZeQPzdA==", + "dev": true + }, + "node_modules/@vitejs/plugin-vue": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-4.2.1.tgz", + "integrity": "sha512-ZTZjzo7bmxTRTkb8GSTwkPOYDIP7pwuyV+RV53c9PYUouwcbkIZIvWvNWlX2b1dYZqtOv7D6iUAnJLVNGcLrSw==", + "dev": true, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.0.0", + "vue": "^3.2.25" + } + }, + "node_modules/@vue/compiler-core": { + "version": "3.2.47", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.47.tgz", + "integrity": "sha512-p4D7FDnQb7+YJmO2iPEv0SQNeNzcbHdGByJDsT4lynf63AFkOTFN07HsiRSvjGo0QrxR/o3d0hUyNCUnBU2Tig==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.16.4", + "@vue/shared": "3.2.47", + "estree-walker": "^2.0.2", + "source-map": "^0.6.1" + } + }, + "node_modules/@vue/compiler-dom": { + "version": "3.2.47", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.2.47.tgz", + "integrity": "sha512-dBBnEHEPoftUiS03a4ggEig74J2YBZ2UIeyfpcRM2tavgMWo4bsEfgCGsu+uJIL/vax9S+JztH8NmQerUo7shQ==", + "dev": true, + "dependencies": { + "@vue/compiler-core": "3.2.47", + "@vue/shared": "3.2.47" + } + }, + "node_modules/@vue/compiler-sfc": { + "version": "3.2.47", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.2.47.tgz", + "integrity": "sha512-rog05W+2IFfxjMcFw10tM9+f7i/+FFpZJJ5XHX72NP9eC2uRD+42M3pYcQqDXVYoj74kHMSEdQ/WmCjt8JFksQ==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.16.4", + "@vue/compiler-core": "3.2.47", + "@vue/compiler-dom": "3.2.47", + "@vue/compiler-ssr": "3.2.47", + "@vue/reactivity-transform": "3.2.47", + "@vue/shared": "3.2.47", + "estree-walker": "^2.0.2", + "magic-string": "^0.25.7", + "postcss": "^8.1.10", + "source-map": "^0.6.1" + } + }, + "node_modules/@vue/compiler-ssr": { + "version": "3.2.47", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.2.47.tgz", + "integrity": "sha512-wVXC+gszhulcMD8wpxMsqSOpvDZ6xKXSVWkf50Guf/S+28hTAXPDYRTbLQ3EDkOP5Xz/+SY37YiwDquKbJOgZw==", + "dev": true, + "dependencies": { + "@vue/compiler-dom": "3.2.47", + "@vue/shared": "3.2.47" + } + }, + "node_modules/@vue/devtools-api": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.5.0.tgz", + "integrity": "sha512-o9KfBeaBmCKl10usN4crU53fYtC1r7jJwdGKjPT24t348rHxgfpZ0xL3Xm/gLUYnc0oTp8LAmrxOeLyu6tbk2Q==", + "dev": true + }, + "node_modules/@vue/reactivity": { + "version": "3.2.47", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.2.47.tgz", + "integrity": "sha512-7khqQ/75oyyg+N/e+iwV6lpy1f5wq759NdlS1fpAhFXa8VeAIKGgk2E/C4VF59lx5b+Ezs5fpp/5WsRYXQiKxQ==", + "dev": true, + "dependencies": { + "@vue/shared": "3.2.47" + } + }, + "node_modules/@vue/reactivity-transform": { + "version": "3.2.47", + "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.2.47.tgz", + "integrity": "sha512-m8lGXw8rdnPVVIdIFhf0LeQ/ixyHkH5plYuS83yop5n7ggVJU+z5v0zecwEnX7fa7HNLBhh2qngJJkxpwEEmYA==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.16.4", + "@vue/compiler-core": "3.2.47", + "@vue/shared": "3.2.47", + "estree-walker": "^2.0.2", + "magic-string": "^0.25.7" + } + }, + "node_modules/@vue/runtime-core": { + "version": "3.2.47", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.2.47.tgz", + "integrity": "sha512-RZxbLQIRB/K0ev0K9FXhNbBzT32H9iRtYbaXb0ZIz2usLms/D55dJR2t6cIEUn6vyhS3ALNvNthI+Q95C+NOpA==", + "dev": true, + "dependencies": { + "@vue/reactivity": "3.2.47", + "@vue/shared": "3.2.47" + } + }, + "node_modules/@vue/runtime-dom": { + "version": "3.2.47", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.2.47.tgz", + "integrity": "sha512-ArXrFTjS6TsDei4qwNvgrdmHtD930KgSKGhS5M+j8QxXrDJYLqYw4RRcDy1bz1m1wMmb6j+zGLifdVHtkXA7gA==", + "dev": true, + "dependencies": { + "@vue/runtime-core": "3.2.47", + "@vue/shared": "3.2.47", + "csstype": "^2.6.8" + } + }, + "node_modules/@vue/server-renderer": { + "version": "3.2.47", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.2.47.tgz", + "integrity": "sha512-dN9gc1i8EvmP9RCzvneONXsKfBRgqFeFZLurmHOveL7oH6HiFXJw5OGu294n1nHc/HMgTy6LulU/tv5/A7f/LA==", + "dev": true, + "dependencies": { + "@vue/compiler-ssr": "3.2.47", + "@vue/shared": "3.2.47" + }, + "peerDependencies": { + "vue": "3.2.47" + } + }, + "node_modules/@vue/shared": { + "version": "3.2.47", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.47.tgz", + "integrity": "sha512-BHGyyGN3Q97EZx0taMQ+OLNuZcW3d37ZEVmEAyeoA9ERdGvm9Irc/0Fua8SNyOtV1w6BS4q25wbMzJujO9HIfQ==", + "dev": true + }, + "node_modules/@vueuse/core": { + "version": "10.1.2", + "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-10.1.2.tgz", + "integrity": "sha512-roNn8WuerI56A5uiTyF/TEYX0Y+VKlhZAF94unUfdhbDUI+NfwQMn4FUnUscIRUhv3344qvAghopU4bzLPNFlA==", + "dev": true, + "dependencies": { + "@types/web-bluetooth": "^0.0.17", + "@vueuse/metadata": "10.1.2", + "@vueuse/shared": "10.1.2", + "vue-demi": ">=0.14.0" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vueuse/core/node_modules/vue-demi": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.0.tgz", + "integrity": "sha512-gt58r2ogsNQeVoQ3EhoUAvUsH9xviydl0dWJj7dabBC/2L4uBId7ujtCwDRD0JhkGsV1i0CtfLAeyYKBht9oWg==", + "dev": true, + "hasInstallScript": true, + "bin": { + "vue-demi-fix": "bin/vue-demi-fix.js", + "vue-demi-switch": "bin/vue-demi-switch.js" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@vue/composition-api": "^1.0.0-rc.1", + "vue": "^3.0.0-0 || ^2.6.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } + } + }, + "node_modules/@vueuse/metadata": { + "version": "10.1.2", + "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-10.1.2.tgz", + "integrity": "sha512-3mc5BqN9aU2SqBeBuWE7ne4OtXHoHKggNgxZR2K+zIW4YLsy6xoZ4/9vErQs6tvoKDX6QAqm3lvsrv0mczAwIQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vueuse/shared": { + "version": "10.1.2", + "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-10.1.2.tgz", + "integrity": "sha512-1uoUTPBlgyscK9v6ScGeVYDDzlPSFXBlxuK7SfrDGyUTBiznb3mNceqhwvZHjtDRELZEN79V5uWPTF1VDV8svA==", + "dev": true, + "dependencies": { + "vue-demi": ">=0.14.0" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vueuse/shared/node_modules/vue-demi": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.0.tgz", + "integrity": "sha512-gt58r2ogsNQeVoQ3EhoUAvUsH9xviydl0dWJj7dabBC/2L4uBId7ujtCwDRD0JhkGsV1i0CtfLAeyYKBht9oWg==", + "dev": true, + "hasInstallScript": true, + "bin": { + "vue-demi-fix": "bin/vue-demi-fix.js", + "vue-demi-switch": "bin/vue-demi-switch.js" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@vue/composition-api": "^1.0.0-rc.1", + "vue": "^3.0.0-0 || ^2.6.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } + } + }, + "node_modules/algoliasearch": { + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.17.0.tgz", + "integrity": "sha512-JMRh2Mw6sEnVMiz6+APsi7lx9a2jiDFF+WUtANaUVCv6uSU9UOLdo5h9K3pdP6frRRybaM2fX8b1u0nqICS9aA==", + "dev": true, + "dependencies": { + "@algolia/cache-browser-local-storage": "4.17.0", + "@algolia/cache-common": "4.17.0", + "@algolia/cache-in-memory": "4.17.0", + "@algolia/client-account": "4.17.0", + "@algolia/client-analytics": "4.17.0", + "@algolia/client-common": "4.17.0", + "@algolia/client-personalization": "4.17.0", + "@algolia/client-search": "4.17.0", + "@algolia/logger-common": "4.17.0", + "@algolia/logger-console": "4.17.0", + "@algolia/requester-browser-xhr": "4.17.0", + "@algolia/requester-common": "4.17.0", + "@algolia/requester-node-http": "4.17.0", + "@algolia/transporter": "4.17.0" + } + }, + "node_modules/ansi-sequence-parser": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ansi-sequence-parser/-/ansi-sequence-parser-1.1.0.tgz", + "integrity": "sha512-lEm8mt52to2fT8GhciPCGeCXACSz2UwIN4X2e2LJSnZ5uAbn2/dsYdOmUXq0AtWS5cpAupysIneExOgH0Vd2TQ==", + "dev": true + }, + "node_modules/body-scroll-lock": { + "version": "4.0.0-beta.0", + "resolved": "https://registry.npmjs.org/body-scroll-lock/-/body-scroll-lock-4.0.0-beta.0.tgz", + "integrity": "sha512-a7tP5+0Mw3YlUJcGAKUqIBkYYGlYxk2fnCasq/FUph1hadxlTRjF+gAcZksxANnaMnALjxEddmSi/H3OR8ugcQ==", + "dev": true + }, + "node_modules/csstype": { + "version": "2.6.21", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.21.tgz", + "integrity": "sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w==", + "dev": true + }, + "node_modules/esbuild": { + "version": "0.17.18", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.18.tgz", + "integrity": "sha512-z1lix43jBs6UKjcZVKOw2xx69ffE2aG0PygLL5qJ9OS/gy0Ewd1gW/PUQIOIQGXBHWNywSc0floSKoMFF8aK2w==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.17.18", + "@esbuild/android-arm64": "0.17.18", + "@esbuild/android-x64": "0.17.18", + "@esbuild/darwin-arm64": "0.17.18", + "@esbuild/darwin-x64": "0.17.18", + "@esbuild/freebsd-arm64": "0.17.18", + "@esbuild/freebsd-x64": "0.17.18", + "@esbuild/linux-arm": "0.17.18", + "@esbuild/linux-arm64": "0.17.18", + "@esbuild/linux-ia32": "0.17.18", + "@esbuild/linux-loong64": "0.17.18", + "@esbuild/linux-mips64el": "0.17.18", + "@esbuild/linux-ppc64": "0.17.18", + "@esbuild/linux-riscv64": "0.17.18", + "@esbuild/linux-s390x": "0.17.18", + "@esbuild/linux-x64": "0.17.18", + "@esbuild/netbsd-x64": "0.17.18", + "@esbuild/openbsd-x64": "0.17.18", + "@esbuild/sunos-x64": "0.17.18", + "@esbuild/win32-arm64": "0.17.18", + "@esbuild/win32-ia32": "0.17.18", + "@esbuild/win32-x64": "0.17.18" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/jsonc-parser": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", + "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", + "dev": true + }, + "node_modules/magic-string": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", + "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", + "dev": true, + "dependencies": { + "sourcemap-codec": "^1.4.8" + } + }, + "node_modules/mark.js": { + "version": "8.11.1", + "resolved": "https://registry.npmjs.org/mark.js/-/mark.js-8.11.1.tgz", + "integrity": "sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==", + "dev": true + }, + "node_modules/minisearch": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/minisearch/-/minisearch-6.0.1.tgz", + "integrity": "sha512-Ly1w0nHKnlhAAh6/BF/+9NgzXfoJxaJ8nhopFhQ3NcvFJrFIL+iCg9gw9e9UMBD+XIsp/RyznJ/o5UIe5Kw+kg==", + "dev": true + }, + "node_modules/nanoid": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "node_modules/postcss": { + "version": "8.4.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.23.tgz", + "integrity": "sha512-bQ3qMcpF6A/YjR55xtoTr0jGOlnPOKAIMdOWiv0EIT6HVPEaJiJB4NLljSbiHoC2RX7DN5Uvjtpbg1NPdwv1oA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/preact": { + "version": "10.13.2", + "resolved": "https://registry.npmjs.org/preact/-/preact-10.13.2.tgz", + "integrity": "sha512-q44QFLhOhty2Bd0Y46fnYW0gD/cbVM9dUVtNTDKPcdXSMA7jfY+Jpd6rk3GB0lcQss0z5s/6CmVP0Z/hV+g6pw==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/preact" + } + }, + "node_modules/rollup": { + "version": "3.21.3", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.21.3.tgz", + "integrity": "sha512-VnPfEG51nIv2xPLnZaekkuN06q9ZbnyDcLkaBdJa/W7UddyhOfMP2yOPziYQfeY7k++fZM8FdQIummFN5y14kA==", + "dev": true, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=14.18.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/shiki": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-0.14.2.tgz", + "integrity": "sha512-ltSZlSLOuSY0M0Y75KA+ieRaZ0Trf5Wl3gutE7jzLuIcWxLp5i/uEnLoQWNvgKXQ5OMpGkJnVMRLAuzjc0LJ2A==", + "dev": true, + "dependencies": { + "ansi-sequence-parser": "^1.1.0", + "jsonc-parser": "^3.2.0", + "vscode-oniguruma": "^1.7.0", + "vscode-textmate": "^8.0.0" + } + }, + "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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", + "deprecated": "Please use @jridgewell/sourcemap-codec instead", + "dev": true + }, + "node_modules/vite": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.3.4.tgz", + "integrity": "sha512-f90aqGBoxSFxWph2b39ae2uHAxm5jFBBdnfueNxZAT1FTpM13ccFQExCaKbR2xFW5atowjleRniQ7onjJ22QEg==", + "dev": true, + "dependencies": { + "esbuild": "^0.17.5", + "postcss": "^8.4.23", + "rollup": "^3.21.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + }, + "peerDependencies": { + "@types/node": ">= 14", + "less": "*", + "sass": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/vitepress": { + "version": "1.0.0-alpha.75", + "resolved": "https://registry.npmjs.org/vitepress/-/vitepress-1.0.0-alpha.75.tgz", + "integrity": "sha512-twpPZ/6UnDR8X0Nmj767KwKhXlTQQM9V/J1i2BP9ryO29/w4hpxBfEum6nvfpNhJ4H3h+cIhwzAK/e9crZ6HEQ==", + "dev": true, + "dependencies": { + "@docsearch/css": "^3.3.4", + "@docsearch/js": "^3.3.4", + "@vitejs/plugin-vue": "^4.2.1", + "@vue/devtools-api": "^6.5.0", + "@vueuse/core": "^10.1.0", + "body-scroll-lock": "4.0.0-beta.0", + "mark.js": "8.11.1", + "minisearch": "^6.0.1", + "shiki": "^0.14.2", + "vite": "^4.3.3", + "vue": "^3.2.47" + }, + "bin": { + "vitepress": "bin/vitepress.js" + } + }, + "node_modules/vscode-oniguruma": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/vscode-oniguruma/-/vscode-oniguruma-1.7.0.tgz", + "integrity": "sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA==", + "dev": true + }, + "node_modules/vscode-textmate": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/vscode-textmate/-/vscode-textmate-8.0.0.tgz", + "integrity": "sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg==", + "dev": true + }, + "node_modules/vue": { + "version": "3.2.47", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.2.47.tgz", + "integrity": "sha512-60188y/9Dc9WVrAZeUVSDxRQOZ+z+y5nO2ts9jWXSTkMvayiWxCWOWtBQoYjLeccfXkiiPZWAHcV+WTPhkqJHQ==", + "dev": true, + "dependencies": { + "@vue/compiler-dom": "3.2.47", + "@vue/compiler-sfc": "3.2.47", + "@vue/runtime-dom": "3.2.47", + "@vue/server-renderer": "3.2.47", + "@vue/shared": "3.2.47" + } + } + }, + "dependencies": { + "@algolia/autocomplete-core": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.8.2.tgz", + "integrity": "sha512-mTeshsyFhAqw/ebqNsQpMtbnjr+qVOSKXArEj4K0d7sqc8It1XD0gkASwecm9mF/jlOQ4Z9RNg1HbdA8JPdRwQ==", + "dev": true, + "requires": { + "@algolia/autocomplete-shared": "1.8.2" + } + }, + "@algolia/autocomplete-preset-algolia": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.8.2.tgz", + "integrity": "sha512-J0oTx4me6ZM9kIKPuL3lyU3aB8DEvpVvR6xWmHVROx5rOYJGQcZsdG4ozxwcOyiiu3qxMkIbzntnV1S1VWD8yA==", + "dev": true, + "requires": { + "@algolia/autocomplete-shared": "1.8.2" + } + }, + "@algolia/autocomplete-shared": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.8.2.tgz", + "integrity": "sha512-b6Z/X4MczChMcfhk6kfRmBzPgjoPzuS9KGR4AFsiLulLNRAAqhP+xZTKtMnZGhLuc61I20d5WqlId02AZvcO6g==", + "dev": true + }, + "@algolia/cache-browser-local-storage": { + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.17.0.tgz", + "integrity": "sha512-myRSRZDIMYB8uCkO+lb40YKiYHi0fjpWRtJpR/dgkaiBlSD0plRyB6lLOh1XIfmMcSeBOqDE7y9m8xZMrXYfyQ==", + "dev": true, + "requires": { + "@algolia/cache-common": "4.17.0" + } + }, + "@algolia/cache-common": { + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.17.0.tgz", + "integrity": "sha512-g8mXzkrcUBIPZaulAuqE7xyHhLAYAcF2xSch7d9dABheybaU3U91LjBX6eJTEB7XVhEsgK4Smi27vWtAJRhIKQ==", + "dev": true + }, + "@algolia/cache-in-memory": { + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.17.0.tgz", + "integrity": "sha512-PT32ciC/xI8z919d0oknWVu3kMfTlhQn3MKxDln3pkn+yA7F7xrxSALysxquv+MhFfNAcrtQ/oVvQVBAQSHtdw==", + "dev": true, + "requires": { + "@algolia/cache-common": "4.17.0" + } + }, + "@algolia/client-account": { + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.17.0.tgz", + "integrity": "sha512-sSEHx9GA6m7wrlsSMNBGfyzlIfDT2fkz2u7jqfCCd6JEEwmxt8emGmxAU/0qBfbhRSuGvzojoLJlr83BSZAKjA==", + "dev": true, + "requires": { + "@algolia/client-common": "4.17.0", + "@algolia/client-search": "4.17.0", + "@algolia/transporter": "4.17.0" + } + }, + "@algolia/client-analytics": { + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.17.0.tgz", + "integrity": "sha512-84ooP8QA3mQ958hQ9wozk7hFUbAO+81CX1CjAuerxBqjKIInh1fOhXKTaku05O/GHBvcfExpPLIQuSuLYziBXQ==", + "dev": true, + "requires": { + "@algolia/client-common": "4.17.0", + "@algolia/client-search": "4.17.0", + "@algolia/requester-common": "4.17.0", + "@algolia/transporter": "4.17.0" + } + }, + "@algolia/client-common": { + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.17.0.tgz", + "integrity": "sha512-jHMks0ZFicf8nRDn6ma8DNNsdwGgP/NKiAAL9z6rS7CymJ7L0+QqTJl3rYxRW7TmBhsUH40wqzmrG6aMIN/DrQ==", + "dev": true, + "requires": { + "@algolia/requester-common": "4.17.0", + "@algolia/transporter": "4.17.0" + } + }, + "@algolia/client-personalization": { + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-4.17.0.tgz", + "integrity": "sha512-RMzN4dZLIta1YuwT7QC9o+OeGz2cU6eTOlGNE/6RcUBLOU3l9tkCOdln5dPE2jp8GZXPl2yk54b2nSs1+pAjqw==", + "dev": true, + "requires": { + "@algolia/client-common": "4.17.0", + "@algolia/requester-common": "4.17.0", + "@algolia/transporter": "4.17.0" + } + }, + "@algolia/client-search": { + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.17.0.tgz", + "integrity": "sha512-x4P2wKrrRIXszT8gb7eWsMHNNHAJs0wE7/uqbufm4tZenAp+hwU/hq5KVsY50v+PfwM0LcDwwn/1DroujsTFoA==", + "dev": true, + "requires": { + "@algolia/client-common": "4.17.0", + "@algolia/requester-common": "4.17.0", + "@algolia/transporter": "4.17.0" + } + }, + "@algolia/logger-common": { + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.17.0.tgz", + "integrity": "sha512-DGuoZqpTmIKJFDeyAJ7M8E/LOenIjWiOsg1XJ1OqAU/eofp49JfqXxbfgctlVZVmDABIyOz8LqEoJ6ZP4DTyvw==", + "dev": true + }, + "@algolia/logger-console": { + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.17.0.tgz", + "integrity": "sha512-zMPvugQV/gbXUvWBCzihw6m7oxIKp48w37QBIUu/XqQQfxhjoOE9xyfJr1KldUt5FrYOKZJVsJaEjTsu+bIgQg==", + "dev": true, + "requires": { + "@algolia/logger-common": "4.17.0" + } + }, + "@algolia/requester-browser-xhr": { + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.17.0.tgz", + "integrity": "sha512-aSOX/smauyTkP21Pf52pJ1O2LmNFJ5iHRIzEeTh0mwBeADO4GdG94cAWDILFA9rNblq/nK3EDh3+UyHHjplZ1A==", + "dev": true, + "requires": { + "@algolia/requester-common": "4.17.0" + } + }, + "@algolia/requester-common": { + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.17.0.tgz", + "integrity": "sha512-XJjmWFEUlHu0ijvcHBoixuXfEoiRUdyzQM6YwTuB8usJNIgShua8ouFlRWF8iCeag0vZZiUm4S2WCVBPkdxFgg==", + "dev": true + }, + "@algolia/requester-node-http": { + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.17.0.tgz", + "integrity": "sha512-bpb/wDA1aC6WxxM8v7TsFspB7yBN3nqCGs2H1OADolQR/hiAIjAxusbuMxVbRFOdaUvAIqioIIkWvZdpYNIn8w==", + "dev": true, + "requires": { + "@algolia/requester-common": "4.17.0" + } + }, + "@algolia/transporter": { + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.17.0.tgz", + "integrity": "sha512-6xL6H6fe+Fi0AEP3ziSgC+G04RK37iRb4uUUqVAH9WPYFI8g+LYFq6iv5HS8Cbuc5TTut+Bwj6G+dh/asdb9uA==", + "dev": true, + "requires": { + "@algolia/cache-common": "4.17.0", + "@algolia/logger-common": "4.17.0", + "@algolia/requester-common": "4.17.0" + } + }, + "@babel/parser": { + "version": "7.21.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.8.tgz", + "integrity": "sha512-6zavDGdzG3gUqAdWvlLFfk+36RilI+Pwyuuh7HItyeScCWP3k6i8vKclAQ0bM/0y/Kz/xiwvxhMv9MgTJP5gmA==", + "dev": true + }, + "@docsearch/css": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.3.4.tgz", + "integrity": "sha512-vDwCDoVXDgopw/hvr0zEADew2wWaGP8Qq0Bxhgii1Ewz2t4fQeyJwIRN/mWADeLFYPVkpz8TpEbxya/i6Tm0WA==", + "dev": true + }, + "@docsearch/js": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@docsearch/js/-/js-3.3.4.tgz", + "integrity": "sha512-Xd2saBziXJ1UuVpcDz94zAFEFAM6ap993agh0za2e3LDZLhaW993b1f9gyUL4e1CZLsR076tztG2un2gVncvpA==", + "dev": true, + "requires": { + "@docsearch/react": "3.3.4", + "preact": "^10.0.0" + } + }, + "@docsearch/react": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.3.4.tgz", + "integrity": "sha512-aeOf1WC5zMzBEi2SI6WWznOmIo9rnpN4p7a3zHXxowVciqlI4HsZGtOR9nFOufLeolv7HibwLlaM0oyUqJxasw==", + "dev": true, + "requires": { + "@algolia/autocomplete-core": "1.8.2", + "@algolia/autocomplete-preset-algolia": "1.8.2", + "@docsearch/css": "3.3.4", + "algoliasearch": "^4.0.0" + } + }, + "@esbuild/android-arm": { + "version": "0.17.18", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.18.tgz", + "integrity": "sha512-EmwL+vUBZJ7mhFCs5lA4ZimpUH3WMAoqvOIYhVQwdIgSpHC8ImHdsRyhHAVxpDYUSm0lWvd63z0XH1IlImS2Qw==", + "dev": true, + "optional": true + }, + "@esbuild/android-arm64": { + "version": "0.17.18", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.18.tgz", + "integrity": "sha512-/iq0aK0eeHgSC3z55ucMAHO05OIqmQehiGay8eP5l/5l+iEr4EIbh4/MI8xD9qRFjqzgkc0JkX0LculNC9mXBw==", + "dev": true, + "optional": true + }, + "@esbuild/android-x64": { + "version": "0.17.18", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.18.tgz", + "integrity": "sha512-x+0efYNBF3NPW2Xc5bFOSFW7tTXdAcpfEg2nXmxegm4mJuVeS+i109m/7HMiOQ6M12aVGGFlqJX3RhNdYM2lWg==", + "dev": true, + "optional": true + }, + "@esbuild/darwin-arm64": { + "version": "0.17.18", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.18.tgz", + "integrity": "sha512-6tY+djEAdF48M1ONWnQb1C+6LiXrKjmqjzPNPWXhu/GzOHTHX2nh8Mo2ZAmBFg0kIodHhciEgUBtcYCAIjGbjQ==", + "dev": true, + "optional": true + }, + "@esbuild/darwin-x64": { + "version": "0.17.18", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.18.tgz", + "integrity": "sha512-Qq84ykvLvya3dO49wVC9FFCNUfSrQJLbxhoQk/TE1r6MjHo3sFF2tlJCwMjhkBVq3/ahUisj7+EpRSz0/+8+9A==", + "dev": true, + "optional": true + }, + "@esbuild/freebsd-arm64": { + "version": "0.17.18", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.18.tgz", + "integrity": "sha512-fw/ZfxfAzuHfaQeMDhbzxp9mc+mHn1Y94VDHFHjGvt2Uxl10mT4CDavHm+/L9KG441t1QdABqkVYwakMUeyLRA==", + "dev": true, + "optional": true + }, + "@esbuild/freebsd-x64": { + "version": "0.17.18", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.18.tgz", + "integrity": "sha512-FQFbRtTaEi8ZBi/A6kxOC0V0E9B/97vPdYjY9NdawyLd4Qk5VD5g2pbWN2VR1c0xhzcJm74HWpObPszWC+qTew==", + "dev": true, + "optional": true + }, + "@esbuild/linux-arm": { + "version": "0.17.18", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.18.tgz", + "integrity": "sha512-jW+UCM40LzHcouIaqv3e/oRs0JM76JfhHjCavPxMUti7VAPh8CaGSlS7cmyrdpzSk7A+8f0hiedHqr/LMnfijg==", + "dev": true, + "optional": true + }, + "@esbuild/linux-arm64": { + "version": "0.17.18", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.18.tgz", + "integrity": "sha512-R7pZvQZFOY2sxUG8P6A21eq6q+eBv7JPQYIybHVf1XkQYC+lT7nDBdC7wWKTrbvMXKRaGudp/dzZCwL/863mZQ==", + "dev": true, + "optional": true + }, + "@esbuild/linux-ia32": { + "version": "0.17.18", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.18.tgz", + "integrity": "sha512-ygIMc3I7wxgXIxk6j3V00VlABIjq260i967Cp9BNAk5pOOpIXmd1RFQJQX9Io7KRsthDrQYrtcx7QCof4o3ZoQ==", + "dev": true, + "optional": true + }, + "@esbuild/linux-loong64": { + "version": "0.17.18", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.18.tgz", + "integrity": "sha512-bvPG+MyFs5ZlwYclCG1D744oHk1Pv7j8psF5TfYx7otCVmcJsEXgFEhQkbhNW8otDHL1a2KDINW20cfCgnzgMQ==", + "dev": true, + "optional": true + }, + "@esbuild/linux-mips64el": { + "version": "0.17.18", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.18.tgz", + "integrity": "sha512-oVqckATOAGuiUOa6wr8TXaVPSa+6IwVJrGidmNZS1cZVx0HqkTMkqFGD2HIx9H1RvOwFeWYdaYbdY6B89KUMxA==", + "dev": true, + "optional": true + }, + "@esbuild/linux-ppc64": { + "version": "0.17.18", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.18.tgz", + "integrity": "sha512-3dLlQO+b/LnQNxgH4l9rqa2/IwRJVN9u/bK63FhOPB4xqiRqlQAU0qDU3JJuf0BmaH0yytTBdoSBHrb2jqc5qQ==", + "dev": true, + "optional": true + }, + "@esbuild/linux-riscv64": { + "version": "0.17.18", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.18.tgz", + "integrity": "sha512-/x7leOyDPjZV3TcsdfrSI107zItVnsX1q2nho7hbbQoKnmoeUWjs+08rKKt4AUXju7+3aRZSsKrJtaRmsdL1xA==", + "dev": true, + "optional": true + }, + "@esbuild/linux-s390x": { + "version": "0.17.18", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.18.tgz", + "integrity": "sha512-cX0I8Q9xQkL/6F5zWdYmVf5JSQt+ZfZD2bJudZrWD+4mnUvoZ3TDDXtDX2mUaq6upMFv9FlfIh4Gfun0tbGzuw==", + "dev": true, + "optional": true + }, + "@esbuild/linux-x64": { + "version": "0.17.18", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.18.tgz", + "integrity": "sha512-66RmRsPlYy4jFl0vG80GcNRdirx4nVWAzJmXkevgphP1qf4dsLQCpSKGM3DUQCojwU1hnepI63gNZdrr02wHUA==", + "dev": true, + "optional": true + }, + "@esbuild/netbsd-x64": { + "version": "0.17.18", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.18.tgz", + "integrity": "sha512-95IRY7mI2yrkLlTLb1gpDxdC5WLC5mZDi+kA9dmM5XAGxCME0F8i4bYH4jZreaJ6lIZ0B8hTrweqG1fUyW7jbg==", + "dev": true, + "optional": true + }, + "@esbuild/openbsd-x64": { + "version": "0.17.18", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.18.tgz", + "integrity": "sha512-WevVOgcng+8hSZ4Q3BKL3n1xTv5H6Nb53cBrtzzEjDbbnOmucEVcZeGCsCOi9bAOcDYEeBZbD2SJNBxlfP3qiA==", + "dev": true, + "optional": true + }, + "@esbuild/sunos-x64": { + "version": "0.17.18", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.18.tgz", + "integrity": "sha512-Rzf4QfQagnwhQXVBS3BYUlxmEbcV7MY+BH5vfDZekU5eYpcffHSyjU8T0xucKVuOcdCsMo+Ur5wmgQJH2GfNrg==", + "dev": true, + "optional": true + }, + "@esbuild/win32-arm64": { + "version": "0.17.18", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.18.tgz", + "integrity": "sha512-Kb3Ko/KKaWhjeAm2YoT/cNZaHaD1Yk/pa3FTsmqo9uFh1D1Rfco7BBLIPdDOozrObj2sahslFuAQGvWbgWldAg==", + "dev": true, + "optional": true + }, + "@esbuild/win32-ia32": { + "version": "0.17.18", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.18.tgz", + "integrity": "sha512-0/xUMIdkVHwkvxfbd5+lfG7mHOf2FRrxNbPiKWg9C4fFrB8H0guClmaM3BFiRUYrznVoyxTIyC/Ou2B7QQSwmw==", + "dev": true, + "optional": true + }, + "@esbuild/win32-x64": { + "version": "0.17.18", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.18.tgz", + "integrity": "sha512-qU25Ma1I3NqTSHJUOKi9sAH1/Mzuvlke0ioMJRthLXKm7JiSKVwFghlGbDLOO2sARECGhja4xYfRAZNPAkooYg==", + "dev": true, + "optional": true + }, + "@types/web-bluetooth": { + "version": "0.0.17", + "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.17.tgz", + "integrity": "sha512-4p9vcSmxAayx72yn70joFoL44c9MO/0+iVEBIQXe3v2h2SiAsEIo/G5v6ObFWvNKRFjbrVadNf9LqEEZeQPzdA==", + "dev": true + }, + "@vitejs/plugin-vue": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-4.2.1.tgz", + "integrity": "sha512-ZTZjzo7bmxTRTkb8GSTwkPOYDIP7pwuyV+RV53c9PYUouwcbkIZIvWvNWlX2b1dYZqtOv7D6iUAnJLVNGcLrSw==", + "dev": true, + "requires": {} + }, + "@vue/compiler-core": { + "version": "3.2.47", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.47.tgz", + "integrity": "sha512-p4D7FDnQb7+YJmO2iPEv0SQNeNzcbHdGByJDsT4lynf63AFkOTFN07HsiRSvjGo0QrxR/o3d0hUyNCUnBU2Tig==", + "dev": true, + "requires": { + "@babel/parser": "^7.16.4", + "@vue/shared": "3.2.47", + "estree-walker": "^2.0.2", + "source-map": "^0.6.1" + } + }, + "@vue/compiler-dom": { + "version": "3.2.47", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.2.47.tgz", + "integrity": "sha512-dBBnEHEPoftUiS03a4ggEig74J2YBZ2UIeyfpcRM2tavgMWo4bsEfgCGsu+uJIL/vax9S+JztH8NmQerUo7shQ==", + "dev": true, + "requires": { + "@vue/compiler-core": "3.2.47", + "@vue/shared": "3.2.47" + } + }, + "@vue/compiler-sfc": { + "version": "3.2.47", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.2.47.tgz", + "integrity": "sha512-rog05W+2IFfxjMcFw10tM9+f7i/+FFpZJJ5XHX72NP9eC2uRD+42M3pYcQqDXVYoj74kHMSEdQ/WmCjt8JFksQ==", + "dev": true, + "requires": { + "@babel/parser": "^7.16.4", + "@vue/compiler-core": "3.2.47", + "@vue/compiler-dom": "3.2.47", + "@vue/compiler-ssr": "3.2.47", + "@vue/reactivity-transform": "3.2.47", + "@vue/shared": "3.2.47", + "estree-walker": "^2.0.2", + "magic-string": "^0.25.7", + "postcss": "^8.1.10", + "source-map": "^0.6.1" + } + }, + "@vue/compiler-ssr": { + "version": "3.2.47", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.2.47.tgz", + "integrity": "sha512-wVXC+gszhulcMD8wpxMsqSOpvDZ6xKXSVWkf50Guf/S+28hTAXPDYRTbLQ3EDkOP5Xz/+SY37YiwDquKbJOgZw==", + "dev": true, + "requires": { + "@vue/compiler-dom": "3.2.47", + "@vue/shared": "3.2.47" + } + }, + "@vue/devtools-api": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.5.0.tgz", + "integrity": "sha512-o9KfBeaBmCKl10usN4crU53fYtC1r7jJwdGKjPT24t348rHxgfpZ0xL3Xm/gLUYnc0oTp8LAmrxOeLyu6tbk2Q==", + "dev": true + }, + "@vue/reactivity": { + "version": "3.2.47", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.2.47.tgz", + "integrity": "sha512-7khqQ/75oyyg+N/e+iwV6lpy1f5wq759NdlS1fpAhFXa8VeAIKGgk2E/C4VF59lx5b+Ezs5fpp/5WsRYXQiKxQ==", + "dev": true, + "requires": { + "@vue/shared": "3.2.47" + } + }, + "@vue/reactivity-transform": { + "version": "3.2.47", + "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.2.47.tgz", + "integrity": "sha512-m8lGXw8rdnPVVIdIFhf0LeQ/ixyHkH5plYuS83yop5n7ggVJU+z5v0zecwEnX7fa7HNLBhh2qngJJkxpwEEmYA==", + "dev": true, + "requires": { + "@babel/parser": "^7.16.4", + "@vue/compiler-core": "3.2.47", + "@vue/shared": "3.2.47", + "estree-walker": "^2.0.2", + "magic-string": "^0.25.7" + } + }, + "@vue/runtime-core": { + "version": "3.2.47", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.2.47.tgz", + "integrity": "sha512-RZxbLQIRB/K0ev0K9FXhNbBzT32H9iRtYbaXb0ZIz2usLms/D55dJR2t6cIEUn6vyhS3ALNvNthI+Q95C+NOpA==", + "dev": true, + "requires": { + "@vue/reactivity": "3.2.47", + "@vue/shared": "3.2.47" + } + }, + "@vue/runtime-dom": { + "version": "3.2.47", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.2.47.tgz", + "integrity": "sha512-ArXrFTjS6TsDei4qwNvgrdmHtD930KgSKGhS5M+j8QxXrDJYLqYw4RRcDy1bz1m1wMmb6j+zGLifdVHtkXA7gA==", + "dev": true, + "requires": { + "@vue/runtime-core": "3.2.47", + "@vue/shared": "3.2.47", + "csstype": "^2.6.8" + } + }, + "@vue/server-renderer": { + "version": "3.2.47", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.2.47.tgz", + "integrity": "sha512-dN9gc1i8EvmP9RCzvneONXsKfBRgqFeFZLurmHOveL7oH6HiFXJw5OGu294n1nHc/HMgTy6LulU/tv5/A7f/LA==", + "dev": true, + "requires": { + "@vue/compiler-ssr": "3.2.47", + "@vue/shared": "3.2.47" + } + }, + "@vue/shared": { + "version": "3.2.47", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.47.tgz", + "integrity": "sha512-BHGyyGN3Q97EZx0taMQ+OLNuZcW3d37ZEVmEAyeoA9ERdGvm9Irc/0Fua8SNyOtV1w6BS4q25wbMzJujO9HIfQ==", + "dev": true + }, + "@vueuse/core": { + "version": "10.1.2", + "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-10.1.2.tgz", + "integrity": "sha512-roNn8WuerI56A5uiTyF/TEYX0Y+VKlhZAF94unUfdhbDUI+NfwQMn4FUnUscIRUhv3344qvAghopU4bzLPNFlA==", + "dev": true, + "requires": { + "@types/web-bluetooth": "^0.0.17", + "@vueuse/metadata": "10.1.2", + "@vueuse/shared": "10.1.2", + "vue-demi": ">=0.14.0" + }, + "dependencies": { + "vue-demi": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.0.tgz", + "integrity": "sha512-gt58r2ogsNQeVoQ3EhoUAvUsH9xviydl0dWJj7dabBC/2L4uBId7ujtCwDRD0JhkGsV1i0CtfLAeyYKBht9oWg==", + "dev": true, + "requires": {} + } + } + }, + "@vueuse/metadata": { + "version": "10.1.2", + "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-10.1.2.tgz", + "integrity": "sha512-3mc5BqN9aU2SqBeBuWE7ne4OtXHoHKggNgxZR2K+zIW4YLsy6xoZ4/9vErQs6tvoKDX6QAqm3lvsrv0mczAwIQ==", + "dev": true + }, + "@vueuse/shared": { + "version": "10.1.2", + "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-10.1.2.tgz", + "integrity": "sha512-1uoUTPBlgyscK9v6ScGeVYDDzlPSFXBlxuK7SfrDGyUTBiznb3mNceqhwvZHjtDRELZEN79V5uWPTF1VDV8svA==", + "dev": true, + "requires": { + "vue-demi": ">=0.14.0" + }, + "dependencies": { + "vue-demi": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.0.tgz", + "integrity": "sha512-gt58r2ogsNQeVoQ3EhoUAvUsH9xviydl0dWJj7dabBC/2L4uBId7ujtCwDRD0JhkGsV1i0CtfLAeyYKBht9oWg==", + "dev": true, + "requires": {} + } + } + }, + "algoliasearch": { + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.17.0.tgz", + "integrity": "sha512-JMRh2Mw6sEnVMiz6+APsi7lx9a2jiDFF+WUtANaUVCv6uSU9UOLdo5h9K3pdP6frRRybaM2fX8b1u0nqICS9aA==", + "dev": true, + "requires": { + "@algolia/cache-browser-local-storage": "4.17.0", + "@algolia/cache-common": "4.17.0", + "@algolia/cache-in-memory": "4.17.0", + "@algolia/client-account": "4.17.0", + "@algolia/client-analytics": "4.17.0", + "@algolia/client-common": "4.17.0", + "@algolia/client-personalization": "4.17.0", + "@algolia/client-search": "4.17.0", + "@algolia/logger-common": "4.17.0", + "@algolia/logger-console": "4.17.0", + "@algolia/requester-browser-xhr": "4.17.0", + "@algolia/requester-common": "4.17.0", + "@algolia/requester-node-http": "4.17.0", + "@algolia/transporter": "4.17.0" + } + }, + "ansi-sequence-parser": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ansi-sequence-parser/-/ansi-sequence-parser-1.1.0.tgz", + "integrity": "sha512-lEm8mt52to2fT8GhciPCGeCXACSz2UwIN4X2e2LJSnZ5uAbn2/dsYdOmUXq0AtWS5cpAupysIneExOgH0Vd2TQ==", + "dev": true + }, + "body-scroll-lock": { + "version": "4.0.0-beta.0", + "resolved": "https://registry.npmjs.org/body-scroll-lock/-/body-scroll-lock-4.0.0-beta.0.tgz", + "integrity": "sha512-a7tP5+0Mw3YlUJcGAKUqIBkYYGlYxk2fnCasq/FUph1hadxlTRjF+gAcZksxANnaMnALjxEddmSi/H3OR8ugcQ==", + "dev": true + }, + "csstype": { + "version": "2.6.21", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.21.tgz", + "integrity": "sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w==", + "dev": true + }, + "esbuild": { + "version": "0.17.18", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.18.tgz", + "integrity": "sha512-z1lix43jBs6UKjcZVKOw2xx69ffE2aG0PygLL5qJ9OS/gy0Ewd1gW/PUQIOIQGXBHWNywSc0floSKoMFF8aK2w==", + "dev": true, + "requires": { + "@esbuild/android-arm": "0.17.18", + "@esbuild/android-arm64": "0.17.18", + "@esbuild/android-x64": "0.17.18", + "@esbuild/darwin-arm64": "0.17.18", + "@esbuild/darwin-x64": "0.17.18", + "@esbuild/freebsd-arm64": "0.17.18", + "@esbuild/freebsd-x64": "0.17.18", + "@esbuild/linux-arm": "0.17.18", + "@esbuild/linux-arm64": "0.17.18", + "@esbuild/linux-ia32": "0.17.18", + "@esbuild/linux-loong64": "0.17.18", + "@esbuild/linux-mips64el": "0.17.18", + "@esbuild/linux-ppc64": "0.17.18", + "@esbuild/linux-riscv64": "0.17.18", + "@esbuild/linux-s390x": "0.17.18", + "@esbuild/linux-x64": "0.17.18", + "@esbuild/netbsd-x64": "0.17.18", + "@esbuild/openbsd-x64": "0.17.18", + "@esbuild/sunos-x64": "0.17.18", + "@esbuild/win32-arm64": "0.17.18", + "@esbuild/win32-ia32": "0.17.18", + "@esbuild/win32-x64": "0.17.18" + } + }, + "estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true + }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "optional": true + }, + "jsonc-parser": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", + "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", + "dev": true + }, + "magic-string": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", + "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", + "dev": true, + "requires": { + "sourcemap-codec": "^1.4.8" + } + }, + "mark.js": { + "version": "8.11.1", + "resolved": "https://registry.npmjs.org/mark.js/-/mark.js-8.11.1.tgz", + "integrity": "sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==", + "dev": true + }, + "minisearch": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/minisearch/-/minisearch-6.0.1.tgz", + "integrity": "sha512-Ly1w0nHKnlhAAh6/BF/+9NgzXfoJxaJ8nhopFhQ3NcvFJrFIL+iCg9gw9e9UMBD+XIsp/RyznJ/o5UIe5Kw+kg==", + "dev": true + }, + "nanoid": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "dev": true + }, + "picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "postcss": { + "version": "8.4.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.23.tgz", + "integrity": "sha512-bQ3qMcpF6A/YjR55xtoTr0jGOlnPOKAIMdOWiv0EIT6HVPEaJiJB4NLljSbiHoC2RX7DN5Uvjtpbg1NPdwv1oA==", + "dev": true, + "requires": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + } + }, + "preact": { + "version": "10.13.2", + "resolved": "https://registry.npmjs.org/preact/-/preact-10.13.2.tgz", + "integrity": "sha512-q44QFLhOhty2Bd0Y46fnYW0gD/cbVM9dUVtNTDKPcdXSMA7jfY+Jpd6rk3GB0lcQss0z5s/6CmVP0Z/hV+g6pw==", + "dev": true + }, + "rollup": { + "version": "3.21.3", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.21.3.tgz", + "integrity": "sha512-VnPfEG51nIv2xPLnZaekkuN06q9ZbnyDcLkaBdJa/W7UddyhOfMP2yOPziYQfeY7k++fZM8FdQIummFN5y14kA==", + "dev": true, + "requires": { + "fsevents": "~2.3.2" + } + }, + "shiki": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-0.14.2.tgz", + "integrity": "sha512-ltSZlSLOuSY0M0Y75KA+ieRaZ0Trf5Wl3gutE7jzLuIcWxLp5i/uEnLoQWNvgKXQ5OMpGkJnVMRLAuzjc0LJ2A==", + "dev": true, + "requires": { + "ansi-sequence-parser": "^1.1.0", + "jsonc-parser": "^3.2.0", + "vscode-oniguruma": "^1.7.0", + "vscode-textmate": "^8.0.0" + } + }, + "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 + }, + "source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "dev": true + }, + "sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", + "dev": true + }, + "vite": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.3.4.tgz", + "integrity": "sha512-f90aqGBoxSFxWph2b39ae2uHAxm5jFBBdnfueNxZAT1FTpM13ccFQExCaKbR2xFW5atowjleRniQ7onjJ22QEg==", + "dev": true, + "requires": { + "esbuild": "^0.17.5", + "fsevents": "~2.3.2", + "postcss": "^8.4.23", + "rollup": "^3.21.0" + } + }, + "vitepress": { + "version": "1.0.0-alpha.75", + "resolved": "https://registry.npmjs.org/vitepress/-/vitepress-1.0.0-alpha.75.tgz", + "integrity": "sha512-twpPZ/6UnDR8X0Nmj767KwKhXlTQQM9V/J1i2BP9ryO29/w4hpxBfEum6nvfpNhJ4H3h+cIhwzAK/e9crZ6HEQ==", + "dev": true, + "requires": { + "@docsearch/css": "^3.3.4", + "@docsearch/js": "^3.3.4", + "@vitejs/plugin-vue": "^4.2.1", + "@vue/devtools-api": "^6.5.0", + "@vueuse/core": "^10.1.0", + "body-scroll-lock": "4.0.0-beta.0", + "mark.js": "8.11.1", + "minisearch": "^6.0.1", + "shiki": "^0.14.2", + "vite": "^4.3.3", + "vue": "^3.2.47" + } + }, + "vscode-oniguruma": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/vscode-oniguruma/-/vscode-oniguruma-1.7.0.tgz", + "integrity": "sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA==", + "dev": true + }, + "vscode-textmate": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/vscode-textmate/-/vscode-textmate-8.0.0.tgz", + "integrity": "sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg==", + "dev": true + }, + "vue": { + "version": "3.2.47", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.2.47.tgz", + "integrity": "sha512-60188y/9Dc9WVrAZeUVSDxRQOZ+z+y5nO2ts9jWXSTkMvayiWxCWOWtBQoYjLeccfXkiiPZWAHcV+WTPhkqJHQ==", + "dev": true, + "requires": { + "@vue/compiler-dom": "3.2.47", + "@vue/compiler-sfc": "3.2.47", + "@vue/runtime-dom": "3.2.47", + "@vue/server-renderer": "3.2.47", + "@vue/shared": "3.2.47" + } + } + } +} diff --git a/apps/zhi-docs-vitepress/package.json b/apps/zhi-docs-vitepress/package.json index 361553b6..b5cdbcd8 100644 --- a/apps/zhi-docs-vitepress/package.json +++ b/apps/zhi-docs-vitepress/package.json @@ -1,24 +1,22 @@ { "name": "zhi-docs-vitepress", "version": "1.0.0", - "description": "docs via TypeDoc and vitepress", "scripts": { - "dev": "vitepress dev", - "build": "vitepress build", - "preview": "vitepress preview" + "dev": "pnpm predocs:dev && pnpm docs:dev", + "build": "pnpm predocs:dev && pnpm docs:build", + "publish-typedoc": "typedoc --options typedoc.json", + "predocs:dev": "pnpm publish-typedoc", + "docs:dev": "vitepress dev docs", + "docs:build": "vitepress build docs", + "docs:preview": "vitepress preview docs" }, - "keywords": [ - "zhi", - "docs", - "vite", - "vitepress" - ], - "author": "terwer", + "author": "Thomas Grey", "license": "MIT", "devDependencies": { - "vitepress": "1.0.0-alpha.75" - }, - "dependencies": { - "vue": "^3.3.2" + "typedoc": "0.24.7", + "typedoc-plugin-frontmatter": "^0.0.2", + "typedoc-plugin-markdown": "workspace:*", + "typedoc-vitepress-theme": "workspace:*", + "vitepress": "^1.0.0-alpha.75" } -} \ No newline at end of file +} diff --git a/apps/zhi-docs-vitepress/tsconfig.json b/apps/zhi-docs-vitepress/tsconfig.json new file mode 100644 index 00000000..ccb37510 --- /dev/null +++ b/apps/zhi-docs-vitepress/tsconfig.json @@ -0,0 +1,38 @@ +{ + "compilerOptions": { + "target": "ES2020", + "useDefineForClassFields": true, + "module": "ESNext", + "lib": ["ES2020", "DOM", "DOM.Iterable"], + "skipLibCheck": true, + "esModuleInterop": true, + + /* Bundler mode */ + "moduleResolution": "Node", + // "allowImportingTsExtensions": true, + "allowSyntheticDefaultImports": true, + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + "jsx": "preserve", + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true, + + "types": ["node", "vite/client"] + }, + "include": [ + "./docs/.vitepress/config.ts", + "../../libs/zhi-device/src/**/*.ts", + "../../libs/zhi-env/src/**/*.ts", + "../../libs/zhi-log/src/**/*.ts", + "../../libs/zhi-common/src/**/*.ts", + "../../libs/zhi-electron/src/**/*.ts", + "../../libs/zhi-blog-api/src/**/*.ts", + "../../libs/zhi-siyuan-api/src/**/*.ts" + ], + "exclude": ["./node_modules"] +} \ No newline at end of file diff --git a/apps/zhi-docs-vitepress/typedoc.json b/apps/zhi-docs-vitepress/typedoc.json new file mode 100644 index 00000000..9e615fb8 --- /dev/null +++ b/apps/zhi-docs-vitepress/typedoc.json @@ -0,0 +1,18 @@ +{ + "plugin": [ + "typedoc-plugin-frontmatter", + "./node_modules/typedoc-plugin-markdown/dist", + "./node_modules/typedoc-vitepress-theme/dist" + ], + "entryPoints": [ + "../../libs/zhi-device/src/index.ts", + "../../libs/zhi-env/src/index.ts", + "../../libs/zhi-log/src/index.ts", + "../../libs/zhi-common/src/index.ts", + "../../libs/zhi-electron/src/index.ts", + "../../libs/zhi-blog-api/src/index.ts", + "../../libs/zhi-siyuan-api/src/index.ts" + ], + "tsconfig": "./tsconfig.json", + "frontmatterTags": ["author", "description", "outline"] +} \ No newline at end of file diff --git a/apps/zhi-docs/package.json b/apps/zhi-docs/package.json index ccc751e1..f269dd5d 100644 --- a/apps/zhi-docs/package.json +++ b/apps/zhi-docs/package.json @@ -20,7 +20,7 @@ "@docusaurus/module-type-aliases": "2.4.0", "@tsconfig/docusaurus": "^1.0.5", "docusaurus-plugin-typedoc": "^0.19.2", - "typedoc": "^0.24.6", + "typedoc": "^0.24.7", "typedoc-plugin-markdown": "^3.15.3", "typedoc-plugin-rename-defaults": "^0.6.5", "typescript": "^5.0.4" diff --git a/libs/zhi-blog-api/.eslintrc.cjs b/libs/zhi-blog-api/.eslintrc.cjs index a147b203..a1993b7b 100644 --- a/libs/zhi-blog-api/.eslintrc.cjs +++ b/libs/zhi-blog-api/.eslintrc.cjs @@ -1,5 +1,4 @@ module.exports = { root: true, - extends: ["./node_modules/@terwer/eslint-config-custom/index.cjs"], - ignorePatterns: ["node_modules/"], + extends: ["./node_modules/@terwer/eslint-config-custom/typescript/index.cjs"], } diff --git a/libs/zhi-blog-api/src/lib/IBlogApi.ts b/libs/zhi-blog-api/src/lib/IBlogApi.ts index dafc678c..7d4408b0 100644 --- a/libs/zhi-blog-api/src/lib/IBlogApi.ts +++ b/libs/zhi-blog-api/src/lib/IBlogApi.ts @@ -33,6 +33,7 @@ import CategoryInfo from "./models/categoryInfo" * * @public * @author terwer + * @outline deep * @version 1.0.0 * @since 1.0.0 */ diff --git a/libs/zhi-common/.eslintrc.cjs b/libs/zhi-common/.eslintrc.cjs index a147b203..a1993b7b 100644 --- a/libs/zhi-common/.eslintrc.cjs +++ b/libs/zhi-common/.eslintrc.cjs @@ -1,5 +1,4 @@ module.exports = { root: true, - extends: ["./node_modules/@terwer/eslint-config-custom/index.cjs"], - ignorePatterns: ["node_modules/"], + extends: ["./node_modules/@terwer/eslint-config-custom/typescript/index.cjs"], } diff --git a/libs/zhi-device/.eslintrc.cjs b/libs/zhi-device/.eslintrc.cjs index a147b203..a1993b7b 100644 --- a/libs/zhi-device/.eslintrc.cjs +++ b/libs/zhi-device/.eslintrc.cjs @@ -1,5 +1,4 @@ module.exports = { root: true, - extends: ["./node_modules/@terwer/eslint-config-custom/index.cjs"], - ignorePatterns: ["node_modules/"], + extends: ["./node_modules/@terwer/eslint-config-custom/typescript/index.cjs"], } diff --git a/libs/zhi-electron/.eslintrc.cjs b/libs/zhi-electron/.eslintrc.cjs index a147b203..a1993b7b 100644 --- a/libs/zhi-electron/.eslintrc.cjs +++ b/libs/zhi-electron/.eslintrc.cjs @@ -1,5 +1,4 @@ module.exports = { root: true, - extends: ["./node_modules/@terwer/eslint-config-custom/index.cjs"], - ignorePatterns: ["node_modules/"], + extends: ["./node_modules/@terwer/eslint-config-custom/typescript/index.cjs"], } diff --git a/libs/zhi-electron/index.js b/libs/zhi-electron/index.js new file mode 100644 index 00000000..85dba622 --- /dev/null +++ b/libs/zhi-electron/index.js @@ -0,0 +1,9781 @@ +var __require = /* @__PURE__ */ ((x2) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x2, { + get: (a, b) => (typeof require !== "undefined" ? require : a)[b] +}) : x2)(function(x2) { + if (typeof require !== "undefined") + return require.apply(this, arguments); + throw new Error('Dynamic require of "' + x2 + '" is not supported'); +}); + +// ../zhi-common/dist/index.js +var $s = Object.defineProperty; +var Es = (e2, r3, n) => r3 in e2 ? $s(e2, r3, { enumerable: true, configurable: true, writable: true, value: n }) : e2[r3] = n; +var be = (e2, r3, n) => (Es(e2, typeof r3 != "symbol" ? r3 + "" : r3, n), n); +var En = typeof globalThis < "u" ? globalThis : typeof window < "u" ? window : typeof global < "u" ? global : typeof self < "u" ? self : {}; +function ks(e2) { + return e2 && e2.__esModule && Object.prototype.hasOwnProperty.call(e2, "default") ? e2.default : e2; +} +var wt = {}; +var Ps = { + get exports() { + return wt; + }, + set exports(e2) { + wt = e2; + } +}; +var kn = {}; +var He = {}; +var Ar = {}; +var rt = {}; +var se = {}; +var et = {}; +(function(e2) { + Object.defineProperty(e2, "__esModule", { value: true }), e2.regexpCode = e2.getEsmExportName = e2.getProperty = e2.safeStringify = e2.stringify = e2.strConcat = e2.addCodeArg = e2.str = e2._ = e2.nil = e2._Code = e2.Name = e2.IDENTIFIER = e2._CodeOrName = void 0; + class r3 { + } + e2._CodeOrName = r3, e2.IDENTIFIER = /^[a-z$_][a-z$_0-9]*$/i; + class n extends r3 { + constructor(N2) { + if (super(), !e2.IDENTIFIER.test(N2)) + throw new Error("CodeGen: name must be a valid identifier"); + this.str = N2; + } + toString() { + return this.str; + } + emptyStr() { + return false; + } + get names() { + return { [this.str]: 1 }; + } + } + e2.Name = n; + class a extends r3 { + constructor(N2) { + super(), this._items = typeof N2 == "string" ? [N2] : N2; + } + toString() { + return this.str; + } + emptyStr() { + if (this._items.length > 1) + return false; + const N2 = this._items[0]; + return N2 === "" || N2 === '""'; + } + get str() { + var N2; + return (N2 = this._str) !== null && N2 !== void 0 ? N2 : this._str = this._items.reduce((D2, t) => `${D2}${t}`, ""); + } + get names() { + var N2; + return (N2 = this._names) !== null && N2 !== void 0 ? N2 : this._names = this._items.reduce((D2, t) => (t instanceof n && (D2[t.str] = (D2[t.str] || 0) + 1), D2), {}); + } + } + e2._Code = a, e2.nil = new a(""); + function d($, ...N2) { + const D2 = [$[0]]; + let t = 0; + for (; t < N2.length; ) + y(D2, N2[t]), D2.push($[++t]); + return new a(D2); + } + e2._ = d; + const o2 = new a("+"); + function p($, ...N2) { + const D2 = [L($[0])]; + let t = 0; + for (; t < N2.length; ) + D2.push(o2), y(D2, N2[t]), D2.push(o2, L($[++t])); + return b(D2), new a(D2); + } + e2.str = p; + function y($, N2) { + N2 instanceof a ? $.push(...N2._items) : N2 instanceof n ? $.push(N2) : $.push(S(N2)); + } + e2.addCodeArg = y; + function b($) { + let N2 = 1; + for (; N2 < $.length - 1; ) { + if ($[N2] === o2) { + const D2 = v($[N2 - 1], $[N2 + 1]); + if (D2 !== void 0) { + $.splice(N2 - 1, 3, D2); + continue; + } + $[N2++] = "+"; + } + N2++; + } + } + function v($, N2) { + if (N2 === '""') + return $; + if ($ === '""') + return N2; + if (typeof $ == "string") + return N2 instanceof n || $[$.length - 1] !== '"' ? void 0 : typeof N2 != "string" ? `${$.slice(0, -1)}${N2}"` : N2[0] === '"' ? $.slice(0, -1) + N2.slice(1) : void 0; + if (typeof N2 == "string" && N2[0] === '"' && !($ instanceof n)) + return `"${$}${N2.slice(1)}`; + } + function g2($, N2) { + return N2.emptyStr() ? $ : $.emptyStr() ? N2 : p`${$}${N2}`; + } + e2.strConcat = g2; + function S($) { + return typeof $ == "number" || typeof $ == "boolean" || $ === null ? $ : L(Array.isArray($) ? $.join(",") : $); + } + function z($) { + return new a(L($)); + } + e2.stringify = z; + function L($) { + return JSON.stringify($).replace(/\u2028/g, "\\u2028").replace(/\u2029/g, "\\u2029"); + } + e2.safeStringify = L; + function R($) { + return typeof $ == "string" && e2.IDENTIFIER.test($) ? new a(`.${$}`) : d`[${$}]`; + } + e2.getProperty = R; + function j($) { + if (typeof $ == "string" && e2.IDENTIFIER.test($)) + return new a(`${$}`); + throw new Error(`CodeGen: invalid export name: ${$}, use explicit $id name mapping`); + } + e2.getEsmExportName = j; + function T($) { + return new a($.toString()); + } + e2.regexpCode = T; +})(et); +var Bt = {}; +(function(e2) { + Object.defineProperty(e2, "__esModule", { value: true }), e2.ValueScope = e2.ValueScopeName = e2.Scope = e2.varKinds = e2.UsedValueState = void 0; + const r3 = et; + class n extends Error { + constructor(v) { + super(`CodeGen: "code" for ${v} not defined`), this.value = v.value; + } + } + var a; + (function(b) { + b[b.Started = 0] = "Started", b[b.Completed = 1] = "Completed"; + })(a = e2.UsedValueState || (e2.UsedValueState = {})), e2.varKinds = { + const: new r3.Name("const"), + let: new r3.Name("let"), + var: new r3.Name("var") + }; + class d { + constructor({ prefixes: v, parent: g2 } = {}) { + this._names = {}, this._prefixes = v, this._parent = g2; + } + toName(v) { + return v instanceof r3.Name ? v : this.name(v); + } + name(v) { + return new r3.Name(this._newName(v)); + } + _newName(v) { + const g2 = this._names[v] || this._nameGroup(v); + return `${v}${g2.index++}`; + } + _nameGroup(v) { + var g2, S; + if (!((S = (g2 = this._parent) === null || g2 === void 0 ? void 0 : g2._prefixes) === null || S === void 0) && S.has(v) || this._prefixes && !this._prefixes.has(v)) + throw new Error(`CodeGen: prefix "${v}" is not allowed in this scope`); + return this._names[v] = { prefix: v, index: 0 }; + } + } + e2.Scope = d; + class o2 extends r3.Name { + constructor(v, g2) { + super(g2), this.prefix = v; + } + setValue(v, { property: g2, itemIndex: S }) { + this.value = v, this.scopePath = (0, r3._)`.${new r3.Name(g2)}[${S}]`; + } + } + e2.ValueScopeName = o2; + const p = (0, r3._)`\n`; + class y extends d { + constructor(v) { + super(v), this._values = {}, this._scope = v.scope, this.opts = { ...v, _n: v.lines ? p : r3.nil }; + } + get() { + return this._scope; + } + name(v) { + return new o2(v, this._newName(v)); + } + value(v, g2) { + var S; + if (g2.ref === void 0) + throw new Error("CodeGen: ref must be passed in value"); + const z = this.toName(v), { prefix: L } = z, R = (S = g2.key) !== null && S !== void 0 ? S : g2.ref; + let j = this._values[L]; + if (j) { + const N2 = j.get(R); + if (N2) + return N2; + } else + j = this._values[L] = /* @__PURE__ */ new Map(); + j.set(R, z); + const T = this._scope[L] || (this._scope[L] = []), $ = T.length; + return T[$] = g2.ref, z.setValue(g2, { property: L, itemIndex: $ }), z; + } + getValue(v, g2) { + const S = this._values[v]; + if (S) + return S.get(g2); + } + scopeRefs(v, g2 = this._values) { + return this._reduceValues(g2, (S) => { + if (S.scopePath === void 0) + throw new Error(`CodeGen: name "${S}" has no value`); + return (0, r3._)`${v}${S.scopePath}`; + }); + } + scopeCode(v = this._values, g2, S) { + return this._reduceValues(v, (z) => { + if (z.value === void 0) + throw new Error(`CodeGen: name "${z}" has no value`); + return z.value.code; + }, g2, S); + } + _reduceValues(v, g2, S = {}, z) { + let L = r3.nil; + for (const R in v) { + const j = v[R]; + if (!j) + continue; + const T = S[R] = S[R] || /* @__PURE__ */ new Map(); + j.forEach(($) => { + if (T.has($)) + return; + T.set($, a.Started); + let N2 = g2($); + if (N2) { + const D2 = this.opts.es5 ? e2.varKinds.var : e2.varKinds.const; + L = (0, r3._)`${L}${D2} ${$} = ${N2};${this.opts._n}`; + } else if (N2 = z == null ? void 0 : z($)) + L = (0, r3._)`${L}${N2}${this.opts._n}`; + else + throw new n($); + T.set($, a.Completed); + }); + } + return L; + } + } + e2.ValueScope = y; +})(Bt); +(function(e2) { + Object.defineProperty(e2, "__esModule", { value: true }), e2.or = e2.and = e2.not = e2.CodeGen = e2.operators = e2.varKinds = e2.ValueScopeName = e2.ValueScope = e2.Scope = e2.Name = e2.regexpCode = e2.stringify = e2.getProperty = e2.nil = e2.strConcat = e2.str = e2._ = void 0; + const r3 = et, n = Bt; + var a = et; + Object.defineProperty(e2, "_", { enumerable: true, get: function() { + return a._; + } }), Object.defineProperty(e2, "str", { enumerable: true, get: function() { + return a.str; + } }), Object.defineProperty(e2, "strConcat", { enumerable: true, get: function() { + return a.strConcat; + } }), Object.defineProperty(e2, "nil", { enumerable: true, get: function() { + return a.nil; + } }), Object.defineProperty(e2, "getProperty", { enumerable: true, get: function() { + return a.getProperty; + } }), Object.defineProperty(e2, "stringify", { enumerable: true, get: function() { + return a.stringify; + } }), Object.defineProperty(e2, "regexpCode", { enumerable: true, get: function() { + return a.regexpCode; + } }), Object.defineProperty(e2, "Name", { enumerable: true, get: function() { + return a.Name; + } }); + var d = Bt; + Object.defineProperty(e2, "Scope", { enumerable: true, get: function() { + return d.Scope; + } }), Object.defineProperty(e2, "ValueScope", { enumerable: true, get: function() { + return d.ValueScope; + } }), Object.defineProperty(e2, "ValueScopeName", { enumerable: true, get: function() { + return d.ValueScopeName; + } }), Object.defineProperty(e2, "varKinds", { enumerable: true, get: function() { + return d.varKinds; + } }), e2.operators = { + GT: new r3._Code(">"), + GTE: new r3._Code(">="), + LT: new r3._Code("<"), + LTE: new r3._Code("<="), + EQ: new r3._Code("==="), + NEQ: new r3._Code("!=="), + NOT: new r3._Code("!"), + OR: new r3._Code("||"), + AND: new r3._Code("&&"), + ADD: new r3._Code("+") + }; + class o2 { + optimizeNodes() { + return this; + } + optimizeNames(l, w2) { + return this; + } + } + class p extends o2 { + constructor(l, w2, I) { + super(), this.varKind = l, this.name = w2, this.rhs = I; + } + render({ es5: l, _n: w2 }) { + const I = l ? n.varKinds.var : this.varKind, K = this.rhs === void 0 ? "" : ` = ${this.rhs}`; + return `${I} ${this.name}${K};` + w2; + } + optimizeNames(l, w2) { + if (l[this.name.str]) + return this.rhs && (this.rhs = V(this.rhs, l, w2)), this; + } + get names() { + return this.rhs instanceof r3._CodeOrName ? this.rhs.names : {}; + } + } + class y extends o2 { + constructor(l, w2, I) { + super(), this.lhs = l, this.rhs = w2, this.sideEffects = I; + } + render({ _n: l }) { + return `${this.lhs} = ${this.rhs};` + l; + } + optimizeNames(l, w2) { + if (!(this.lhs instanceof r3.Name && !l[this.lhs.str] && !this.sideEffects)) + return this.rhs = V(this.rhs, l, w2), this; + } + get names() { + const l = this.lhs instanceof r3.Name ? {} : { ...this.lhs.names }; + return H(l, this.rhs); + } + } + class b extends y { + constructor(l, w2, I, K) { + super(l, I, K), this.op = w2; + } + render({ _n: l }) { + return `${this.lhs} ${this.op}= ${this.rhs};` + l; + } + } + class v extends o2 { + constructor(l) { + super(), this.label = l, this.names = {}; + } + render({ _n: l }) { + return `${this.label}:` + l; + } + } + class g2 extends o2 { + constructor(l) { + super(), this.label = l, this.names = {}; + } + render({ _n: l }) { + return `break${this.label ? ` ${this.label}` : ""};` + l; + } + } + class S extends o2 { + constructor(l) { + super(), this.error = l; + } + render({ _n: l }) { + return `throw ${this.error};` + l; + } + get names() { + return this.error.names; + } + } + class z extends o2 { + constructor(l) { + super(), this.code = l; + } + render({ _n: l }) { + return `${this.code};` + l; + } + optimizeNodes() { + return `${this.code}` ? this : void 0; + } + optimizeNames(l, w2) { + return this.code = V(this.code, l, w2), this; + } + get names() { + return this.code instanceof r3._CodeOrName ? this.code.names : {}; + } + } + class L extends o2 { + constructor(l = []) { + super(), this.nodes = l; + } + render(l) { + return this.nodes.reduce((w2, I) => w2 + I.render(l), ""); + } + optimizeNodes() { + const { nodes: l } = this; + let w2 = l.length; + for (; w2--; ) { + const I = l[w2].optimizeNodes(); + Array.isArray(I) ? l.splice(w2, 1, ...I) : I ? l[w2] = I : l.splice(w2, 1); + } + return l.length > 0 ? this : void 0; + } + optimizeNames(l, w2) { + const { nodes: I } = this; + let K = I.length; + for (; K--; ) { + const W = I[K]; + W.optimizeNames(l, w2) || (G(l, W.names), I.splice(K, 1)); + } + return I.length > 0 ? this : void 0; + } + get names() { + return this.nodes.reduce((l, w2) => U(l, w2.names), {}); + } + } + class R extends L { + render(l) { + return "{" + l._n + super.render(l) + "}" + l._n; + } + } + class j extends L { + } + class T extends R { + } + T.kind = "else"; + class $ extends R { + constructor(l, w2) { + super(w2), this.condition = l; + } + render(l) { + let w2 = `if(${this.condition})` + super.render(l); + return this.else && (w2 += "else " + this.else.render(l)), w2; + } + optimizeNodes() { + super.optimizeNodes(); + const l = this.condition; + if (l === true) + return this.nodes; + let w2 = this.else; + if (w2) { + const I = w2.optimizeNodes(); + w2 = this.else = Array.isArray(I) ? new T(I) : I; + } + if (w2) + return l === false ? w2 instanceof $ ? w2 : w2.nodes : this.nodes.length ? this : new $(_2(l), w2 instanceof $ ? [w2] : w2.nodes); + if (!(l === false || !this.nodes.length)) + return this; + } + optimizeNames(l, w2) { + var I; + if (this.else = (I = this.else) === null || I === void 0 ? void 0 : I.optimizeNames(l, w2), !!(super.optimizeNames(l, w2) || this.else)) + return this.condition = V(this.condition, l, w2), this; + } + get names() { + const l = super.names; + return H(l, this.condition), this.else && U(l, this.else.names), l; + } + } + $.kind = "if"; + class N2 extends R { + } + N2.kind = "for"; + class D2 extends N2 { + constructor(l) { + super(), this.iteration = l; + } + render(l) { + return `for(${this.iteration})` + super.render(l); + } + optimizeNames(l, w2) { + if (super.optimizeNames(l, w2)) + return this.iteration = V(this.iteration, l, w2), this; + } + get names() { + return U(super.names, this.iteration.names); + } + } + class t extends N2 { + constructor(l, w2, I, K) { + super(), this.varKind = l, this.name = w2, this.from = I, this.to = K; + } + render(l) { + const w2 = l.es5 ? n.varKinds.var : this.varKind, { name: I, from: K, to: W } = this; + return `for(${w2} ${I}=${K}; ${I}<${W}; ${I}++)` + super.render(l); + } + get names() { + const l = H(super.names, this.from); + return H(l, this.to); + } + } + class u2 extends N2 { + constructor(l, w2, I, K) { + super(), this.loop = l, this.varKind = w2, this.name = I, this.iterable = K; + } + render(l) { + return `for(${this.varKind} ${this.name} ${this.loop} ${this.iterable})` + super.render(l); + } + optimizeNames(l, w2) { + if (super.optimizeNames(l, w2)) + return this.iterable = V(this.iterable, l, w2), this; + } + get names() { + return U(super.names, this.iterable.names); + } + } + class s extends R { + constructor(l, w2, I) { + super(), this.name = l, this.args = w2, this.async = I; + } + render(l) { + return `${this.async ? "async " : ""}function ${this.name}(${this.args})` + super.render(l); + } + } + s.kind = "func"; + class i2 extends L { + render(l) { + return "return " + super.render(l); + } + } + i2.kind = "return"; + class c extends R { + render(l) { + let w2 = "try" + super.render(l); + return this.catch && (w2 += this.catch.render(l)), this.finally && (w2 += this.finally.render(l)), w2; + } + optimizeNodes() { + var l, w2; + return super.optimizeNodes(), (l = this.catch) === null || l === void 0 || l.optimizeNodes(), (w2 = this.finally) === null || w2 === void 0 || w2.optimizeNodes(), this; + } + optimizeNames(l, w2) { + var I, K; + return super.optimizeNames(l, w2), (I = this.catch) === null || I === void 0 || I.optimizeNames(l, w2), (K = this.finally) === null || K === void 0 || K.optimizeNames(l, w2), this; + } + get names() { + const l = super.names; + return this.catch && U(l, this.catch.names), this.finally && U(l, this.finally.names), l; + } + } + class m extends R { + constructor(l) { + super(), this.error = l; + } + render(l) { + return `catch(${this.error})` + super.render(l); + } + } + m.kind = "catch"; + class h2 extends R { + render(l) { + return "finally" + super.render(l); + } + } + h2.kind = "finally"; + class C { + constructor(l, w2 = {}) { + this._values = {}, this._blockStarts = [], this._constants = {}, this.opts = { ...w2, _n: w2.lines ? ` +` : "" }, this._extScope = l, this._scope = new n.Scope({ parent: l }), this._nodes = [new j()]; + } + toString() { + return this._root.render(this.opts); + } + // returns unique name in the internal scope + name(l) { + return this._scope.name(l); + } + // reserves unique name in the external scope + scopeName(l) { + return this._extScope.name(l); + } + // reserves unique name in the external scope and assigns value to it + scopeValue(l, w2) { + const I = this._extScope.value(l, w2); + return (this._values[I.prefix] || (this._values[I.prefix] = /* @__PURE__ */ new Set())).add(I), I; + } + getScopeValue(l, w2) { + return this._extScope.getValue(l, w2); + } + // return code that assigns values in the external scope to the names that are used internally + // (same names that were returned by gen.scopeName or gen.scopeValue) + scopeRefs(l) { + return this._extScope.scopeRefs(l, this._values); + } + scopeCode() { + return this._extScope.scopeCode(this._values); + } + _def(l, w2, I, K) { + const W = this._scope.toName(w2); + return I !== void 0 && K && (this._constants[W.str] = I), this._leafNode(new p(l, W, I)), W; + } + // `const` declaration (`var` in es5 mode) + const(l, w2, I) { + return this._def(n.varKinds.const, l, w2, I); + } + // `let` declaration with optional assignment (`var` in es5 mode) + let(l, w2, I) { + return this._def(n.varKinds.let, l, w2, I); + } + // `var` declaration with optional assignment + var(l, w2, I) { + return this._def(n.varKinds.var, l, w2, I); + } + // assignment code + assign(l, w2, I) { + return this._leafNode(new y(l, w2, I)); + } + // `+=` code + add(l, w2) { + return this._leafNode(new b(l, e2.operators.ADD, w2)); + } + // appends passed SafeExpr to code or executes Block + code(l) { + return typeof l == "function" ? l() : l !== r3.nil && this._leafNode(new z(l)), this; + } + // returns code for object literal for the passed argument list of key-value pairs + object(...l) { + const w2 = ["{"]; + for (const [I, K] of l) + w2.length > 1 && w2.push(","), w2.push(I), (I !== K || this.opts.es5) && (w2.push(":"), (0, r3.addCodeArg)(w2, K)); + return w2.push("}"), new r3._Code(w2); + } + // `if` clause (or statement if `thenBody` and, optionally, `elseBody` are passed) + if(l, w2, I) { + if (this._blockNode(new $(l)), w2 && I) + this.code(w2).else().code(I).endIf(); + else if (w2) + this.code(w2).endIf(); + else if (I) + throw new Error('CodeGen: "else" body without "then" body'); + return this; + } + // `else if` clause - invalid without `if` or after `else` clauses + elseIf(l) { + return this._elseNode(new $(l)); + } + // `else` clause - only valid after `if` or `else if` clauses + else() { + return this._elseNode(new T()); + } + // end `if` statement (needed if gen.if was used only with condition) + endIf() { + return this._endBlockNode($, T); + } + _for(l, w2) { + return this._blockNode(l), w2 && this.code(w2).endFor(), this; + } + // a generic `for` clause (or statement if `forBody` is passed) + for(l, w2) { + return this._for(new D2(l), w2); + } + // `for` statement for a range of values + forRange(l, w2, I, K, W = this.opts.es5 ? n.varKinds.var : n.varKinds.let) { + const re = this._scope.toName(l); + return this._for(new t(W, re, w2, I), () => K(re)); + } + // `for-of` statement (in es5 mode replace with a normal for loop) + forOf(l, w2, I, K = n.varKinds.const) { + const W = this._scope.toName(l); + if (this.opts.es5) { + const re = w2 instanceof r3.Name ? w2 : this.var("_arr", w2); + return this.forRange("_i", 0, (0, r3._)`${re}.length`, (ae) => { + this.var(W, (0, r3._)`${re}[${ae}]`), I(W); + }); + } + return this._for(new u2("of", K, W, w2), () => I(W)); + } + // `for-in` statement. + // With option `ownProperties` replaced with a `for-of` loop for object keys + forIn(l, w2, I, K = this.opts.es5 ? n.varKinds.var : n.varKinds.const) { + if (this.opts.ownProperties) + return this.forOf(l, (0, r3._)`Object.keys(${w2})`, I); + const W = this._scope.toName(l); + return this._for(new u2("in", K, W, w2), () => I(W)); + } + // end `for` loop + endFor() { + return this._endBlockNode(N2); + } + // `label` statement + label(l) { + return this._leafNode(new v(l)); + } + // `break` statement + break(l) { + return this._leafNode(new g2(l)); + } + // `return` statement + return(l) { + const w2 = new i2(); + if (this._blockNode(w2), this.code(l), w2.nodes.length !== 1) + throw new Error('CodeGen: "return" should have one node'); + return this._endBlockNode(i2); + } + // `try` statement + try(l, w2, I) { + if (!w2 && !I) + throw new Error('CodeGen: "try" without "catch" and "finally"'); + const K = new c(); + if (this._blockNode(K), this.code(l), w2) { + const W = this.name("e"); + this._currNode = K.catch = new m(W), w2(W); + } + return I && (this._currNode = K.finally = new h2(), this.code(I)), this._endBlockNode(m, h2); + } + // `throw` statement + throw(l) { + return this._leafNode(new S(l)); + } + // start self-balancing block + block(l, w2) { + return this._blockStarts.push(this._nodes.length), l && this.code(l).endBlock(w2), this; + } + // end the current self-balancing block + endBlock(l) { + const w2 = this._blockStarts.pop(); + if (w2 === void 0) + throw new Error("CodeGen: not in self-balancing block"); + const I = this._nodes.length - w2; + if (I < 0 || l !== void 0 && I !== l) + throw new Error(`CodeGen: wrong number of nodes: ${I} vs ${l} expected`); + return this._nodes.length = w2, this; + } + // `function` heading (or definition if funcBody is passed) + func(l, w2 = r3.nil, I, K) { + return this._blockNode(new s(l, w2, I)), K && this.code(K).endFunc(), this; + } + // end function definition + endFunc() { + return this._endBlockNode(s); + } + optimize(l = 1) { + for (; l-- > 0; ) + this._root.optimizeNodes(), this._root.optimizeNames(this._root.names, this._constants); + } + _leafNode(l) { + return this._currNode.nodes.push(l), this; + } + _blockNode(l) { + this._currNode.nodes.push(l), this._nodes.push(l); + } + _endBlockNode(l, w2) { + const I = this._currNode; + if (I instanceof l || w2 && I instanceof w2) + return this._nodes.pop(), this; + throw new Error(`CodeGen: not in block "${w2 ? `${l.kind}/${w2.kind}` : l.kind}"`); + } + _elseNode(l) { + const w2 = this._currNode; + if (!(w2 instanceof $)) + throw new Error('CodeGen: "else" without "if"'); + return this._currNode = w2.else = l, this; + } + get _root() { + return this._nodes[0]; + } + get _currNode() { + const l = this._nodes; + return l[l.length - 1]; + } + set _currNode(l) { + const w2 = this._nodes; + w2[w2.length - 1] = l; + } + } + e2.CodeGen = C; + function U(O, l) { + for (const w2 in l) + O[w2] = (O[w2] || 0) + (l[w2] || 0); + return O; + } + function H(O, l) { + return l instanceof r3._CodeOrName ? U(O, l.names) : O; + } + function V(O, l, w2) { + if (O instanceof r3.Name) + return I(O); + if (!K(O)) + return O; + return new r3._Code(O._items.reduce((W, re) => (re instanceof r3.Name && (re = I(re)), re instanceof r3._Code ? W.push(...re._items) : W.push(re), W), [])); + function I(W) { + const re = w2[W.str]; + return re === void 0 || l[W.str] !== 1 ? W : (delete l[W.str], re); + } + function K(W) { + return W instanceof r3._Code && W._items.some((re) => re instanceof r3.Name && l[re.str] === 1 && w2[re.str] !== void 0); + } + } + function G(O, l) { + for (const w2 in l) + O[w2] = (O[w2] || 0) - (l[w2] || 0); + } + function _2(O) { + return typeof O == "boolean" || typeof O == "number" || O === null ? !O : (0, r3._)`!${F(O)}`; + } + e2.not = _2; + const q = k(e2.operators.AND); + function J(...O) { + return O.reduce(q); + } + e2.and = J; + const Z = k(e2.operators.OR); + function B(...O) { + return O.reduce(Z); + } + e2.or = B; + function k(O) { + return (l, w2) => l === r3.nil ? w2 : w2 === r3.nil ? l : (0, r3._)`${F(l)} ${O} ${F(w2)}`; + } + function F(O) { + return O instanceof r3.Name ? O : (0, r3._)`(${O})`; + } +})(se); +var ie = {}; +(function(e2) { + Object.defineProperty(e2, "__esModule", { value: true }), e2.checkStrictMode = e2.getErrorPath = e2.Type = e2.useFunc = e2.setEvaluated = e2.evaluatedPropsToName = e2.mergeEvaluated = e2.eachItem = e2.unescapeJsonPointer = e2.escapeJsonPointer = e2.escapeFragment = e2.unescapeFragment = e2.schemaRefOrVal = e2.schemaHasRulesButRef = e2.schemaHasRules = e2.checkUnknownRules = e2.alwaysValidSchema = e2.toHash = void 0; + const r3 = se, n = et; + function a(s) { + const i2 = {}; + for (const c of s) + i2[c] = true; + return i2; + } + e2.toHash = a; + function d(s, i2) { + return typeof i2 == "boolean" ? i2 : Object.keys(i2).length === 0 ? true : (o2(s, i2), !p(i2, s.self.RULES.all)); + } + e2.alwaysValidSchema = d; + function o2(s, i2 = s.schema) { + const { opts: c, self: m } = s; + if (!c.strictSchema || typeof i2 == "boolean") + return; + const h2 = m.RULES.keywords; + for (const C in i2) + h2[C] || u2(s, `unknown keyword: "${C}"`); + } + e2.checkUnknownRules = o2; + function p(s, i2) { + if (typeof s == "boolean") + return !s; + for (const c in s) + if (i2[c]) + return true; + return false; + } + e2.schemaHasRules = p; + function y(s, i2) { + if (typeof s == "boolean") + return !s; + for (const c in s) + if (c !== "$ref" && i2.all[c]) + return true; + return false; + } + e2.schemaHasRulesButRef = y; + function b({ topSchemaRef: s, schemaPath: i2 }, c, m, h2) { + if (!h2) { + if (typeof c == "number" || typeof c == "boolean") + return c; + if (typeof c == "string") + return (0, r3._)`${c}`; + } + return (0, r3._)`${s}${i2}${(0, r3.getProperty)(m)}`; + } + e2.schemaRefOrVal = b; + function v(s) { + return z(decodeURIComponent(s)); + } + e2.unescapeFragment = v; + function g2(s) { + return encodeURIComponent(S(s)); + } + e2.escapeFragment = g2; + function S(s) { + return typeof s == "number" ? `${s}` : s.replace(/~/g, "~0").replace(/\//g, "~1"); + } + e2.escapeJsonPointer = S; + function z(s) { + return s.replace(/~1/g, "/").replace(/~0/g, "~"); + } + e2.unescapeJsonPointer = z; + function L(s, i2) { + if (Array.isArray(s)) + for (const c of s) + i2(c); + else + i2(s); + } + e2.eachItem = L; + function R({ mergeNames: s, mergeToName: i2, mergeValues: c, resultToName: m }) { + return (h2, C, U, H) => { + const V = U === void 0 ? C : U instanceof r3.Name ? (C instanceof r3.Name ? s(h2, C, U) : i2(h2, C, U), U) : C instanceof r3.Name ? (i2(h2, U, C), C) : c(C, U); + return H === r3.Name && !(V instanceof r3.Name) ? m(h2, V) : V; + }; + } + e2.mergeEvaluated = { + props: R({ + mergeNames: (s, i2, c) => s.if((0, r3._)`${c} !== true && ${i2} !== undefined`, () => { + s.if((0, r3._)`${i2} === true`, () => s.assign(c, true), () => s.assign(c, (0, r3._)`${c} || {}`).code((0, r3._)`Object.assign(${c}, ${i2})`)); + }), + mergeToName: (s, i2, c) => s.if((0, r3._)`${c} !== true`, () => { + i2 === true ? s.assign(c, true) : (s.assign(c, (0, r3._)`${c} || {}`), T(s, c, i2)); + }), + mergeValues: (s, i2) => s === true ? true : { ...s, ...i2 }, + resultToName: j + }), + items: R({ + mergeNames: (s, i2, c) => s.if((0, r3._)`${c} !== true && ${i2} !== undefined`, () => s.assign(c, (0, r3._)`${i2} === true ? true : ${c} > ${i2} ? ${c} : ${i2}`)), + mergeToName: (s, i2, c) => s.if((0, r3._)`${c} !== true`, () => s.assign(c, i2 === true ? true : (0, r3._)`${c} > ${i2} ? ${c} : ${i2}`)), + mergeValues: (s, i2) => s === true ? true : Math.max(s, i2), + resultToName: (s, i2) => s.var("items", i2) + }) + }; + function j(s, i2) { + if (i2 === true) + return s.var("props", true); + const c = s.var("props", (0, r3._)`{}`); + return i2 !== void 0 && T(s, c, i2), c; + } + e2.evaluatedPropsToName = j; + function T(s, i2, c) { + Object.keys(c).forEach((m) => s.assign((0, r3._)`${i2}${(0, r3.getProperty)(m)}`, true)); + } + e2.setEvaluated = T; + const $ = {}; + function N2(s, i2) { + return s.scopeValue("func", { + ref: i2, + code: $[i2.code] || ($[i2.code] = new n._Code(i2.code)) + }); + } + e2.useFunc = N2; + var D2; + (function(s) { + s[s.Num = 0] = "Num", s[s.Str = 1] = "Str"; + })(D2 = e2.Type || (e2.Type = {})); + function t(s, i2, c) { + if (s instanceof r3.Name) { + const m = i2 === D2.Num; + return c ? m ? (0, r3._)`"[" + ${s} + "]"` : (0, r3._)`"['" + ${s} + "']"` : m ? (0, r3._)`"/" + ${s}` : (0, r3._)`"/" + ${s}.replace(/~/g, "~0").replace(/\\//g, "~1")`; + } + return c ? (0, r3.getProperty)(s).toString() : "/" + S(s); + } + e2.getErrorPath = t; + function u2(s, i2, c = s.opts.strictSchema) { + if (c) { + if (i2 = `strict mode: ${i2}`, c === true) + throw new Error(i2); + s.self.logger.warn(i2); + } + } + e2.checkStrictMode = u2; +})(ie); +var Qe = {}; +Object.defineProperty(Qe, "__esModule", { value: true }); +var Pe = se; +var Ss = { + // validation function arguments + data: new Pe.Name("data"), + // args passed from referencing schema + valCxt: new Pe.Name("valCxt"), + instancePath: new Pe.Name("instancePath"), + parentData: new Pe.Name("parentData"), + parentDataProperty: new Pe.Name("parentDataProperty"), + rootData: new Pe.Name("rootData"), + dynamicAnchors: new Pe.Name("dynamicAnchors"), + // function scoped variables + vErrors: new Pe.Name("vErrors"), + errors: new Pe.Name("errors"), + this: new Pe.Name("this"), + // "globals" + self: new Pe.Name("self"), + scope: new Pe.Name("scope"), + // JTD serialize/parse name for JSON string and position + json: new Pe.Name("json"), + jsonPos: new Pe.Name("jsonPos"), + jsonLen: new Pe.Name("jsonLen"), + jsonPart: new Pe.Name("jsonPart") +}; +Qe.default = Ss; +(function(e2) { + Object.defineProperty(e2, "__esModule", { value: true }), e2.extendErrors = e2.resetErrorsCount = e2.reportExtraError = e2.reportError = e2.keyword$DataError = e2.keywordError = void 0; + const r3 = se, n = ie, a = Qe; + e2.keywordError = { + message: ({ keyword: T }) => (0, r3.str)`must pass "${T}" keyword validation` + }, e2.keyword$DataError = { + message: ({ keyword: T, schemaType: $ }) => $ ? (0, r3.str)`"${T}" keyword must be ${$} ($data)` : (0, r3.str)`"${T}" keyword is invalid ($data)` + }; + function d(T, $ = e2.keywordError, N2, D2) { + const { it: t } = T, { gen: u2, compositeRule: s, allErrors: i2 } = t, c = S(T, $, N2); + D2 ?? (s || i2) ? b(u2, c) : v(t, (0, r3._)`[${c}]`); + } + e2.reportError = d; + function o2(T, $ = e2.keywordError, N2) { + const { it: D2 } = T, { gen: t, compositeRule: u2, allErrors: s } = D2, i2 = S(T, $, N2); + b(t, i2), u2 || s || v(D2, a.default.vErrors); + } + e2.reportExtraError = o2; + function p(T, $) { + T.assign(a.default.errors, $), T.if((0, r3._)`${a.default.vErrors} !== null`, () => T.if($, () => T.assign((0, r3._)`${a.default.vErrors}.length`, $), () => T.assign(a.default.vErrors, null))); + } + e2.resetErrorsCount = p; + function y({ gen: T, keyword: $, schemaValue: N2, data: D2, errsCount: t, it: u2 }) { + if (t === void 0) + throw new Error("ajv implementation error"); + const s = T.name("err"); + T.forRange("i", t, a.default.errors, (i2) => { + T.const(s, (0, r3._)`${a.default.vErrors}[${i2}]`), T.if((0, r3._)`${s}.instancePath === undefined`, () => T.assign((0, r3._)`${s}.instancePath`, (0, r3.strConcat)(a.default.instancePath, u2.errorPath))), T.assign((0, r3._)`${s}.schemaPath`, (0, r3.str)`${u2.errSchemaPath}/${$}`), u2.opts.verbose && (T.assign((0, r3._)`${s}.schema`, N2), T.assign((0, r3._)`${s}.data`, D2)); + }); + } + e2.extendErrors = y; + function b(T, $) { + const N2 = T.const("err", $); + T.if((0, r3._)`${a.default.vErrors} === null`, () => T.assign(a.default.vErrors, (0, r3._)`[${N2}]`), (0, r3._)`${a.default.vErrors}.push(${N2})`), T.code((0, r3._)`${a.default.errors}++`); + } + function v(T, $) { + const { gen: N2, validateName: D2, schemaEnv: t } = T; + t.$async ? N2.throw((0, r3._)`new ${T.ValidationError}(${$})`) : (N2.assign((0, r3._)`${D2}.errors`, $), N2.return(false)); + } + const g2 = { + keyword: new r3.Name("keyword"), + schemaPath: new r3.Name("schemaPath"), + params: new r3.Name("params"), + propertyName: new r3.Name("propertyName"), + message: new r3.Name("message"), + schema: new r3.Name("schema"), + parentSchema: new r3.Name("parentSchema") + }; + function S(T, $, N2) { + const { createErrors: D2 } = T.it; + return D2 === false ? (0, r3._)`{}` : z(T, $, N2); + } + function z(T, $, N2 = {}) { + const { gen: D2, it: t } = T, u2 = [ + L(t, N2), + R(T, N2) + ]; + return j(T, $, u2), D2.object(...u2); + } + function L({ errorPath: T }, { instancePath: $ }) { + const N2 = $ ? (0, r3.str)`${T}${(0, n.getErrorPath)($, n.Type.Str)}` : T; + return [a.default.instancePath, (0, r3.strConcat)(a.default.instancePath, N2)]; + } + function R({ keyword: T, it: { errSchemaPath: $ } }, { schemaPath: N2, parentSchema: D2 }) { + let t = D2 ? $ : (0, r3.str)`${$}/${T}`; + return N2 && (t = (0, r3.str)`${t}${(0, n.getErrorPath)(N2, n.Type.Str)}`), [g2.schemaPath, t]; + } + function j(T, { params: $, message: N2 }, D2) { + const { keyword: t, data: u2, schemaValue: s, it: i2 } = T, { opts: c, propertyName: m, topSchemaRef: h2, schemaPath: C } = i2; + D2.push([g2.keyword, t], [g2.params, typeof $ == "function" ? $(T) : $ || (0, r3._)`{}`]), c.messages && D2.push([g2.message, typeof N2 == "function" ? N2(T) : N2]), c.verbose && D2.push([g2.schema, s], [g2.parentSchema, (0, r3._)`${h2}${C}`], [a.default.data, u2]), m && D2.push([g2.propertyName, m]); + } +})(rt); +Object.defineProperty(Ar, "__esModule", { value: true }); +Ar.boolOrEmptySchema = Ar.topBoolOrEmptySchema = void 0; +var Cs = rt; +var Ts = se; +var js = Qe; +var Ns = { + message: "boolean schema is false" +}; +function Os(e2) { + const { gen: r3, schema: n, validateName: a } = e2; + n === false ? Pn(e2, false) : typeof n == "object" && n.$async === true ? r3.return(js.default.data) : (r3.assign((0, Ts._)`${a}.errors`, null), r3.return(true)); +} +Ar.topBoolOrEmptySchema = Os; +function Rs(e2, r3) { + const { gen: n, schema: a } = e2; + a === false ? (n.var(r3, false), Pn(e2)) : n.var(r3, true); +} +Ar.boolOrEmptySchema = Rs; +function Pn(e2, r3) { + const { gen: n, data: a } = e2, d = { + gen: n, + keyword: "false schema", + data: a, + schema: false, + schemaCode: false, + schemaValue: false, + params: {}, + it: e2 + }; + (0, Cs.reportError)(d, Ns, void 0, r3); +} +var tt = {}; +var vr = {}; +Object.defineProperty(vr, "__esModule", { value: true }); +vr.getRules = vr.isJSONType = void 0; +var As = ["string", "number", "integer", "boolean", "null", "object", "array"]; +var Is = new Set(As); +function Ms(e2) { + return typeof e2 == "string" && Is.has(e2); +} +vr.isJSONType = Ms; +function Ds() { + const e2 = { + number: { type: "number", rules: [] }, + string: { type: "string", rules: [] }, + array: { type: "array", rules: [] }, + object: { type: "object", rules: [] } + }; + return { + types: { ...e2, integer: true, boolean: true, null: true }, + rules: [{ rules: [] }, e2.number, e2.string, e2.array, e2.object], + post: { rules: [] }, + all: {}, + keywords: {} + }; +} +vr.getRules = Ds; +var rr = {}; +Object.defineProperty(rr, "__esModule", { value: true }); +rr.shouldUseRule = rr.shouldUseGroup = rr.schemaHasRulesForType = void 0; +function Ls({ schema: e2, self: r3 }, n) { + const a = r3.RULES.types[n]; + return a && a !== true && Sn(e2, a); +} +rr.schemaHasRulesForType = Ls; +function Sn(e2, r3) { + return r3.rules.some((n) => Cn(e2, n)); +} +rr.shouldUseGroup = Sn; +function Cn(e2, r3) { + var n; + return e2[r3.keyword] !== void 0 || ((n = r3.definition.implements) === null || n === void 0 ? void 0 : n.some((a) => e2[a] !== void 0)); +} +rr.shouldUseRule = Cn; +(function(e2) { + Object.defineProperty(e2, "__esModule", { value: true }), e2.reportTypeError = e2.checkDataTypes = e2.checkDataType = e2.coerceAndCheckDataType = e2.getJSONTypes = e2.getSchemaTypes = e2.DataType = void 0; + const r3 = vr, n = rr, a = rt, d = se, o2 = ie; + var p; + (function(D2) { + D2[D2.Correct = 0] = "Correct", D2[D2.Wrong = 1] = "Wrong"; + })(p = e2.DataType || (e2.DataType = {})); + function y(D2) { + const t = b(D2.type); + if (t.includes("null")) { + if (D2.nullable === false) + throw new Error("type: null contradicts nullable: false"); + } else { + if (!t.length && D2.nullable !== void 0) + throw new Error('"nullable" cannot be used without "type"'); + D2.nullable === true && t.push("null"); + } + return t; + } + e2.getSchemaTypes = y; + function b(D2) { + const t = Array.isArray(D2) ? D2 : D2 ? [D2] : []; + if (t.every(r3.isJSONType)) + return t; + throw new Error("type must be JSONType or JSONType[]: " + t.join(",")); + } + e2.getJSONTypes = b; + function v(D2, t) { + const { gen: u2, data: s, opts: i2 } = D2, c = S(t, i2.coerceTypes), m = t.length > 0 && !(c.length === 0 && t.length === 1 && (0, n.schemaHasRulesForType)(D2, t[0])); + if (m) { + const h2 = j(t, s, i2.strictNumbers, p.Wrong); + u2.if(h2, () => { + c.length ? z(D2, t, c) : $(D2); + }); + } + return m; + } + e2.coerceAndCheckDataType = v; + const g2 = /* @__PURE__ */ new Set(["string", "number", "integer", "boolean", "null"]); + function S(D2, t) { + return t ? D2.filter((u2) => g2.has(u2) || t === "array" && u2 === "array") : []; + } + function z(D2, t, u2) { + const { gen: s, data: i2, opts: c } = D2, m = s.let("dataType", (0, d._)`typeof ${i2}`), h2 = s.let("coerced", (0, d._)`undefined`); + c.coerceTypes === "array" && s.if((0, d._)`${m} == 'object' && Array.isArray(${i2}) && ${i2}.length == 1`, () => s.assign(i2, (0, d._)`${i2}[0]`).assign(m, (0, d._)`typeof ${i2}`).if(j(t, i2, c.strictNumbers), () => s.assign(h2, i2))), s.if((0, d._)`${h2} !== undefined`); + for (const U of u2) + (g2.has(U) || U === "array" && c.coerceTypes === "array") && C(U); + s.else(), $(D2), s.endIf(), s.if((0, d._)`${h2} !== undefined`, () => { + s.assign(i2, h2), L(D2, h2); + }); + function C(U) { + switch (U) { + case "string": + s.elseIf((0, d._)`${m} == "number" || ${m} == "boolean"`).assign(h2, (0, d._)`"" + ${i2}`).elseIf((0, d._)`${i2} === null`).assign(h2, (0, d._)`""`); + return; + case "number": + s.elseIf((0, d._)`${m} == "boolean" || ${i2} === null + || (${m} == "string" && ${i2} && ${i2} == +${i2})`).assign(h2, (0, d._)`+${i2}`); + return; + case "integer": + s.elseIf((0, d._)`${m} === "boolean" || ${i2} === null + || (${m} === "string" && ${i2} && ${i2} == +${i2} && !(${i2} % 1))`).assign(h2, (0, d._)`+${i2}`); + return; + case "boolean": + s.elseIf((0, d._)`${i2} === "false" || ${i2} === 0 || ${i2} === null`).assign(h2, false).elseIf((0, d._)`${i2} === "true" || ${i2} === 1`).assign(h2, true); + return; + case "null": + s.elseIf((0, d._)`${i2} === "" || ${i2} === 0 || ${i2} === false`), s.assign(h2, null); + return; + case "array": + s.elseIf((0, d._)`${m} === "string" || ${m} === "number" + || ${m} === "boolean" || ${i2} === null`).assign(h2, (0, d._)`[${i2}]`); + } + } + } + function L({ gen: D2, parentData: t, parentDataProperty: u2 }, s) { + D2.if((0, d._)`${t} !== undefined`, () => D2.assign((0, d._)`${t}[${u2}]`, s)); + } + function R(D2, t, u2, s = p.Correct) { + const i2 = s === p.Correct ? d.operators.EQ : d.operators.NEQ; + let c; + switch (D2) { + case "null": + return (0, d._)`${t} ${i2} null`; + case "array": + c = (0, d._)`Array.isArray(${t})`; + break; + case "object": + c = (0, d._)`${t} && typeof ${t} == "object" && !Array.isArray(${t})`; + break; + case "integer": + c = m((0, d._)`!(${t} % 1) && !isNaN(${t})`); + break; + case "number": + c = m(); + break; + default: + return (0, d._)`typeof ${t} ${i2} ${D2}`; + } + return s === p.Correct ? c : (0, d.not)(c); + function m(h2 = d.nil) { + return (0, d.and)((0, d._)`typeof ${t} == "number"`, h2, u2 ? (0, d._)`isFinite(${t})` : d.nil); + } + } + e2.checkDataType = R; + function j(D2, t, u2, s) { + if (D2.length === 1) + return R(D2[0], t, u2, s); + let i2; + const c = (0, o2.toHash)(D2); + if (c.array && c.object) { + const m = (0, d._)`typeof ${t} != "object"`; + i2 = c.null ? m : (0, d._)`!${t} || ${m}`, delete c.null, delete c.array, delete c.object; + } else + i2 = d.nil; + c.number && delete c.integer; + for (const m in c) + i2 = (0, d.and)(i2, R(m, t, u2, s)); + return i2; + } + e2.checkDataTypes = j; + const T = { + message: ({ schema: D2 }) => `must be ${D2}`, + params: ({ schema: D2, schemaValue: t }) => typeof D2 == "string" ? (0, d._)`{type: ${D2}}` : (0, d._)`{type: ${t}}` + }; + function $(D2) { + const t = N2(D2); + (0, a.reportError)(t, T); + } + e2.reportTypeError = $; + function N2(D2) { + const { gen: t, data: u2, schema: s } = D2, i2 = (0, o2.schemaRefOrVal)(D2, s, "type"); + return { + gen: t, + keyword: "type", + data: u2, + schema: s.type, + schemaCode: i2, + schemaValue: i2, + parentSchema: s, + params: {}, + it: D2 + }; + } +})(tt); +var Ot = {}; +Object.defineProperty(Ot, "__esModule", { value: true }); +Ot.assignDefaults = void 0; +var Sr = se; +var zs = ie; +function Vs(e2, r3) { + const { properties: n, items: a } = e2.schema; + if (r3 === "object" && n) + for (const d in n) + Ja(e2, d, n[d].default); + else + r3 === "array" && Array.isArray(a) && a.forEach((d, o2) => Ja(e2, o2, d.default)); +} +Ot.assignDefaults = Vs; +function Ja(e2, r3, n) { + const { gen: a, compositeRule: d, data: o2, opts: p } = e2; + if (n === void 0) + return; + const y = (0, Sr._)`${o2}${(0, Sr.getProperty)(r3)}`; + if (d) { + (0, zs.checkStrictMode)(e2, `default is ignored for: ${y}`); + return; + } + let b = (0, Sr._)`${y} === undefined`; + p.useDefaults === "empty" && (b = (0, Sr._)`${b} || ${y} === null || ${y} === ""`), a.if(b, (0, Sr._)`${y} = ${(0, Sr.stringify)(n)}`); +} +var Xe = {}; +var ne = {}; +Object.defineProperty(ne, "__esModule", { value: true }); +ne.validateUnion = ne.validateArray = ne.usePattern = ne.callValidateCode = ne.schemaProperties = ne.allSchemaProperties = ne.noPropertyInData = ne.propertyInData = ne.isOwnProperty = ne.hasPropFunc = ne.reportMissingProp = ne.checkMissingProp = ne.checkReportMissingProp = void 0; +var pe = se; +var Yt = ie; +var nr = Qe; +var Fs = ie; +function Us(e2, r3) { + const { gen: n, data: a, it: d } = e2; + n.if(Qt(n, a, r3, d.opts.ownProperties), () => { + e2.setParams({ missingProperty: (0, pe._)`${r3}` }, true), e2.error(); + }); +} +ne.checkReportMissingProp = Us; +function Bs({ gen: e2, data: r3, it: { opts: n } }, a, d) { + return (0, pe.or)(...a.map((o2) => (0, pe.and)(Qt(e2, r3, o2, n.ownProperties), (0, pe._)`${d} = ${o2}`))); +} +ne.checkMissingProp = Bs; +function Hs(e2, r3) { + e2.setParams({ missingProperty: r3 }, true), e2.error(); +} +ne.reportMissingProp = Hs; +function Tn(e2) { + return e2.scopeValue("func", { + // eslint-disable-next-line @typescript-eslint/unbound-method + ref: Object.prototype.hasOwnProperty, + code: (0, pe._)`Object.prototype.hasOwnProperty` + }); +} +ne.hasPropFunc = Tn; +function Xt(e2, r3, n) { + return (0, pe._)`${Tn(e2)}.call(${r3}, ${n})`; +} +ne.isOwnProperty = Xt; +function qs(e2, r3, n, a) { + const d = (0, pe._)`${r3}${(0, pe.getProperty)(n)} !== undefined`; + return a ? (0, pe._)`${d} && ${Xt(e2, r3, n)}` : d; +} +ne.propertyInData = qs; +function Qt(e2, r3, n, a) { + const d = (0, pe._)`${r3}${(0, pe.getProperty)(n)} === undefined`; + return a ? (0, pe.or)(d, (0, pe.not)(Xt(e2, r3, n))) : d; +} +ne.noPropertyInData = Qt; +function jn(e2) { + return e2 ? Object.keys(e2).filter((r3) => r3 !== "__proto__") : []; +} +ne.allSchemaProperties = jn; +function Gs(e2, r3) { + return jn(r3).filter((n) => !(0, Yt.alwaysValidSchema)(e2, r3[n])); +} +ne.schemaProperties = Gs; +function Ks({ schemaCode: e2, data: r3, it: { gen: n, topSchemaRef: a, schemaPath: d, errorPath: o2 }, it: p }, y, b, v) { + const g2 = v ? (0, pe._)`${e2}, ${r3}, ${a}${d}` : r3, S = [ + [nr.default.instancePath, (0, pe.strConcat)(nr.default.instancePath, o2)], + [nr.default.parentData, p.parentData], + [nr.default.parentDataProperty, p.parentDataProperty], + [nr.default.rootData, nr.default.rootData] + ]; + p.opts.dynamicRef && S.push([nr.default.dynamicAnchors, nr.default.dynamicAnchors]); + const z = (0, pe._)`${g2}, ${n.object(...S)}`; + return b !== pe.nil ? (0, pe._)`${y}.call(${b}, ${z})` : (0, pe._)`${y}(${z})`; +} +ne.callValidateCode = Ks; +var Ws = (0, pe._)`new RegExp`; +function Js({ gen: e2, it: { opts: r3 } }, n) { + const a = r3.unicodeRegExp ? "u" : "", { regExp: d } = r3.code, o2 = d(n, a); + return e2.scopeValue("pattern", { + key: o2.toString(), + ref: o2, + code: (0, pe._)`${d.code === "new RegExp" ? Ws : (0, Fs.useFunc)(e2, d)}(${n}, ${a})` + }); +} +ne.usePattern = Js; +function Zs(e2) { + const { gen: r3, data: n, keyword: a, it: d } = e2, o2 = r3.name("valid"); + if (d.allErrors) { + const y = r3.let("valid", true); + return p(() => r3.assign(y, false)), y; + } + return r3.var(o2, true), p(() => r3.break()), o2; + function p(y) { + const b = r3.const("len", (0, pe._)`${n}.length`); + r3.forRange("i", 0, b, (v) => { + e2.subschema({ + keyword: a, + dataProp: v, + dataPropType: Yt.Type.Num + }, o2), r3.if((0, pe.not)(o2), y); + }); + } +} +ne.validateArray = Zs; +function Ys(e2) { + const { gen: r3, schema: n, keyword: a, it: d } = e2; + if (!Array.isArray(n)) + throw new Error("ajv implementation error"); + if (n.some((b) => (0, Yt.alwaysValidSchema)(d, b)) && !d.opts.unevaluated) + return; + const p = r3.let("valid", false), y = r3.name("_valid"); + r3.block(() => n.forEach((b, v) => { + const g2 = e2.subschema({ + keyword: a, + schemaProp: v, + compositeRule: true + }, y); + r3.assign(p, (0, pe._)`${p} || ${y}`), e2.mergeValidEvaluated(g2, y) || r3.if((0, pe.not)(p)); + })), e2.result(p, () => e2.reset(), () => e2.error(true)); +} +ne.validateUnion = Ys; +Object.defineProperty(Xe, "__esModule", { value: true }); +Xe.validateKeywordUsage = Xe.validSchemaType = Xe.funcKeywordCode = Xe.macroKeywordCode = void 0; +var Ce = se; +var mr = Qe; +var Xs = ne; +var Qs = rt; +function xs(e2, r3) { + const { gen: n, keyword: a, schema: d, parentSchema: o2, it: p } = e2, y = r3.macro.call(p.self, d, o2, p), b = Nn(n, a, y); + p.opts.validateSchema !== false && p.self.validateSchema(y, true); + const v = n.name("valid"); + e2.subschema({ + schema: y, + schemaPath: Ce.nil, + errSchemaPath: `${p.errSchemaPath}/${a}`, + topSchemaRef: b, + compositeRule: true + }, v), e2.pass(v, () => e2.error(true)); +} +Xe.macroKeywordCode = xs; +function eu(e2, r3) { + var n; + const { gen: a, keyword: d, schema: o2, parentSchema: p, $data: y, it: b } = e2; + tu(b, r3); + const v = !y && r3.compile ? r3.compile.call(b.self, o2, p, b) : r3.validate, g2 = Nn(a, d, v), S = a.let("valid"); + e2.block$data(S, z), e2.ok((n = r3.valid) !== null && n !== void 0 ? n : S); + function z() { + if (r3.errors === false) + j(), r3.modifying && Za(e2), T(() => e2.error()); + else { + const $ = r3.async ? L() : R(); + r3.modifying && Za(e2), T(() => ru(e2, $)); + } + } + function L() { + const $ = a.let("ruleErrs", null); + return a.try(() => j((0, Ce._)`await `), (N2) => a.assign(S, false).if((0, Ce._)`${N2} instanceof ${b.ValidationError}`, () => a.assign($, (0, Ce._)`${N2}.errors`), () => a.throw(N2))), $; + } + function R() { + const $ = (0, Ce._)`${g2}.errors`; + return a.assign($, null), j(Ce.nil), $; + } + function j($ = r3.async ? (0, Ce._)`await ` : Ce.nil) { + const N2 = b.opts.passContext ? mr.default.this : mr.default.self, D2 = !("compile" in r3 && !y || r3.schema === false); + a.assign(S, (0, Ce._)`${$}${(0, Xs.callValidateCode)(e2, g2, N2, D2)}`, r3.modifying); + } + function T($) { + var N2; + a.if((0, Ce.not)((N2 = r3.valid) !== null && N2 !== void 0 ? N2 : S), $); + } +} +Xe.funcKeywordCode = eu; +function Za(e2) { + const { gen: r3, data: n, it: a } = e2; + r3.if(a.parentData, () => r3.assign(n, (0, Ce._)`${a.parentData}[${a.parentDataProperty}]`)); +} +function ru(e2, r3) { + const { gen: n } = e2; + n.if((0, Ce._)`Array.isArray(${r3})`, () => { + n.assign(mr.default.vErrors, (0, Ce._)`${mr.default.vErrors} === null ? ${r3} : ${mr.default.vErrors}.concat(${r3})`).assign(mr.default.errors, (0, Ce._)`${mr.default.vErrors}.length`), (0, Qs.extendErrors)(e2); + }, () => e2.error()); +} +function tu({ schemaEnv: e2 }, r3) { + if (r3.async && !e2.$async) + throw new Error("async keyword in sync schema"); +} +function Nn(e2, r3, n) { + if (n === void 0) + throw new Error(`keyword "${r3}" failed to compile`); + return e2.scopeValue("keyword", typeof n == "function" ? { ref: n } : { ref: n, code: (0, Ce.stringify)(n) }); +} +function au(e2, r3, n = false) { + return !r3.length || r3.some((a) => a === "array" ? Array.isArray(e2) : a === "object" ? e2 && typeof e2 == "object" && !Array.isArray(e2) : typeof e2 == a || n && typeof e2 > "u"); +} +Xe.validSchemaType = au; +function nu({ schema: e2, opts: r3, self: n, errSchemaPath: a }, d, o2) { + if (Array.isArray(d.keyword) ? !d.keyword.includes(o2) : d.keyword !== o2) + throw new Error("ajv implementation error"); + const p = d.dependencies; + if (p != null && p.some((y) => !Object.prototype.hasOwnProperty.call(e2, y))) + throw new Error(`parent schema must have dependencies of ${o2}: ${p.join(",")}`); + if (d.validateSchema && !d.validateSchema(e2[o2])) { + const b = `keyword "${o2}" value is invalid at path "${a}": ` + n.errorsText(d.validateSchema.errors); + if (r3.validateSchema === "log") + n.logger.error(b); + else + throw new Error(b); + } +} +Xe.validateKeywordUsage = nu; +var ir = {}; +Object.defineProperty(ir, "__esModule", { value: true }); +ir.extendSubschemaMode = ir.extendSubschemaData = ir.getSubschema = void 0; +var Ye = se; +var On = ie; +function su(e2, { keyword: r3, schemaProp: n, schema: a, schemaPath: d, errSchemaPath: o2, topSchemaRef: p }) { + if (r3 !== void 0 && a !== void 0) + throw new Error('both "keyword" and "schema" passed, only one allowed'); + if (r3 !== void 0) { + const y = e2.schema[r3]; + return n === void 0 ? { + schema: y, + schemaPath: (0, Ye._)`${e2.schemaPath}${(0, Ye.getProperty)(r3)}`, + errSchemaPath: `${e2.errSchemaPath}/${r3}` + } : { + schema: y[n], + schemaPath: (0, Ye._)`${e2.schemaPath}${(0, Ye.getProperty)(r3)}${(0, Ye.getProperty)(n)}`, + errSchemaPath: `${e2.errSchemaPath}/${r3}/${(0, On.escapeFragment)(n)}` + }; + } + if (a !== void 0) { + if (d === void 0 || o2 === void 0 || p === void 0) + throw new Error('"schemaPath", "errSchemaPath" and "topSchemaRef" are required with "schema"'); + return { + schema: a, + schemaPath: d, + topSchemaRef: p, + errSchemaPath: o2 + }; + } + throw new Error('either "keyword" or "schema" must be passed'); +} +ir.getSubschema = su; +function uu(e2, r3, { dataProp: n, dataPropType: a, data: d, dataTypes: o2, propertyName: p }) { + if (d !== void 0 && n !== void 0) + throw new Error('both "data" and "dataProp" passed, only one allowed'); + const { gen: y } = r3; + if (n !== void 0) { + const { errorPath: v, dataPathArr: g2, opts: S } = r3, z = y.let("data", (0, Ye._)`${r3.data}${(0, Ye.getProperty)(n)}`, true); + b(z), e2.errorPath = (0, Ye.str)`${v}${(0, On.getErrorPath)(n, a, S.jsPropertySyntax)}`, e2.parentDataProperty = (0, Ye._)`${n}`, e2.dataPathArr = [...g2, e2.parentDataProperty]; + } + if (d !== void 0) { + const v = d instanceof Ye.Name ? d : y.let("data", d, true); + b(v), p !== void 0 && (e2.propertyName = p); + } + o2 && (e2.dataTypes = o2); + function b(v) { + e2.data = v, e2.dataLevel = r3.dataLevel + 1, e2.dataTypes = [], r3.definedProperties = /* @__PURE__ */ new Set(), e2.parentData = r3.data, e2.dataNames = [...r3.dataNames, v]; + } +} +ir.extendSubschemaData = uu; +function du(e2, { jtdDiscriminator: r3, jtdMetadata: n, compositeRule: a, createErrors: d, allErrors: o2 }) { + a !== void 0 && (e2.compositeRule = a), d !== void 0 && (e2.createErrors = d), o2 !== void 0 && (e2.allErrors = o2), e2.jtdDiscriminator = r3, e2.jtdMetadata = n; +} +ir.extendSubschemaMode = du; +var ke = {}; +var Rn = function e(r3, n) { + if (r3 === n) + return true; + if (r3 && n && typeof r3 == "object" && typeof n == "object") { + if (r3.constructor !== n.constructor) + return false; + var a, d, o2; + if (Array.isArray(r3)) { + if (a = r3.length, a != n.length) + return false; + for (d = a; d-- !== 0; ) + if (!e(r3[d], n[d])) + return false; + return true; + } + if (r3.constructor === RegExp) + return r3.source === n.source && r3.flags === n.flags; + if (r3.valueOf !== Object.prototype.valueOf) + return r3.valueOf() === n.valueOf(); + if (r3.toString !== Object.prototype.toString) + return r3.toString() === n.toString(); + if (o2 = Object.keys(r3), a = o2.length, a !== Object.keys(n).length) + return false; + for (d = a; d-- !== 0; ) + if (!Object.prototype.hasOwnProperty.call(n, o2[d])) + return false; + for (d = a; d-- !== 0; ) { + var p = o2[d]; + if (!e(r3[p], n[p])) + return false; + } + return true; + } + return r3 !== r3 && n !== n; +}; +var Ht = {}; +var iu = { + get exports() { + return Ht; + }, + set exports(e2) { + Ht = e2; + } +}; +var dr = iu.exports = function(e2, r3, n) { + typeof r3 == "function" && (n = r3, r3 = {}), n = r3.cb || n; + var a = typeof n == "function" ? n : n.pre || function() { + }, d = n.post || function() { + }; + mt(r3, a, d, e2, "", e2); +}; +dr.keywords = { + additionalItems: true, + items: true, + contains: true, + additionalProperties: true, + propertyNames: true, + not: true, + if: true, + then: true, + else: true +}; +dr.arrayKeywords = { + items: true, + allOf: true, + anyOf: true, + oneOf: true +}; +dr.propsKeywords = { + $defs: true, + definitions: true, + properties: true, + patternProperties: true, + dependencies: true +}; +dr.skipKeywords = { + default: true, + enum: true, + const: true, + required: true, + maximum: true, + minimum: true, + exclusiveMaximum: true, + exclusiveMinimum: true, + multipleOf: true, + maxLength: true, + minLength: true, + pattern: true, + format: true, + maxItems: true, + minItems: true, + uniqueItems: true, + maxProperties: true, + minProperties: true +}; +function mt(e2, r3, n, a, d, o2, p, y, b, v) { + if (a && typeof a == "object" && !Array.isArray(a)) { + r3(a, d, o2, p, y, b, v); + for (var g2 in a) { + var S = a[g2]; + if (Array.isArray(S)) { + if (g2 in dr.arrayKeywords) + for (var z = 0; z < S.length; z++) + mt(e2, r3, n, S[z], d + "/" + g2 + "/" + z, o2, d, g2, a, z); + } else if (g2 in dr.propsKeywords) { + if (S && typeof S == "object") + for (var L in S) + mt(e2, r3, n, S[L], d + "/" + g2 + "/" + ou(L), o2, d, g2, a, L); + } else + (g2 in dr.keywords || e2.allKeys && !(g2 in dr.skipKeywords)) && mt(e2, r3, n, S, d + "/" + g2, o2, d, g2, a); + } + n(a, d, o2, p, y, b, v); + } +} +function ou(e2) { + return e2.replace(/~/g, "~0").replace(/\//g, "~1"); +} +Object.defineProperty(ke, "__esModule", { value: true }); +ke.getSchemaRefs = ke.resolveUrl = ke.normalizeId = ke._getFullPath = ke.getFullPath = ke.inlineRef = void 0; +var cu = ie; +var lu = Rn; +var fu = Ht; +var hu = /* @__PURE__ */ new Set([ + "type", + "format", + "pattern", + "maxLength", + "minLength", + "maxProperties", + "minProperties", + "maxItems", + "minItems", + "maximum", + "minimum", + "uniqueItems", + "multipleOf", + "required", + "enum", + "const" +]); +function pu(e2, r3 = true) { + return typeof e2 == "boolean" ? true : r3 === true ? !qt(e2) : r3 ? An(e2) <= r3 : false; +} +ke.inlineRef = pu; +var mu = /* @__PURE__ */ new Set([ + "$ref", + "$recursiveRef", + "$recursiveAnchor", + "$dynamicRef", + "$dynamicAnchor" +]); +function qt(e2) { + for (const r3 in e2) { + if (mu.has(r3)) + return true; + const n = e2[r3]; + if (Array.isArray(n) && n.some(qt) || typeof n == "object" && qt(n)) + return true; + } + return false; +} +function An(e2) { + let r3 = 0; + for (const n in e2) { + if (n === "$ref") + return 1 / 0; + if (r3++, !hu.has(n) && (typeof e2[n] == "object" && (0, cu.eachItem)(e2[n], (a) => r3 += An(a)), r3 === 1 / 0)) + return 1 / 0; + } + return r3; +} +function In(e2, r3 = "", n) { + n !== false && (r3 = Or(r3)); + const a = e2.parse(r3); + return Mn(e2, a); +} +ke.getFullPath = In; +function Mn(e2, r3) { + return e2.serialize(r3).split("#")[0] + "#"; +} +ke._getFullPath = Mn; +var gu = /#\/?$/; +function Or(e2) { + return e2 ? e2.replace(gu, "") : ""; +} +ke.normalizeId = Or; +function _u(e2, r3, n) { + return n = Or(n), e2.resolve(r3, n); +} +ke.resolveUrl = _u; +var vu = /^[a-z_][-a-z0-9._]*$/i; +function yu(e2, r3) { + if (typeof e2 == "boolean") + return {}; + const { schemaId: n, uriResolver: a } = this.opts, d = Or(e2[n] || r3), o2 = { "": d }, p = In(a, d, false), y = {}, b = /* @__PURE__ */ new Set(); + return fu(e2, { allKeys: true }, (S, z, L, R) => { + if (R === void 0) + return; + const j = p + z; + let T = o2[R]; + typeof S[n] == "string" && (T = $.call(this, S[n])), N2.call(this, S.$anchor), N2.call(this, S.$dynamicAnchor), o2[z] = T; + function $(D2) { + const t = this.opts.uriResolver.resolve; + if (D2 = Or(T ? t(T, D2) : D2), b.has(D2)) + throw g2(D2); + b.add(D2); + let u2 = this.refs[D2]; + return typeof u2 == "string" && (u2 = this.refs[u2]), typeof u2 == "object" ? v(S, u2.schema, D2) : D2 !== Or(j) && (D2[0] === "#" ? (v(S, y[D2], D2), y[D2] = S) : this.refs[D2] = j), D2; + } + function N2(D2) { + if (typeof D2 == "string") { + if (!vu.test(D2)) + throw new Error(`invalid anchor "${D2}"`); + $.call(this, `#${D2}`); + } + } + }), y; + function v(S, z, L) { + if (z !== void 0 && !lu(S, z)) + throw g2(L); + } + function g2(S) { + return new Error(`reference "${S}" resolves to more than one schema`); + } +} +ke.getSchemaRefs = yu; +Object.defineProperty(He, "__esModule", { value: true }); +He.getData = He.KeywordCxt = He.validateFunctionCode = void 0; +var Dn = Ar; +var Ya = tt; +var xt = rr; +var bt = tt; +var wu = Ot; +var Zr = Xe; +var Dt = ir; +var Y = se; +var x = Qe; +var bu = ke; +var tr = ie; +var Kr = rt; +function $u(e2) { + if (Vn(e2) && (Fn(e2), zn(e2))) { + Pu(e2); + return; + } + Ln(e2, () => (0, Dn.topBoolOrEmptySchema)(e2)); +} +He.validateFunctionCode = $u; +function Ln({ gen: e2, validateName: r3, schema: n, schemaEnv: a, opts: d }, o2) { + d.code.es5 ? e2.func(r3, (0, Y._)`${x.default.data}, ${x.default.valCxt}`, a.$async, () => { + e2.code((0, Y._)`"use strict"; ${Xa(n, d)}`), ku(e2, d), e2.code(o2); + }) : e2.func(r3, (0, Y._)`${x.default.data}, ${Eu(d)}`, a.$async, () => e2.code(Xa(n, d)).code(o2)); +} +function Eu(e2) { + return (0, Y._)`{${x.default.instancePath}="", ${x.default.parentData}, ${x.default.parentDataProperty}, ${x.default.rootData}=${x.default.data}${e2.dynamicRef ? (0, Y._)`, ${x.default.dynamicAnchors}={}` : Y.nil}}={}`; +} +function ku(e2, r3) { + e2.if(x.default.valCxt, () => { + e2.var(x.default.instancePath, (0, Y._)`${x.default.valCxt}.${x.default.instancePath}`), e2.var(x.default.parentData, (0, Y._)`${x.default.valCxt}.${x.default.parentData}`), e2.var(x.default.parentDataProperty, (0, Y._)`${x.default.valCxt}.${x.default.parentDataProperty}`), e2.var(x.default.rootData, (0, Y._)`${x.default.valCxt}.${x.default.rootData}`), r3.dynamicRef && e2.var(x.default.dynamicAnchors, (0, Y._)`${x.default.valCxt}.${x.default.dynamicAnchors}`); + }, () => { + e2.var(x.default.instancePath, (0, Y._)`""`), e2.var(x.default.parentData, (0, Y._)`undefined`), e2.var(x.default.parentDataProperty, (0, Y._)`undefined`), e2.var(x.default.rootData, x.default.data), r3.dynamicRef && e2.var(x.default.dynamicAnchors, (0, Y._)`{}`); + }); +} +function Pu(e2) { + const { schema: r3, opts: n, gen: a } = e2; + Ln(e2, () => { + n.$comment && r3.$comment && Bn(e2), Nu(e2), a.let(x.default.vErrors, null), a.let(x.default.errors, 0), n.unevaluated && Su(e2), Un(e2), Au(e2); + }); +} +function Su(e2) { + const { gen: r3, validateName: n } = e2; + e2.evaluated = r3.const("evaluated", (0, Y._)`${n}.evaluated`), r3.if((0, Y._)`${e2.evaluated}.dynamicProps`, () => r3.assign((0, Y._)`${e2.evaluated}.props`, (0, Y._)`undefined`)), r3.if((0, Y._)`${e2.evaluated}.dynamicItems`, () => r3.assign((0, Y._)`${e2.evaluated}.items`, (0, Y._)`undefined`)); +} +function Xa(e2, r3) { + const n = typeof e2 == "object" && e2[r3.schemaId]; + return n && (r3.code.source || r3.code.process) ? (0, Y._)`/*# sourceURL=${n} */` : Y.nil; +} +function Cu(e2, r3) { + if (Vn(e2) && (Fn(e2), zn(e2))) { + Tu(e2, r3); + return; + } + (0, Dn.boolOrEmptySchema)(e2, r3); +} +function zn({ schema: e2, self: r3 }) { + if (typeof e2 == "boolean") + return !e2; + for (const n in e2) + if (r3.RULES.all[n]) + return true; + return false; +} +function Vn(e2) { + return typeof e2.schema != "boolean"; +} +function Tu(e2, r3) { + const { schema: n, gen: a, opts: d } = e2; + d.$comment && n.$comment && Bn(e2), Ou(e2), Ru(e2); + const o2 = a.const("_errs", x.default.errors); + Un(e2, o2), a.var(r3, (0, Y._)`${o2} === ${x.default.errors}`); +} +function Fn(e2) { + (0, tr.checkUnknownRules)(e2), ju(e2); +} +function Un(e2, r3) { + if (e2.opts.jtd) + return Qa(e2, [], false, r3); + const n = (0, Ya.getSchemaTypes)(e2.schema), a = (0, Ya.coerceAndCheckDataType)(e2, n); + Qa(e2, n, !a, r3); +} +function ju(e2) { + const { schema: r3, errSchemaPath: n, opts: a, self: d } = e2; + r3.$ref && a.ignoreKeywordsWithRef && (0, tr.schemaHasRulesButRef)(r3, d.RULES) && d.logger.warn(`$ref: keywords ignored in schema at path "${n}"`); +} +function Nu(e2) { + const { schema: r3, opts: n } = e2; + r3.default !== void 0 && n.useDefaults && n.strictSchema && (0, tr.checkStrictMode)(e2, "default is ignored in the schema root"); +} +function Ou(e2) { + const r3 = e2.schema[e2.opts.schemaId]; + r3 && (e2.baseId = (0, bu.resolveUrl)(e2.opts.uriResolver, e2.baseId, r3)); +} +function Ru(e2) { + if (e2.schema.$async && !e2.schemaEnv.$async) + throw new Error("async schema in sync schema"); +} +function Bn({ gen: e2, schemaEnv: r3, schema: n, errSchemaPath: a, opts: d }) { + const o2 = n.$comment; + if (d.$comment === true) + e2.code((0, Y._)`${x.default.self}.logger.log(${o2})`); + else if (typeof d.$comment == "function") { + const p = (0, Y.str)`${a}/$comment`, y = e2.scopeValue("root", { ref: r3.root }); + e2.code((0, Y._)`${x.default.self}.opts.$comment(${o2}, ${p}, ${y}.schema)`); + } +} +function Au(e2) { + const { gen: r3, schemaEnv: n, validateName: a, ValidationError: d, opts: o2 } = e2; + n.$async ? r3.if((0, Y._)`${x.default.errors} === 0`, () => r3.return(x.default.data), () => r3.throw((0, Y._)`new ${d}(${x.default.vErrors})`)) : (r3.assign((0, Y._)`${a}.errors`, x.default.vErrors), o2.unevaluated && Iu(e2), r3.return((0, Y._)`${x.default.errors} === 0`)); +} +function Iu({ gen: e2, evaluated: r3, props: n, items: a }) { + n instanceof Y.Name && e2.assign((0, Y._)`${r3}.props`, n), a instanceof Y.Name && e2.assign((0, Y._)`${r3}.items`, a); +} +function Qa(e2, r3, n, a) { + const { gen: d, schema: o2, data: p, allErrors: y, opts: b, self: v } = e2, { RULES: g2 } = v; + if (o2.$ref && (b.ignoreKeywordsWithRef || !(0, tr.schemaHasRulesButRef)(o2, g2))) { + d.block(() => Gn(e2, "$ref", g2.all.$ref.definition)); + return; + } + b.jtd || Mu(e2, r3), d.block(() => { + for (const z of g2.rules) + S(z); + S(g2.post); + }); + function S(z) { + (0, xt.shouldUseGroup)(o2, z) && (z.type ? (d.if((0, bt.checkDataType)(z.type, p, b.strictNumbers)), xa(e2, z), r3.length === 1 && r3[0] === z.type && n && (d.else(), (0, bt.reportTypeError)(e2)), d.endIf()) : xa(e2, z), y || d.if((0, Y._)`${x.default.errors} === ${a || 0}`)); + } +} +function xa(e2, r3) { + const { gen: n, schema: a, opts: { useDefaults: d } } = e2; + d && (0, wu.assignDefaults)(e2, r3.type), n.block(() => { + for (const o2 of r3.rules) + (0, xt.shouldUseRule)(a, o2) && Gn(e2, o2.keyword, o2.definition, r3.type); + }); +} +function Mu(e2, r3) { + e2.schemaEnv.meta || !e2.opts.strictTypes || (Du(e2, r3), e2.opts.allowUnionTypes || Lu(e2, r3), zu(e2, e2.dataTypes)); +} +function Du(e2, r3) { + if (r3.length) { + if (!e2.dataTypes.length) { + e2.dataTypes = r3; + return; + } + r3.forEach((n) => { + Hn(e2.dataTypes, n) || ea(e2, `type "${n}" not allowed by context "${e2.dataTypes.join(",")}"`); + }), Fu(e2, r3); + } +} +function Lu(e2, r3) { + r3.length > 1 && !(r3.length === 2 && r3.includes("null")) && ea(e2, "use allowUnionTypes to allow union type keyword"); +} +function zu(e2, r3) { + const n = e2.self.RULES.all; + for (const a in n) { + const d = n[a]; + if (typeof d == "object" && (0, xt.shouldUseRule)(e2.schema, d)) { + const { type: o2 } = d.definition; + o2.length && !o2.some((p) => Vu(r3, p)) && ea(e2, `missing type "${o2.join(",")}" for keyword "${a}"`); + } + } +} +function Vu(e2, r3) { + return e2.includes(r3) || r3 === "number" && e2.includes("integer"); +} +function Hn(e2, r3) { + return e2.includes(r3) || r3 === "integer" && e2.includes("number"); +} +function Fu(e2, r3) { + const n = []; + for (const a of e2.dataTypes) + Hn(r3, a) ? n.push(a) : r3.includes("integer") && a === "number" && n.push("integer"); + e2.dataTypes = n; +} +function ea(e2, r3) { + const n = e2.schemaEnv.baseId + e2.errSchemaPath; + r3 += ` at "${n}" (strictTypes)`, (0, tr.checkStrictMode)(e2, r3, e2.opts.strictTypes); +} +var qn = class { + constructor(r3, n, a) { + if ((0, Zr.validateKeywordUsage)(r3, n, a), this.gen = r3.gen, this.allErrors = r3.allErrors, this.keyword = a, this.data = r3.data, this.schema = r3.schema[a], this.$data = n.$data && r3.opts.$data && this.schema && this.schema.$data, this.schemaValue = (0, tr.schemaRefOrVal)(r3, this.schema, a, this.$data), this.schemaType = n.schemaType, this.parentSchema = r3.schema, this.params = {}, this.it = r3, this.def = n, this.$data) + this.schemaCode = r3.gen.const("vSchema", Kn(this.$data, r3)); + else if (this.schemaCode = this.schemaValue, !(0, Zr.validSchemaType)(this.schema, n.schemaType, n.allowUndefined)) + throw new Error(`${a} value must be ${JSON.stringify(n.schemaType)}`); + ("code" in n ? n.trackErrors : n.errors !== false) && (this.errsCount = r3.gen.const("_errs", x.default.errors)); + } + result(r3, n, a) { + this.failResult((0, Y.not)(r3), n, a); + } + failResult(r3, n, a) { + this.gen.if(r3), a ? a() : this.error(), n ? (this.gen.else(), n(), this.allErrors && this.gen.endIf()) : this.allErrors ? this.gen.endIf() : this.gen.else(); + } + pass(r3, n) { + this.failResult((0, Y.not)(r3), void 0, n); + } + fail(r3) { + if (r3 === void 0) { + this.error(), this.allErrors || this.gen.if(false); + return; + } + this.gen.if(r3), this.error(), this.allErrors ? this.gen.endIf() : this.gen.else(); + } + fail$data(r3) { + if (!this.$data) + return this.fail(r3); + const { schemaCode: n } = this; + this.fail((0, Y._)`${n} !== undefined && (${(0, Y.or)(this.invalid$data(), r3)})`); + } + error(r3, n, a) { + if (n) { + this.setParams(n), this._error(r3, a), this.setParams({}); + return; + } + this._error(r3, a); + } + _error(r3, n) { + (r3 ? Kr.reportExtraError : Kr.reportError)(this, this.def.error, n); + } + $dataError() { + (0, Kr.reportError)(this, this.def.$dataError || Kr.keyword$DataError); + } + reset() { + if (this.errsCount === void 0) + throw new Error('add "trackErrors" to keyword definition'); + (0, Kr.resetErrorsCount)(this.gen, this.errsCount); + } + ok(r3) { + this.allErrors || this.gen.if(r3); + } + setParams(r3, n) { + n ? Object.assign(this.params, r3) : this.params = r3; + } + block$data(r3, n, a = Y.nil) { + this.gen.block(() => { + this.check$data(r3, a), n(); + }); + } + check$data(r3 = Y.nil, n = Y.nil) { + if (!this.$data) + return; + const { gen: a, schemaCode: d, schemaType: o2, def: p } = this; + a.if((0, Y.or)((0, Y._)`${d} === undefined`, n)), r3 !== Y.nil && a.assign(r3, true), (o2.length || p.validateSchema) && (a.elseIf(this.invalid$data()), this.$dataError(), r3 !== Y.nil && a.assign(r3, false)), a.else(); + } + invalid$data() { + const { gen: r3, schemaCode: n, schemaType: a, def: d, it: o2 } = this; + return (0, Y.or)(p(), y()); + function p() { + if (a.length) { + if (!(n instanceof Y.Name)) + throw new Error("ajv implementation error"); + const b = Array.isArray(a) ? a : [a]; + return (0, Y._)`${(0, bt.checkDataTypes)(b, n, o2.opts.strictNumbers, bt.DataType.Wrong)}`; + } + return Y.nil; + } + function y() { + if (d.validateSchema) { + const b = r3.scopeValue("validate$data", { ref: d.validateSchema }); + return (0, Y._)`!${b}(${n})`; + } + return Y.nil; + } + } + subschema(r3, n) { + const a = (0, Dt.getSubschema)(this.it, r3); + (0, Dt.extendSubschemaData)(a, this.it, r3), (0, Dt.extendSubschemaMode)(a, r3); + const d = { ...this.it, ...a, items: void 0, props: void 0 }; + return Cu(d, n), d; + } + mergeEvaluated(r3, n) { + const { it: a, gen: d } = this; + a.opts.unevaluated && (a.props !== true && r3.props !== void 0 && (a.props = tr.mergeEvaluated.props(d, r3.props, a.props, n)), a.items !== true && r3.items !== void 0 && (a.items = tr.mergeEvaluated.items(d, r3.items, a.items, n))); + } + mergeValidEvaluated(r3, n) { + const { it: a, gen: d } = this; + if (a.opts.unevaluated && (a.props !== true || a.items !== true)) + return d.if(n, () => this.mergeEvaluated(r3, Y.Name)), true; + } +}; +He.KeywordCxt = qn; +function Gn(e2, r3, n, a) { + const d = new qn(e2, n, r3); + "code" in n ? n.code(d, a) : d.$data && n.validate ? (0, Zr.funcKeywordCode)(d, n) : "macro" in n ? (0, Zr.macroKeywordCode)(d, n) : (n.compile || n.validate) && (0, Zr.funcKeywordCode)(d, n); +} +var Uu = /^\/(?:[^~]|~0|~1)*$/; +var Bu = /^([0-9]+)(#|\/(?:[^~]|~0|~1)*)?$/; +function Kn(e2, { dataLevel: r3, dataNames: n, dataPathArr: a }) { + let d, o2; + if (e2 === "") + return x.default.rootData; + if (e2[0] === "/") { + if (!Uu.test(e2)) + throw new Error(`Invalid JSON-pointer: ${e2}`); + d = e2, o2 = x.default.rootData; + } else { + const v = Bu.exec(e2); + if (!v) + throw new Error(`Invalid JSON-pointer: ${e2}`); + const g2 = +v[1]; + if (d = v[2], d === "#") { + if (g2 >= r3) + throw new Error(b("property/index", g2)); + return a[r3 - g2]; + } + if (g2 > r3) + throw new Error(b("data", g2)); + if (o2 = n[r3 - g2], !d) + return o2; + } + let p = o2; + const y = d.split("/"); + for (const v of y) + v && (o2 = (0, Y._)`${o2}${(0, Y.getProperty)((0, tr.unescapeJsonPointer)(v))}`, p = (0, Y._)`${p} && ${o2}`); + return p; + function b(v, g2) { + return `Cannot access ${v} ${g2} levels up, current level is ${r3}`; + } +} +He.getData = Kn; +var at = {}; +Object.defineProperty(at, "__esModule", { value: true }); +var Hu = class extends Error { + constructor(r3) { + super("validation failed"), this.errors = r3, this.ajv = this.validation = true; + } +}; +at.default = Hu; +var nt = {}; +Object.defineProperty(nt, "__esModule", { value: true }); +var Lt = ke; +var qu = class extends Error { + constructor(r3, n, a, d) { + super(d || `can't resolve reference ${a} from id ${n}`), this.missingRef = (0, Lt.resolveUrl)(r3, n, a), this.missingSchema = (0, Lt.normalizeId)((0, Lt.getFullPath)(r3, this.missingRef)); + } +}; +nt.default = qu; +var Ae = {}; +Object.defineProperty(Ae, "__esModule", { value: true }); +Ae.resolveSchema = Ae.getCompilingSchema = Ae.resolveRef = Ae.compileSchema = Ae.SchemaEnv = void 0; +var Ve = se; +var Gu = at; +var hr = Qe; +var Be = ke; +var en = ie; +var Ku = He; +var Rt = class { + constructor(r3) { + var n; + this.refs = {}, this.dynamicAnchors = {}; + let a; + typeof r3.schema == "object" && (a = r3.schema), this.schema = r3.schema, this.schemaId = r3.schemaId, this.root = r3.root || this, this.baseId = (n = r3.baseId) !== null && n !== void 0 ? n : (0, Be.normalizeId)(a == null ? void 0 : a[r3.schemaId || "$id"]), this.schemaPath = r3.schemaPath, this.localRefs = r3.localRefs, this.meta = r3.meta, this.$async = a == null ? void 0 : a.$async, this.refs = {}; + } +}; +Ae.SchemaEnv = Rt; +function ra(e2) { + const r3 = Wn.call(this, e2); + if (r3) + return r3; + const n = (0, Be.getFullPath)(this.opts.uriResolver, e2.root.baseId), { es5: a, lines: d } = this.opts.code, { ownProperties: o2 } = this.opts, p = new Ve.CodeGen(this.scope, { es5: a, lines: d, ownProperties: o2 }); + let y; + e2.$async && (y = p.scopeValue("Error", { + ref: Gu.default, + code: (0, Ve._)`require("ajv/dist/runtime/validation_error").default` + })); + const b = p.scopeName("validate"); + e2.validateName = b; + const v = { + gen: p, + allErrors: this.opts.allErrors, + data: hr.default.data, + parentData: hr.default.parentData, + parentDataProperty: hr.default.parentDataProperty, + dataNames: [hr.default.data], + dataPathArr: [Ve.nil], + dataLevel: 0, + dataTypes: [], + definedProperties: /* @__PURE__ */ new Set(), + topSchemaRef: p.scopeValue("schema", this.opts.code.source === true ? { ref: e2.schema, code: (0, Ve.stringify)(e2.schema) } : { ref: e2.schema }), + validateName: b, + ValidationError: y, + schema: e2.schema, + schemaEnv: e2, + rootId: n, + baseId: e2.baseId || n, + schemaPath: Ve.nil, + errSchemaPath: e2.schemaPath || (this.opts.jtd ? "" : "#"), + errorPath: (0, Ve._)`""`, + opts: this.opts, + self: this + }; + let g2; + try { + this._compilations.add(e2), (0, Ku.validateFunctionCode)(v), p.optimize(this.opts.code.optimize); + const S = p.toString(); + g2 = `${p.scopeRefs(hr.default.scope)}return ${S}`, this.opts.code.process && (g2 = this.opts.code.process(g2, e2)); + const L = new Function(`${hr.default.self}`, `${hr.default.scope}`, g2)(this, this.scope.get()); + if (this.scope.value(b, { ref: L }), L.errors = null, L.schema = e2.schema, L.schemaEnv = e2, e2.$async && (L.$async = true), this.opts.code.source === true && (L.source = { validateName: b, validateCode: S, scopeValues: p._values }), this.opts.unevaluated) { + const { props: R, items: j } = v; + L.evaluated = { + props: R instanceof Ve.Name ? void 0 : R, + items: j instanceof Ve.Name ? void 0 : j, + dynamicProps: R instanceof Ve.Name, + dynamicItems: j instanceof Ve.Name + }, L.source && (L.source.evaluated = (0, Ve.stringify)(L.evaluated)); + } + return e2.validate = L, e2; + } catch (S) { + throw delete e2.validate, delete e2.validateName, g2 && this.logger.error("Error compiling schema, function code:", g2), S; + } finally { + this._compilations.delete(e2); + } +} +Ae.compileSchema = ra; +function Wu(e2, r3, n) { + var a; + n = (0, Be.resolveUrl)(this.opts.uriResolver, r3, n); + const d = e2.refs[n]; + if (d) + return d; + let o2 = Yu.call(this, e2, n); + if (o2 === void 0) { + const p = (a = e2.localRefs) === null || a === void 0 ? void 0 : a[n], { schemaId: y } = this.opts; + p && (o2 = new Rt({ schema: p, schemaId: y, root: e2, baseId: r3 })); + } + if (o2 !== void 0) + return e2.refs[n] = Ju.call(this, o2); +} +Ae.resolveRef = Wu; +function Ju(e2) { + return (0, Be.inlineRef)(e2.schema, this.opts.inlineRefs) ? e2.schema : e2.validate ? e2 : ra.call(this, e2); +} +function Wn(e2) { + for (const r3 of this._compilations) + if (Zu(r3, e2)) + return r3; +} +Ae.getCompilingSchema = Wn; +function Zu(e2, r3) { + return e2.schema === r3.schema && e2.root === r3.root && e2.baseId === r3.baseId; +} +function Yu(e2, r3) { + let n; + for (; typeof (n = this.refs[r3]) == "string"; ) + r3 = n; + return n || this.schemas[r3] || At.call(this, e2, r3); +} +function At(e2, r3) { + const n = this.opts.uriResolver.parse(r3), a = (0, Be._getFullPath)(this.opts.uriResolver, n); + let d = (0, Be.getFullPath)(this.opts.uriResolver, e2.baseId, void 0); + if (Object.keys(e2.schema).length > 0 && a === d) + return zt.call(this, n, e2); + const o2 = (0, Be.normalizeId)(a), p = this.refs[o2] || this.schemas[o2]; + if (typeof p == "string") { + const y = At.call(this, e2, p); + return typeof (y == null ? void 0 : y.schema) != "object" ? void 0 : zt.call(this, n, y); + } + if (typeof (p == null ? void 0 : p.schema) == "object") { + if (p.validate || ra.call(this, p), o2 === (0, Be.normalizeId)(r3)) { + const { schema: y } = p, { schemaId: b } = this.opts, v = y[b]; + return v && (d = (0, Be.resolveUrl)(this.opts.uriResolver, d, v)), new Rt({ schema: y, schemaId: b, root: e2, baseId: d }); + } + return zt.call(this, n, p); + } +} +Ae.resolveSchema = At; +var Xu = /* @__PURE__ */ new Set([ + "properties", + "patternProperties", + "enum", + "dependencies", + "definitions" +]); +function zt(e2, { baseId: r3, schema: n, root: a }) { + var d; + if (((d = e2.fragment) === null || d === void 0 ? void 0 : d[0]) !== "/") + return; + for (const y of e2.fragment.slice(1).split("/")) { + if (typeof n == "boolean") + return; + const b = n[(0, en.unescapeFragment)(y)]; + if (b === void 0) + return; + n = b; + const v = typeof n == "object" && n[this.opts.schemaId]; + !Xu.has(y) && v && (r3 = (0, Be.resolveUrl)(this.opts.uriResolver, r3, v)); + } + let o2; + if (typeof n != "boolean" && n.$ref && !(0, en.schemaHasRulesButRef)(n, this.RULES)) { + const y = (0, Be.resolveUrl)(this.opts.uriResolver, r3, n.$ref); + o2 = At.call(this, a, y); + } + const { schemaId: p } = this.opts; + if (o2 = o2 || new Rt({ schema: n, schemaId: p, root: a, baseId: r3 }), o2.schema !== o2.root.schema) + return o2; +} +var Qu = "https://raw.githubusercontent.com/ajv-validator/ajv/master/lib/refs/data.json#"; +var xu = "Meta-schema for $data reference (JSON AnySchema extension proposal)"; +var ed = "object"; +var rd = [ + "$data" +]; +var td = { + $data: { + type: "string", + anyOf: [ + { + format: "relative-json-pointer" + }, + { + format: "json-pointer" + } + ] + } +}; +var ad = false; +var nd = { + $id: Qu, + description: xu, + type: ed, + required: rd, + properties: td, + additionalProperties: ad +}; +var ta = {}; +var $t = {}; +var sd = { + get exports() { + return $t; + }, + set exports(e2) { + $t = e2; + } +}; +(function(e2, r3) { + (function(n, a) { + a(r3); + })(En, function(n) { + function a() { + for (var E2 = arguments.length, f = Array(E2), P2 = 0; P2 < E2; P2++) + f[P2] = arguments[P2]; + if (f.length > 1) { + f[0] = f[0].slice(0, -1); + for (var M = f.length - 1, A = 1; A < M; ++A) + f[A] = f[A].slice(1, -1); + return f[M] = f[M].slice(1), f.join(""); + } else + return f[0]; + } + function d(E2) { + return "(?:" + E2 + ")"; + } + function o2(E2) { + return E2 === void 0 ? "undefined" : E2 === null ? "null" : Object.prototype.toString.call(E2).split(" ").pop().split("]").shift().toLowerCase(); + } + function p(E2) { + return E2.toUpperCase(); + } + function y(E2) { + return E2 != null ? E2 instanceof Array ? E2 : typeof E2.length != "number" || E2.split || E2.setInterval || E2.call ? [E2] : Array.prototype.slice.call(E2) : []; + } + function b(E2, f) { + var P2 = E2; + if (f) + for (var M in f) + P2[M] = f[M]; + return P2; + } + function v(E2) { + var f = "[A-Za-z]", P2 = "[0-9]", M = a(P2, "[A-Fa-f]"), A = d(d("%[EFef]" + M + "%" + M + M + "%" + M + M) + "|" + d("%[89A-Fa-f]" + M + "%" + M + M) + "|" + d("%" + M + M)), X = "[\\:\\/\\?\\#\\[\\]\\@]", Q = "[\\!\\$\\&\\'\\(\\)\\*\\+\\,\\;\\=]", de = a(X, Q), he = E2 ? "[\\xA0-\\u200D\\u2010-\\u2029\\u202F-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF]" : "[]", _e = E2 ? "[\\uE000-\\uF8FF]" : "[]", ue = a(f, P2, "[\\-\\.\\_\\~]", he); + d(f + a(f, P2, "[\\+\\-\\.]") + "*"), d(d(A + "|" + a(ue, Q, "[\\:]")) + "*"); + var ce = d(d("25[0-5]") + "|" + d("2[0-4]" + P2) + "|" + d("1" + P2 + P2) + "|" + d("0?[1-9]" + P2) + "|0?0?" + P2), ve = d(ce + "\\." + ce + "\\." + ce + "\\." + ce), ee = d(M + "{1,4}"), me = d(d(ee + "\\:" + ee) + "|" + ve), we = d(d(ee + "\\:") + "{6}" + me), ge = d("\\:\\:" + d(ee + "\\:") + "{5}" + me), ar = d(d(ee) + "?\\:\\:" + d(ee + "\\:") + "{4}" + me), Ke = d(d(d(ee + "\\:") + "{0,1}" + ee) + "?\\:\\:" + d(ee + "\\:") + "{3}" + me), We = d(d(d(ee + "\\:") + "{0,2}" + ee) + "?\\:\\:" + d(ee + "\\:") + "{2}" + me), Pr = d(d(d(ee + "\\:") + "{0,3}" + ee) + "?\\:\\:" + ee + "\\:" + me), lr = d(d(d(ee + "\\:") + "{0,4}" + ee) + "?\\:\\:" + me), De = d(d(d(ee + "\\:") + "{0,5}" + ee) + "?\\:\\:" + ee), Je = d(d(d(ee + "\\:") + "{0,6}" + ee) + "?\\:\\:"), fr = d([we, ge, ar, Ke, We, Pr, lr, De, Je].join("|")), er = d(d(ue + "|" + A) + "+"); + d("[vV]" + M + "+\\." + a(ue, Q, "[\\:]") + "+"), d(d(A + "|" + a(ue, Q)) + "*"); + var qr = d(A + "|" + a(ue, Q, "[\\:\\@]")); + return d(d(A + "|" + a(ue, Q, "[\\@]")) + "+"), d(d(qr + "|" + a("[\\/\\?]", _e)) + "*"), { + NOT_SCHEME: new RegExp(a("[^]", f, P2, "[\\+\\-\\.]"), "g"), + NOT_USERINFO: new RegExp(a("[^\\%\\:]", ue, Q), "g"), + NOT_HOST: new RegExp(a("[^\\%\\[\\]\\:]", ue, Q), "g"), + NOT_PATH: new RegExp(a("[^\\%\\/\\:\\@]", ue, Q), "g"), + NOT_PATH_NOSCHEME: new RegExp(a("[^\\%\\/\\@]", ue, Q), "g"), + NOT_QUERY: new RegExp(a("[^\\%]", ue, Q, "[\\:\\@\\/\\?]", _e), "g"), + NOT_FRAGMENT: new RegExp(a("[^\\%]", ue, Q, "[\\:\\@\\/\\?]"), "g"), + ESCAPE: new RegExp(a("[^]", ue, Q), "g"), + UNRESERVED: new RegExp(ue, "g"), + OTHER_CHARS: new RegExp(a("[^\\%]", ue, de), "g"), + PCT_ENCODED: new RegExp(A, "g"), + IPV4ADDRESS: new RegExp("^(" + ve + ")$"), + IPV6ADDRESS: new RegExp("^\\[?(" + fr + ")" + d(d("\\%25|\\%(?!" + M + "{2})") + "(" + er + ")") + "?\\]?$") + //RFC 6874, with relaxed parsing rules + }; + } + var g2 = v(false), S = v(true), z = function() { + function E2(f, P2) { + var M = [], A = true, X = false, Q = void 0; + try { + for (var de = f[Symbol.iterator](), he; !(A = (he = de.next()).done) && (M.push(he.value), !(P2 && M.length === P2)); A = true) + ; + } catch (_e) { + X = true, Q = _e; + } finally { + try { + !A && de.return && de.return(); + } finally { + if (X) + throw Q; + } + } + return M; + } + return function(f, P2) { + if (Array.isArray(f)) + return f; + if (Symbol.iterator in Object(f)) + return E2(f, P2); + throw new TypeError("Invalid attempt to destructure non-iterable instance"); + }; + }(), L = function(E2) { + if (Array.isArray(E2)) { + for (var f = 0, P2 = Array(E2.length); f < E2.length; f++) + P2[f] = E2[f]; + return P2; + } else + return Array.from(E2); + }, R = 2147483647, j = 36, T = 1, $ = 26, N2 = 38, D2 = 700, t = 72, u2 = 128, s = "-", i2 = /^xn--/, c = /[^\0-\x7E]/, m = /[\x2E\u3002\uFF0E\uFF61]/g, h2 = { + overflow: "Overflow: input needs wider integers to process", + "not-basic": "Illegal input >= 0x80 (not a basic code point)", + "invalid-input": "Invalid input" + }, C = j - T, U = Math.floor, H = String.fromCharCode; + function V(E2) { + throw new RangeError(h2[E2]); + } + function G(E2, f) { + for (var P2 = [], M = E2.length; M--; ) + P2[M] = f(E2[M]); + return P2; + } + function _2(E2, f) { + var P2 = E2.split("@"), M = ""; + P2.length > 1 && (M = P2[0] + "@", E2 = P2[1]), E2 = E2.replace(m, "."); + var A = E2.split("."), X = G(A, f).join("."); + return M + X; + } + function q(E2) { + for (var f = [], P2 = 0, M = E2.length; P2 < M; ) { + var A = E2.charCodeAt(P2++); + if (A >= 55296 && A <= 56319 && P2 < M) { + var X = E2.charCodeAt(P2++); + (X & 64512) == 56320 ? f.push(((A & 1023) << 10) + (X & 1023) + 65536) : (f.push(A), P2--); + } else + f.push(A); + } + return f; + } + var J = function(f) { + return String.fromCodePoint.apply(String, L(f)); + }, Z = function(f) { + return f - 48 < 10 ? f - 22 : f - 65 < 26 ? f - 65 : f - 97 < 26 ? f - 97 : j; + }, B = function(f, P2) { + return f + 22 + 75 * (f < 26) - ((P2 != 0) << 5); + }, k = function(f, P2, M) { + var A = 0; + for ( + f = M ? U(f / D2) : f >> 1, f += U(f / P2); + /* no initialization */ + f > C * $ >> 1; + A += j + ) + f = U(f / C); + return U(A + (C + 1) * f / (f + N2)); + }, F = function(f) { + var P2 = [], M = f.length, A = 0, X = u2, Q = t, de = f.lastIndexOf(s); + de < 0 && (de = 0); + for (var he = 0; he < de; ++he) + f.charCodeAt(he) >= 128 && V("not-basic"), P2.push(f.charCodeAt(he)); + for (var _e = de > 0 ? de + 1 : 0; _e < M; ) { + for ( + var ue = A, ce = 1, ve = j; + ; + /* no condition */ + ve += j + ) { + _e >= M && V("invalid-input"); + var ee = Z(f.charCodeAt(_e++)); + (ee >= j || ee > U((R - A) / ce)) && V("overflow"), A += ee * ce; + var me = ve <= Q ? T : ve >= Q + $ ? $ : ve - Q; + if (ee < me) + break; + var we = j - me; + ce > U(R / we) && V("overflow"), ce *= we; + } + var ge = P2.length + 1; + Q = k(A - ue, ge, ue == 0), U(A / ge) > R - X && V("overflow"), X += U(A / ge), A %= ge, P2.splice(A++, 0, X); + } + return String.fromCodePoint.apply(String, P2); + }, O = function(f) { + var P2 = []; + f = q(f); + var M = f.length, A = u2, X = 0, Q = t, de = true, he = false, _e = void 0; + try { + for (var ue = f[Symbol.iterator](), ce; !(de = (ce = ue.next()).done); de = true) { + var ve = ce.value; + ve < 128 && P2.push(H(ve)); + } + } catch (Gr) { + he = true, _e = Gr; + } finally { + try { + !de && ue.return && ue.return(); + } finally { + if (he) + throw _e; + } + } + var ee = P2.length, me = ee; + for (ee && P2.push(s); me < M; ) { + var we = R, ge = true, ar = false, Ke = void 0; + try { + for (var We = f[Symbol.iterator](), Pr; !(ge = (Pr = We.next()).done); ge = true) { + var lr = Pr.value; + lr >= A && lr < we && (we = lr); + } + } catch (Gr) { + ar = true, Ke = Gr; + } finally { + try { + !ge && We.return && We.return(); + } finally { + if (ar) + throw Ke; + } + } + var De = me + 1; + we - A > U((R - X) / De) && V("overflow"), X += (we - A) * De, A = we; + var Je = true, fr = false, er = void 0; + try { + for (var qr = f[Symbol.iterator](), qa; !(Je = (qa = qr.next()).done); Je = true) { + var Ga = qa.value; + if (Ga < A && ++X > R && V("overflow"), Ga == A) { + for ( + var dt = X, it = j; + ; + /* no condition */ + it += j + ) { + var ot = it <= Q ? T : it >= Q + $ ? $ : it - Q; + if (dt < ot) + break; + var Ka = dt - ot, Wa = j - ot; + P2.push(H(B(ot + Ka % Wa, 0))), dt = U(Ka / Wa); + } + P2.push(H(B(dt, 0))), Q = k(X, De, me == ee), X = 0, ++me; + } + } + } catch (Gr) { + fr = true, er = Gr; + } finally { + try { + !Je && qr.return && qr.return(); + } finally { + if (fr) + throw er; + } + } + ++X, ++A; + } + return P2.join(""); + }, l = function(f) { + return _2(f, function(P2) { + return i2.test(P2) ? F(P2.slice(4).toLowerCase()) : P2; + }); + }, w2 = function(f) { + return _2(f, function(P2) { + return c.test(P2) ? "xn--" + O(P2) : P2; + }); + }, I = { + /** + * A string representing the current Punycode.js version number. + * @memberOf punycode + * @type String + */ + version: "2.1.0", + /** + * An object of methods to convert from JavaScript's internal character + * representation (UCS-2) to Unicode code points, and back. + * @see + * @memberOf punycode + * @type Object + */ + ucs2: { + decode: q, + encode: J + }, + decode: F, + encode: O, + toASCII: w2, + toUnicode: l + }, K = {}; + function W(E2) { + var f = E2.charCodeAt(0), P2 = void 0; + return f < 16 ? P2 = "%0" + f.toString(16).toUpperCase() : f < 128 ? P2 = "%" + f.toString(16).toUpperCase() : f < 2048 ? P2 = "%" + (f >> 6 | 192).toString(16).toUpperCase() + "%" + (f & 63 | 128).toString(16).toUpperCase() : P2 = "%" + (f >> 12 | 224).toString(16).toUpperCase() + "%" + (f >> 6 & 63 | 128).toString(16).toUpperCase() + "%" + (f & 63 | 128).toString(16).toUpperCase(), P2; + } + function re(E2) { + for (var f = "", P2 = 0, M = E2.length; P2 < M; ) { + var A = parseInt(E2.substr(P2 + 1, 2), 16); + if (A < 128) + f += String.fromCharCode(A), P2 += 3; + else if (A >= 194 && A < 224) { + if (M - P2 >= 6) { + var X = parseInt(E2.substr(P2 + 4, 2), 16); + f += String.fromCharCode((A & 31) << 6 | X & 63); + } else + f += E2.substr(P2, 6); + P2 += 6; + } else if (A >= 224) { + if (M - P2 >= 9) { + var Q = parseInt(E2.substr(P2 + 4, 2), 16), de = parseInt(E2.substr(P2 + 7, 2), 16); + f += String.fromCharCode((A & 15) << 12 | (Q & 63) << 6 | de & 63); + } else + f += E2.substr(P2, 9); + P2 += 9; + } else + f += E2.substr(P2, 3), P2 += 3; + } + return f; + } + function ae(E2, f) { + function P2(M) { + var A = re(M); + return A.match(f.UNRESERVED) ? A : M; + } + return E2.scheme && (E2.scheme = String(E2.scheme).replace(f.PCT_ENCODED, P2).toLowerCase().replace(f.NOT_SCHEME, "")), E2.userinfo !== void 0 && (E2.userinfo = String(E2.userinfo).replace(f.PCT_ENCODED, P2).replace(f.NOT_USERINFO, W).replace(f.PCT_ENCODED, p)), E2.host !== void 0 && (E2.host = String(E2.host).replace(f.PCT_ENCODED, P2).toLowerCase().replace(f.NOT_HOST, W).replace(f.PCT_ENCODED, p)), E2.path !== void 0 && (E2.path = String(E2.path).replace(f.PCT_ENCODED, P2).replace(E2.scheme ? f.NOT_PATH : f.NOT_PATH_NOSCHEME, W).replace(f.PCT_ENCODED, p)), E2.query !== void 0 && (E2.query = String(E2.query).replace(f.PCT_ENCODED, P2).replace(f.NOT_QUERY, W).replace(f.PCT_ENCODED, p)), E2.fragment !== void 0 && (E2.fragment = String(E2.fragment).replace(f.PCT_ENCODED, P2).replace(f.NOT_FRAGMENT, W).replace(f.PCT_ENCODED, p)), E2; + } + function fe(E2) { + return E2.replace(/^0*(.*)/, "$1") || "0"; + } + function je(E2, f) { + var P2 = E2.match(f.IPV4ADDRESS) || [], M = z(P2, 2), A = M[1]; + return A ? A.split(".").map(fe).join(".") : E2; + } + function xe(E2, f) { + var P2 = E2.match(f.IPV6ADDRESS) || [], M = z(P2, 3), A = M[1], X = M[2]; + if (A) { + for (var Q = A.toLowerCase().split("::").reverse(), de = z(Q, 2), he = de[0], _e = de[1], ue = _e ? _e.split(":").map(fe) : [], ce = he.split(":").map(fe), ve = f.IPV4ADDRESS.test(ce[ce.length - 1]), ee = ve ? 7 : 8, me = ce.length - ee, we = Array(ee), ge = 0; ge < ee; ++ge) + we[ge] = ue[ge] || ce[me + ge] || ""; + ve && (we[ee - 1] = je(we[ee - 1], f)); + var ar = we.reduce(function(De, Je, fr) { + if (!Je || Je === "0") { + var er = De[De.length - 1]; + er && er.index + er.length === fr ? er.length++ : De.push({ index: fr, length: 1 }); + } + return De; + }, []), Ke = ar.sort(function(De, Je) { + return Je.length - De.length; + })[0], We = void 0; + if (Ke && Ke.length > 1) { + var Pr = we.slice(0, Ke.index), lr = we.slice(Ke.index + Ke.length); + We = Pr.join(":") + "::" + lr.join(":"); + } else + We = we.join(":"); + return X && (We += "%" + X), We; + } else + return E2; + } + var Lr = /^(?:([^:\/?#]+):)?(?:\/\/((?:([^\/?#@]*)@)?(\[[^\/?#\]]+\]|[^\/?#:]*)(?:\:(\d*))?))?([^?#]*)(?:\?([^#]*))?(?:#((?:.|\n|\r)*))?/i, zr = "".match(/(){0}/)[1] === void 0; + function Ie(E2) { + var f = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {}, P2 = {}, M = f.iri !== false ? S : g2; + f.reference === "suffix" && (E2 = (f.scheme ? f.scheme + ":" : "") + "//" + E2); + var A = E2.match(Lr); + if (A) { + zr ? (P2.scheme = A[1], P2.userinfo = A[3], P2.host = A[4], P2.port = parseInt(A[5], 10), P2.path = A[6] || "", P2.query = A[7], P2.fragment = A[8], isNaN(P2.port) && (P2.port = A[5])) : (P2.scheme = A[1] || void 0, P2.userinfo = E2.indexOf("@") !== -1 ? A[3] : void 0, P2.host = E2.indexOf("//") !== -1 ? A[4] : void 0, P2.port = parseInt(A[5], 10), P2.path = A[6] || "", P2.query = E2.indexOf("?") !== -1 ? A[7] : void 0, P2.fragment = E2.indexOf("#") !== -1 ? A[8] : void 0, isNaN(P2.port) && (P2.port = E2.match(/\/\/(?:.|\n)*\:(?:\/|\?|\#|$)/) ? A[4] : void 0)), P2.host && (P2.host = xe(je(P2.host, M), M)), P2.scheme === void 0 && P2.userinfo === void 0 && P2.host === void 0 && P2.port === void 0 && !P2.path && P2.query === void 0 ? P2.reference = "same-document" : P2.scheme === void 0 ? P2.reference = "relative" : P2.fragment === void 0 ? P2.reference = "absolute" : P2.reference = "uri", f.reference && f.reference !== "suffix" && f.reference !== P2.reference && (P2.error = P2.error || "URI is not a " + f.reference + " reference."); + var X = K[(f.scheme || P2.scheme || "").toLowerCase()]; + if (!f.unicodeSupport && (!X || !X.unicodeSupport)) { + if (P2.host && (f.domainHost || X && X.domainHost)) + try { + P2.host = I.toASCII(P2.host.replace(M.PCT_ENCODED, re).toLowerCase()); + } catch (Q) { + P2.error = P2.error || "Host's domain name can not be converted to ASCII via punycode: " + Q; + } + ae(P2, g2); + } else + ae(P2, M); + X && X.parse && X.parse(P2, f); + } else + P2.error = P2.error || "URI can not be parsed."; + return P2; + } + function Vr(E2, f) { + var P2 = f.iri !== false ? S : g2, M = []; + return E2.userinfo !== void 0 && (M.push(E2.userinfo), M.push("@")), E2.host !== void 0 && M.push(xe(je(String(E2.host), P2), P2).replace(P2.IPV6ADDRESS, function(A, X, Q) { + return "[" + X + (Q ? "%25" + Q : "") + "]"; + })), (typeof E2.port == "number" || typeof E2.port == "string") && (M.push(":"), M.push(String(E2.port))), M.length ? M.join("") : void 0; + } + var wr = /^\.\.?\//, br = /^\/\.(\/|$)/, $r = /^\/\.\.(\/|$)/, Fr = /^\/?(?:.|\n)*?(?=\/|$)/; + function qe(E2) { + for (var f = []; E2.length; ) + if (E2.match(wr)) + E2 = E2.replace(wr, ""); + else if (E2.match(br)) + E2 = E2.replace(br, "/"); + else if (E2.match($r)) + E2 = E2.replace($r, "/"), f.pop(); + else if (E2 === "." || E2 === "..") + E2 = ""; + else { + var P2 = E2.match(Fr); + if (P2) { + var M = P2[0]; + E2 = E2.slice(M.length), f.push(M); + } else + throw new Error("Unexpected dot segment condition"); + } + return f.join(""); + } + function Ne(E2) { + var f = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {}, P2 = f.iri ? S : g2, M = [], A = K[(f.scheme || E2.scheme || "").toLowerCase()]; + if (A && A.serialize && A.serialize(E2, f), E2.host && !P2.IPV6ADDRESS.test(E2.host)) { + if (f.domainHost || A && A.domainHost) + try { + E2.host = f.iri ? I.toUnicode(E2.host) : I.toASCII(E2.host.replace(P2.PCT_ENCODED, re).toLowerCase()); + } catch (de) { + E2.error = E2.error || "Host's domain name can not be converted to " + (f.iri ? "Unicode" : "ASCII") + " via punycode: " + de; + } + } + ae(E2, P2), f.reference !== "suffix" && E2.scheme && (M.push(E2.scheme), M.push(":")); + var X = Vr(E2, f); + if (X !== void 0 && (f.reference !== "suffix" && M.push("//"), M.push(X), E2.path && E2.path.charAt(0) !== "/" && M.push("/")), E2.path !== void 0) { + var Q = E2.path; + !f.absolutePath && (!A || !A.absolutePath) && (Q = qe(Q)), X === void 0 && (Q = Q.replace(/^\/\//, "/%2F")), M.push(Q); + } + return E2.query !== void 0 && (M.push("?"), M.push(E2.query)), E2.fragment !== void 0 && (M.push("#"), M.push(E2.fragment)), M.join(""); + } + function Er(E2, f) { + var P2 = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : {}, M = arguments[3], A = {}; + return M || (E2 = Ie(Ne(E2, P2), P2), f = Ie(Ne(f, P2), P2)), P2 = P2 || {}, !P2.tolerant && f.scheme ? (A.scheme = f.scheme, A.userinfo = f.userinfo, A.host = f.host, A.port = f.port, A.path = qe(f.path || ""), A.query = f.query) : (f.userinfo !== void 0 || f.host !== void 0 || f.port !== void 0 ? (A.userinfo = f.userinfo, A.host = f.host, A.port = f.port, A.path = qe(f.path || ""), A.query = f.query) : (f.path ? (f.path.charAt(0) === "/" ? A.path = qe(f.path) : ((E2.userinfo !== void 0 || E2.host !== void 0 || E2.port !== void 0) && !E2.path ? A.path = "/" + f.path : E2.path ? A.path = E2.path.slice(0, E2.path.lastIndexOf("/") + 1) + f.path : A.path = f.path, A.path = qe(A.path)), A.query = f.query) : (A.path = E2.path, f.query !== void 0 ? A.query = f.query : A.query = E2.query), A.userinfo = E2.userinfo, A.host = E2.host, A.port = E2.port), A.scheme = E2.scheme), A.fragment = f.fragment, A; + } + function Ur(E2, f, P2) { + var M = b({ scheme: "null" }, P2); + return Ne(Er(Ie(E2, M), Ie(f, M), M, true), M); + } + function or(E2, f) { + return typeof E2 == "string" ? E2 = Ne(Ie(E2, f), f) : o2(E2) === "object" && (E2 = Ie(Ne(E2, f), f)), E2; + } + function Br(E2, f, P2) { + return typeof E2 == "string" ? E2 = Ne(Ie(E2, P2), P2) : o2(E2) === "object" && (E2 = Ne(E2, P2)), typeof f == "string" ? f = Ne(Ie(f, P2), P2) : o2(f) === "object" && (f = Ne(f, P2)), E2 === f; + } + function ut(E2, f) { + return E2 && E2.toString().replace(!f || !f.iri ? g2.ESCAPE : S.ESCAPE, W); + } + function Me(E2, f) { + return E2 && E2.toString().replace(!f || !f.iri ? g2.PCT_ENCODED : S.PCT_ENCODED, re); + } + var cr = { + scheme: "http", + domainHost: true, + parse: function(f, P2) { + return f.host || (f.error = f.error || "HTTP URIs must have a host."), f; + }, + serialize: function(f, P2) { + var M = String(f.scheme).toLowerCase() === "https"; + return (f.port === (M ? 443 : 80) || f.port === "") && (f.port = void 0), f.path || (f.path = "/"), f; + } + }, Da = { + scheme: "https", + domainHost: cr.domainHost, + parse: cr.parse, + serialize: cr.serialize + }; + function La(E2) { + return typeof E2.secure == "boolean" ? E2.secure : String(E2.scheme).toLowerCase() === "wss"; + } + var Hr = { + scheme: "ws", + domainHost: true, + parse: function(f, P2) { + var M = f; + return M.secure = La(M), M.resourceName = (M.path || "/") + (M.query ? "?" + M.query : ""), M.path = void 0, M.query = void 0, M; + }, + serialize: function(f, P2) { + if ((f.port === (La(f) ? 443 : 80) || f.port === "") && (f.port = void 0), typeof f.secure == "boolean" && (f.scheme = f.secure ? "wss" : "ws", f.secure = void 0), f.resourceName) { + var M = f.resourceName.split("?"), A = z(M, 2), X = A[0], Q = A[1]; + f.path = X && X !== "/" ? X : void 0, f.query = Q, f.resourceName = void 0; + } + return f.fragment = void 0, f; + } + }, za = { + scheme: "wss", + domainHost: Hr.domainHost, + parse: Hr.parse, + serialize: Hr.serialize + }, ls = {}, Va = "[A-Za-z0-9\\-\\.\\_\\~\\xA0-\\u200D\\u2010-\\u2029\\u202F-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF]", Ge = "[0-9A-Fa-f]", fs = d(d("%[EFef]" + Ge + "%" + Ge + Ge + "%" + Ge + Ge) + "|" + d("%[89A-Fa-f]" + Ge + "%" + Ge + Ge) + "|" + d("%" + Ge + Ge)), hs = "[A-Za-z0-9\\!\\$\\%\\'\\*\\+\\-\\^\\_\\`\\{\\|\\}\\~]", ps = "[\\!\\$\\%\\'\\(\\)\\*\\+\\,\\-\\.0-9\\<\\>A-Z\\x5E-\\x7E]", ms = a(ps, '[\\"\\\\]'), gs = "[\\!\\$\\'\\(\\)\\*\\+\\,\\;\\:\\@]", _s = new RegExp(Va, "g"), kr = new RegExp(fs, "g"), vs = new RegExp(a("[^]", hs, "[\\.]", '[\\"]', ms), "g"), Fa = new RegExp(a("[^]", Va, gs), "g"), ys = Fa; + function Mt(E2) { + var f = re(E2); + return f.match(_s) ? f : E2; + } + var Ua = { + scheme: "mailto", + parse: function(f, P2) { + var M = f, A = M.to = M.path ? M.path.split(",") : []; + if (M.path = void 0, M.query) { + for (var X = false, Q = {}, de = M.query.split("&"), he = 0, _e = de.length; he < _e; ++he) { + var ue = de[he].split("="); + switch (ue[0]) { + case "to": + for (var ce = ue[1].split(","), ve = 0, ee = ce.length; ve < ee; ++ve) + A.push(ce[ve]); + break; + case "subject": + M.subject = Me(ue[1], P2); + break; + case "body": + M.body = Me(ue[1], P2); + break; + default: + X = true, Q[Me(ue[0], P2)] = Me(ue[1], P2); + break; + } + } + X && (M.headers = Q); + } + M.query = void 0; + for (var me = 0, we = A.length; me < we; ++me) { + var ge = A[me].split("@"); + if (ge[0] = Me(ge[0]), P2.unicodeSupport) + ge[1] = Me(ge[1], P2).toLowerCase(); + else + try { + ge[1] = I.toASCII(Me(ge[1], P2).toLowerCase()); + } catch (ar) { + M.error = M.error || "Email address's domain name can not be converted to ASCII via punycode: " + ar; + } + A[me] = ge.join("@"); + } + return M; + }, + serialize: function(f, P2) { + var M = f, A = y(f.to); + if (A) { + for (var X = 0, Q = A.length; X < Q; ++X) { + var de = String(A[X]), he = de.lastIndexOf("@"), _e = de.slice(0, he).replace(kr, Mt).replace(kr, p).replace(vs, W), ue = de.slice(he + 1); + try { + ue = P2.iri ? I.toUnicode(ue) : I.toASCII(Me(ue, P2).toLowerCase()); + } catch (me) { + M.error = M.error || "Email address's domain name can not be converted to " + (P2.iri ? "Unicode" : "ASCII") + " via punycode: " + me; + } + A[X] = _e + "@" + ue; + } + M.path = A.join(","); + } + var ce = f.headers = f.headers || {}; + f.subject && (ce.subject = f.subject), f.body && (ce.body = f.body); + var ve = []; + for (var ee in ce) + ce[ee] !== ls[ee] && ve.push(ee.replace(kr, Mt).replace(kr, p).replace(Fa, W) + "=" + ce[ee].replace(kr, Mt).replace(kr, p).replace(ys, W)); + return ve.length && (M.query = ve.join("&")), M; + } + }, ws = /^([^\:]+)\:(.*)/, Ba = { + scheme: "urn", + parse: function(f, P2) { + var M = f.path && f.path.match(ws), A = f; + if (M) { + var X = P2.scheme || A.scheme || "urn", Q = M[1].toLowerCase(), de = M[2], he = X + ":" + (P2.nid || Q), _e = K[he]; + A.nid = Q, A.nss = de, A.path = void 0, _e && (A = _e.parse(A, P2)); + } else + A.error = A.error || "URN can not be parsed."; + return A; + }, + serialize: function(f, P2) { + var M = P2.scheme || f.scheme || "urn", A = f.nid, X = M + ":" + (P2.nid || A), Q = K[X]; + Q && (f = Q.serialize(f, P2)); + var de = f, he = f.nss; + return de.path = (A || P2.nid) + ":" + he, de; + } + }, bs = /^[0-9A-Fa-f]{8}(?:\-[0-9A-Fa-f]{4}){3}\-[0-9A-Fa-f]{12}$/, Ha = { + scheme: "urn:uuid", + parse: function(f, P2) { + var M = f; + return M.uuid = M.nss, M.nss = void 0, !P2.tolerant && (!M.uuid || !M.uuid.match(bs)) && (M.error = M.error || "UUID is not valid."), M; + }, + serialize: function(f, P2) { + var M = f; + return M.nss = (f.uuid || "").toLowerCase(), M; + } + }; + K[cr.scheme] = cr, K[Da.scheme] = Da, K[Hr.scheme] = Hr, K[za.scheme] = za, K[Ua.scheme] = Ua, K[Ba.scheme] = Ba, K[Ha.scheme] = Ha, n.SCHEMES = K, n.pctEncChar = W, n.pctDecChars = re, n.parse = Ie, n.removeDotSegments = qe, n.serialize = Ne, n.resolveComponents = Er, n.resolve = Ur, n.normalize = or, n.equal = Br, n.escapeComponent = ut, n.unescapeComponent = Me, Object.defineProperty(n, "__esModule", { value: true }); + }); +})(sd, $t); +Object.defineProperty(ta, "__esModule", { value: true }); +var Jn = $t; +Jn.code = 'require("ajv/dist/runtime/uri").default'; +ta.default = Jn; +(function(e2) { + Object.defineProperty(e2, "__esModule", { value: true }), e2.CodeGen = e2.Name = e2.nil = e2.stringify = e2.str = e2._ = e2.KeywordCxt = void 0; + var r3 = He; + Object.defineProperty(e2, "KeywordCxt", { enumerable: true, get: function() { + return r3.KeywordCxt; + } }); + var n = se; + Object.defineProperty(e2, "_", { enumerable: true, get: function() { + return n._; + } }), Object.defineProperty(e2, "str", { enumerable: true, get: function() { + return n.str; + } }), Object.defineProperty(e2, "stringify", { enumerable: true, get: function() { + return n.stringify; + } }), Object.defineProperty(e2, "nil", { enumerable: true, get: function() { + return n.nil; + } }), Object.defineProperty(e2, "Name", { enumerable: true, get: function() { + return n.Name; + } }), Object.defineProperty(e2, "CodeGen", { enumerable: true, get: function() { + return n.CodeGen; + } }); + const a = at, d = nt, o2 = vr, p = Ae, y = se, b = ke, v = tt, g2 = ie, S = nd, z = ta, L = (B, k) => new RegExp(B, k); + L.code = "new RegExp"; + const R = ["removeAdditional", "useDefaults", "coerceTypes"], j = /* @__PURE__ */ new Set([ + "validate", + "serialize", + "parse", + "wrapper", + "root", + "schema", + "keyword", + "pattern", + "formats", + "validate$data", + "func", + "obj", + "Error" + ]), T = { + errorDataPath: "", + format: "`validateFormats: false` can be used instead.", + nullable: '"nullable" keyword is supported by default.', + jsonPointers: "Deprecated jsPropertySyntax can be used instead.", + extendRefs: "Deprecated ignoreKeywordsWithRef can be used instead.", + missingRefs: "Pass empty schema with $id that should be ignored to ajv.addSchema.", + processCode: "Use option `code: {process: (code, schemaEnv: object) => string}`", + sourceCode: "Use option `code: {source: true}`", + strictDefaults: "It is default now, see option `strict`.", + strictKeywords: "It is default now, see option `strict`.", + uniqueItems: '"uniqueItems" keyword is always validated.', + unknownFormats: "Disable strict mode or pass `true` to `ajv.addFormat` (or `formats` option).", + cache: "Map is used as cache, schema object as key.", + serialize: "Map is used as cache, schema object as key.", + ajvErrors: "It is default now." + }, $ = { + ignoreKeywordsWithRef: "", + jsPropertySyntax: "", + unicode: '"minLength"/"maxLength" account for unicode characters by default.' + }, N2 = 200; + function D2(B) { + var k, F, O, l, w2, I, K, W, re, ae, fe, je, xe, Lr, zr, Ie, Vr, wr, br, $r, Fr, qe, Ne, Er, Ur; + const or = B.strict, Br = (k = B.code) === null || k === void 0 ? void 0 : k.optimize, ut = Br === true || Br === void 0 ? 1 : Br || 0, Me = (O = (F = B.code) === null || F === void 0 ? void 0 : F.regExp) !== null && O !== void 0 ? O : L, cr = (l = B.uriResolver) !== null && l !== void 0 ? l : z.default; + return { + strictSchema: (I = (w2 = B.strictSchema) !== null && w2 !== void 0 ? w2 : or) !== null && I !== void 0 ? I : true, + strictNumbers: (W = (K = B.strictNumbers) !== null && K !== void 0 ? K : or) !== null && W !== void 0 ? W : true, + strictTypes: (ae = (re = B.strictTypes) !== null && re !== void 0 ? re : or) !== null && ae !== void 0 ? ae : "log", + strictTuples: (je = (fe = B.strictTuples) !== null && fe !== void 0 ? fe : or) !== null && je !== void 0 ? je : "log", + strictRequired: (Lr = (xe = B.strictRequired) !== null && xe !== void 0 ? xe : or) !== null && Lr !== void 0 ? Lr : false, + code: B.code ? { ...B.code, optimize: ut, regExp: Me } : { optimize: ut, regExp: Me }, + loopRequired: (zr = B.loopRequired) !== null && zr !== void 0 ? zr : N2, + loopEnum: (Ie = B.loopEnum) !== null && Ie !== void 0 ? Ie : N2, + meta: (Vr = B.meta) !== null && Vr !== void 0 ? Vr : true, + messages: (wr = B.messages) !== null && wr !== void 0 ? wr : true, + inlineRefs: (br = B.inlineRefs) !== null && br !== void 0 ? br : true, + schemaId: ($r = B.schemaId) !== null && $r !== void 0 ? $r : "$id", + addUsedSchema: (Fr = B.addUsedSchema) !== null && Fr !== void 0 ? Fr : true, + validateSchema: (qe = B.validateSchema) !== null && qe !== void 0 ? qe : true, + validateFormats: (Ne = B.validateFormats) !== null && Ne !== void 0 ? Ne : true, + unicodeRegExp: (Er = B.unicodeRegExp) !== null && Er !== void 0 ? Er : true, + int32range: (Ur = B.int32range) !== null && Ur !== void 0 ? Ur : true, + uriResolver: cr + }; + } + class t { + constructor(k = {}) { + this.schemas = {}, this.refs = {}, this.formats = {}, this._compilations = /* @__PURE__ */ new Set(), this._loading = {}, this._cache = /* @__PURE__ */ new Map(), k = this.opts = { ...k, ...D2(k) }; + const { es5: F, lines: O } = this.opts.code; + this.scope = new y.ValueScope({ scope: {}, prefixes: j, es5: F, lines: O }), this.logger = U(k.logger); + const l = k.validateFormats; + k.validateFormats = false, this.RULES = (0, o2.getRules)(), u2.call(this, T, k, "NOT SUPPORTED"), u2.call(this, $, k, "DEPRECATED", "warn"), this._metaOpts = h2.call(this), k.formats && c.call(this), this._addVocabularies(), this._addDefaultMetaSchema(), k.keywords && m.call(this, k.keywords), typeof k.meta == "object" && this.addMetaSchema(k.meta), i2.call(this), k.validateFormats = l; + } + _addVocabularies() { + this.addKeyword("$async"); + } + _addDefaultMetaSchema() { + const { $data: k, meta: F, schemaId: O } = this.opts; + let l = S; + O === "id" && (l = { ...S }, l.id = l.$id, delete l.$id), F && k && this.addMetaSchema(l, l[O], false); + } + defaultMeta() { + const { meta: k, schemaId: F } = this.opts; + return this.opts.defaultMeta = typeof k == "object" ? k[F] || k : void 0; + } + validate(k, F) { + let O; + if (typeof k == "string") { + if (O = this.getSchema(k), !O) + throw new Error(`no schema with key or ref "${k}"`); + } else + O = this.compile(k); + const l = O(F); + return "$async" in O || (this.errors = O.errors), l; + } + compile(k, F) { + const O = this._addSchema(k, F); + return O.validate || this._compileSchemaEnv(O); + } + compileAsync(k, F) { + if (typeof this.opts.loadSchema != "function") + throw new Error("options.loadSchema should be a function"); + const { loadSchema: O } = this.opts; + return l.call(this, k, F); + async function l(ae, fe) { + await w2.call(this, ae.$schema); + const je = this._addSchema(ae, fe); + return je.validate || I.call(this, je); + } + async function w2(ae) { + ae && !this.getSchema(ae) && await l.call(this, { $ref: ae }, true); + } + async function I(ae) { + try { + return this._compileSchemaEnv(ae); + } catch (fe) { + if (!(fe instanceof d.default)) + throw fe; + return K.call(this, fe), await W.call(this, fe.missingSchema), I.call(this, ae); + } + } + function K({ missingSchema: ae, missingRef: fe }) { + if (this.refs[ae]) + throw new Error(`AnySchema ${ae} is loaded but ${fe} cannot be resolved`); + } + async function W(ae) { + const fe = await re.call(this, ae); + this.refs[ae] || await w2.call(this, fe.$schema), this.refs[ae] || this.addSchema(fe, ae, F); + } + async function re(ae) { + const fe = this._loading[ae]; + if (fe) + return fe; + try { + return await (this._loading[ae] = O(ae)); + } finally { + delete this._loading[ae]; + } + } + } + // Adds schema to the instance + addSchema(k, F, O, l = this.opts.validateSchema) { + if (Array.isArray(k)) { + for (const I of k) + this.addSchema(I, void 0, O, l); + return this; + } + let w2; + if (typeof k == "object") { + const { schemaId: I } = this.opts; + if (w2 = k[I], w2 !== void 0 && typeof w2 != "string") + throw new Error(`schema ${I} must be string`); + } + return F = (0, b.normalizeId)(F || w2), this._checkUnique(F), this.schemas[F] = this._addSchema(k, O, F, l, true), this; + } + // Add schema that will be used to validate other schemas + // options in META_IGNORE_OPTIONS are alway set to false + addMetaSchema(k, F, O = this.opts.validateSchema) { + return this.addSchema(k, F, true, O), this; + } + // Validate schema against its meta-schema + validateSchema(k, F) { + if (typeof k == "boolean") + return true; + let O; + if (O = k.$schema, O !== void 0 && typeof O != "string") + throw new Error("$schema must be a string"); + if (O = O || this.opts.defaultMeta || this.defaultMeta(), !O) + return this.logger.warn("meta-schema not available"), this.errors = null, true; + const l = this.validate(O, k); + if (!l && F) { + const w2 = "schema is invalid: " + this.errorsText(); + if (this.opts.validateSchema === "log") + this.logger.error(w2); + else + throw new Error(w2); + } + return l; + } + // Get compiled schema by `key` or `ref`. + // (`key` that was passed to `addSchema` or full schema reference - `schema.$id` or resolved id) + getSchema(k) { + let F; + for (; typeof (F = s.call(this, k)) == "string"; ) + k = F; + if (F === void 0) { + const { schemaId: O } = this.opts, l = new p.SchemaEnv({ schema: {}, schemaId: O }); + if (F = p.resolveSchema.call(this, l, k), !F) + return; + this.refs[k] = F; + } + return F.validate || this._compileSchemaEnv(F); + } + // Remove cached schema(s). + // If no parameter is passed all schemas but meta-schemas are removed. + // If RegExp is passed all schemas with key/id matching pattern but meta-schemas are removed. + // Even if schema is referenced by other schemas it still can be removed as other schemas have local references. + removeSchema(k) { + if (k instanceof RegExp) + return this._removeAllSchemas(this.schemas, k), this._removeAllSchemas(this.refs, k), this; + switch (typeof k) { + case "undefined": + return this._removeAllSchemas(this.schemas), this._removeAllSchemas(this.refs), this._cache.clear(), this; + case "string": { + const F = s.call(this, k); + return typeof F == "object" && this._cache.delete(F.schema), delete this.schemas[k], delete this.refs[k], this; + } + case "object": { + const F = k; + this._cache.delete(F); + let O = k[this.opts.schemaId]; + return O && (O = (0, b.normalizeId)(O), delete this.schemas[O], delete this.refs[O]), this; + } + default: + throw new Error("ajv.removeSchema: invalid parameter"); + } + } + // add "vocabulary" - a collection of keywords + addVocabulary(k) { + for (const F of k) + this.addKeyword(F); + return this; + } + addKeyword(k, F) { + let O; + if (typeof k == "string") + O = k, typeof F == "object" && (this.logger.warn("these parameters are deprecated, see docs for addKeyword"), F.keyword = O); + else if (typeof k == "object" && F === void 0) { + if (F = k, O = F.keyword, Array.isArray(O) && !O.length) + throw new Error("addKeywords: keyword must be string or non-empty array"); + } else + throw new Error("invalid addKeywords parameters"); + if (V.call(this, O, F), !F) + return (0, g2.eachItem)(O, (w2) => G.call(this, w2)), this; + q.call(this, F); + const l = { + ...F, + type: (0, v.getJSONTypes)(F.type), + schemaType: (0, v.getJSONTypes)(F.schemaType) + }; + return (0, g2.eachItem)(O, l.type.length === 0 ? (w2) => G.call(this, w2, l) : (w2) => l.type.forEach((I) => G.call(this, w2, l, I))), this; + } + getKeyword(k) { + const F = this.RULES.all[k]; + return typeof F == "object" ? F.definition : !!F; + } + // Remove keyword + removeKeyword(k) { + const { RULES: F } = this; + delete F.keywords[k], delete F.all[k]; + for (const O of F.rules) { + const l = O.rules.findIndex((w2) => w2.keyword === k); + l >= 0 && O.rules.splice(l, 1); + } + return this; + } + // Add format + addFormat(k, F) { + return typeof F == "string" && (F = new RegExp(F)), this.formats[k] = F, this; + } + errorsText(k = this.errors, { separator: F = ", ", dataVar: O = "data" } = {}) { + return !k || k.length === 0 ? "No errors" : k.map((l) => `${O}${l.instancePath} ${l.message}`).reduce((l, w2) => l + F + w2); + } + $dataMetaSchema(k, F) { + const O = this.RULES.all; + k = JSON.parse(JSON.stringify(k)); + for (const l of F) { + const w2 = l.split("/").slice(1); + let I = k; + for (const K of w2) + I = I[K]; + for (const K in O) { + const W = O[K]; + if (typeof W != "object") + continue; + const { $data: re } = W.definition, ae = I[K]; + re && ae && (I[K] = Z(ae)); + } + } + return k; + } + _removeAllSchemas(k, F) { + for (const O in k) { + const l = k[O]; + (!F || F.test(O)) && (typeof l == "string" ? delete k[O] : l && !l.meta && (this._cache.delete(l.schema), delete k[O])); + } + } + _addSchema(k, F, O, l = this.opts.validateSchema, w2 = this.opts.addUsedSchema) { + let I; + const { schemaId: K } = this.opts; + if (typeof k == "object") + I = k[K]; + else { + if (this.opts.jtd) + throw new Error("schema must be object"); + if (typeof k != "boolean") + throw new Error("schema must be object or boolean"); + } + let W = this._cache.get(k); + if (W !== void 0) + return W; + O = (0, b.normalizeId)(I || O); + const re = b.getSchemaRefs.call(this, k, O); + return W = new p.SchemaEnv({ schema: k, schemaId: K, meta: F, baseId: O, localRefs: re }), this._cache.set(W.schema, W), w2 && !O.startsWith("#") && (O && this._checkUnique(O), this.refs[O] = W), l && this.validateSchema(k, true), W; + } + _checkUnique(k) { + if (this.schemas[k] || this.refs[k]) + throw new Error(`schema with key or id "${k}" already exists`); + } + _compileSchemaEnv(k) { + if (k.meta ? this._compileMetaSchema(k) : p.compileSchema.call(this, k), !k.validate) + throw new Error("ajv implementation error"); + return k.validate; + } + _compileMetaSchema(k) { + const F = this.opts; + this.opts = this._metaOpts; + try { + p.compileSchema.call(this, k); + } finally { + this.opts = F; + } + } + } + e2.default = t, t.ValidationError = a.default, t.MissingRefError = d.default; + function u2(B, k, F, O = "error") { + for (const l in B) { + const w2 = l; + w2 in k && this.logger[O](`${F}: option ${l}. ${B[w2]}`); + } + } + function s(B) { + return B = (0, b.normalizeId)(B), this.schemas[B] || this.refs[B]; + } + function i2() { + const B = this.opts.schemas; + if (B) + if (Array.isArray(B)) + this.addSchema(B); + else + for (const k in B) + this.addSchema(B[k], k); + } + function c() { + for (const B in this.opts.formats) { + const k = this.opts.formats[B]; + k && this.addFormat(B, k); + } + } + function m(B) { + if (Array.isArray(B)) { + this.addVocabulary(B); + return; + } + this.logger.warn("keywords option as map is deprecated, pass array"); + for (const k in B) { + const F = B[k]; + F.keyword || (F.keyword = k), this.addKeyword(F); + } + } + function h2() { + const B = { ...this.opts }; + for (const k of R) + delete B[k]; + return B; + } + const C = { log() { + }, warn() { + }, error() { + } }; + function U(B) { + if (B === false) + return C; + if (B === void 0) + return console; + if (B.log && B.warn && B.error) + return B; + throw new Error("logger must implement log, warn and error methods"); + } + const H = /^[a-z_$][a-z0-9_$:-]*$/i; + function V(B, k) { + const { RULES: F } = this; + if ((0, g2.eachItem)(B, (O) => { + if (F.keywords[O]) + throw new Error(`Keyword ${O} is already defined`); + if (!H.test(O)) + throw new Error(`Keyword ${O} has invalid name`); + }), !!k && k.$data && !("code" in k || "validate" in k)) + throw new Error('$data keyword must have "code" or "validate" function'); + } + function G(B, k, F) { + var O; + const l = k == null ? void 0 : k.post; + if (F && l) + throw new Error('keyword with "post" flag cannot have "type"'); + const { RULES: w2 } = this; + let I = l ? w2.post : w2.rules.find(({ type: W }) => W === F); + if (I || (I = { type: F, rules: [] }, w2.rules.push(I)), w2.keywords[B] = true, !k) + return; + const K = { + keyword: B, + definition: { + ...k, + type: (0, v.getJSONTypes)(k.type), + schemaType: (0, v.getJSONTypes)(k.schemaType) + } + }; + k.before ? _2.call(this, I, K, k.before) : I.rules.push(K), w2.all[B] = K, (O = k.implements) === null || O === void 0 || O.forEach((W) => this.addKeyword(W)); + } + function _2(B, k, F) { + const O = B.rules.findIndex((l) => l.keyword === F); + O >= 0 ? B.rules.splice(O, 0, k) : (B.rules.push(k), this.logger.warn(`rule ${F} is not defined`)); + } + function q(B) { + let { metaSchema: k } = B; + k !== void 0 && (B.$data && this.opts.$data && (k = Z(k)), B.validateSchema = this.compile(k, true)); + } + const J = { + $ref: "https://raw.githubusercontent.com/ajv-validator/ajv/master/lib/refs/data.json#" + }; + function Z(B) { + return { anyOf: [B, J] }; + } +})(kn); +var aa = {}; +var na = {}; +var sa = {}; +Object.defineProperty(sa, "__esModule", { value: true }); +var ud = { + keyword: "id", + code() { + throw new Error('NOT SUPPORTED: keyword "id", use "$id" for schema ID'); + } +}; +sa.default = ud; +var yr = {}; +Object.defineProperty(yr, "__esModule", { value: true }); +yr.callRef = yr.getValidate = void 0; +var dd = nt; +var rn = ne; +var Re = se; +var Cr = Qe; +var tn = Ae; +var ct = ie; +var id = { + keyword: "$ref", + schemaType: "string", + code(e2) { + const { gen: r3, schema: n, it: a } = e2, { baseId: d, schemaEnv: o2, validateName: p, opts: y, self: b } = a, { root: v } = o2; + if ((n === "#" || n === "#/") && d === v.baseId) + return S(); + const g2 = tn.resolveRef.call(b, v, d, n); + if (g2 === void 0) + throw new dd.default(a.opts.uriResolver, d, n); + if (g2 instanceof tn.SchemaEnv) + return z(g2); + return L(g2); + function S() { + if (o2 === v) + return gt(e2, p, o2, o2.$async); + const R = r3.scopeValue("root", { ref: v }); + return gt(e2, (0, Re._)`${R}.validate`, v, v.$async); + } + function z(R) { + const j = Zn(e2, R); + gt(e2, j, R, R.$async); + } + function L(R) { + const j = r3.scopeValue("schema", y.code.source === true ? { ref: R, code: (0, Re.stringify)(R) } : { ref: R }), T = r3.name("valid"), $ = e2.subschema({ + schema: R, + dataTypes: [], + schemaPath: Re.nil, + topSchemaRef: j, + errSchemaPath: n + }, T); + e2.mergeEvaluated($), e2.ok(T); + } + } +}; +function Zn(e2, r3) { + const { gen: n } = e2; + return r3.validate ? n.scopeValue("validate", { ref: r3.validate }) : (0, Re._)`${n.scopeValue("wrapper", { ref: r3 })}.validate`; +} +yr.getValidate = Zn; +function gt(e2, r3, n, a) { + const { gen: d, it: o2 } = e2, { allErrors: p, schemaEnv: y, opts: b } = o2, v = b.passContext ? Cr.default.this : Re.nil; + a ? g2() : S(); + function g2() { + if (!y.$async) + throw new Error("async schema referenced by sync schema"); + const R = d.let("valid"); + d.try(() => { + d.code((0, Re._)`await ${(0, rn.callValidateCode)(e2, r3, v)}`), L(r3), p || d.assign(R, true); + }, (j) => { + d.if((0, Re._)`!(${j} instanceof ${o2.ValidationError})`, () => d.throw(j)), z(j), p || d.assign(R, false); + }), e2.ok(R); + } + function S() { + e2.result((0, rn.callValidateCode)(e2, r3, v), () => L(r3), () => z(r3)); + } + function z(R) { + const j = (0, Re._)`${R}.errors`; + d.assign(Cr.default.vErrors, (0, Re._)`${Cr.default.vErrors} === null ? ${j} : ${Cr.default.vErrors}.concat(${j})`), d.assign(Cr.default.errors, (0, Re._)`${Cr.default.vErrors}.length`); + } + function L(R) { + var j; + if (!o2.opts.unevaluated) + return; + const T = (j = n == null ? void 0 : n.validate) === null || j === void 0 ? void 0 : j.evaluated; + if (o2.props !== true) + if (T && !T.dynamicProps) + T.props !== void 0 && (o2.props = ct.mergeEvaluated.props(d, T.props, o2.props)); + else { + const $ = d.var("props", (0, Re._)`${R}.evaluated.props`); + o2.props = ct.mergeEvaluated.props(d, $, o2.props, Re.Name); + } + if (o2.items !== true) + if (T && !T.dynamicItems) + T.items !== void 0 && (o2.items = ct.mergeEvaluated.items(d, T.items, o2.items)); + else { + const $ = d.var("items", (0, Re._)`${R}.evaluated.items`); + o2.items = ct.mergeEvaluated.items(d, $, o2.items, Re.Name); + } + } +} +yr.callRef = gt; +yr.default = id; +Object.defineProperty(na, "__esModule", { value: true }); +var od = sa; +var cd = yr; +var ld = [ + "$schema", + "$id", + "$defs", + "$vocabulary", + { keyword: "$comment" }, + "definitions", + od.default, + cd.default +]; +na.default = ld; +var ua = {}; +var da = {}; +Object.defineProperty(da, "__esModule", { value: true }); +var Et = se; +var sr = Et.operators; +var kt = { + maximum: { okStr: "<=", ok: sr.LTE, fail: sr.GT }, + minimum: { okStr: ">=", ok: sr.GTE, fail: sr.LT }, + exclusiveMaximum: { okStr: "<", ok: sr.LT, fail: sr.GTE }, + exclusiveMinimum: { okStr: ">", ok: sr.GT, fail: sr.LTE } +}; +var fd = { + message: ({ keyword: e2, schemaCode: r3 }) => (0, Et.str)`must be ${kt[e2].okStr} ${r3}`, + params: ({ keyword: e2, schemaCode: r3 }) => (0, Et._)`{comparison: ${kt[e2].okStr}, limit: ${r3}}` +}; +var hd = { + keyword: Object.keys(kt), + type: "number", + schemaType: "number", + $data: true, + error: fd, + code(e2) { + const { keyword: r3, data: n, schemaCode: a } = e2; + e2.fail$data((0, Et._)`${n} ${kt[r3].fail} ${a} || isNaN(${n})`); + } +}; +da.default = hd; +var ia = {}; +Object.defineProperty(ia, "__esModule", { value: true }); +var Yr = se; +var pd = { + message: ({ schemaCode: e2 }) => (0, Yr.str)`must be multiple of ${e2}`, + params: ({ schemaCode: e2 }) => (0, Yr._)`{multipleOf: ${e2}}` +}; +var md = { + keyword: "multipleOf", + type: "number", + schemaType: "number", + $data: true, + error: pd, + code(e2) { + const { gen: r3, data: n, schemaCode: a, it: d } = e2, o2 = d.opts.multipleOfPrecision, p = r3.let("res"), y = o2 ? (0, Yr._)`Math.abs(Math.round(${p}) - ${p}) > 1e-${o2}` : (0, Yr._)`${p} !== parseInt(${p})`; + e2.fail$data((0, Yr._)`(${a} === 0 || (${p} = ${n}/${a}, ${y}))`); + } +}; +ia.default = md; +var oa = {}; +var ca = {}; +Object.defineProperty(ca, "__esModule", { value: true }); +function Yn(e2) { + const r3 = e2.length; + let n = 0, a = 0, d; + for (; a < r3; ) + n++, d = e2.charCodeAt(a++), d >= 55296 && d <= 56319 && a < r3 && (d = e2.charCodeAt(a), (d & 64512) === 56320 && a++); + return n; +} +ca.default = Yn; +Yn.code = 'require("ajv/dist/runtime/ucs2length").default'; +Object.defineProperty(oa, "__esModule", { value: true }); +var gr = se; +var gd = ie; +var _d = ca; +var vd = { + message({ keyword: e2, schemaCode: r3 }) { + const n = e2 === "maxLength" ? "more" : "fewer"; + return (0, gr.str)`must NOT have ${n} than ${r3} characters`; + }, + params: ({ schemaCode: e2 }) => (0, gr._)`{limit: ${e2}}` +}; +var yd = { + keyword: ["maxLength", "minLength"], + type: "string", + schemaType: "number", + $data: true, + error: vd, + code(e2) { + const { keyword: r3, data: n, schemaCode: a, it: d } = e2, o2 = r3 === "maxLength" ? gr.operators.GT : gr.operators.LT, p = d.opts.unicode === false ? (0, gr._)`${n}.length` : (0, gr._)`${(0, gd.useFunc)(e2.gen, _d.default)}(${n})`; + e2.fail$data((0, gr._)`${p} ${o2} ${a}`); + } +}; +oa.default = yd; +var la = {}; +Object.defineProperty(la, "__esModule", { value: true }); +var wd = ne; +var Pt = se; +var bd = { + message: ({ schemaCode: e2 }) => (0, Pt.str)`must match pattern "${e2}"`, + params: ({ schemaCode: e2 }) => (0, Pt._)`{pattern: ${e2}}` +}; +var $d = { + keyword: "pattern", + type: "string", + schemaType: "string", + $data: true, + error: bd, + code(e2) { + const { data: r3, $data: n, schema: a, schemaCode: d, it: o2 } = e2, p = o2.opts.unicodeRegExp ? "u" : "", y = n ? (0, Pt._)`(new RegExp(${d}, ${p}))` : (0, wd.usePattern)(e2, a); + e2.fail$data((0, Pt._)`!${y}.test(${r3})`); + } +}; +la.default = $d; +var fa = {}; +Object.defineProperty(fa, "__esModule", { value: true }); +var Xr = se; +var Ed = { + message({ keyword: e2, schemaCode: r3 }) { + const n = e2 === "maxProperties" ? "more" : "fewer"; + return (0, Xr.str)`must NOT have ${n} than ${r3} properties`; + }, + params: ({ schemaCode: e2 }) => (0, Xr._)`{limit: ${e2}}` +}; +var kd = { + keyword: ["maxProperties", "minProperties"], + type: "object", + schemaType: "number", + $data: true, + error: Ed, + code(e2) { + const { keyword: r3, data: n, schemaCode: a } = e2, d = r3 === "maxProperties" ? Xr.operators.GT : Xr.operators.LT; + e2.fail$data((0, Xr._)`Object.keys(${n}).length ${d} ${a}`); + } +}; +fa.default = kd; +var ha = {}; +Object.defineProperty(ha, "__esModule", { value: true }); +var Wr = ne; +var Qr = se; +var Pd = ie; +var Sd = { + message: ({ params: { missingProperty: e2 } }) => (0, Qr.str)`must have required property '${e2}'`, + params: ({ params: { missingProperty: e2 } }) => (0, Qr._)`{missingProperty: ${e2}}` +}; +var Cd = { + keyword: "required", + type: "object", + schemaType: "array", + $data: true, + error: Sd, + code(e2) { + const { gen: r3, schema: n, schemaCode: a, data: d, $data: o2, it: p } = e2, { opts: y } = p; + if (!o2 && n.length === 0) + return; + const b = n.length >= y.loopRequired; + if (p.allErrors ? v() : g2(), y.strictRequired) { + const L = e2.parentSchema.properties, { definedProperties: R } = e2.it; + for (const j of n) + if ((L == null ? void 0 : L[j]) === void 0 && !R.has(j)) { + const T = p.schemaEnv.baseId + p.errSchemaPath, $ = `required property "${j}" is not defined at "${T}" (strictRequired)`; + (0, Pd.checkStrictMode)(p, $, p.opts.strictRequired); + } + } + function v() { + if (b || o2) + e2.block$data(Qr.nil, S); + else + for (const L of n) + (0, Wr.checkReportMissingProp)(e2, L); + } + function g2() { + const L = r3.let("missing"); + if (b || o2) { + const R = r3.let("valid", true); + e2.block$data(R, () => z(L, R)), e2.ok(R); + } else + r3.if((0, Wr.checkMissingProp)(e2, n, L)), (0, Wr.reportMissingProp)(e2, L), r3.else(); + } + function S() { + r3.forOf("prop", a, (L) => { + e2.setParams({ missingProperty: L }), r3.if((0, Wr.noPropertyInData)(r3, d, L, y.ownProperties), () => e2.error()); + }); + } + function z(L, R) { + e2.setParams({ missingProperty: L }), r3.forOf(L, a, () => { + r3.assign(R, (0, Wr.propertyInData)(r3, d, L, y.ownProperties)), r3.if((0, Qr.not)(R), () => { + e2.error(), r3.break(); + }); + }, Qr.nil); + } + } +}; +ha.default = Cd; +var pa = {}; +Object.defineProperty(pa, "__esModule", { value: true }); +var xr = se; +var Td = { + message({ keyword: e2, schemaCode: r3 }) { + const n = e2 === "maxItems" ? "more" : "fewer"; + return (0, xr.str)`must NOT have ${n} than ${r3} items`; + }, + params: ({ schemaCode: e2 }) => (0, xr._)`{limit: ${e2}}` +}; +var jd = { + keyword: ["maxItems", "minItems"], + type: "array", + schemaType: "number", + $data: true, + error: Td, + code(e2) { + const { keyword: r3, data: n, schemaCode: a } = e2, d = r3 === "maxItems" ? xr.operators.GT : xr.operators.LT; + e2.fail$data((0, xr._)`${n}.length ${d} ${a}`); + } +}; +pa.default = jd; +var ma = {}; +var st = {}; +Object.defineProperty(st, "__esModule", { value: true }); +var Xn = Rn; +Xn.code = 'require("ajv/dist/runtime/equal").default'; +st.default = Xn; +Object.defineProperty(ma, "__esModule", { value: true }); +var Vt = tt; +var Ee = se; +var Nd = ie; +var Od = st; +var Rd = { + message: ({ params: { i: e2, j: r3 } }) => (0, Ee.str)`must NOT have duplicate items (items ## ${r3} and ${e2} are identical)`, + params: ({ params: { i: e2, j: r3 } }) => (0, Ee._)`{i: ${e2}, j: ${r3}}` +}; +var Ad = { + keyword: "uniqueItems", + type: "array", + schemaType: "boolean", + $data: true, + error: Rd, + code(e2) { + const { gen: r3, data: n, $data: a, schema: d, parentSchema: o2, schemaCode: p, it: y } = e2; + if (!a && !d) + return; + const b = r3.let("valid"), v = o2.items ? (0, Vt.getSchemaTypes)(o2.items) : []; + e2.block$data(b, g2, (0, Ee._)`${p} === false`), e2.ok(b); + function g2() { + const R = r3.let("i", (0, Ee._)`${n}.length`), j = r3.let("j"); + e2.setParams({ i: R, j }), r3.assign(b, true), r3.if((0, Ee._)`${R} > 1`, () => (S() ? z : L)(R, j)); + } + function S() { + return v.length > 0 && !v.some((R) => R === "object" || R === "array"); + } + function z(R, j) { + const T = r3.name("item"), $ = (0, Vt.checkDataTypes)(v, T, y.opts.strictNumbers, Vt.DataType.Wrong), N2 = r3.const("indices", (0, Ee._)`{}`); + r3.for((0, Ee._)`;${R}--;`, () => { + r3.let(T, (0, Ee._)`${n}[${R}]`), r3.if($, (0, Ee._)`continue`), v.length > 1 && r3.if((0, Ee._)`typeof ${T} == "string"`, (0, Ee._)`${T} += "_"`), r3.if((0, Ee._)`typeof ${N2}[${T}] == "number"`, () => { + r3.assign(j, (0, Ee._)`${N2}[${T}]`), e2.error(), r3.assign(b, false).break(); + }).code((0, Ee._)`${N2}[${T}] = ${R}`); + }); + } + function L(R, j) { + const T = (0, Nd.useFunc)(r3, Od.default), $ = r3.name("outer"); + r3.label($).for((0, Ee._)`;${R}--;`, () => r3.for((0, Ee._)`${j} = ${R}; ${j}--;`, () => r3.if((0, Ee._)`${T}(${n}[${R}], ${n}[${j}])`, () => { + e2.error(), r3.assign(b, false).break($); + }))); + } + } +}; +ma.default = Ad; +var ga = {}; +Object.defineProperty(ga, "__esModule", { value: true }); +var Gt = se; +var Id = ie; +var Md = st; +var Dd = { + message: "must be equal to constant", + params: ({ schemaCode: e2 }) => (0, Gt._)`{allowedValue: ${e2}}` +}; +var Ld = { + keyword: "const", + $data: true, + error: Dd, + code(e2) { + const { gen: r3, data: n, $data: a, schemaCode: d, schema: o2 } = e2; + a || o2 && typeof o2 == "object" ? e2.fail$data((0, Gt._)`!${(0, Id.useFunc)(r3, Md.default)}(${n}, ${d})`) : e2.fail((0, Gt._)`${o2} !== ${n}`); + } +}; +ga.default = Ld; +var _a = {}; +Object.defineProperty(_a, "__esModule", { value: true }); +var Jr = se; +var zd = ie; +var Vd = st; +var Fd = { + message: "must be equal to one of the allowed values", + params: ({ schemaCode: e2 }) => (0, Jr._)`{allowedValues: ${e2}}` +}; +var Ud = { + keyword: "enum", + schemaType: "array", + $data: true, + error: Fd, + code(e2) { + const { gen: r3, data: n, $data: a, schema: d, schemaCode: o2, it: p } = e2; + if (!a && d.length === 0) + throw new Error("enum must have non-empty array"); + const y = d.length >= p.opts.loopEnum; + let b; + const v = () => b ?? (b = (0, zd.useFunc)(r3, Vd.default)); + let g2; + if (y || a) + g2 = r3.let("valid"), e2.block$data(g2, S); + else { + if (!Array.isArray(d)) + throw new Error("ajv implementation error"); + const L = r3.const("vSchema", o2); + g2 = (0, Jr.or)(...d.map((R, j) => z(L, j))); + } + e2.pass(g2); + function S() { + r3.assign(g2, false), r3.forOf("v", o2, (L) => r3.if((0, Jr._)`${v()}(${n}, ${L})`, () => r3.assign(g2, true).break())); + } + function z(L, R) { + const j = d[R]; + return typeof j == "object" && j !== null ? (0, Jr._)`${v()}(${n}, ${L}[${R}])` : (0, Jr._)`${n} === ${j}`; + } + } +}; +_a.default = Ud; +Object.defineProperty(ua, "__esModule", { value: true }); +var Bd = da; +var Hd = ia; +var qd = oa; +var Gd = la; +var Kd = fa; +var Wd = ha; +var Jd = pa; +var Zd = ma; +var Yd = ga; +var Xd = _a; +var Qd = [ + // number + Bd.default, + Hd.default, + // string + qd.default, + Gd.default, + // object + Kd.default, + Wd.default, + // array + Jd.default, + Zd.default, + // any + { keyword: "type", schemaType: ["string", "array"] }, + { keyword: "nullable", schemaType: "boolean" }, + Yd.default, + Xd.default +]; +ua.default = Qd; +var va = {}; +var Mr = {}; +Object.defineProperty(Mr, "__esModule", { value: true }); +Mr.validateAdditionalItems = void 0; +var _r = se; +var Kt = ie; +var xd = { + message: ({ params: { len: e2 } }) => (0, _r.str)`must NOT have more than ${e2} items`, + params: ({ params: { len: e2 } }) => (0, _r._)`{limit: ${e2}}` +}; +var ei = { + keyword: "additionalItems", + type: "array", + schemaType: ["boolean", "object"], + before: "uniqueItems", + error: xd, + code(e2) { + const { parentSchema: r3, it: n } = e2, { items: a } = r3; + if (!Array.isArray(a)) { + (0, Kt.checkStrictMode)(n, '"additionalItems" is ignored when "items" is not an array of schemas'); + return; + } + Qn(e2, a); + } +}; +function Qn(e2, r3) { + const { gen: n, schema: a, data: d, keyword: o2, it: p } = e2; + p.items = true; + const y = n.const("len", (0, _r._)`${d}.length`); + if (a === false) + e2.setParams({ len: r3.length }), e2.pass((0, _r._)`${y} <= ${r3.length}`); + else if (typeof a == "object" && !(0, Kt.alwaysValidSchema)(p, a)) { + const v = n.var("valid", (0, _r._)`${y} <= ${r3.length}`); + n.if((0, _r.not)(v), () => b(v)), e2.ok(v); + } + function b(v) { + n.forRange("i", r3.length, y, (g2) => { + e2.subschema({ keyword: o2, dataProp: g2, dataPropType: Kt.Type.Num }, v), p.allErrors || n.if((0, _r.not)(v), () => n.break()); + }); + } +} +Mr.validateAdditionalItems = Qn; +Mr.default = ei; +var ya = {}; +var Dr = {}; +Object.defineProperty(Dr, "__esModule", { value: true }); +Dr.validateTuple = void 0; +var an = se; +var _t = ie; +var ri = ne; +var ti = { + keyword: "items", + type: "array", + schemaType: ["object", "array", "boolean"], + before: "uniqueItems", + code(e2) { + const { schema: r3, it: n } = e2; + if (Array.isArray(r3)) + return xn(e2, "additionalItems", r3); + n.items = true, !(0, _t.alwaysValidSchema)(n, r3) && e2.ok((0, ri.validateArray)(e2)); + } +}; +function xn(e2, r3, n = e2.schema) { + const { gen: a, parentSchema: d, data: o2, keyword: p, it: y } = e2; + g2(d), y.opts.unevaluated && n.length && y.items !== true && (y.items = _t.mergeEvaluated.items(a, n.length, y.items)); + const b = a.name("valid"), v = a.const("len", (0, an._)`${o2}.length`); + n.forEach((S, z) => { + (0, _t.alwaysValidSchema)(y, S) || (a.if((0, an._)`${v} > ${z}`, () => e2.subschema({ + keyword: p, + schemaProp: z, + dataProp: z + }, b)), e2.ok(b)); + }); + function g2(S) { + const { opts: z, errSchemaPath: L } = y, R = n.length, j = R === S.minItems && (R === S.maxItems || S[r3] === false); + if (z.strictTuples && !j) { + const T = `"${p}" is ${R}-tuple, but minItems or maxItems/${r3} are not specified or different at path "${L}"`; + (0, _t.checkStrictMode)(y, T, z.strictTuples); + } + } +} +Dr.validateTuple = xn; +Dr.default = ti; +Object.defineProperty(ya, "__esModule", { value: true }); +var ai = Dr; +var ni = { + keyword: "prefixItems", + type: "array", + schemaType: ["array"], + before: "uniqueItems", + code: (e2) => (0, ai.validateTuple)(e2, "items") +}; +ya.default = ni; +var wa = {}; +Object.defineProperty(wa, "__esModule", { value: true }); +var nn = se; +var si = ie; +var ui = ne; +var di = Mr; +var ii = { + message: ({ params: { len: e2 } }) => (0, nn.str)`must NOT have more than ${e2} items`, + params: ({ params: { len: e2 } }) => (0, nn._)`{limit: ${e2}}` +}; +var oi = { + keyword: "items", + type: "array", + schemaType: ["object", "boolean"], + before: "uniqueItems", + error: ii, + code(e2) { + const { schema: r3, parentSchema: n, it: a } = e2, { prefixItems: d } = n; + a.items = true, !(0, si.alwaysValidSchema)(a, r3) && (d ? (0, di.validateAdditionalItems)(e2, d) : e2.ok((0, ui.validateArray)(e2))); + } +}; +wa.default = oi; +var ba = {}; +Object.defineProperty(ba, "__esModule", { value: true }); +var ze = se; +var lt = ie; +var ci = { + message: ({ params: { min: e2, max: r3 } }) => r3 === void 0 ? (0, ze.str)`must contain at least ${e2} valid item(s)` : (0, ze.str)`must contain at least ${e2} and no more than ${r3} valid item(s)`, + params: ({ params: { min: e2, max: r3 } }) => r3 === void 0 ? (0, ze._)`{minContains: ${e2}}` : (0, ze._)`{minContains: ${e2}, maxContains: ${r3}}` +}; +var li = { + keyword: "contains", + type: "array", + schemaType: ["object", "boolean"], + before: "uniqueItems", + trackErrors: true, + error: ci, + code(e2) { + const { gen: r3, schema: n, parentSchema: a, data: d, it: o2 } = e2; + let p, y; + const { minContains: b, maxContains: v } = a; + o2.opts.next ? (p = b === void 0 ? 1 : b, y = v) : p = 1; + const g2 = r3.const("len", (0, ze._)`${d}.length`); + if (e2.setParams({ min: p, max: y }), y === void 0 && p === 0) { + (0, lt.checkStrictMode)(o2, '"minContains" == 0 without "maxContains": "contains" keyword ignored'); + return; + } + if (y !== void 0 && p > y) { + (0, lt.checkStrictMode)(o2, '"minContains" > "maxContains" is always invalid'), e2.fail(); + return; + } + if ((0, lt.alwaysValidSchema)(o2, n)) { + let j = (0, ze._)`${g2} >= ${p}`; + y !== void 0 && (j = (0, ze._)`${j} && ${g2} <= ${y}`), e2.pass(j); + return; + } + o2.items = true; + const S = r3.name("valid"); + y === void 0 && p === 1 ? L(S, () => r3.if(S, () => r3.break())) : p === 0 ? (r3.let(S, true), y !== void 0 && r3.if((0, ze._)`${d}.length > 0`, z)) : (r3.let(S, false), z()), e2.result(S, () => e2.reset()); + function z() { + const j = r3.name("_valid"), T = r3.let("count", 0); + L(j, () => r3.if(j, () => R(T))); + } + function L(j, T) { + r3.forRange("i", 0, g2, ($) => { + e2.subschema({ + keyword: "contains", + dataProp: $, + dataPropType: lt.Type.Num, + compositeRule: true + }, j), T(); + }); + } + function R(j) { + r3.code((0, ze._)`${j}++`), y === void 0 ? r3.if((0, ze._)`${j} >= ${p}`, () => r3.assign(S, true).break()) : (r3.if((0, ze._)`${j} > ${y}`, () => r3.assign(S, false).break()), p === 1 ? r3.assign(S, true) : r3.if((0, ze._)`${j} >= ${p}`, () => r3.assign(S, true))); + } + } +}; +ba.default = li; +var es = {}; +(function(e2) { + Object.defineProperty(e2, "__esModule", { value: true }), e2.validateSchemaDeps = e2.validatePropertyDeps = e2.error = void 0; + const r3 = se, n = ie, a = ne; + e2.error = { + message: ({ params: { property: b, depsCount: v, deps: g2 } }) => { + const S = v === 1 ? "property" : "properties"; + return (0, r3.str)`must have ${S} ${g2} when property ${b} is present`; + }, + params: ({ params: { property: b, depsCount: v, deps: g2, missingProperty: S } }) => (0, r3._)`{property: ${b}, + missingProperty: ${S}, + depsCount: ${v}, + deps: ${g2}}` + // TODO change to reference + }; + const d = { + keyword: "dependencies", + type: "object", + schemaType: "object", + error: e2.error, + code(b) { + const [v, g2] = o2(b); + p(b, v), y(b, g2); + } + }; + function o2({ schema: b }) { + const v = {}, g2 = {}; + for (const S in b) { + if (S === "__proto__") + continue; + const z = Array.isArray(b[S]) ? v : g2; + z[S] = b[S]; + } + return [v, g2]; + } + function p(b, v = b.schema) { + const { gen: g2, data: S, it: z } = b; + if (Object.keys(v).length === 0) + return; + const L = g2.let("missing"); + for (const R in v) { + const j = v[R]; + if (j.length === 0) + continue; + const T = (0, a.propertyInData)(g2, S, R, z.opts.ownProperties); + b.setParams({ + property: R, + depsCount: j.length, + deps: j.join(", ") + }), z.allErrors ? g2.if(T, () => { + for (const $ of j) + (0, a.checkReportMissingProp)(b, $); + }) : (g2.if((0, r3._)`${T} && (${(0, a.checkMissingProp)(b, j, L)})`), (0, a.reportMissingProp)(b, L), g2.else()); + } + } + e2.validatePropertyDeps = p; + function y(b, v = b.schema) { + const { gen: g2, data: S, keyword: z, it: L } = b, R = g2.name("valid"); + for (const j in v) + (0, n.alwaysValidSchema)(L, v[j]) || (g2.if( + (0, a.propertyInData)(g2, S, j, L.opts.ownProperties), + () => { + const T = b.subschema({ keyword: z, schemaProp: j }, R); + b.mergeValidEvaluated(T, R); + }, + () => g2.var(R, true) + // TODO var + ), b.ok(R)); + } + e2.validateSchemaDeps = y, e2.default = d; +})(es); +var $a = {}; +Object.defineProperty($a, "__esModule", { value: true }); +var rs = se; +var fi = ie; +var hi = { + message: "property name must be valid", + params: ({ params: e2 }) => (0, rs._)`{propertyName: ${e2.propertyName}}` +}; +var pi = { + keyword: "propertyNames", + type: "object", + schemaType: ["object", "boolean"], + error: hi, + code(e2) { + const { gen: r3, schema: n, data: a, it: d } = e2; + if ((0, fi.alwaysValidSchema)(d, n)) + return; + const o2 = r3.name("valid"); + r3.forIn("key", a, (p) => { + e2.setParams({ propertyName: p }), e2.subschema({ + keyword: "propertyNames", + data: p, + dataTypes: ["string"], + propertyName: p, + compositeRule: true + }, o2), r3.if((0, rs.not)(o2), () => { + e2.error(true), d.allErrors || r3.break(); + }); + }), e2.ok(o2); + } +}; +$a.default = pi; +var It = {}; +Object.defineProperty(It, "__esModule", { value: true }); +var ft = ne; +var Fe = se; +var mi = Qe; +var ht = ie; +var gi = { + message: "must NOT have additional properties", + params: ({ params: e2 }) => (0, Fe._)`{additionalProperty: ${e2.additionalProperty}}` +}; +var _i = { + keyword: "additionalProperties", + type: ["object"], + schemaType: ["boolean", "object"], + allowUndefined: true, + trackErrors: true, + error: gi, + code(e2) { + const { gen: r3, schema: n, parentSchema: a, data: d, errsCount: o2, it: p } = e2; + if (!o2) + throw new Error("ajv implementation error"); + const { allErrors: y, opts: b } = p; + if (p.props = true, b.removeAdditional !== "all" && (0, ht.alwaysValidSchema)(p, n)) + return; + const v = (0, ft.allSchemaProperties)(a.properties), g2 = (0, ft.allSchemaProperties)(a.patternProperties); + S(), e2.ok((0, Fe._)`${o2} === ${mi.default.errors}`); + function S() { + r3.forIn("key", d, (T) => { + !v.length && !g2.length ? R(T) : r3.if(z(T), () => R(T)); + }); + } + function z(T) { + let $; + if (v.length > 8) { + const N2 = (0, ht.schemaRefOrVal)(p, a.properties, "properties"); + $ = (0, ft.isOwnProperty)(r3, N2, T); + } else + v.length ? $ = (0, Fe.or)(...v.map((N2) => (0, Fe._)`${T} === ${N2}`)) : $ = Fe.nil; + return g2.length && ($ = (0, Fe.or)($, ...g2.map((N2) => (0, Fe._)`${(0, ft.usePattern)(e2, N2)}.test(${T})`))), (0, Fe.not)($); + } + function L(T) { + r3.code((0, Fe._)`delete ${d}[${T}]`); + } + function R(T) { + if (b.removeAdditional === "all" || b.removeAdditional && n === false) { + L(T); + return; + } + if (n === false) { + e2.setParams({ additionalProperty: T }), e2.error(), y || r3.break(); + return; + } + if (typeof n == "object" && !(0, ht.alwaysValidSchema)(p, n)) { + const $ = r3.name("valid"); + b.removeAdditional === "failing" ? (j(T, $, false), r3.if((0, Fe.not)($), () => { + e2.reset(), L(T); + })) : (j(T, $), y || r3.if((0, Fe.not)($), () => r3.break())); + } + } + function j(T, $, N2) { + const D2 = { + keyword: "additionalProperties", + dataProp: T, + dataPropType: ht.Type.Str + }; + N2 === false && Object.assign(D2, { + compositeRule: true, + createErrors: false, + allErrors: false + }), e2.subschema(D2, $); + } + } +}; +It.default = _i; +var Ea = {}; +Object.defineProperty(Ea, "__esModule", { value: true }); +var vi = He; +var sn = ne; +var Ft = ie; +var un = It; +var yi = { + keyword: "properties", + type: "object", + schemaType: "object", + code(e2) { + const { gen: r3, schema: n, parentSchema: a, data: d, it: o2 } = e2; + o2.opts.removeAdditional === "all" && a.additionalProperties === void 0 && un.default.code(new vi.KeywordCxt(o2, un.default, "additionalProperties")); + const p = (0, sn.allSchemaProperties)(n); + for (const S of p) + o2.definedProperties.add(S); + o2.opts.unevaluated && p.length && o2.props !== true && (o2.props = Ft.mergeEvaluated.props(r3, (0, Ft.toHash)(p), o2.props)); + const y = p.filter((S) => !(0, Ft.alwaysValidSchema)(o2, n[S])); + if (y.length === 0) + return; + const b = r3.name("valid"); + for (const S of y) + v(S) ? g2(S) : (r3.if((0, sn.propertyInData)(r3, d, S, o2.opts.ownProperties)), g2(S), o2.allErrors || r3.else().var(b, true), r3.endIf()), e2.it.definedProperties.add(S), e2.ok(b); + function v(S) { + return o2.opts.useDefaults && !o2.compositeRule && n[S].default !== void 0; + } + function g2(S) { + e2.subschema({ + keyword: "properties", + schemaProp: S, + dataProp: S + }, b); + } + } +}; +Ea.default = yi; +var ka = {}; +Object.defineProperty(ka, "__esModule", { value: true }); +var dn = ne; +var pt = se; +var on = ie; +var cn = ie; +var wi = { + keyword: "patternProperties", + type: "object", + schemaType: "object", + code(e2) { + const { gen: r3, schema: n, data: a, parentSchema: d, it: o2 } = e2, { opts: p } = o2, y = (0, dn.allSchemaProperties)(n), b = y.filter((j) => (0, on.alwaysValidSchema)(o2, n[j])); + if (y.length === 0 || b.length === y.length && (!o2.opts.unevaluated || o2.props === true)) + return; + const v = p.strictSchema && !p.allowMatchingProperties && d.properties, g2 = r3.name("valid"); + o2.props !== true && !(o2.props instanceof pt.Name) && (o2.props = (0, cn.evaluatedPropsToName)(r3, o2.props)); + const { props: S } = o2; + z(); + function z() { + for (const j of y) + v && L(j), o2.allErrors ? R(j) : (r3.var(g2, true), R(j), r3.if(g2)); + } + function L(j) { + for (const T in v) + new RegExp(j).test(T) && (0, on.checkStrictMode)(o2, `property ${T} matches pattern ${j} (use allowMatchingProperties)`); + } + function R(j) { + r3.forIn("key", a, (T) => { + r3.if((0, pt._)`${(0, dn.usePattern)(e2, j)}.test(${T})`, () => { + const $ = b.includes(j); + $ || e2.subschema({ + keyword: "patternProperties", + schemaProp: j, + dataProp: T, + dataPropType: cn.Type.Str + }, g2), o2.opts.unevaluated && S !== true ? r3.assign((0, pt._)`${S}[${T}]`, true) : !$ && !o2.allErrors && r3.if((0, pt.not)(g2), () => r3.break()); + }); + }); + } + } +}; +ka.default = wi; +var Pa = {}; +Object.defineProperty(Pa, "__esModule", { value: true }); +var bi = ie; +var $i = { + keyword: "not", + schemaType: ["object", "boolean"], + trackErrors: true, + code(e2) { + const { gen: r3, schema: n, it: a } = e2; + if ((0, bi.alwaysValidSchema)(a, n)) { + e2.fail(); + return; + } + const d = r3.name("valid"); + e2.subschema({ + keyword: "not", + compositeRule: true, + createErrors: false, + allErrors: false + }, d), e2.failResult(d, () => e2.reset(), () => e2.error()); + }, + error: { message: "must NOT be valid" } +}; +Pa.default = $i; +var Sa = {}; +Object.defineProperty(Sa, "__esModule", { value: true }); +var Ei = ne; +var ki = { + keyword: "anyOf", + schemaType: "array", + trackErrors: true, + code: Ei.validateUnion, + error: { message: "must match a schema in anyOf" } +}; +Sa.default = ki; +var Ca = {}; +Object.defineProperty(Ca, "__esModule", { value: true }); +var vt = se; +var Pi = ie; +var Si = { + message: "must match exactly one schema in oneOf", + params: ({ params: e2 }) => (0, vt._)`{passingSchemas: ${e2.passing}}` +}; +var Ci = { + keyword: "oneOf", + schemaType: "array", + trackErrors: true, + error: Si, + code(e2) { + const { gen: r3, schema: n, parentSchema: a, it: d } = e2; + if (!Array.isArray(n)) + throw new Error("ajv implementation error"); + if (d.opts.discriminator && a.discriminator) + return; + const o2 = n, p = r3.let("valid", false), y = r3.let("passing", null), b = r3.name("_valid"); + e2.setParams({ passing: y }), r3.block(v), e2.result(p, () => e2.reset(), () => e2.error(true)); + function v() { + o2.forEach((g2, S) => { + let z; + (0, Pi.alwaysValidSchema)(d, g2) ? r3.var(b, true) : z = e2.subschema({ + keyword: "oneOf", + schemaProp: S, + compositeRule: true + }, b), S > 0 && r3.if((0, vt._)`${b} && ${p}`).assign(p, false).assign(y, (0, vt._)`[${y}, ${S}]`).else(), r3.if(b, () => { + r3.assign(p, true), r3.assign(y, S), z && e2.mergeEvaluated(z, vt.Name); + }); + }); + } + } +}; +Ca.default = Ci; +var Ta = {}; +Object.defineProperty(Ta, "__esModule", { value: true }); +var Ti = ie; +var ji = { + keyword: "allOf", + schemaType: "array", + code(e2) { + const { gen: r3, schema: n, it: a } = e2; + if (!Array.isArray(n)) + throw new Error("ajv implementation error"); + const d = r3.name("valid"); + n.forEach((o2, p) => { + if ((0, Ti.alwaysValidSchema)(a, o2)) + return; + const y = e2.subschema({ keyword: "allOf", schemaProp: p }, d); + e2.ok(d), e2.mergeEvaluated(y); + }); + } +}; +Ta.default = ji; +var ja = {}; +Object.defineProperty(ja, "__esModule", { value: true }); +var St = se; +var ts = ie; +var Ni = { + message: ({ params: e2 }) => (0, St.str)`must match "${e2.ifClause}" schema`, + params: ({ params: e2 }) => (0, St._)`{failingKeyword: ${e2.ifClause}}` +}; +var Oi = { + keyword: "if", + schemaType: ["object", "boolean"], + trackErrors: true, + error: Ni, + code(e2) { + const { gen: r3, parentSchema: n, it: a } = e2; + n.then === void 0 && n.else === void 0 && (0, ts.checkStrictMode)(a, '"if" without "then" and "else" is ignored'); + const d = ln(a, "then"), o2 = ln(a, "else"); + if (!d && !o2) + return; + const p = r3.let("valid", true), y = r3.name("_valid"); + if (b(), e2.reset(), d && o2) { + const g2 = r3.let("ifClause"); + e2.setParams({ ifClause: g2 }), r3.if(y, v("then", g2), v("else", g2)); + } else + d ? r3.if(y, v("then")) : r3.if((0, St.not)(y), v("else")); + e2.pass(p, () => e2.error(true)); + function b() { + const g2 = e2.subschema({ + keyword: "if", + compositeRule: true, + createErrors: false, + allErrors: false + }, y); + e2.mergeEvaluated(g2); + } + function v(g2, S) { + return () => { + const z = e2.subschema({ keyword: g2 }, y); + r3.assign(p, y), e2.mergeValidEvaluated(z, p), S ? r3.assign(S, (0, St._)`${g2}`) : e2.setParams({ ifClause: g2 }); + }; + } + } +}; +function ln(e2, r3) { + const n = e2.schema[r3]; + return n !== void 0 && !(0, ts.alwaysValidSchema)(e2, n); +} +ja.default = Oi; +var Na = {}; +Object.defineProperty(Na, "__esModule", { value: true }); +var Ri = ie; +var Ai = { + keyword: ["then", "else"], + schemaType: ["object", "boolean"], + code({ keyword: e2, parentSchema: r3, it: n }) { + r3.if === void 0 && (0, Ri.checkStrictMode)(n, `"${e2}" without "if" is ignored`); + } +}; +Na.default = Ai; +Object.defineProperty(va, "__esModule", { value: true }); +var Ii = Mr; +var Mi = ya; +var Di = Dr; +var Li = wa; +var zi = ba; +var Vi = es; +var Fi = $a; +var Ui = It; +var Bi = Ea; +var Hi = ka; +var qi = Pa; +var Gi = Sa; +var Ki = Ca; +var Wi = Ta; +var Ji = ja; +var Zi = Na; +function Yi(e2 = false) { + const r3 = [ + // any + qi.default, + Gi.default, + Ki.default, + Wi.default, + Ji.default, + Zi.default, + // object + Fi.default, + Ui.default, + Vi.default, + Bi.default, + Hi.default + ]; + return e2 ? r3.push(Mi.default, Li.default) : r3.push(Ii.default, Di.default), r3.push(zi.default), r3; +} +va.default = Yi; +var Oa = {}; +var Ra = {}; +Object.defineProperty(Ra, "__esModule", { value: true }); +var ye = se; +var Xi = { + message: ({ schemaCode: e2 }) => (0, ye.str)`must match format "${e2}"`, + params: ({ schemaCode: e2 }) => (0, ye._)`{format: ${e2}}` +}; +var Qi = { + keyword: "format", + type: ["number", "string"], + schemaType: "string", + $data: true, + error: Xi, + code(e2, r3) { + const { gen: n, data: a, $data: d, schema: o2, schemaCode: p, it: y } = e2, { opts: b, errSchemaPath: v, schemaEnv: g2, self: S } = y; + if (!b.validateFormats) + return; + d ? z() : L(); + function z() { + const R = n.scopeValue("formats", { + ref: S.formats, + code: b.code.formats + }), j = n.const("fDef", (0, ye._)`${R}[${p}]`), T = n.let("fType"), $ = n.let("format"); + n.if((0, ye._)`typeof ${j} == "object" && !(${j} instanceof RegExp)`, () => n.assign(T, (0, ye._)`${j}.type || "string"`).assign($, (0, ye._)`${j}.validate`), () => n.assign(T, (0, ye._)`"string"`).assign($, j)), e2.fail$data((0, ye.or)(N2(), D2())); + function N2() { + return b.strictSchema === false ? ye.nil : (0, ye._)`${p} && !${$}`; + } + function D2() { + const t = g2.$async ? (0, ye._)`(${j}.async ? await ${$}(${a}) : ${$}(${a}))` : (0, ye._)`${$}(${a})`, u2 = (0, ye._)`(typeof ${$} == "function" ? ${t} : ${$}.test(${a}))`; + return (0, ye._)`${$} && ${$} !== true && ${T} === ${r3} && !${u2}`; + } + } + function L() { + const R = S.formats[o2]; + if (!R) { + N2(); + return; + } + if (R === true) + return; + const [j, T, $] = D2(R); + j === r3 && e2.pass(t()); + function N2() { + if (b.strictSchema === false) { + S.logger.warn(u2()); + return; + } + throw new Error(u2()); + function u2() { + return `unknown format "${o2}" ignored in schema at path "${v}"`; + } + } + function D2(u2) { + const s = u2 instanceof RegExp ? (0, ye.regexpCode)(u2) : b.code.formats ? (0, ye._)`${b.code.formats}${(0, ye.getProperty)(o2)}` : void 0, i2 = n.scopeValue("formats", { key: o2, ref: u2, code: s }); + return typeof u2 == "object" && !(u2 instanceof RegExp) ? [u2.type || "string", u2.validate, (0, ye._)`${i2}.validate`] : ["string", u2, i2]; + } + function t() { + if (typeof R == "object" && !(R instanceof RegExp) && R.async) { + if (!g2.$async) + throw new Error("async format in sync schema"); + return (0, ye._)`await ${$}(${a})`; + } + return typeof T == "function" ? (0, ye._)`${$}(${a})` : (0, ye._)`${$}.test(${a})`; + } + } + } +}; +Ra.default = Qi; +Object.defineProperty(Oa, "__esModule", { value: true }); +var xi = Ra; +var eo = [xi.default]; +Oa.default = eo; +var Ir = {}; +Object.defineProperty(Ir, "__esModule", { value: true }); +Ir.contentVocabulary = Ir.metadataVocabulary = void 0; +Ir.metadataVocabulary = [ + "title", + "description", + "default", + "deprecated", + "readOnly", + "writeOnly", + "examples" +]; +Ir.contentVocabulary = [ + "contentMediaType", + "contentEncoding", + "contentSchema" +]; +Object.defineProperty(aa, "__esModule", { value: true }); +var ro = na; +var to = ua; +var ao = va; +var no = Oa; +var fn = Ir; +var so = [ + ro.default, + to.default, + (0, ao.default)(), + no.default, + fn.metadataVocabulary, + fn.contentVocabulary +]; +aa.default = so; +var Aa = {}; +var as = {}; +(function(e2) { + Object.defineProperty(e2, "__esModule", { value: true }), e2.DiscrError = void 0, function(r3) { + r3.Tag = "tag", r3.Mapping = "mapping"; + }(e2.DiscrError || (e2.DiscrError = {})); +})(as); +Object.defineProperty(Aa, "__esModule", { value: true }); +var Tr = se; +var Wt = as; +var hn = Ae; +var uo = ie; +var io = { + message: ({ params: { discrError: e2, tagName: r3 } }) => e2 === Wt.DiscrError.Tag ? `tag "${r3}" must be string` : `value of tag "${r3}" must be in oneOf`, + params: ({ params: { discrError: e2, tag: r3, tagName: n } }) => (0, Tr._)`{error: ${e2}, tag: ${n}, tagValue: ${r3}}` +}; +var oo = { + keyword: "discriminator", + type: "object", + schemaType: "object", + error: io, + code(e2) { + const { gen: r3, data: n, schema: a, parentSchema: d, it: o2 } = e2, { oneOf: p } = d; + if (!o2.opts.discriminator) + throw new Error("discriminator: requires discriminator option"); + const y = a.propertyName; + if (typeof y != "string") + throw new Error("discriminator: requires propertyName"); + if (a.mapping) + throw new Error("discriminator: mapping is not supported"); + if (!p) + throw new Error("discriminator: requires oneOf keyword"); + const b = r3.let("valid", false), v = r3.const("tag", (0, Tr._)`${n}${(0, Tr.getProperty)(y)}`); + r3.if((0, Tr._)`typeof ${v} == "string"`, () => g2(), () => e2.error(false, { discrError: Wt.DiscrError.Tag, tag: v, tagName: y })), e2.ok(b); + function g2() { + const L = z(); + r3.if(false); + for (const R in L) + r3.elseIf((0, Tr._)`${v} === ${R}`), r3.assign(b, S(L[R])); + r3.else(), e2.error(false, { discrError: Wt.DiscrError.Mapping, tag: v, tagName: y }), r3.endIf(); + } + function S(L) { + const R = r3.name("valid"), j = e2.subschema({ keyword: "oneOf", schemaProp: L }, R); + return e2.mergeEvaluated(j, Tr.Name), R; + } + function z() { + var L; + const R = {}, j = $(d); + let T = true; + for (let t = 0; t < p.length; t++) { + let u2 = p[t]; + u2 != null && u2.$ref && !(0, uo.schemaHasRulesButRef)(u2, o2.self.RULES) && (u2 = hn.resolveRef.call(o2.self, o2.schemaEnv.root, o2.baseId, u2 == null ? void 0 : u2.$ref), u2 instanceof hn.SchemaEnv && (u2 = u2.schema)); + const s = (L = u2 == null ? void 0 : u2.properties) === null || L === void 0 ? void 0 : L[y]; + if (typeof s != "object") + throw new Error(`discriminator: oneOf subschemas (or referenced schemas) must have "properties/${y}"`); + T = T && (j || $(u2)), N2(s, t); + } + if (!T) + throw new Error(`discriminator: "${y}" must be required`); + return R; + function $({ required: t }) { + return Array.isArray(t) && t.includes(y); + } + function N2(t, u2) { + if (t.const) + D2(t.const, u2); + else if (t.enum) + for (const s of t.enum) + D2(s, u2); + else + throw new Error(`discriminator: "properties/${y}" must have "const" or "enum"`); + } + function D2(t, u2) { + if (typeof t != "string" || t in R) + throw new Error(`discriminator: "${y}" values must be unique strings`); + R[t] = u2; + } + } + } +}; +Aa.default = oo; +var co = "http://json-schema.org/draft-07/schema#"; +var lo = "http://json-schema.org/draft-07/schema#"; +var fo = "Core schema meta-schema"; +var ho = { + schemaArray: { + type: "array", + minItems: 1, + items: { + $ref: "#" + } + }, + nonNegativeInteger: { + type: "integer", + minimum: 0 + }, + nonNegativeIntegerDefault0: { + allOf: [ + { + $ref: "#/definitions/nonNegativeInteger" + }, + { + default: 0 + } + ] + }, + simpleTypes: { + enum: [ + "array", + "boolean", + "integer", + "null", + "number", + "object", + "string" + ] + }, + stringArray: { + type: "array", + items: { + type: "string" + }, + uniqueItems: true, + default: [] + } +}; +var po = [ + "object", + "boolean" +]; +var mo = { + $id: { + type: "string", + format: "uri-reference" + }, + $schema: { + type: "string", + format: "uri" + }, + $ref: { + type: "string", + format: "uri-reference" + }, + $comment: { + type: "string" + }, + title: { + type: "string" + }, + description: { + type: "string" + }, + default: true, + readOnly: { + type: "boolean", + default: false + }, + examples: { + type: "array", + items: true + }, + multipleOf: { + type: "number", + exclusiveMinimum: 0 + }, + maximum: { + type: "number" + }, + exclusiveMaximum: { + type: "number" + }, + minimum: { + type: "number" + }, + exclusiveMinimum: { + type: "number" + }, + maxLength: { + $ref: "#/definitions/nonNegativeInteger" + }, + minLength: { + $ref: "#/definitions/nonNegativeIntegerDefault0" + }, + pattern: { + type: "string", + format: "regex" + }, + additionalItems: { + $ref: "#" + }, + items: { + anyOf: [ + { + $ref: "#" + }, + { + $ref: "#/definitions/schemaArray" + } + ], + default: true + }, + maxItems: { + $ref: "#/definitions/nonNegativeInteger" + }, + minItems: { + $ref: "#/definitions/nonNegativeIntegerDefault0" + }, + uniqueItems: { + type: "boolean", + default: false + }, + contains: { + $ref: "#" + }, + maxProperties: { + $ref: "#/definitions/nonNegativeInteger" + }, + minProperties: { + $ref: "#/definitions/nonNegativeIntegerDefault0" + }, + required: { + $ref: "#/definitions/stringArray" + }, + additionalProperties: { + $ref: "#" + }, + definitions: { + type: "object", + additionalProperties: { + $ref: "#" + }, + default: {} + }, + properties: { + type: "object", + additionalProperties: { + $ref: "#" + }, + default: {} + }, + patternProperties: { + type: "object", + additionalProperties: { + $ref: "#" + }, + propertyNames: { + format: "regex" + }, + default: {} + }, + dependencies: { + type: "object", + additionalProperties: { + anyOf: [ + { + $ref: "#" + }, + { + $ref: "#/definitions/stringArray" + } + ] + } + }, + propertyNames: { + $ref: "#" + }, + const: true, + enum: { + type: "array", + items: true, + minItems: 1, + uniqueItems: true + }, + type: { + anyOf: [ + { + $ref: "#/definitions/simpleTypes" + }, + { + type: "array", + items: { + $ref: "#/definitions/simpleTypes" + }, + minItems: 1, + uniqueItems: true + } + ] + }, + format: { + type: "string" + }, + contentMediaType: { + type: "string" + }, + contentEncoding: { + type: "string" + }, + if: { + $ref: "#" + }, + then: { + $ref: "#" + }, + else: { + $ref: "#" + }, + allOf: { + $ref: "#/definitions/schemaArray" + }, + anyOf: { + $ref: "#/definitions/schemaArray" + }, + oneOf: { + $ref: "#/definitions/schemaArray" + }, + not: { + $ref: "#" + } +}; +var go = { + $schema: co, + $id: lo, + title: fo, + definitions: ho, + type: po, + properties: mo, + default: true +}; +(function(e2, r3) { + Object.defineProperty(r3, "__esModule", { value: true }), r3.MissingRefError = r3.ValidationError = r3.CodeGen = r3.Name = r3.nil = r3.stringify = r3.str = r3._ = r3.KeywordCxt = void 0; + const n = kn, a = aa, d = Aa, o2 = go, p = ["/properties"], y = "http://json-schema.org/draft-07/schema"; + class b extends n.default { + _addVocabularies() { + super._addVocabularies(), a.default.forEach((R) => this.addVocabulary(R)), this.opts.discriminator && this.addKeyword(d.default); + } + _addDefaultMetaSchema() { + if (super._addDefaultMetaSchema(), !this.opts.meta) + return; + const R = this.opts.$data ? this.$dataMetaSchema(o2, p) : o2; + this.addMetaSchema(R, y, false), this.refs["http://json-schema.org/schema"] = y; + } + defaultMeta() { + return this.opts.defaultMeta = super.defaultMeta() || (this.getSchema(y) ? y : void 0); + } + } + e2.exports = r3 = b, Object.defineProperty(r3, "__esModule", { value: true }), r3.default = b; + var v = He; + Object.defineProperty(r3, "KeywordCxt", { enumerable: true, get: function() { + return v.KeywordCxt; + } }); + var g2 = se; + Object.defineProperty(r3, "_", { enumerable: true, get: function() { + return g2._; + } }), Object.defineProperty(r3, "str", { enumerable: true, get: function() { + return g2.str; + } }), Object.defineProperty(r3, "stringify", { enumerable: true, get: function() { + return g2.stringify; + } }), Object.defineProperty(r3, "nil", { enumerable: true, get: function() { + return g2.nil; + } }), Object.defineProperty(r3, "Name", { enumerable: true, get: function() { + return g2.Name; + } }), Object.defineProperty(r3, "CodeGen", { enumerable: true, get: function() { + return g2.CodeGen; + } }); + var S = at; + Object.defineProperty(r3, "ValidationError", { enumerable: true, get: function() { + return S.default; + } }); + var z = nt; + Object.defineProperty(r3, "MissingRefError", { enumerable: true, get: function() { + return z.default; + } }); +})(Ps, wt); +var _o = /* @__PURE__ */ ks(wt); +var vo = class { + constructor() { + be(this, "ajv"); + this.ajv = new _o(); + } + validateJson(r3, n) { + const a = this.ajv.validate(r3, n); + return a ? { valid: a } : { valid: a, error: this.ajv.errorsText() }; + } + validateObjectSchema(r3, n) { + const a = this.ajv.validate(r3, n); + return a ? { valid: a } : { valid: a, error: this.ajv.errorsText() }; + } +}; +var yo = class { + constructor() { + be(this, "TIME_SPLIT", " "); + } + /** + * 给日期添加小时 + * + * @param date - Date + * @param numOfHours - 数字 + * @author terwer + * @since 1.0.0 + */ + addHoursToDate(r3, n) { + return r3.setTime(r3.getTime() + n * 60 * 60 * 1e3), r3; + } + /** + * 转换ISO日期为中文日期的通用转换方法 + * + * @param str - '2022-07-18T06:25:48.000Z + * @param isAddTimeZone - 是否增加时区(默认不增加) + * @param isShort - 是否只返回日期 + * @author terwer + * @since 1.0.0 + */ + formatIsoToZhDateFormat(r3, n, a) { + if (!r3) + return ""; + let d = r3; + const o2 = /(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})(.\d{3})Z$/gm, p = d.match(o2); + if (p == null) + return r3; + for (let y = 0; y < p.length; y++) { + const b = p[y]; + let v = b; + n && (v = this.addHoursToDate(new Date(b), 8).toISOString()); + const g2 = v.split("T"), S = g2[0], z = g2[1].split(".")[0]; + let L = S + this.TIME_SPLIT + z; + a && (L = S), d = d.replace(b, L); + } + return d; + } + /** + * 转换ISO日期为中文完整时间 + * + * @param str - '2022-07-18T06:25:48.000Z + */ + formatIsoToZh(r3) { + return this.formatIsoToZhDateFormat(r3, false, false); + } + /** + * 转换ISO日期为中文日期 + * + * @param str - '2022-07-18T06:25:48.000Z + */ + formatIsoToZhDate(r3) { + return this.formatIsoToZhDateFormat(r3, false, true); + } + /** + * 转换ISO日期为中文时间 + * + * @param str - '2022-07-18T06:25:48.000Z + */ + formatIsoToZhTime(r3) { + return this.formatIsoToZhDateFormat(r3, false).split(this.TIME_SPLIT)[1]; + } + /** + * 当前日期时间完整格式,格式:2023-03-10 02:03:43 + */ + nowZh() { + return this.formatIsoToZhDateFormat((/* @__PURE__ */ new Date()).toISOString(), true); + } + /** + * 当前日期,格式:2023-03-10 + */ + nowDateZh() { + return this.formatIsoToZhDateFormat((/* @__PURE__ */ new Date()).toISOString(), true, true); + } + /** + * 当前时间,格式:02:03:43 + */ + nowTimeZh() { + return this.formatIsoToZhDateFormat((/* @__PURE__ */ new Date()).toISOString(), true).split(this.TIME_SPLIT)[1]; + } +}; +var wo = class { + /** + * 格式化字符串 + * + * @param str - 字符串,可用占位符,例如:test \{0\} str + * @param args - 按占位符顺序排列的参数 + * @author terwer + * @since 0.0.1 + */ + f(r3, ...n) { + let a = r3; + for (let d = 0; d < n.length; d++) { + const o2 = n[d]; + typeof o2 == "string" ? a = a.replace(`{${d}}`, o2) : a = a.replace(`{${d}}`, o2.toString()); + } + return a; + } + /** + * 字符串拼接 + * + * @param str - 字符串数组 + */ + appendStr(...r3) { + return r3.join(""); + } + /** + * 判断字符串中,是否包含数组中任何一个元素 + * + * @param str - 字符串 + * @param arr - 字符串数组 + */ + includeInArray(r3, n) { + let a = false; + for (let d = 0; d < n.length; d++) { + const o2 = n[d]; + r3.includes(o2) && (a = true); + } + return a; + } + /** + * 截取指定长度的字符串 + * + * @param str - str + * @param length - 长度 + * @param ignore - 不要结尾省略号 + */ + getByLength(r3, n, a) { + const d = r3; + return d.length < n ? d : a ? d.substring(0, n) : d.substring(0, n) + "..."; + } + /** + * 字符串空值检测 + * + * @param str - 待检测的字符串 + */ + isEmptyString(r3) { + return !r3 || typeof r3 != "string" ? true : r3.trim().length === 0; + } + /** + * 路径组合,解决多出来/的问题 + * + * @param path1 - 路径1 + * @param path2 - 路径2 + */ + pathJoin(r3, n) { + let a = r3; + const d = r3.lastIndexOf("/"); + return d + 1 === r3.length && (a = r3.substring(0, d)), n.indexOf("/") > 0 ? a = a + "/" + n : a = a + n, a; + } + /** + * 强转boolean + * + * @param val - val + */ + parseBoolean(r3) { + return r3 || (r3 = "false"), r3.toString().toLowerCase() === "true"; + } +}; +var Ut = (e2, r3) => { + const n = pn(e2), a = pn(r3), d = n.pop(), o2 = a.pop(), p = _n(n, a); + return p !== 0 ? p : d && o2 ? _n(d.split("."), o2.split(".")) : d || o2 ? d ? -1 : 1 : 0; +}; +var bo = /^[v^~<>=]*?(\d+)(?:\.([x*]|\d+)(?:\.([x*]|\d+)(?:\.([x*]|\d+))?(?:-([\da-z\-]+(?:\.[\da-z\-]+)*))?(?:\+[\da-z\-]+(?:\.[\da-z\-]+)*)?)?)?$/i; +var pn = (e2) => { + if (typeof e2 != "string") + throw new TypeError("Invalid argument expected string"); + const r3 = e2.match(bo); + if (!r3) + throw new Error(`Invalid argument not valid semver ('${e2}' received)`); + return r3.shift(), r3; +}; +var mn = (e2) => e2 === "*" || e2 === "x" || e2 === "X"; +var gn = (e2) => { + const r3 = parseInt(e2, 10); + return isNaN(r3) ? e2 : r3; +}; +var $o = (e2, r3) => typeof e2 != typeof r3 ? [String(e2), String(r3)] : [e2, r3]; +var Eo = (e2, r3) => { + if (mn(e2) || mn(r3)) + return 0; + const [n, a] = $o(gn(e2), gn(r3)); + return n > a ? 1 : n < a ? -1 : 0; +}; +var _n = (e2, r3) => { + for (let n = 0; n < Math.max(e2.length, r3.length); n++) { + const a = Eo(e2[n] || "0", r3[n] || "0"); + if (a !== 0) + return a; + } + return 0; +}; +var ko = class { + /** + * Compare [semver](https://semver.org/) version strings + * This library supports the full semver specification, including comparing versions with different number of digits like `1.0.0`, `1.0`, `1`, and pre-release versions like `1.0.0-alpha`. + * + * @param v1 - First version to compare + * @param v2 - Second version to compare + * @returns boolean true if v1 is higher than v2 + */ + greater(r3, n) { + return Ut(r3, n) > 0; + } + /** + * Compare [semver](https://semver.org/) version strings + * This library supports the full semver specification, including comparing versions with different number of digits like `1.0.0`, `1.0`, `1`, and pre-release versions like `1.0.0-alpha`. + * + * @param v1 - First version to compare + * @param v2 - Second version to compare + * @returns boolean true if v1 is equal to v2 + */ + equal(r3, n) { + return Ut(r3, n) === 0; + } + /** + * Compare [semver](https://semver.org/) version strings + * This library supports the full semver specification, including comparing versions with different number of digits like `1.0.0`, `1.0`, `1`, and pre-release versions like `1.0.0-alpha`. + * + * @param v1 - First version to compare + * @param v2 - Second version to compare + * @returns boolean true if v1 is lesser than v2 + */ + lesser(r3, n) { + return Ut(r3, n) < 0; + } +}; +var Po = Object.defineProperty; +var So = (e2, r3, n) => r3 in e2 ? Po(e2, r3, { enumerable: true, configurable: true, writable: true, value: n }) : e2[r3] = n; +var jr = (e2, r3, n) => (So(e2, typeof r3 != "symbol" ? r3 + "" : r3, n), n); +var ur = class { +}; +jr(ur, "NODE_ENV_KEY", "NODE_ENV"), /** +* 开发环境 +*/ +jr(ur, "NODE_ENV_DEVELOPMENT", "development"), /** +* 生产环境 +*/ +jr(ur, "NODE_ENV_PRODUCTION", "production"), /** +* 测试环境 +*/ +jr(ur, "NODE_ENV_TEST", "test"), /** +* 是否处于调试模式 +*/ +jr(ur, "VITE_DEBUG_MODE_KEY", "VITE_DEBUG_MODE"); +var Co = class { + /** + * 环境初始化 + * + * @param envMeta - 需要传入 {"BASE_URL":"/","MODE":"production","DEV":false,"PROD":true,"SSR":false} 。特别提醒:此参数是静态元数据,取决于最终使用的项目。因此仅仅在最终使用的地方显示传递此值,中间项目请保持参数传递 + * @see {@link https://vitejs.dev/guide/env-and-mode.html#production-replacement} + */ + constructor(r3) { + jr(this, "envMeta"), this.envMeta = r3; + } + /** + * 是否是开发阶段调试 + */ + isNodeDev() { + return this.getEnv(ur.NODE_ENV_KEY) === ur.NODE_ENV_DEVELOPMENT; + } + /** + * 是否是调试阶段 + */ + isDev() { + return this.isNodeDev() || this.getBooleanEnv(ur.VITE_DEBUG_MODE_KEY); + } + /** + * 获取环境变量,key不存在返回undefined + * @param key - key + */ + getEnv(r3) { + let n; + try { + this.envMeta[r3] && (n = this.envMeta[r3]); + } catch { + } + return n; + } + /** + * 获取String类型的环境变量,key不存在直接返回空值 + * @param key - key + */ + getStringEnv(r3) { + return this.getEnv(r3) ?? ""; + } + /** + * 获取Boolean类型的环境变量,key不存在返回false + * @param key - key + */ + getBooleanEnv(r3) { + let n = false; + return this.getEnv(r3) && (n = this.getStringEnv(r3).toLowerCase() === "true"), n; + } + /** + * 获取环境变量,如果未定义或者为空值,用指定的默认值代替 + * + * @param key - key + * @param defaultValue - 默认值 + * @since 0.1.0 + * @author terwer + */ + getEnvOrDefault(r3, n) { + const a = this.getStringEnv(r3); + return a.trim().length == 0 ? n : a; + } +}; +var To = Object.defineProperty; +var jo = (e2, r3, n) => r3 in e2 ? To(e2, r3, { enumerable: true, configurable: true, writable: true, value: n }) : e2[r3] = n; +var Rr = (e2, r3, n) => (jo(e2, typeof r3 != "symbol" ? r3 + "" : r3, n), n); +var Ct = class { +}; +Rr(Ct, "LOG_LEVEL_KEY", "VITE_LOG_LEVEL"), Rr(Ct, "LOG_PREFIX_KEY", "VITE_LOG_PREFIX"); +var Ze = /* @__PURE__ */ ((e2) => (e2.LOG_LEVEL_TRACE = "TRACE", e2.LOG_LEVEL_DEBUG = "DEBUG", e2.LOG_LEVEL_INFO = "INFO", e2.LOG_LEVEL_WARN = "WARN", e2.LOG_LEVEL_ERROR = "ERROR", e2))(Ze || {}); +var ns = typeof globalThis < "u" ? globalThis : typeof window < "u" ? window : typeof global < "u" ? global : typeof self < "u" ? self : {}; +var Nr = {}; +var No = { + get exports() { + return Nr; + }, + set exports(e2) { + Nr = e2; + } +}; +(function(e2) { + (function(r3, n) { + e2.exports ? e2.exports = n() : r3.log = n(); + })(ns, function() { + var r3 = function() { + }, n = "undefined", a = typeof window !== n && typeof window.navigator !== n && /Trident\/|MSIE /.test(window.navigator.userAgent), d = [ + "trace", + "debug", + "info", + "warn", + "error" + ]; + function o2(j, T) { + var $ = j[T]; + if (typeof $.bind == "function") + return $.bind(j); + try { + return Function.prototype.bind.call($, j); + } catch { + return function() { + return Function.prototype.apply.apply($, [j, arguments]); + }; + } + } + function p() { + console.log && (console.log.apply ? console.log.apply(console, arguments) : Function.prototype.apply.apply(console.log, [console, arguments])), console.trace && console.trace(); + } + function y(j) { + return j === "debug" && (j = "log"), typeof console === n ? false : j === "trace" && a ? p : console[j] !== void 0 ? o2(console, j) : console.log !== void 0 ? o2(console, "log") : r3; + } + function b(j, T) { + for (var $ = 0; $ < d.length; $++) { + var N2 = d[$]; + this[N2] = $ < j ? r3 : this.methodFactory(N2, j, T); + } + this.log = this.debug; + } + function v(j, T, $) { + return function() { + typeof console !== n && (b.call(this, T, $), this[j].apply(this, arguments)); + }; + } + function g2(j, T, $) { + return y(j) || v.apply(this, arguments); + } + function S(j, T, $) { + var N2 = this, D2; + T = T ?? "WARN"; + var t = "loglevel"; + typeof j == "string" ? t += ":" + j : typeof j == "symbol" && (t = void 0); + function u2(m) { + var h2 = (d[m] || "silent").toUpperCase(); + if (!(typeof window === n || !t)) { + try { + window.localStorage[t] = h2; + return; + } catch { + } + try { + window.document.cookie = encodeURIComponent(t) + "=" + h2 + ";"; + } catch { + } + } + } + function s() { + var m; + if (!(typeof window === n || !t)) { + try { + m = window.localStorage[t]; + } catch { + } + if (typeof m === n) + try { + var h2 = window.document.cookie, C = h2.indexOf( + encodeURIComponent(t) + "=" + ); + C !== -1 && (m = /^([^;]+)/.exec(h2.slice(C))[1]); + } catch { + } + return N2.levels[m] === void 0 && (m = void 0), m; + } + } + function i2() { + if (!(typeof window === n || !t)) { + try { + window.localStorage.removeItem(t); + return; + } catch { + } + try { + window.document.cookie = encodeURIComponent(t) + "=; expires=Thu, 01 Jan 1970 00:00:00 UTC"; + } catch { + } + } + } + N2.name = j, N2.levels = { + TRACE: 0, + DEBUG: 1, + INFO: 2, + WARN: 3, + ERROR: 4, + SILENT: 5 + }, N2.methodFactory = $ || g2, N2.getLevel = function() { + return D2; + }, N2.setLevel = function(m, h2) { + if (typeof m == "string" && N2.levels[m.toUpperCase()] !== void 0 && (m = N2.levels[m.toUpperCase()]), typeof m == "number" && m >= 0 && m <= N2.levels.SILENT) { + if (D2 = m, h2 !== false && u2(m), b.call(N2, m, j), typeof console === n && m < N2.levels.SILENT) + return "No console available for logging"; + } else + throw "log.setLevel() called with invalid level: " + m; + }, N2.setDefaultLevel = function(m) { + T = m, s() || N2.setLevel(m, false); + }, N2.resetLevel = function() { + N2.setLevel(T, false), i2(); + }, N2.enableAll = function(m) { + N2.setLevel(N2.levels.TRACE, m); + }, N2.disableAll = function(m) { + N2.setLevel(N2.levels.SILENT, m); + }; + var c = s(); + c == null && (c = T), N2.setLevel(c, false); + } + var z = new S(), L = {}; + z.getLogger = function(j) { + if (typeof j != "symbol" && typeof j != "string" || j === "") + throw new TypeError("You must supply a name when creating a logger."); + var T = L[j]; + return T || (T = L[j] = new S( + j, + z.getLevel(), + z.methodFactory + )), T; + }; + var R = typeof window !== n ? window.log : void 0; + return z.noConflict = function() { + return typeof window !== n && window.log === z && (window.log = R), z; + }, z.getLoggers = function() { + return L; + }, z.default = z, z; + }); +})(No); +var Tt = {}; +var Oo = { + get exports() { + return Tt; + }, + set exports(e2) { + Tt = e2; + } +}; +(function(e2) { + (function(r3, n) { + e2.exports ? e2.exports = n() : r3.prefix = n(r3); + })(ns, function(r3) { + var n = function(g2) { + for (var S = 1, z = arguments.length, L; S < z; S++) + for (L in arguments[S]) + Object.prototype.hasOwnProperty.call(arguments[S], L) && (g2[L] = arguments[S][L]); + return g2; + }, a = { + template: "[%t] %l:", + levelFormatter: function(g2) { + return g2.toUpperCase(); + }, + nameFormatter: function(g2) { + return g2 || "root"; + }, + timestampFormatter: function(g2) { + return g2.toTimeString().replace(/.*(\d{2}:\d{2}:\d{2}).*/, "$1"); + }, + format: void 0 + }, d, o2 = {}, p = function(g2) { + if (!g2 || !g2.getLogger) + throw new TypeError("Argument is not a root logger"); + d = g2; + }, y = function(g2, S) { + if (!g2 || !g2.setLevel) + throw new TypeError("Argument is not a logger"); + var z = g2.methodFactory, L = g2.name || "", R = o2[L] || o2[""] || a; + function j(T, $, N2) { + var D2 = z(T, $, N2), t = o2[N2] || o2[""], u2 = t.template.indexOf("%t") !== -1, s = t.template.indexOf("%l") !== -1, i2 = t.template.indexOf("%n") !== -1; + return function() { + for (var c = "", m = arguments.length, h2 = Array(m), C = 0; C < m; C++) + h2[C] = arguments[C]; + if (L || !o2[N2]) { + var U = t.timestampFormatter(/* @__PURE__ */ new Date()), H = t.levelFormatter(T), V = t.nameFormatter(N2); + t.format ? c += t.format(H, V, U) : (c += t.template, u2 && (c = c.replace(/%t/, U)), s && (c = c.replace(/%l/, H)), i2 && (c = c.replace(/%n/, V))), h2.length && typeof h2[0] == "string" ? h2[0] = c + " " + h2[0] : h2.unshift(c); + } + D2.apply(void 0, h2); + }; + } + return o2[L] || (g2.methodFactory = j), S = S || {}, S.template && (S.format = void 0), o2[L] = n({}, R, S), g2.setLevel(g2.getLevel()), d || g2.warn( + "It is necessary to call the function reg() of loglevel-plugin-prefix before calling apply. From the next release, it will throw an error. See more: https://github.com/kutuluk/loglevel-plugin-prefix/blob/master/README.md" + ), g2; + }, b = { + reg: p, + apply: y + }, v; + return r3 && (v = r3.prefix, b.noConflict = function() { + return r3.prefix === b && (r3.prefix = v), b; + }), b; + }); +})(Oo); +function Ro() { + const e2 = Error.prepareStackTrace; + Error.prepareStackTrace = (n, a) => a; + const r3 = new Error().stack.slice(1); + return Error.prepareStackTrace = e2, r3; +} +var jt = class { + /** + * 解析日志级别为枚举 + * + * @param enumObj - 枚举对象 + * @param value - 配置的值 + */ + static stringToEnumValue(r3, n) { + return r3[Object.keys(r3).filter((a) => r3[a].toString() === n)[0]]; + } + /** + * 获取配置的日志级别 + */ + static getEnvLevel(r3) { + if (!r3) + return; + const n = r3.getEnvOrDefault(Ct.LOG_LEVEL_KEY, Ze.LOG_LEVEL_INFO), a = jt.stringToEnumValue(Ze, n.toUpperCase()); + return a || console.warn( + "[zhi-log] LOG_LEVEL is invalid in you .env file.It must be either debug, info, warn or error, fallback to default info level" + ), a; + } + /** + * 获取默认日志 + */ + static getEnvLogger(r3) { + return r3 ? r3.getEnv(Ct.LOG_PREFIX_KEY) : void 0; + } +}; +var Se = {}; +var Ao = { + get exports() { + return Se; + }, + set exports(e2) { + Se = e2; + } +}; +var Jt = {}; +var Io = { + get exports() { + return Jt; + }, + set exports(e2) { + Jt = e2; + } +}; +var vn; +function Mo() { + return vn || (vn = 1, function(e2) { + const r3 = typeof process < "u" && process.env.TERM_PROGRAM === "Hyper", n = typeof process < "u" && process.platform === "win32", a = typeof process < "u" && process.platform === "linux", d = { + ballotDisabled: "\u2612", + ballotOff: "\u2610", + ballotOn: "\u2611", + bullet: "\u2022", + bulletWhite: "\u25E6", + fullBlock: "\u2588", + heart: "\u2764", + identicalTo: "\u2261", + line: "\u2500", + mark: "\u203B", + middot: "\xB7", + minus: "\uFF0D", + multiplication: "\xD7", + obelus: "\xF7", + pencilDownRight: "\u270E", + pencilRight: "\u270F", + pencilUpRight: "\u2710", + percent: "%", + pilcrow2: "\u2761", + pilcrow: "\xB6", + plusMinus: "\xB1", + question: "?", + section: "\xA7", + starsOff: "\u2606", + starsOn: "\u2605", + upDownArrow: "\u2195" + }, o2 = Object.assign({}, d, { + check: "\u221A", + cross: "\xD7", + ellipsisLarge: "...", + ellipsis: "...", + info: "i", + questionSmall: "?", + pointer: ">", + pointerSmall: "\xBB", + radioOff: "( )", + radioOn: "(*)", + warning: "\u203C" + }), p = Object.assign({}, d, { + ballotCross: "\u2718", + check: "\u2714", + cross: "\u2716", + ellipsisLarge: "\u22EF", + ellipsis: "\u2026", + info: "\u2139", + questionFull: "\uFF1F", + questionSmall: "\uFE56", + pointer: a ? "\u25B8" : "\u276F", + pointerSmall: a ? "\u2023" : "\u203A", + radioOff: "\u25EF", + radioOn: "\u25C9", + warning: "\u26A0" + }); + e2.exports = n && !r3 ? o2 : p, Reflect.defineProperty(e2.exports, "common", { enumerable: false, value: d }), Reflect.defineProperty(e2.exports, "windows", { enumerable: false, value: o2 }), Reflect.defineProperty(e2.exports, "other", { enumerable: false, value: p }); + }(Io)), Jt; +} +var Do = (e2) => e2 !== null && typeof e2 == "object" && !Array.isArray(e2); +var Lo = /[\u001b\u009b][[\]#;?()]*(?:(?:(?:[^\W_]*;?[^\W_]*)\u0007)|(?:(?:[0-9]{1,4}(;[0-9]{0,4})*)?[~0-9=<>cf-nqrtyA-PRZ]))/g; +var zo = () => typeof process < "u" ? process.env.FORCE_COLOR !== "0" : false; +var ss = () => { + const e2 = { + enabled: zo(), + visible: true, + styles: {}, + keys: {} + }, r3 = (o2) => { + let p = o2.open = `\x1B[${o2.codes[0]}m`, y = o2.close = `\x1B[${o2.codes[1]}m`, b = o2.regex = new RegExp(`\\u001b\\[${o2.codes[1]}m`, "g"); + return o2.wrap = (v, g2) => { + v.includes(y) && (v = v.replace(b, y + p)); + let S = p + v + y; + return g2 ? S.replace(/\r*\n/g, `${y}$&${p}`) : S; + }, o2; + }, n = (o2, p, y) => typeof o2 == "function" ? o2(p) : o2.wrap(p, y), a = (o2, p) => { + if (o2 === "" || o2 == null) + return ""; + if (e2.enabled === false) + return o2; + if (e2.visible === false) + return ""; + let y = "" + o2, b = y.includes(` +`), v = p.length; + for (v > 0 && p.includes("unstyle") && (p = [.../* @__PURE__ */ new Set(["unstyle", ...p])].reverse()); v-- > 0; ) + y = n(e2.styles[p[v]], y, b); + return y; + }, d = (o2, p, y) => { + e2.styles[o2] = r3({ name: o2, codes: p }), (e2.keys[y] || (e2.keys[y] = [])).push(o2), Reflect.defineProperty(e2, o2, { + configurable: true, + enumerable: true, + set(b) { + e2.alias(o2, b); + }, + get() { + let b = (v) => a(v, b.stack); + return Reflect.setPrototypeOf(b, e2), b.stack = this.stack ? this.stack.concat(o2) : [o2], b; + } + }); + }; + return d("reset", [0, 0], "modifier"), d("bold", [1, 22], "modifier"), d("dim", [2, 22], "modifier"), d("italic", [3, 23], "modifier"), d("underline", [4, 24], "modifier"), d("inverse", [7, 27], "modifier"), d("hidden", [8, 28], "modifier"), d("strikethrough", [9, 29], "modifier"), d("black", [30, 39], "color"), d("red", [31, 39], "color"), d("green", [32, 39], "color"), d("yellow", [33, 39], "color"), d("blue", [34, 39], "color"), d("magenta", [35, 39], "color"), d("cyan", [36, 39], "color"), d("white", [37, 39], "color"), d("gray", [90, 39], "color"), d("grey", [90, 39], "color"), d("bgBlack", [40, 49], "bg"), d("bgRed", [41, 49], "bg"), d("bgGreen", [42, 49], "bg"), d("bgYellow", [43, 49], "bg"), d("bgBlue", [44, 49], "bg"), d("bgMagenta", [45, 49], "bg"), d("bgCyan", [46, 49], "bg"), d("bgWhite", [47, 49], "bg"), d("blackBright", [90, 39], "bright"), d("redBright", [91, 39], "bright"), d("greenBright", [92, 39], "bright"), d("yellowBright", [93, 39], "bright"), d("blueBright", [94, 39], "bright"), d("magentaBright", [95, 39], "bright"), d("cyanBright", [96, 39], "bright"), d("whiteBright", [97, 39], "bright"), d("bgBlackBright", [100, 49], "bgBright"), d("bgRedBright", [101, 49], "bgBright"), d("bgGreenBright", [102, 49], "bgBright"), d("bgYellowBright", [103, 49], "bgBright"), d("bgBlueBright", [104, 49], "bgBright"), d("bgMagentaBright", [105, 49], "bgBright"), d("bgCyanBright", [106, 49], "bgBright"), d("bgWhiteBright", [107, 49], "bgBright"), e2.ansiRegex = Lo, e2.hasColor = e2.hasAnsi = (o2) => (e2.ansiRegex.lastIndex = 0, typeof o2 == "string" && o2 !== "" && e2.ansiRegex.test(o2)), e2.alias = (o2, p) => { + let y = typeof p == "string" ? e2[p] : p; + if (typeof y != "function") + throw new TypeError("Expected alias to be the name of an existing color (string) or a function"); + y.stack || (Reflect.defineProperty(y, "name", { value: o2 }), e2.styles[o2] = y, y.stack = [o2]), Reflect.defineProperty(e2, o2, { + configurable: true, + enumerable: true, + set(b) { + e2.alias(o2, b); + }, + get() { + let b = (v) => a(v, b.stack); + return Reflect.setPrototypeOf(b, e2), b.stack = this.stack ? this.stack.concat(y.stack) : y.stack, b; + } + }); + }, e2.theme = (o2) => { + if (!Do(o2)) + throw new TypeError("Expected theme to be an object"); + for (let p of Object.keys(o2)) + e2.alias(p, o2[p]); + return e2; + }, e2.alias("unstyle", (o2) => typeof o2 == "string" && o2 !== "" ? (e2.ansiRegex.lastIndex = 0, o2.replace(e2.ansiRegex, "")) : ""), e2.alias("noop", (o2) => o2), e2.none = e2.clear = e2.noop, e2.stripColor = e2.unstyle, e2.symbols = Mo(), e2.define = d, e2; +}; +Ao.exports = ss(); +Se.create = ss; +var Zt; +var us; +var ds; +var is; +var os = true; +typeof process < "u" && ({ FORCE_COLOR: Zt, NODE_DISABLE_COLORS: us, NO_COLOR: ds, TERM: is } = process.env || {}, os = process.stdout && process.stdout.isTTY); +var te = { + enabled: !us && ds == null && is !== "dumb" && (Zt != null && Zt !== "0" || os), + // modifiers + reset: le(0, 0), + bold: le(1, 22), + dim: le(2, 22), + italic: le(3, 23), + underline: le(4, 24), + inverse: le(7, 27), + hidden: le(8, 28), + strikethrough: le(9, 29), + // colors + black: le(30, 39), + red: le(31, 39), + green: le(32, 39), + yellow: le(33, 39), + blue: le(34, 39), + magenta: le(35, 39), + cyan: le(36, 39), + white: le(37, 39), + gray: le(90, 39), + grey: le(90, 39), + // background colors + bgBlack: le(40, 49), + bgRed: le(41, 49), + bgGreen: le(42, 49), + bgYellow: le(43, 49), + bgBlue: le(44, 49), + bgMagenta: le(45, 49), + bgCyan: le(46, 49), + bgWhite: le(47, 49) +}; +function yn(e2, r3) { + let n = 0, a, d = "", o2 = ""; + for (; n < e2.length; n++) + a = e2[n], d += a.open, o2 += a.close, ~r3.indexOf(a.close) && (r3 = r3.replace(a.rgx, a.close + a.open)); + return d + r3 + o2; +} +function Vo(e2, r3) { + let n = { has: e2, keys: r3 }; + return n.reset = te.reset.bind(n), n.bold = te.bold.bind(n), n.dim = te.dim.bind(n), n.italic = te.italic.bind(n), n.underline = te.underline.bind(n), n.inverse = te.inverse.bind(n), n.hidden = te.hidden.bind(n), n.strikethrough = te.strikethrough.bind(n), n.black = te.black.bind(n), n.red = te.red.bind(n), n.green = te.green.bind(n), n.yellow = te.yellow.bind(n), n.blue = te.blue.bind(n), n.magenta = te.magenta.bind(n), n.cyan = te.cyan.bind(n), n.white = te.white.bind(n), n.gray = te.gray.bind(n), n.grey = te.grey.bind(n), n.bgBlack = te.bgBlack.bind(n), n.bgRed = te.bgRed.bind(n), n.bgGreen = te.bgGreen.bind(n), n.bgYellow = te.bgYellow.bind(n), n.bgBlue = te.bgBlue.bind(n), n.bgMagenta = te.bgMagenta.bind(n), n.bgCyan = te.bgCyan.bind(n), n.bgWhite = te.bgWhite.bind(n), n; +} +function le(e2, r3) { + let n = { + open: `\x1B[${e2}m`, + close: `\x1B[${r3}m`, + rgx: new RegExp(`\\x1b\\[${r3}m`, "g") + }; + return function(a) { + return this !== void 0 && this.has !== void 0 ? (~this.has.indexOf(e2) || (this.has.push(e2), this.keys.push(n)), a === void 0 ? this : te.enabled ? yn(this.keys, a + "") : a + "") : a === void 0 ? Vo([e2], [n]) : te.enabled ? yn([n], a + "") : a + ""; + }; +} +var Fo = Object.defineProperty; +var Uo = (e2, r3, n) => r3 in e2 ? Fo(e2, r3, { enumerable: true, configurable: true, writable: true, value: n }) : e2[r3] = n; +var $e = (e2, r3, n) => (Uo(e2, typeof r3 != "symbol" ? r3 + "" : r3, n), n); +var Ue = class { + /** + * 检测是否运行在Chrome插件中 + */ + static isInChromeExtension() { + return Ue.isInBrowser ? window.location.href.indexOf("chrome-extension://") > -1 : false; + } +}; +var oe = Ue; +$e(oe, "isNode", typeof process < "u"), /** +* 是否在浏览器环境 +*/ +$e(oe, "isInBrowser", typeof window < "u"), /** +* 浏览器路径分隔符 +*/ +$e(oe, "BrowserSeperator", "/"), /** +* 是否是Electron环境 +*/ +$e(oe, "isElectron", () => !Ue.isInBrowser || !window.navigator || !window.navigator.userAgent ? false : /Electron/.test(window.navigator.userAgent)), /** +* 是否有Node环境,目前包括 Electron 和 Node +*/ +$e(oe, "hasNodeEnv", () => Ue.isElectron() || Ue.isNode), /** +* 获取url参数 +* +* @param sParam - 参数 +*/ +$e(oe, "getQueryString", (e2) => { + if (!Ue.isInBrowser) + return ""; + const r3 = window.location.search.substring(1).split("&"); + for (let n = 0; n < r3.length; n++) { + const a = r3[n].split("="); + if (a[0] === e2) + return a[1]; + } + return ""; +}), /** +* 替换 URL 的参数 +* 思路: +* 1. 使用了 URLSearchParams 对象来解析和构建 URL 查询参数。 +* +* 2. 在处理包含 hash 片段的 URL 时使用了 split 函数将 URL 分成两部分:基本 URL 和 hash 片段。 +* +* 3. 然后,再次使用 split 函数将基本 URL 分成两部分:路径和查询参数。 +* +* 4. 将查询参数转换为 URLSearchParams 对象,然后设置指定的参数名和值。 +* +* 5. 最后,使用 toString 函数将查询参数转换为字符串,并将其与路径组合成新的基本 URL。如果 URL 包含 hash 片段,则将其添加到新的基本 URL 中。 +* +* @param url - 链接地址 +* @param paramName - 参数名 +* @param paramValue - 参数值 +*/ +$e(oe, "replaceUrlParam", (e2, r3, n) => { + n == null && (n = ""); + const a = new RegExp("\\b(" + r3 + "=).*?(&|#|$)"); + if (e2.search(a) >= 0) + return e2.replace(a, "$1" + n + "$2"); + const [d, o2] = e2.split("#"), [p, y] = d.split("?"), b = new URLSearchParams(y); + b.set(r3, n); + const v = b.toString(), g2 = p + (v ? "?" + v : ""); + return o2 ? g2 + "#" + o2 : g2; +}), /** +* 设置url参数 +* +* @param urlstring - url +* @param key - key +* @param value - value +*/ +$e(oe, "setUrlParameter", (e2, r3, n) => { + if (e2.includes(r3)) + return Ue.replaceUrlParam(e2, r3, n); + const a = e2.split("#"); + let d = a[0]; + const o2 = a[1]; + return d.includes("?") ? d += `&${r3}=${n}` : d += `?${r3}=${n}`, o2 && (d += "#" + o2), d; +}), /** +* 重新加载指定tab +* +* @param tabname - tabname +* @param t - 延迟时间 +*/ +$e(oe, "reloadTabPage", (e2, r3 = 200) => { + setTimeout(function() { + if (Ue.isInBrowser) { + const n = window.location.href; + window.location.href = Ue.setUrlParameter(n, "tab", e2); + } + }, r3); +}), /** +* 刷新当前tab页面 +*/ +$e(oe, "reloadPage", () => { + setTimeout(function() { + Ue.isInBrowser && window.location.reload(); + }, 200); +}), /** +* 刷新当前tab页面 +* +* @param msg - 消息提示 +* @param cb - 回调 +*/ +$e(oe, "reloadPageWithMessageCallback", (e2, r3) => { + r3 && r3(e2), setTimeout(function() { + Ue.isInBrowser && window.location.reload(); + }, 200); +}); +var Te = /* @__PURE__ */ ((e2) => (e2.BasePathType_Appearance = "Appearance", e2.BasePathType_Data = "Data", e2.BasePathType_Themes = "Themes", e2.BasePathType_ZhiTheme = "ZhiTheme", e2.BasePathType_None = "None", e2))(Te || {}); +var Oe = class { + /** + * 检测是否运行在思源打开的浏览器中 + */ + static isInSiyuanBrowser() { + return oe.isInBrowser ? typeof window.siyuan < "u" && typeof window.Lute < "u" : false; + } + /** + * 思源笔记 window 对象 + */ + static siyuanWindow() { + let e2; + return this.isInSiyuanWidget() ? e2 = parent.window : this.isInSiyuanNewWin() || this.isInSiyuanBrowser() || typeof window < "u" ? e2 = window : e2 = void 0, e2; + } + // ========================= + // require end + // ========================= + // ========================= + // import start + // ========================= + /** + * 引入json + * + * @param jsPath - js相对路径全路径 + * @param type - 类型 + */ + static async importJs(e2, r3) { + let n = e2; + switch (r3) { + case Te.BasePathType_Appearance: + n = this.browserJoinPath(this.siyuanAppearanceRelativePath(), e2); + break; + case Te.BasePathType_Data: + n = this.browserJoinPath(this.siyuanDataRelativePath(), e2); + break; + case Te.BasePathType_Themes: + n = this.browserJoinPath(this.siyuanThemeRelativePath(), e2); + break; + case Te.BasePathType_ZhiTheme: + n = this.browserJoinPath(this.zhiThemeRelativePath(), e2); + break; + default: + throw new Error("type must be provided"); + } + const { default: a } = await import( + /* @vite-ignore */ + n + ); + return a; + } + /** + * 引入json + * + * @param jsonPath - json相对路径全路径 + * @param type - 类型 + */ + // public static async importJson(jsonPath: string, type: BasePathTypeEnum) { + // let fullJsonPath = jsonPath + // switch (type) { + // case BasePathTypeEnum.BasePathType_Appearance: + // fullJsonPath = this.browserJoinPath(this.siyuanAppearanceRelativePath(), jsonPath) + // break + // case BasePathTypeEnum.BasePathType_Data: + // fullJsonPath = this.browserJoinPath(this.siyuanDataRelativePath(), jsonPath) + // break + // case BasePathTypeEnum.BasePathType_Themes: + // fullJsonPath = this.browserJoinPath(this.siyuanThemeRelativePath(), jsonPath) + // break + // case BasePathTypeEnum.BasePathType_ZhiTheme: + // fullJsonPath = this.browserJoinPath(this.zhiThemeRelativePath(), jsonPath) + // break + // default: + // throw new Error("type must be provided") + // } + // + // const { default: data } = await import(/* @vite-ignore */ fullJsonPath, { assert: { type: "json" } }) + // return data + // } + /** + * 引入 json - 以 data 为基本路径 + * + * @param jsonPath - 相对于 data 的相对路径 + */ + // public static async importDataJson(jsonPath: string) { + // return await this.importJson(jsonPath, BasePathTypeEnum.BasePathType_Data) + // } + /** + * 引入 json - 以 appearance 为基本路径 + * + * @param jsonPath - 相对于 appearance 的相对路径 + */ + // public static async importAppearanceJson(jsonPath: string) { + // return await this.importJson(jsonPath, BasePathTypeEnum.BasePathType_Appearance) + // } + /** + * 引入 json - 以 themes 为基本路径 + * + * @param jsonPath - 相对于 themes 的相对路径 + */ + // public static async importThemesJson(jsonPath: string) { + // return await this.importJson(jsonPath, BasePathTypeEnum.BasePathType_Themes) + // } + /** + * 引入 zhi 主题的 json - 以 zhi 主题 的根路径为基本路径 + * + * @param jsonPath - 相对于 zhi 主题根路径的相对路径 + */ + // public static async importZhiThemeJson(jsonPath: string) { + // return await this.importJson(jsonPath, BasePathTypeEnum.BasePathType_ZhiTheme) + // } + /** + * 引入 zhi 主题的 js - 以 zhi 主题 的根路径为基本路径 + * + * @param jsPath - 相对于 zhi 主题根路径的相对路径 + */ + static async importZhiThemeJs(e2) { + return await this.importJs(e2, Te.BasePathType_ZhiTheme); + } + // ========================= + // import start + // ========================= + /** + * 路径拼接 + * + * @param paths - 路径数组 + */ + static joinPath(...e2) { + if (oe.hasNodeEnv()) { + const r3 = this.requireLib("path"); + if (r3) + return r3.join(...e2); + } + return this.browserJoinPath(...e2); + } + static browserJoinPath(...e2) { + return e2.join(oe.BrowserSeperator); + } + /** + * 思源笔记 conf 目录 + */ + static siyuanConfPath() { + const e2 = this.siyuanWindow(); + if (!e2) + throw new Error("Not in siyuan env"); + return e2.siyuan.config.system.confDir; + } + /** + * 思源笔记 data 目录 + */ + static siyuanDataPath() { + const e2 = this.siyuanWindow(); + if (!e2) + throw new Error("Not in siyuan env"); + return e2.siyuan.config.system.dataDir; + } + /** + * 思源笔记 data 目录-相对路径 + */ + static siyuanDataRelativePath() { + if (!this.siyuanWindow()) + throw new Error("Not in siyuan env"); + return ""; + } + /** + * 思源笔记 appearance 目录 + */ + static siyuanAppearancePath() { + return this.joinPath(this.siyuanConfPath(), "appearance"); + } + /** + * 思源笔记 appearance 目录-相对路径 + */ + static siyuanAppearanceRelativePath() { + if (!this.siyuanWindow()) + throw new Error("Not in siyuan env"); + return this.browserJoinPath("", "appearance"); + } + /** + * 思源笔记 themes 目录-绝对路径 + * + * 注意: 如果是非 electron 和 Node 环境,这里返回的是浏览器的路径,不是物理路径 + * 如果使用物理路径,请调用 siyuanAppearancePath 或者 siyuanDataPath + * + * @author terwer + * @since 0.1.0 + */ + static siyuanThemePath() { + if (oe.hasNodeEnv()) + return this.joinPath(this.siyuanAppearancePath(), "themes"); + { + const e2 = this.siyuanWindow(); + if (!e2) + throw new Error("Not in siyuan env"); + return this.joinPath(e2.location.origin, "appearance", "themes"); + } + } + /** + * 思源笔记 themes 目录-相对路径 + */ + static siyuanThemeRelativePath() { + if (!this.siyuanWindow()) + throw new Error("Not in siyuan env"); + return this.browserJoinPath("", "appearance", "themes"); + } + /** + * zhi 主题目录 - 绝对路径 + */ + static zhiThemePath() { + return this.joinPath(this.siyuanThemePath(), "zhi"); + } + /** + * zhi 主题目录 - 相对路径 + */ + static zhiThemeRelativePath() { + return this.browserJoinPath(this.siyuanThemeRelativePath(), "zhi"); + } +}; +var pr = Oe; +$e(pr, "isInSiyuanWidget", () => oe.isInBrowser ? window.frameElement != null && window.frameElement.parentElement != null && window.frameElement.parentElement.parentElement != null && window.frameElement.parentElement.parentElement.getAttribute("data-node-id") !== "" : false), /** +* 思源笔记新窗口 +* +* @deprecated window.terwer 判断方式已废弃,建议以后打开新窗口注入 window.siyuanNewWin ,这样语义会更容易理解 +* @author terwer +* @version 0.1.0 +* @since 0.0.1 +*/ +$e(pr, "isInSiyuanNewWin", () => !oe.isInBrowser || !oe.isElectron() ? false : typeof window.terwer < "u" || typeof window.siyuanNewWin < "u"), // ========================= +// require start +// ========================= +/** + * 引入依赖 + * + * @param libpath - 依赖全路径 + * @param abs - 可选,是否使用觉得路径,默认是 true , 启用之后 type参数无效 + * @param type - 可选,以谁的基本路径为准 + */ +$e(pr, "requireLib", (e2, r3 = true, n = Te.BasePathType_None) => { + if (!oe.hasNodeEnv()) + throw new Error("require ony works on node env"); + let a = e2; + if (!r3) + switch (n) { + case Te.BasePathType_Appearance: + a = Oe.joinPath(Oe.siyuanAppearancePath(), e2); + break; + case Te.BasePathType_Data: + a = Oe.joinPath(Oe.siyuanDataPath(), e2); + break; + case Te.BasePathType_Themes: + a = Oe.joinPath(Oe.siyuanAppearancePath(), "themes", e2); + break; + case Te.BasePathType_ZhiTheme: + a = Oe.joinPath(Oe.siyuanAppearancePath(), "themes", "zhi", e2); + break; + default: + throw new Error("type must be provided when not use absolute path"); + } + const d = Oe.siyuanWindow(); + if (!d) + return __require(a); + if (typeof d.require < "u") + return d.require(a); +}), /** +* 引入依赖,以 data 的基本路径为准 +* +* @param libpath - 相对于 appearance 的相对路径 +*/ +$e(pr, "requireAppearanceLib", (e2) => Oe.requireLib(e2, false, Te.BasePathType_Appearance)), /** +* 引入依赖,以 data 的基本路径为准 +* +* @param libpath - 相对于 data 的相对路径 +*/ +$e(pr, "requireDataLib", (e2) => Oe.requireLib(e2, false, Te.BasePathType_Data)), /** +* 引入依赖,以 theme 的基本路径为准 +* +* @param libpath - 相对于 theme 的相对路径 +*/ +$e(pr, "requireThemesLib", (e2) => Oe.requireLib(e2, false, Te.BasePathType_Themes)), /** +* 引入依赖,以 ZhiTheme 的基本路径为准 +* +* @param libpath - 相对于 ZhiTheme 的相对路径 +*/ +$e(pr, "requireZhiThemeLib", (e2) => Oe.requireLib(e2, false, Te.BasePathType_ZhiTheme)); +var Le = { + white: (e2) => oe.isElectron() ? Se.whiteBright(e2) : te.white(e2), + gray: (e2) => oe.isElectron() ? Se.gray(e2) : te.gray(e2), + blue: (e2) => oe.isElectron() ? Se.blue(e2) : te.blue(e2), + green: (e2) => oe.isElectron() ? Se.green(e2) : te.green(e2), + yellow: (e2) => oe.isElectron() ? Se.yellow(e2) : te.yellow(e2), + red: (e2) => oe.isElectron() ? Se.red(e2) : te.red(e2), + bgWhite: (e2) => oe.isElectron() ? Se.bgWhiteBright(e2) : te.bgWhite(e2), + bgGrey: (e2) => oe.isElectron() ? Se.bgCyanBright(e2) : te.bgCyan(e2), + bgBlue: (e2) => oe.isElectron() ? Se.bgBlueBright(e2) : te.bgBlue(e2), + bgGreen: (e2) => oe.isElectron() ? Se.bgGreenBright(e2) : te.bgGreen(e2), + bgYellow: (e2) => oe.isElectron() ? Se.bgYellowBright(e2) : te.bgYellow(e2), + bgRed: (e2) => oe.isElectron() ? Se.bgRedBright(e2) : te.bgRed(e2) +}; +var Bo = class { + constructor(r3, n, a) { + Rr(this, "consoleLogger", "console"), Rr(this, "stackSize", 1), Rr(this, "getLogger", (p) => { + let y; + if (p) + y = p; + else { + const b = this.getCallStack(), v = [], g2 = []; + for (let S = 0; S < b.length; S++) { + const z = b[S], L = z.getFileName() ?? "none"; + if (S > this.stackSize - 1) + break; + const R = L + "-" + z.getLineNumber() + ":" + z.getColumnNumber(); + v.push(R); + } + g2.length > 0 && (y = v.join(" -> ")); + } + return (!y || y.trim().length === 0) && (y = this.consoleLogger), Nr.getLogger(y); + }), this.stackSize = 1; + let d; + r3 ? d = r3 : d = jt.getEnvLevel(a), d = d ?? Ze.LOG_LEVEL_INFO, Nr.setLevel(d); + const o2 = (p, y, b, v) => { + const g2 = [], S = n ?? jt.getEnvLogger(a) ?? "zhi"; + return g2.push(Le.gray("[") + v(S) + Le.gray("]")), g2.push(Le.gray("[") + Le.gray(b.toString()) + Le.gray("]")), g2.push(v(p.toUpperCase().toString())), g2.push(v(y)), g2.push(Le.gray(":")), g2; + }; + Tt.reg(Nr), Tt.apply(Nr, { + format(p, y, b) { + let v = []; + const g2 = y ?? ""; + switch (p) { + case Ze.LOG_LEVEL_TRACE: + v = o2(p, g2, b, Le.gray); + break; + case Ze.LOG_LEVEL_DEBUG: + v = o2(p, g2, b, Le.blue); + break; + case Ze.LOG_LEVEL_INFO: + v = o2(p, g2, b, Le.green); + break; + case Ze.LOG_LEVEL_WARN: + v = o2(p, g2, b, Le.yellow); + break; + case Ze.LOG_LEVEL_ERROR: + v = o2(p, g2, b, Le.red); + break; + default: + v = o2(Ze.LOG_LEVEL_INFO, g2, b, Le.green); + break; + } + return v.join(" "); + } + }); + } + /** + * 设置输出栈的深度,默认1 + * + * @param stackSize - 栈的深度 + */ + setStackSize(r3) { + this.stackSize = r3 ?? 1; + } + /** + * 获取调用堆栈,若未获取到直接返回空数组 + * + * @author terwer + * @since 1.6.0 + */ + getCallStack() { + let r3; + try { + r3 = Ro(); + } catch { + r3 = []; + } + return r3; + } +}; +var Ho = class { + /** + * 默认日志级别 + * + * @param level - 可选,未设置默认INFO + * @param sign - 可选前缀,默认zhi + * @param env - 可选环境变量实例 + */ + constructor(r3, n, a) { + Rr(this, "logger"), this.logger = new Bo(r3, n, a); + } + /** + * 获取日志记录器 + * + * @param loggerName - 日志记录器名称 + * @param stackSize - 打印栈的深度 + * @protected + */ + getLogger(r3, n) { + return this.logger.setStackSize(n), this.logger.getLogger(r3); + } +}; +var wn = class extends Ho { + constructor(r3, n, a) { + super(r3, n, a); + } + /** + * 获取默认的日志记录器 + * + * @param loggerName - 日志记录器名称 + * @param stackSize - 打印栈的深度 + */ + getLogger(r3, n) { + return super.getLogger(r3, n); + } +}; +var Ia = class { + /** + * 默认日志记录器 + * + * @param stackSize - 栈的深度 + * @param env - 环境变量实例 + */ + static defaultLogger(r3, n) { + return Ia.customLogFactory(void 0, void 0, r3).getLogger(void 0, n); + } + /** + * 自定义日志工厂 + * + * @param level - 级别 + * @param sign - 标志 + * @param env - 环境变量 + */ + static customLogFactory(r3, n, a) { + return new wn(r3, n, a); + } + /** + * 自定义日志工厂,自定义前缀 + * + * @param sign - 标志 + * @param env - 环境变量 + */ + static customSignLogFactory(r3, n) { + return new wn(void 0, r3, n); + } +}; +var qo = "zhi"; +var yt = class { + /** + * 某些情况下,可能需要手动 init 之后才能用 + */ + static initEnv(r3) { + this.env = r3; + } + /** + * 获取 zhi-env 实例 - 必须在使用的时候重写此方法 + * + * ``` + * if (!this.env) { + * this.env = new Env({"BASE_URL":"/","MODE":"production","DEV":false,"PROD":true,"SSR":false}) + * } + * return this.env + * ``` + * + * @see {@link https://github.com/terwer/zhi/tree/main/apps/zhi-env#usage docs for zhi-env usage} + */ + static zhiEnv() { + throw new Error("Method 'zhiEnv' must be implemented"); + } + /** + * 获取 zhi-log 实例 + * + * @param sign - 标志 + * @param loggerName - 日志名称 + */ + static zhiLogWithSign(r3, n) { + if (this.loggerMap[n]) + return this.loggerMap[n].debug("Zhi-log use cache"), this.loggerMap[n]; + const a = this.env, d = Ia.customSignLogFactory(r3, a).getLogger(n); + return this.loggerMap[n] = d, d.debug("Zhi-log add new logger"), d; + } + /** + * 获取 zhi-log 实例 + * + * @param loggerName - 日志名称 + */ + static zhiLog(r3) { + return this.zhiLogWithSign(qo, r3); + } + /** + * 获取 zhi-common 实例 + */ + static zhiCommon() { + return this.common || (this.common = new Zo()), this.common; + } +}; +be(yt, "env"), /** +* zhi-util 的日志器缓存 +*/ +be(yt, "loggerMap", {}), /** +* zhi-util 的通用工具类 +*/ +be(yt, "common"); +var Ma = class extends yt { + static zhiEnv() { + return this.env || (this.env = new Co({ BASE_URL: "/", MODE: "production", DEV: false, PROD: true, SSR: false })), this.env; + } +}; +var bn = class { + constructor() { + be(this, "logger"); + this.logger = Ma.zhiLog("lute-adaptor"), Lute ? this.logger.debug("Detected Lute is bundled, will use!") : this.logger.debug("Lute is not available!"); + } + isAvailable() { + return typeof Lute < "u"; + } + /** + * 高亮关键字 + * + * @param str - 字符串 + * @private + */ + highlightWords(r3) { + const n = new RegExp("(?<=^|[\\s\\S])==([^\\n]+?)==(?=($|[\\s\\S]))", "g"); + return r3.replace(n, '$1'); + } + /** + * 渲染Markdown + * + * @param md - Markdown + */ + async renderMarkdownStr(r3) { + if (!this.isAvailable()) + return this.logger.error("Lute is not available, will return original md"), r3; + const n = Lute, a = n.New(), d = { + renderText: (o2, p) => p ? [this.highlightWords(o2.Text()), n.WalkContinue] : ["", n.WalkContinue] + // renderStrong: (node: any, entering: any) => { + // return ["", luteObj.WalkContinue] + // }, + // renderParagraph: (node: any, entering: any) => { + // return ["", luteObj.WalkContinue] + // } + }; + return a.SetJSRenderers({ + renderers: { + Md2HTML: d + } + }), this.logger.info("Lute is rendering md to HTML..."), a.MarkdownStr("", r3); + } +}; +var Nt = {}; +var Go = { + get exports() { + return Nt; + }, + set exports(e2) { + Nt = e2; + } +}; +(function(e2) { + (function() { + function r3(t) { + var u2 = { + omitExtraWLInCodeBlocks: { + defaultValue: false, + describe: "Omit the default extra whiteline added to code blocks", + type: "boolean" + }, + noHeaderId: { + defaultValue: false, + describe: "Turn on/off generated header id", + type: "boolean" + }, + prefixHeaderId: { + defaultValue: false, + describe: "Add a prefix to the generated header ids. Passing a string will prefix that string to the header id. Setting to true will add a generic 'section-' prefix", + type: "string" + }, + rawPrefixHeaderId: { + defaultValue: false, + describe: 'Setting this option to true will prevent showdown from modifying the prefix. This might result in malformed IDs (if, for instance, the " char is used in the prefix)', + type: "boolean" + }, + ghCompatibleHeaderId: { + defaultValue: false, + describe: "Generate header ids compatible with github style (spaces are replaced with dashes, a bunch of non alphanumeric chars are removed)", + type: "boolean" + }, + rawHeaderId: { + defaultValue: false, + describe: `Remove only spaces, ' and " from generated header ids (including prefixes), replacing them with dashes (-). WARNING: This might result in malformed ids`, + type: "boolean" + }, + headerLevelStart: { + defaultValue: false, + describe: "The header blocks level start", + type: "integer" + }, + parseImgDimensions: { + defaultValue: false, + describe: "Turn on/off image dimension parsing", + type: "boolean" + }, + simplifiedAutoLink: { + defaultValue: false, + describe: "Turn on/off GFM autolink style", + type: "boolean" + }, + excludeTrailingPunctuationFromURLs: { + defaultValue: false, + describe: "Excludes trailing punctuation from links generated with autoLinking", + type: "boolean" + }, + literalMidWordUnderscores: { + defaultValue: false, + describe: "Parse midword underscores as literal underscores", + type: "boolean" + }, + literalMidWordAsterisks: { + defaultValue: false, + describe: "Parse midword asterisks as literal asterisks", + type: "boolean" + }, + strikethrough: { + defaultValue: false, + describe: "Turn on/off strikethrough support", + type: "boolean" + }, + tables: { + defaultValue: false, + describe: "Turn on/off tables support", + type: "boolean" + }, + tablesHeaderId: { + defaultValue: false, + describe: "Add an id to table headers", + type: "boolean" + }, + ghCodeBlocks: { + defaultValue: true, + describe: "Turn on/off GFM fenced code blocks support", + type: "boolean" + }, + tasklists: { + defaultValue: false, + describe: "Turn on/off GFM tasklist support", + type: "boolean" + }, + smoothLivePreview: { + defaultValue: false, + describe: "Prevents weird effects in live previews due to incomplete input", + type: "boolean" + }, + smartIndentationFix: { + defaultValue: false, + describe: "Tries to smartly fix indentation in es6 strings", + type: "boolean" + }, + disableForced4SpacesIndentedSublists: { + defaultValue: false, + describe: "Disables the requirement of indenting nested sublists by 4 spaces", + type: "boolean" + }, + simpleLineBreaks: { + defaultValue: false, + describe: "Parses simple line breaks as
(GFM Style)", + type: "boolean" + }, + requireSpaceBeforeHeadingText: { + defaultValue: false, + describe: "Makes adding a space between `#` and the header text mandatory (GFM Style)", + type: "boolean" + }, + ghMentions: { + defaultValue: false, + describe: "Enables github @mentions", + type: "boolean" + }, + ghMentionsLink: { + defaultValue: "https://github.com/{u}", + describe: "Changes the link generated by @mentions. Only applies if ghMentions option is enabled.", + type: "string" + }, + encodeEmails: { + defaultValue: true, + describe: "Encode e-mail addresses through the use of Character Entities, transforming ASCII e-mail addresses into its equivalent decimal entities", + type: "boolean" + }, + openLinksInNewWindow: { + defaultValue: false, + describe: "Open all links in new windows", + type: "boolean" + }, + backslashEscapesHTMLTags: { + defaultValue: false, + describe: "Support for HTML Tag escaping. ex:
foo
", + type: "boolean" + }, + emoji: { + defaultValue: false, + describe: "Enable emoji support. Ex: `this is a :smile: emoji`", + type: "boolean" + }, + underline: { + defaultValue: false, + describe: "Enable support for underline. Syntax is double or triple underscores: `__underline word__`. With this option enabled, underscores no longer parses into `` and ``", + type: "boolean" + }, + ellipsis: { + defaultValue: true, + describe: "Replaces three dots with the ellipsis unicode character", + type: "boolean" + }, + completeHTMLDocument: { + defaultValue: false, + describe: "Outputs a complete html document, including ``, `` and `` tags", + type: "boolean" + }, + metadata: { + defaultValue: false, + describe: "Enable support for document metadata (defined at the top of the document between `\xAB\xAB\xAB` and `\xBB\xBB\xBB` or between `---` and `---`).", + type: "boolean" + }, + splitAdjacentBlockquotes: { + defaultValue: false, + describe: "Split adjacent blockquote blocks", + type: "boolean" + } + }; + if (t === false) + return JSON.parse(JSON.stringify(u2)); + var s = {}; + for (var i2 in u2) + u2.hasOwnProperty(i2) && (s[i2] = u2[i2].defaultValue); + return s; + } + function n() { + var t = r3(true), u2 = {}; + for (var s in t) + t.hasOwnProperty(s) && (u2[s] = true); + return u2; + } + var a = {}, d = {}, o2 = {}, p = r3(true), y = "vanilla", b = { + github: { + omitExtraWLInCodeBlocks: true, + simplifiedAutoLink: true, + excludeTrailingPunctuationFromURLs: true, + literalMidWordUnderscores: true, + strikethrough: true, + tables: true, + tablesHeaderId: true, + ghCodeBlocks: true, + tasklists: true, + disableForced4SpacesIndentedSublists: true, + simpleLineBreaks: true, + requireSpaceBeforeHeadingText: true, + ghCompatibleHeaderId: true, + ghMentions: true, + backslashEscapesHTMLTags: true, + emoji: true, + splitAdjacentBlockquotes: true + }, + original: { + noHeaderId: true, + ghCodeBlocks: false + }, + ghost: { + omitExtraWLInCodeBlocks: true, + parseImgDimensions: true, + simplifiedAutoLink: true, + excludeTrailingPunctuationFromURLs: true, + literalMidWordUnderscores: true, + strikethrough: true, + tables: true, + tablesHeaderId: true, + ghCodeBlocks: true, + tasklists: true, + smoothLivePreview: true, + simpleLineBreaks: true, + requireSpaceBeforeHeadingText: true, + ghMentions: false, + encodeEmails: true + }, + vanilla: r3(true), + allOn: n() + }; + a.helper = {}, a.extensions = {}, a.setOption = function(t, u2) { + return p[t] = u2, this; + }, a.getOption = function(t) { + return p[t]; + }, a.getOptions = function() { + return p; + }, a.resetOptions = function() { + p = r3(true); + }, a.setFlavor = function(t) { + if (!b.hasOwnProperty(t)) + throw Error(t + " flavor was not found"); + a.resetOptions(); + var u2 = b[t]; + y = t; + for (var s in u2) + u2.hasOwnProperty(s) && (p[s] = u2[s]); + }, a.getFlavor = function() { + return y; + }, a.getFlavorOptions = function(t) { + if (b.hasOwnProperty(t)) + return b[t]; + }, a.getDefaultOptions = function(t) { + return r3(t); + }, a.subParser = function(t, u2) { + if (a.helper.isString(t)) + if (typeof u2 < "u") + d[t] = u2; + else { + if (d.hasOwnProperty(t)) + return d[t]; + throw Error("SubParser named " + t + " not registered!"); + } + }, a.extension = function(t, u2) { + if (!a.helper.isString(t)) + throw Error("Extension 'name' must be a string"); + if (t = a.helper.stdExtName(t), a.helper.isUndefined(u2)) { + if (!o2.hasOwnProperty(t)) + throw Error("Extension named " + t + " is not registered!"); + return o2[t]; + } else { + typeof u2 == "function" && (u2 = u2()), a.helper.isArray(u2) || (u2 = [u2]); + var s = v(u2, t); + if (s.valid) + o2[t] = u2; + else + throw Error(s.error); + } + }, a.getAllExtensions = function() { + return o2; + }, a.removeExtension = function(t) { + delete o2[t]; + }, a.resetExtensions = function() { + o2 = {}; + }; + function v(t, u2) { + var s = u2 ? "Error in " + u2 + " extension->" : "Error in unnamed extension", i2 = { + valid: true, + error: "" + }; + a.helper.isArray(t) || (t = [t]); + for (var c = 0; c < t.length; ++c) { + var m = s + " sub-extension " + c + ": ", h2 = t[c]; + if (typeof h2 != "object") + return i2.valid = false, i2.error = m + "must be an object, but " + typeof h2 + " given", i2; + if (!a.helper.isString(h2.type)) + return i2.valid = false, i2.error = m + 'property "type" must be a string, but ' + typeof h2.type + " given", i2; + var C = h2.type = h2.type.toLowerCase(); + if (C === "language" && (C = h2.type = "lang"), C === "html" && (C = h2.type = "output"), C !== "lang" && C !== "output" && C !== "listener") + return i2.valid = false, i2.error = m + "type " + C + ' is not recognized. Valid values: "lang/language", "output/html" or "listener"', i2; + if (C === "listener") { + if (a.helper.isUndefined(h2.listeners)) + return i2.valid = false, i2.error = m + '. Extensions of type "listener" must have a property called "listeners"', i2; + } else if (a.helper.isUndefined(h2.filter) && a.helper.isUndefined(h2.regex)) + return i2.valid = false, i2.error = m + C + ' extensions must define either a "regex" property or a "filter" method', i2; + if (h2.listeners) { + if (typeof h2.listeners != "object") + return i2.valid = false, i2.error = m + '"listeners" property must be an object but ' + typeof h2.listeners + " given", i2; + for (var U in h2.listeners) + if (h2.listeners.hasOwnProperty(U) && typeof h2.listeners[U] != "function") + return i2.valid = false, i2.error = m + '"listeners" property must be an hash of [event name]: [callback]. listeners.' + U + " must be a function but " + typeof h2.listeners[U] + " given", i2; + } + if (h2.filter) { + if (typeof h2.filter != "function") + return i2.valid = false, i2.error = m + '"filter" must be a function, but ' + typeof h2.filter + " given", i2; + } else if (h2.regex) { + if (a.helper.isString(h2.regex) && (h2.regex = new RegExp(h2.regex, "g")), !(h2.regex instanceof RegExp)) + return i2.valid = false, i2.error = m + '"regex" property must either be a string or a RegExp object, but ' + typeof h2.regex + " given", i2; + if (a.helper.isUndefined(h2.replace)) + return i2.valid = false, i2.error = m + '"regex" extensions must implement a replace string or function', i2; + } + } + return i2; + } + a.validateExtension = function(t) { + var u2 = v(t, null); + return u2.valid ? true : (console.warn(u2.error), false); + }, a.hasOwnProperty("helper") || (a.helper = {}), a.helper.isString = function(t) { + return typeof t == "string" || t instanceof String; + }, a.helper.isFunction = function(t) { + var u2 = {}; + return t && u2.toString.call(t) === "[object Function]"; + }, a.helper.isArray = function(t) { + return Array.isArray(t); + }, a.helper.isUndefined = function(t) { + return typeof t > "u"; + }, a.helper.forEach = function(t, u2) { + if (a.helper.isUndefined(t)) + throw new Error("obj param is required"); + if (a.helper.isUndefined(u2)) + throw new Error("callback param is required"); + if (!a.helper.isFunction(u2)) + throw new Error("callback param must be a function/closure"); + if (typeof t.forEach == "function") + t.forEach(u2); + else if (a.helper.isArray(t)) + for (var s = 0; s < t.length; s++) + u2(t[s], s, t); + else if (typeof t == "object") + for (var i2 in t) + t.hasOwnProperty(i2) && u2(t[i2], i2, t); + else + throw new Error("obj does not seem to be an array or an iterable object"); + }, a.helper.stdExtName = function(t) { + return t.replace(/[_?*+\/\\.^-]/g, "").replace(/\s/g, "").toLowerCase(); + }; + function g2(t, u2) { + var s = u2.charCodeAt(0); + return "\xA8E" + s + "E"; + } + a.helper.escapeCharactersCallback = g2, a.helper.escapeCharacters = function(t, u2, s) { + var i2 = "([" + u2.replace(/([\[\]\\])/g, "\\$1") + "])"; + s && (i2 = "\\\\" + i2); + var c = new RegExp(i2, "g"); + return t = t.replace(c, g2), t; + }, a.helper.unescapeHTMLEntities = function(t) { + return t.replace(/"/g, '"').replace(/</g, "<").replace(/>/g, ">").replace(/&/g, "&"); + }; + var S = function(t, u2, s, i2) { + var c = i2 || "", m = c.indexOf("g") > -1, h2 = new RegExp(u2 + "|" + s, "g" + c.replace(/g/g, "")), C = new RegExp(u2, c.replace(/g/g, "")), U = [], H, V, G, _2, q; + do + for (H = 0; G = h2.exec(t); ) + if (C.test(G[0])) + H++ || (V = h2.lastIndex, _2 = V - G[0].length); + else if (H && !--H) { + q = G.index + G[0].length; + var J = { + left: { start: _2, end: V }, + match: { start: V, end: G.index }, + right: { start: G.index, end: q }, + wholeMatch: { start: _2, end: q } + }; + if (U.push(J), !m) + return U; + } + while (H && (h2.lastIndex = V)); + return U; + }; + a.helper.matchRecursiveRegExp = function(t, u2, s, i2) { + for (var c = S(t, u2, s, i2), m = [], h2 = 0; h2 < c.length; ++h2) + m.push([ + t.slice(c[h2].wholeMatch.start, c[h2].wholeMatch.end), + t.slice(c[h2].match.start, c[h2].match.end), + t.slice(c[h2].left.start, c[h2].left.end), + t.slice(c[h2].right.start, c[h2].right.end) + ]); + return m; + }, a.helper.replaceRecursiveRegExp = function(t, u2, s, i2, c) { + if (!a.helper.isFunction(u2)) { + var m = u2; + u2 = function() { + return m; + }; + } + var h2 = S(t, s, i2, c), C = t, U = h2.length; + if (U > 0) { + var H = []; + h2[0].wholeMatch.start !== 0 && H.push(t.slice(0, h2[0].wholeMatch.start)); + for (var V = 0; V < U; ++V) + H.push( + u2( + t.slice(h2[V].wholeMatch.start, h2[V].wholeMatch.end), + t.slice(h2[V].match.start, h2[V].match.end), + t.slice(h2[V].left.start, h2[V].left.end), + t.slice(h2[V].right.start, h2[V].right.end) + ) + ), V < U - 1 && H.push(t.slice(h2[V].wholeMatch.end, h2[V + 1].wholeMatch.start)); + h2[U - 1].wholeMatch.end < t.length && H.push(t.slice(h2[U - 1].wholeMatch.end)), C = H.join(""); + } + return C; + }, a.helper.regexIndexOf = function(t, u2, s) { + if (!a.helper.isString(t)) + throw "InvalidArgumentError: first parameter of showdown.helper.regexIndexOf function must be a string"; + if (!(u2 instanceof RegExp)) + throw "InvalidArgumentError: second parameter of showdown.helper.regexIndexOf function must be an instance of RegExp"; + var i2 = t.substring(s || 0).search(u2); + return i2 >= 0 ? i2 + (s || 0) : i2; + }, a.helper.splitAtIndex = function(t, u2) { + if (!a.helper.isString(t)) + throw "InvalidArgumentError: first parameter of showdown.helper.regexIndexOf function must be a string"; + return [t.substring(0, u2), t.substring(u2)]; + }, a.helper.encodeEmailAddress = function(t) { + var u2 = [ + function(s) { + return "&#" + s.charCodeAt(0) + ";"; + }, + function(s) { + return "&#x" + s.charCodeAt(0).toString(16) + ";"; + }, + function(s) { + return s; + } + ]; + return t = t.replace(/./g, function(s) { + if (s === "@") + s = u2[Math.floor(Math.random() * 2)](s); + else { + var i2 = Math.random(); + s = i2 > 0.9 ? u2[2](s) : i2 > 0.45 ? u2[1](s) : u2[0](s); + } + return s; + }), t; + }, a.helper.padEnd = function(u2, s, i2) { + return s = s >> 0, i2 = String(i2 || " "), u2.length > s ? String(u2) : (s = s - u2.length, s > i2.length && (i2 += i2.repeat(s / i2.length)), String(u2) + i2.slice(0, s)); + }, typeof console > "u" && (console = { + warn: function(t) { + alert(t); + }, + log: function(t) { + alert(t); + }, + error: function(t) { + throw t; + } + }), a.helper.regexes = { + asteriskDashAndColon: /([*_:~])/g + }, a.helper.emojis = { + "+1": "\u{1F44D}", + "-1": "\u{1F44E}", + 100: "\u{1F4AF}", + 1234: "\u{1F522}", + "1st_place_medal": "\u{1F947}", + "2nd_place_medal": "\u{1F948}", + "3rd_place_medal": "\u{1F949}", + "8ball": "\u{1F3B1}", + a: "\u{1F170}\uFE0F", + ab: "\u{1F18E}", + abc: "\u{1F524}", + abcd: "\u{1F521}", + accept: "\u{1F251}", + aerial_tramway: "\u{1F6A1}", + airplane: "\u2708\uFE0F", + alarm_clock: "\u23F0", + alembic: "\u2697\uFE0F", + alien: "\u{1F47D}", + ambulance: "\u{1F691}", + amphora: "\u{1F3FA}", + anchor: "\u2693\uFE0F", + angel: "\u{1F47C}", + anger: "\u{1F4A2}", + angry: "\u{1F620}", + anguished: "\u{1F627}", + ant: "\u{1F41C}", + apple: "\u{1F34E}", + aquarius: "\u2652\uFE0F", + aries: "\u2648\uFE0F", + arrow_backward: "\u25C0\uFE0F", + arrow_double_down: "\u23EC", + arrow_double_up: "\u23EB", + arrow_down: "\u2B07\uFE0F", + arrow_down_small: "\u{1F53D}", + arrow_forward: "\u25B6\uFE0F", + arrow_heading_down: "\u2935\uFE0F", + arrow_heading_up: "\u2934\uFE0F", + arrow_left: "\u2B05\uFE0F", + arrow_lower_left: "\u2199\uFE0F", + arrow_lower_right: "\u2198\uFE0F", + arrow_right: "\u27A1\uFE0F", + arrow_right_hook: "\u21AA\uFE0F", + arrow_up: "\u2B06\uFE0F", + arrow_up_down: "\u2195\uFE0F", + arrow_up_small: "\u{1F53C}", + arrow_upper_left: "\u2196\uFE0F", + arrow_upper_right: "\u2197\uFE0F", + arrows_clockwise: "\u{1F503}", + arrows_counterclockwise: "\u{1F504}", + art: "\u{1F3A8}", + articulated_lorry: "\u{1F69B}", + artificial_satellite: "\u{1F6F0}", + astonished: "\u{1F632}", + athletic_shoe: "\u{1F45F}", + atm: "\u{1F3E7}", + atom_symbol: "\u269B\uFE0F", + avocado: "\u{1F951}", + b: "\u{1F171}\uFE0F", + baby: "\u{1F476}", + baby_bottle: "\u{1F37C}", + baby_chick: "\u{1F424}", + baby_symbol: "\u{1F6BC}", + back: "\u{1F519}", + bacon: "\u{1F953}", + badminton: "\u{1F3F8}", + baggage_claim: "\u{1F6C4}", + baguette_bread: "\u{1F956}", + balance_scale: "\u2696\uFE0F", + balloon: "\u{1F388}", + ballot_box: "\u{1F5F3}", + ballot_box_with_check: "\u2611\uFE0F", + bamboo: "\u{1F38D}", + banana: "\u{1F34C}", + bangbang: "\u203C\uFE0F", + bank: "\u{1F3E6}", + bar_chart: "\u{1F4CA}", + barber: "\u{1F488}", + baseball: "\u26BE\uFE0F", + basketball: "\u{1F3C0}", + basketball_man: "\u26F9\uFE0F", + basketball_woman: "\u26F9\uFE0F‍\u2640\uFE0F", + bat: "\u{1F987}", + bath: "\u{1F6C0}", + bathtub: "\u{1F6C1}", + battery: "\u{1F50B}", + beach_umbrella: "\u{1F3D6}", + bear: "\u{1F43B}", + bed: "\u{1F6CF}", + bee: "\u{1F41D}", + beer: "\u{1F37A}", + beers: "\u{1F37B}", + beetle: "\u{1F41E}", + beginner: "\u{1F530}", + bell: "\u{1F514}", + bellhop_bell: "\u{1F6CE}", + bento: "\u{1F371}", + biking_man: "\u{1F6B4}", + bike: "\u{1F6B2}", + biking_woman: "\u{1F6B4}‍\u2640\uFE0F", + bikini: "\u{1F459}", + biohazard: "\u2623\uFE0F", + bird: "\u{1F426}", + birthday: "\u{1F382}", + black_circle: "\u26AB\uFE0F", + black_flag: "\u{1F3F4}", + black_heart: "\u{1F5A4}", + black_joker: "\u{1F0CF}", + black_large_square: "\u2B1B\uFE0F", + black_medium_small_square: "\u25FE\uFE0F", + black_medium_square: "\u25FC\uFE0F", + black_nib: "\u2712\uFE0F", + black_small_square: "\u25AA\uFE0F", + black_square_button: "\u{1F532}", + blonde_man: "\u{1F471}", + blonde_woman: "\u{1F471}‍\u2640\uFE0F", + blossom: "\u{1F33C}", + blowfish: "\u{1F421}", + blue_book: "\u{1F4D8}", + blue_car: "\u{1F699}", + blue_heart: "\u{1F499}", + blush: "\u{1F60A}", + boar: "\u{1F417}", + boat: "\u26F5\uFE0F", + bomb: "\u{1F4A3}", + book: "\u{1F4D6}", + bookmark: "\u{1F516}", + bookmark_tabs: "\u{1F4D1}", + books: "\u{1F4DA}", + boom: "\u{1F4A5}", + boot: "\u{1F462}", + bouquet: "\u{1F490}", + bowing_man: "\u{1F647}", + bow_and_arrow: "\u{1F3F9}", + bowing_woman: "\u{1F647}‍\u2640\uFE0F", + bowling: "\u{1F3B3}", + boxing_glove: "\u{1F94A}", + boy: "\u{1F466}", + bread: "\u{1F35E}", + bride_with_veil: "\u{1F470}", + bridge_at_night: "\u{1F309}", + briefcase: "\u{1F4BC}", + broken_heart: "\u{1F494}", + bug: "\u{1F41B}", + building_construction: "\u{1F3D7}", + bulb: "\u{1F4A1}", + bullettrain_front: "\u{1F685}", + bullettrain_side: "\u{1F684}", + burrito: "\u{1F32F}", + bus: "\u{1F68C}", + business_suit_levitating: "\u{1F574}", + busstop: "\u{1F68F}", + bust_in_silhouette: "\u{1F464}", + busts_in_silhouette: "\u{1F465}", + butterfly: "\u{1F98B}", + cactus: "\u{1F335}", + cake: "\u{1F370}", + calendar: "\u{1F4C6}", + call_me_hand: "\u{1F919}", + calling: "\u{1F4F2}", + camel: "\u{1F42B}", + camera: "\u{1F4F7}", + camera_flash: "\u{1F4F8}", + camping: "\u{1F3D5}", + cancer: "\u264B\uFE0F", + candle: "\u{1F56F}", + candy: "\u{1F36C}", + canoe: "\u{1F6F6}", + capital_abcd: "\u{1F520}", + capricorn: "\u2651\uFE0F", + car: "\u{1F697}", + card_file_box: "\u{1F5C3}", + card_index: "\u{1F4C7}", + card_index_dividers: "\u{1F5C2}", + carousel_horse: "\u{1F3A0}", + carrot: "\u{1F955}", + cat: "\u{1F431}", + cat2: "\u{1F408}", + cd: "\u{1F4BF}", + chains: "\u26D3", + champagne: "\u{1F37E}", + chart: "\u{1F4B9}", + chart_with_downwards_trend: "\u{1F4C9}", + chart_with_upwards_trend: "\u{1F4C8}", + checkered_flag: "\u{1F3C1}", + cheese: "\u{1F9C0}", + cherries: "\u{1F352}", + cherry_blossom: "\u{1F338}", + chestnut: "\u{1F330}", + chicken: "\u{1F414}", + children_crossing: "\u{1F6B8}", + chipmunk: "\u{1F43F}", + chocolate_bar: "\u{1F36B}", + christmas_tree: "\u{1F384}", + church: "\u26EA\uFE0F", + cinema: "\u{1F3A6}", + circus_tent: "\u{1F3AA}", + city_sunrise: "\u{1F307}", + city_sunset: "\u{1F306}", + cityscape: "\u{1F3D9}", + cl: "\u{1F191}", + clamp: "\u{1F5DC}", + clap: "\u{1F44F}", + clapper: "\u{1F3AC}", + classical_building: "\u{1F3DB}", + clinking_glasses: "\u{1F942}", + clipboard: "\u{1F4CB}", + clock1: "\u{1F550}", + clock10: "\u{1F559}", + clock1030: "\u{1F565}", + clock11: "\u{1F55A}", + clock1130: "\u{1F566}", + clock12: "\u{1F55B}", + clock1230: "\u{1F567}", + clock130: "\u{1F55C}", + clock2: "\u{1F551}", + clock230: "\u{1F55D}", + clock3: "\u{1F552}", + clock330: "\u{1F55E}", + clock4: "\u{1F553}", + clock430: "\u{1F55F}", + clock5: "\u{1F554}", + clock530: "\u{1F560}", + clock6: "\u{1F555}", + clock630: "\u{1F561}", + clock7: "\u{1F556}", + clock730: "\u{1F562}", + clock8: "\u{1F557}", + clock830: "\u{1F563}", + clock9: "\u{1F558}", + clock930: "\u{1F564}", + closed_book: "\u{1F4D5}", + closed_lock_with_key: "\u{1F510}", + closed_umbrella: "\u{1F302}", + cloud: "\u2601\uFE0F", + cloud_with_lightning: "\u{1F329}", + cloud_with_lightning_and_rain: "\u26C8", + cloud_with_rain: "\u{1F327}", + cloud_with_snow: "\u{1F328}", + clown_face: "\u{1F921}", + clubs: "\u2663\uFE0F", + cocktail: "\u{1F378}", + coffee: "\u2615\uFE0F", + coffin: "\u26B0\uFE0F", + cold_sweat: "\u{1F630}", + comet: "\u2604\uFE0F", + computer: "\u{1F4BB}", + computer_mouse: "\u{1F5B1}", + confetti_ball: "\u{1F38A}", + confounded: "\u{1F616}", + confused: "\u{1F615}", + congratulations: "\u3297\uFE0F", + construction: "\u{1F6A7}", + construction_worker_man: "\u{1F477}", + construction_worker_woman: "\u{1F477}‍\u2640\uFE0F", + control_knobs: "\u{1F39B}", + convenience_store: "\u{1F3EA}", + cookie: "\u{1F36A}", + cool: "\u{1F192}", + policeman: "\u{1F46E}", + copyright: "\xA9\uFE0F", + corn: "\u{1F33D}", + couch_and_lamp: "\u{1F6CB}", + couple: "\u{1F46B}", + couple_with_heart_woman_man: "\u{1F491}", + couple_with_heart_man_man: "\u{1F468}‍\u2764\uFE0F‍\u{1F468}", + couple_with_heart_woman_woman: "\u{1F469}‍\u2764\uFE0F‍\u{1F469}", + couplekiss_man_man: "\u{1F468}‍\u2764\uFE0F‍\u{1F48B}‍\u{1F468}", + couplekiss_man_woman: "\u{1F48F}", + couplekiss_woman_woman: "\u{1F469}‍\u2764\uFE0F‍\u{1F48B}‍\u{1F469}", + cow: "\u{1F42E}", + cow2: "\u{1F404}", + cowboy_hat_face: "\u{1F920}", + crab: "\u{1F980}", + crayon: "\u{1F58D}", + credit_card: "\u{1F4B3}", + crescent_moon: "\u{1F319}", + cricket: "\u{1F3CF}", + crocodile: "\u{1F40A}", + croissant: "\u{1F950}", + crossed_fingers: "\u{1F91E}", + crossed_flags: "\u{1F38C}", + crossed_swords: "\u2694\uFE0F", + crown: "\u{1F451}", + cry: "\u{1F622}", + crying_cat_face: "\u{1F63F}", + crystal_ball: "\u{1F52E}", + cucumber: "\u{1F952}", + cupid: "\u{1F498}", + curly_loop: "\u27B0", + currency_exchange: "\u{1F4B1}", + curry: "\u{1F35B}", + custard: "\u{1F36E}", + customs: "\u{1F6C3}", + cyclone: "\u{1F300}", + dagger: "\u{1F5E1}", + dancer: "\u{1F483}", + dancing_women: "\u{1F46F}", + dancing_men: "\u{1F46F}‍\u2642\uFE0F", + dango: "\u{1F361}", + dark_sunglasses: "\u{1F576}", + dart: "\u{1F3AF}", + dash: "\u{1F4A8}", + date: "\u{1F4C5}", + deciduous_tree: "\u{1F333}", + deer: "\u{1F98C}", + department_store: "\u{1F3EC}", + derelict_house: "\u{1F3DA}", + desert: "\u{1F3DC}", + desert_island: "\u{1F3DD}", + desktop_computer: "\u{1F5A5}", + male_detective: "\u{1F575}\uFE0F", + diamond_shape_with_a_dot_inside: "\u{1F4A0}", + diamonds: "\u2666\uFE0F", + disappointed: "\u{1F61E}", + disappointed_relieved: "\u{1F625}", + dizzy: "\u{1F4AB}", + dizzy_face: "\u{1F635}", + do_not_litter: "\u{1F6AF}", + dog: "\u{1F436}", + dog2: "\u{1F415}", + dollar: "\u{1F4B5}", + dolls: "\u{1F38E}", + dolphin: "\u{1F42C}", + door: "\u{1F6AA}", + doughnut: "\u{1F369}", + dove: "\u{1F54A}", + dragon: "\u{1F409}", + dragon_face: "\u{1F432}", + dress: "\u{1F457}", + dromedary_camel: "\u{1F42A}", + drooling_face: "\u{1F924}", + droplet: "\u{1F4A7}", + drum: "\u{1F941}", + duck: "\u{1F986}", + dvd: "\u{1F4C0}", + "e-mail": "\u{1F4E7}", + eagle: "\u{1F985}", + ear: "\u{1F442}", + ear_of_rice: "\u{1F33E}", + earth_africa: "\u{1F30D}", + earth_americas: "\u{1F30E}", + earth_asia: "\u{1F30F}", + egg: "\u{1F95A}", + eggplant: "\u{1F346}", + eight_pointed_black_star: "\u2734\uFE0F", + eight_spoked_asterisk: "\u2733\uFE0F", + electric_plug: "\u{1F50C}", + elephant: "\u{1F418}", + email: "\u2709\uFE0F", + end: "\u{1F51A}", + envelope_with_arrow: "\u{1F4E9}", + euro: "\u{1F4B6}", + european_castle: "\u{1F3F0}", + european_post_office: "\u{1F3E4}", + evergreen_tree: "\u{1F332}", + exclamation: "\u2757\uFE0F", + expressionless: "\u{1F611}", + eye: "\u{1F441}", + eye_speech_bubble: "\u{1F441}‍\u{1F5E8}", + eyeglasses: "\u{1F453}", + eyes: "\u{1F440}", + face_with_head_bandage: "\u{1F915}", + face_with_thermometer: "\u{1F912}", + fist_oncoming: "\u{1F44A}", + factory: "\u{1F3ED}", + fallen_leaf: "\u{1F342}", + family_man_woman_boy: "\u{1F46A}", + family_man_boy: "\u{1F468}‍\u{1F466}", + family_man_boy_boy: "\u{1F468}‍\u{1F466}‍\u{1F466}", + family_man_girl: "\u{1F468}‍\u{1F467}", + family_man_girl_boy: "\u{1F468}‍\u{1F467}‍\u{1F466}", + family_man_girl_girl: "\u{1F468}‍\u{1F467}‍\u{1F467}", + family_man_man_boy: "\u{1F468}‍\u{1F468}‍\u{1F466}", + family_man_man_boy_boy: "\u{1F468}‍\u{1F468}‍\u{1F466}‍\u{1F466}", + family_man_man_girl: "\u{1F468}‍\u{1F468}‍\u{1F467}", + family_man_man_girl_boy: "\u{1F468}‍\u{1F468}‍\u{1F467}‍\u{1F466}", + family_man_man_girl_girl: "\u{1F468}‍\u{1F468}‍\u{1F467}‍\u{1F467}", + family_man_woman_boy_boy: "\u{1F468}‍\u{1F469}‍\u{1F466}‍\u{1F466}", + family_man_woman_girl: "\u{1F468}‍\u{1F469}‍\u{1F467}", + family_man_woman_girl_boy: "\u{1F468}‍\u{1F469}‍\u{1F467}‍\u{1F466}", + family_man_woman_girl_girl: "\u{1F468}‍\u{1F469}‍\u{1F467}‍\u{1F467}", + family_woman_boy: "\u{1F469}‍\u{1F466}", + family_woman_boy_boy: "\u{1F469}‍\u{1F466}‍\u{1F466}", + family_woman_girl: "\u{1F469}‍\u{1F467}", + family_woman_girl_boy: "\u{1F469}‍\u{1F467}‍\u{1F466}", + family_woman_girl_girl: "\u{1F469}‍\u{1F467}‍\u{1F467}", + family_woman_woman_boy: "\u{1F469}‍\u{1F469}‍\u{1F466}", + family_woman_woman_boy_boy: "\u{1F469}‍\u{1F469}‍\u{1F466}‍\u{1F466}", + family_woman_woman_girl: "\u{1F469}‍\u{1F469}‍\u{1F467}", + family_woman_woman_girl_boy: "\u{1F469}‍\u{1F469}‍\u{1F467}‍\u{1F466}", + family_woman_woman_girl_girl: "\u{1F469}‍\u{1F469}‍\u{1F467}‍\u{1F467}", + fast_forward: "\u23E9", + fax: "\u{1F4E0}", + fearful: "\u{1F628}", + feet: "\u{1F43E}", + female_detective: "\u{1F575}\uFE0F‍\u2640\uFE0F", + ferris_wheel: "\u{1F3A1}", + ferry: "\u26F4", + field_hockey: "\u{1F3D1}", + file_cabinet: "\u{1F5C4}", + file_folder: "\u{1F4C1}", + film_projector: "\u{1F4FD}", + film_strip: "\u{1F39E}", + fire: "\u{1F525}", + fire_engine: "\u{1F692}", + fireworks: "\u{1F386}", + first_quarter_moon: "\u{1F313}", + first_quarter_moon_with_face: "\u{1F31B}", + fish: "\u{1F41F}", + fish_cake: "\u{1F365}", + fishing_pole_and_fish: "\u{1F3A3}", + fist_raised: "\u270A", + fist_left: "\u{1F91B}", + fist_right: "\u{1F91C}", + flags: "\u{1F38F}", + flashlight: "\u{1F526}", + fleur_de_lis: "\u269C\uFE0F", + flight_arrival: "\u{1F6EC}", + flight_departure: "\u{1F6EB}", + floppy_disk: "\u{1F4BE}", + flower_playing_cards: "\u{1F3B4}", + flushed: "\u{1F633}", + fog: "\u{1F32B}", + foggy: "\u{1F301}", + football: "\u{1F3C8}", + footprints: "\u{1F463}", + fork_and_knife: "\u{1F374}", + fountain: "\u26F2\uFE0F", + fountain_pen: "\u{1F58B}", + four_leaf_clover: "\u{1F340}", + fox_face: "\u{1F98A}", + framed_picture: "\u{1F5BC}", + free: "\u{1F193}", + fried_egg: "\u{1F373}", + fried_shrimp: "\u{1F364}", + fries: "\u{1F35F}", + frog: "\u{1F438}", + frowning: "\u{1F626}", + frowning_face: "\u2639\uFE0F", + frowning_man: "\u{1F64D}‍\u2642\uFE0F", + frowning_woman: "\u{1F64D}", + middle_finger: "\u{1F595}", + fuelpump: "\u26FD\uFE0F", + full_moon: "\u{1F315}", + full_moon_with_face: "\u{1F31D}", + funeral_urn: "\u26B1\uFE0F", + game_die: "\u{1F3B2}", + gear: "\u2699\uFE0F", + gem: "\u{1F48E}", + gemini: "\u264A\uFE0F", + ghost: "\u{1F47B}", + gift: "\u{1F381}", + gift_heart: "\u{1F49D}", + girl: "\u{1F467}", + globe_with_meridians: "\u{1F310}", + goal_net: "\u{1F945}", + goat: "\u{1F410}", + golf: "\u26F3\uFE0F", + golfing_man: "\u{1F3CC}\uFE0F", + golfing_woman: "\u{1F3CC}\uFE0F‍\u2640\uFE0F", + gorilla: "\u{1F98D}", + grapes: "\u{1F347}", + green_apple: "\u{1F34F}", + green_book: "\u{1F4D7}", + green_heart: "\u{1F49A}", + green_salad: "\u{1F957}", + grey_exclamation: "\u2755", + grey_question: "\u2754", + grimacing: "\u{1F62C}", + grin: "\u{1F601}", + grinning: "\u{1F600}", + guardsman: "\u{1F482}", + guardswoman: "\u{1F482}‍\u2640\uFE0F", + guitar: "\u{1F3B8}", + gun: "\u{1F52B}", + haircut_woman: "\u{1F487}", + haircut_man: "\u{1F487}‍\u2642\uFE0F", + hamburger: "\u{1F354}", + hammer: "\u{1F528}", + hammer_and_pick: "\u2692", + hammer_and_wrench: "\u{1F6E0}", + hamster: "\u{1F439}", + hand: "\u270B", + handbag: "\u{1F45C}", + handshake: "\u{1F91D}", + hankey: "\u{1F4A9}", + hatched_chick: "\u{1F425}", + hatching_chick: "\u{1F423}", + headphones: "\u{1F3A7}", + hear_no_evil: "\u{1F649}", + heart: "\u2764\uFE0F", + heart_decoration: "\u{1F49F}", + heart_eyes: "\u{1F60D}", + heart_eyes_cat: "\u{1F63B}", + heartbeat: "\u{1F493}", + heartpulse: "\u{1F497}", + hearts: "\u2665\uFE0F", + heavy_check_mark: "\u2714\uFE0F", + heavy_division_sign: "\u2797", + heavy_dollar_sign: "\u{1F4B2}", + heavy_heart_exclamation: "\u2763\uFE0F", + heavy_minus_sign: "\u2796", + heavy_multiplication_x: "\u2716\uFE0F", + heavy_plus_sign: "\u2795", + helicopter: "\u{1F681}", + herb: "\u{1F33F}", + hibiscus: "\u{1F33A}", + high_brightness: "\u{1F506}", + high_heel: "\u{1F460}", + hocho: "\u{1F52A}", + hole: "\u{1F573}", + honey_pot: "\u{1F36F}", + horse: "\u{1F434}", + horse_racing: "\u{1F3C7}", + hospital: "\u{1F3E5}", + hot_pepper: "\u{1F336}", + hotdog: "\u{1F32D}", + hotel: "\u{1F3E8}", + hotsprings: "\u2668\uFE0F", + hourglass: "\u231B\uFE0F", + hourglass_flowing_sand: "\u23F3", + house: "\u{1F3E0}", + house_with_garden: "\u{1F3E1}", + houses: "\u{1F3D8}", + hugs: "\u{1F917}", + hushed: "\u{1F62F}", + ice_cream: "\u{1F368}", + ice_hockey: "\u{1F3D2}", + ice_skate: "\u26F8", + icecream: "\u{1F366}", + id: "\u{1F194}", + ideograph_advantage: "\u{1F250}", + imp: "\u{1F47F}", + inbox_tray: "\u{1F4E5}", + incoming_envelope: "\u{1F4E8}", + tipping_hand_woman: "\u{1F481}", + information_source: "\u2139\uFE0F", + innocent: "\u{1F607}", + interrobang: "\u2049\uFE0F", + iphone: "\u{1F4F1}", + izakaya_lantern: "\u{1F3EE}", + jack_o_lantern: "\u{1F383}", + japan: "\u{1F5FE}", + japanese_castle: "\u{1F3EF}", + japanese_goblin: "\u{1F47A}", + japanese_ogre: "\u{1F479}", + jeans: "\u{1F456}", + joy: "\u{1F602}", + joy_cat: "\u{1F639}", + joystick: "\u{1F579}", + kaaba: "\u{1F54B}", + key: "\u{1F511}", + keyboard: "\u2328\uFE0F", + keycap_ten: "\u{1F51F}", + kick_scooter: "\u{1F6F4}", + kimono: "\u{1F458}", + kiss: "\u{1F48B}", + kissing: "\u{1F617}", + kissing_cat: "\u{1F63D}", + kissing_closed_eyes: "\u{1F61A}", + kissing_heart: "\u{1F618}", + kissing_smiling_eyes: "\u{1F619}", + kiwi_fruit: "\u{1F95D}", + koala: "\u{1F428}", + koko: "\u{1F201}", + label: "\u{1F3F7}", + large_blue_circle: "\u{1F535}", + large_blue_diamond: "\u{1F537}", + large_orange_diamond: "\u{1F536}", + last_quarter_moon: "\u{1F317}", + last_quarter_moon_with_face: "\u{1F31C}", + latin_cross: "\u271D\uFE0F", + laughing: "\u{1F606}", + leaves: "\u{1F343}", + ledger: "\u{1F4D2}", + left_luggage: "\u{1F6C5}", + left_right_arrow: "\u2194\uFE0F", + leftwards_arrow_with_hook: "\u21A9\uFE0F", + lemon: "\u{1F34B}", + leo: "\u264C\uFE0F", + leopard: "\u{1F406}", + level_slider: "\u{1F39A}", + libra: "\u264E\uFE0F", + light_rail: "\u{1F688}", + link: "\u{1F517}", + lion: "\u{1F981}", + lips: "\u{1F444}", + lipstick: "\u{1F484}", + lizard: "\u{1F98E}", + lock: "\u{1F512}", + lock_with_ink_pen: "\u{1F50F}", + lollipop: "\u{1F36D}", + loop: "\u27BF", + loud_sound: "\u{1F50A}", + loudspeaker: "\u{1F4E2}", + love_hotel: "\u{1F3E9}", + love_letter: "\u{1F48C}", + low_brightness: "\u{1F505}", + lying_face: "\u{1F925}", + m: "\u24C2\uFE0F", + mag: "\u{1F50D}", + mag_right: "\u{1F50E}", + mahjong: "\u{1F004}\uFE0F", + mailbox: "\u{1F4EB}", + mailbox_closed: "\u{1F4EA}", + mailbox_with_mail: "\u{1F4EC}", + mailbox_with_no_mail: "\u{1F4ED}", + man: "\u{1F468}", + man_artist: "\u{1F468}‍\u{1F3A8}", + man_astronaut: "\u{1F468}‍\u{1F680}", + man_cartwheeling: "\u{1F938}‍\u2642\uFE0F", + man_cook: "\u{1F468}‍\u{1F373}", + man_dancing: "\u{1F57A}", + man_facepalming: "\u{1F926}‍\u2642\uFE0F", + man_factory_worker: "\u{1F468}‍\u{1F3ED}", + man_farmer: "\u{1F468}‍\u{1F33E}", + man_firefighter: "\u{1F468}‍\u{1F692}", + man_health_worker: "\u{1F468}‍\u2695\uFE0F", + man_in_tuxedo: "\u{1F935}", + man_judge: "\u{1F468}‍\u2696\uFE0F", + man_juggling: "\u{1F939}‍\u2642\uFE0F", + man_mechanic: "\u{1F468}‍\u{1F527}", + man_office_worker: "\u{1F468}‍\u{1F4BC}", + man_pilot: "\u{1F468}‍\u2708\uFE0F", + man_playing_handball: "\u{1F93E}‍\u2642\uFE0F", + man_playing_water_polo: "\u{1F93D}‍\u2642\uFE0F", + man_scientist: "\u{1F468}‍\u{1F52C}", + man_shrugging: "\u{1F937}‍\u2642\uFE0F", + man_singer: "\u{1F468}‍\u{1F3A4}", + man_student: "\u{1F468}‍\u{1F393}", + man_teacher: "\u{1F468}‍\u{1F3EB}", + man_technologist: "\u{1F468}‍\u{1F4BB}", + man_with_gua_pi_mao: "\u{1F472}", + man_with_turban: "\u{1F473}", + tangerine: "\u{1F34A}", + mans_shoe: "\u{1F45E}", + mantelpiece_clock: "\u{1F570}", + maple_leaf: "\u{1F341}", + martial_arts_uniform: "\u{1F94B}", + mask: "\u{1F637}", + massage_woman: "\u{1F486}", + massage_man: "\u{1F486}‍\u2642\uFE0F", + meat_on_bone: "\u{1F356}", + medal_military: "\u{1F396}", + medal_sports: "\u{1F3C5}", + mega: "\u{1F4E3}", + melon: "\u{1F348}", + memo: "\u{1F4DD}", + men_wrestling: "\u{1F93C}‍\u2642\uFE0F", + menorah: "\u{1F54E}", + mens: "\u{1F6B9}", + metal: "\u{1F918}", + metro: "\u{1F687}", + microphone: "\u{1F3A4}", + microscope: "\u{1F52C}", + milk_glass: "\u{1F95B}", + milky_way: "\u{1F30C}", + minibus: "\u{1F690}", + minidisc: "\u{1F4BD}", + mobile_phone_off: "\u{1F4F4}", + money_mouth_face: "\u{1F911}", + money_with_wings: "\u{1F4B8}", + moneybag: "\u{1F4B0}", + monkey: "\u{1F412}", + monkey_face: "\u{1F435}", + monorail: "\u{1F69D}", + moon: "\u{1F314}", + mortar_board: "\u{1F393}", + mosque: "\u{1F54C}", + motor_boat: "\u{1F6E5}", + motor_scooter: "\u{1F6F5}", + motorcycle: "\u{1F3CD}", + motorway: "\u{1F6E3}", + mount_fuji: "\u{1F5FB}", + mountain: "\u26F0", + mountain_biking_man: "\u{1F6B5}", + mountain_biking_woman: "\u{1F6B5}‍\u2640\uFE0F", + mountain_cableway: "\u{1F6A0}", + mountain_railway: "\u{1F69E}", + mountain_snow: "\u{1F3D4}", + mouse: "\u{1F42D}", + mouse2: "\u{1F401}", + movie_camera: "\u{1F3A5}", + moyai: "\u{1F5FF}", + mrs_claus: "\u{1F936}", + muscle: "\u{1F4AA}", + mushroom: "\u{1F344}", + musical_keyboard: "\u{1F3B9}", + musical_note: "\u{1F3B5}", + musical_score: "\u{1F3BC}", + mute: "\u{1F507}", + nail_care: "\u{1F485}", + name_badge: "\u{1F4DB}", + national_park: "\u{1F3DE}", + nauseated_face: "\u{1F922}", + necktie: "\u{1F454}", + negative_squared_cross_mark: "\u274E", + nerd_face: "\u{1F913}", + neutral_face: "\u{1F610}", + new: "\u{1F195}", + new_moon: "\u{1F311}", + new_moon_with_face: "\u{1F31A}", + newspaper: "\u{1F4F0}", + newspaper_roll: "\u{1F5DE}", + next_track_button: "\u23ED", + ng: "\u{1F196}", + no_good_man: "\u{1F645}‍\u2642\uFE0F", + no_good_woman: "\u{1F645}", + night_with_stars: "\u{1F303}", + no_bell: "\u{1F515}", + no_bicycles: "\u{1F6B3}", + no_entry: "\u26D4\uFE0F", + no_entry_sign: "\u{1F6AB}", + no_mobile_phones: "\u{1F4F5}", + no_mouth: "\u{1F636}", + no_pedestrians: "\u{1F6B7}", + no_smoking: "\u{1F6AD}", + "non-potable_water": "\u{1F6B1}", + nose: "\u{1F443}", + notebook: "\u{1F4D3}", + notebook_with_decorative_cover: "\u{1F4D4}", + notes: "\u{1F3B6}", + nut_and_bolt: "\u{1F529}", + o: "\u2B55\uFE0F", + o2: "\u{1F17E}\uFE0F", + ocean: "\u{1F30A}", + octopus: "\u{1F419}", + oden: "\u{1F362}", + office: "\u{1F3E2}", + oil_drum: "\u{1F6E2}", + ok: "\u{1F197}", + ok_hand: "\u{1F44C}", + ok_man: "\u{1F646}‍\u2642\uFE0F", + ok_woman: "\u{1F646}", + old_key: "\u{1F5DD}", + older_man: "\u{1F474}", + older_woman: "\u{1F475}", + om: "\u{1F549}", + on: "\u{1F51B}", + oncoming_automobile: "\u{1F698}", + oncoming_bus: "\u{1F68D}", + oncoming_police_car: "\u{1F694}", + oncoming_taxi: "\u{1F696}", + open_file_folder: "\u{1F4C2}", + open_hands: "\u{1F450}", + open_mouth: "\u{1F62E}", + open_umbrella: "\u2602\uFE0F", + ophiuchus: "\u26CE", + orange_book: "\u{1F4D9}", + orthodox_cross: "\u2626\uFE0F", + outbox_tray: "\u{1F4E4}", + owl: "\u{1F989}", + ox: "\u{1F402}", + package: "\u{1F4E6}", + page_facing_up: "\u{1F4C4}", + page_with_curl: "\u{1F4C3}", + pager: "\u{1F4DF}", + paintbrush: "\u{1F58C}", + palm_tree: "\u{1F334}", + pancakes: "\u{1F95E}", + panda_face: "\u{1F43C}", + paperclip: "\u{1F4CE}", + paperclips: "\u{1F587}", + parasol_on_ground: "\u26F1", + parking: "\u{1F17F}\uFE0F", + part_alternation_mark: "\u303D\uFE0F", + partly_sunny: "\u26C5\uFE0F", + passenger_ship: "\u{1F6F3}", + passport_control: "\u{1F6C2}", + pause_button: "\u23F8", + peace_symbol: "\u262E\uFE0F", + peach: "\u{1F351}", + peanuts: "\u{1F95C}", + pear: "\u{1F350}", + pen: "\u{1F58A}", + pencil2: "\u270F\uFE0F", + penguin: "\u{1F427}", + pensive: "\u{1F614}", + performing_arts: "\u{1F3AD}", + persevere: "\u{1F623}", + person_fencing: "\u{1F93A}", + pouting_woman: "\u{1F64E}", + phone: "\u260E\uFE0F", + pick: "\u26CF", + pig: "\u{1F437}", + pig2: "\u{1F416}", + pig_nose: "\u{1F43D}", + pill: "\u{1F48A}", + pineapple: "\u{1F34D}", + ping_pong: "\u{1F3D3}", + pisces: "\u2653\uFE0F", + pizza: "\u{1F355}", + place_of_worship: "\u{1F6D0}", + plate_with_cutlery: "\u{1F37D}", + play_or_pause_button: "\u23EF", + point_down: "\u{1F447}", + point_left: "\u{1F448}", + point_right: "\u{1F449}", + point_up: "\u261D\uFE0F", + point_up_2: "\u{1F446}", + police_car: "\u{1F693}", + policewoman: "\u{1F46E}‍\u2640\uFE0F", + poodle: "\u{1F429}", + popcorn: "\u{1F37F}", + post_office: "\u{1F3E3}", + postal_horn: "\u{1F4EF}", + postbox: "\u{1F4EE}", + potable_water: "\u{1F6B0}", + potato: "\u{1F954}", + pouch: "\u{1F45D}", + poultry_leg: "\u{1F357}", + pound: "\u{1F4B7}", + rage: "\u{1F621}", + pouting_cat: "\u{1F63E}", + pouting_man: "\u{1F64E}‍\u2642\uFE0F", + pray: "\u{1F64F}", + prayer_beads: "\u{1F4FF}", + pregnant_woman: "\u{1F930}", + previous_track_button: "\u23EE", + prince: "\u{1F934}", + princess: "\u{1F478}", + printer: "\u{1F5A8}", + purple_heart: "\u{1F49C}", + purse: "\u{1F45B}", + pushpin: "\u{1F4CC}", + put_litter_in_its_place: "\u{1F6AE}", + question: "\u2753", + rabbit: "\u{1F430}", + rabbit2: "\u{1F407}", + racehorse: "\u{1F40E}", + racing_car: "\u{1F3CE}", + radio: "\u{1F4FB}", + radio_button: "\u{1F518}", + radioactive: "\u2622\uFE0F", + railway_car: "\u{1F683}", + railway_track: "\u{1F6E4}", + rainbow: "\u{1F308}", + rainbow_flag: "\u{1F3F3}\uFE0F‍\u{1F308}", + raised_back_of_hand: "\u{1F91A}", + raised_hand_with_fingers_splayed: "\u{1F590}", + raised_hands: "\u{1F64C}", + raising_hand_woman: "\u{1F64B}", + raising_hand_man: "\u{1F64B}‍\u2642\uFE0F", + ram: "\u{1F40F}", + ramen: "\u{1F35C}", + rat: "\u{1F400}", + record_button: "\u23FA", + recycle: "\u267B\uFE0F", + red_circle: "\u{1F534}", + registered: "\xAE\uFE0F", + relaxed: "\u263A\uFE0F", + relieved: "\u{1F60C}", + reminder_ribbon: "\u{1F397}", + repeat: "\u{1F501}", + repeat_one: "\u{1F502}", + rescue_worker_helmet: "\u26D1", + restroom: "\u{1F6BB}", + revolving_hearts: "\u{1F49E}", + rewind: "\u23EA", + rhinoceros: "\u{1F98F}", + ribbon: "\u{1F380}", + rice: "\u{1F35A}", + rice_ball: "\u{1F359}", + rice_cracker: "\u{1F358}", + rice_scene: "\u{1F391}", + right_anger_bubble: "\u{1F5EF}", + ring: "\u{1F48D}", + robot: "\u{1F916}", + rocket: "\u{1F680}", + rofl: "\u{1F923}", + roll_eyes: "\u{1F644}", + roller_coaster: "\u{1F3A2}", + rooster: "\u{1F413}", + rose: "\u{1F339}", + rosette: "\u{1F3F5}", + rotating_light: "\u{1F6A8}", + round_pushpin: "\u{1F4CD}", + rowing_man: "\u{1F6A3}", + rowing_woman: "\u{1F6A3}‍\u2640\uFE0F", + rugby_football: "\u{1F3C9}", + running_man: "\u{1F3C3}", + running_shirt_with_sash: "\u{1F3BD}", + running_woman: "\u{1F3C3}‍\u2640\uFE0F", + sa: "\u{1F202}\uFE0F", + sagittarius: "\u2650\uFE0F", + sake: "\u{1F376}", + sandal: "\u{1F461}", + santa: "\u{1F385}", + satellite: "\u{1F4E1}", + saxophone: "\u{1F3B7}", + school: "\u{1F3EB}", + school_satchel: "\u{1F392}", + scissors: "\u2702\uFE0F", + scorpion: "\u{1F982}", + scorpius: "\u264F\uFE0F", + scream: "\u{1F631}", + scream_cat: "\u{1F640}", + scroll: "\u{1F4DC}", + seat: "\u{1F4BA}", + secret: "\u3299\uFE0F", + see_no_evil: "\u{1F648}", + seedling: "\u{1F331}", + selfie: "\u{1F933}", + shallow_pan_of_food: "\u{1F958}", + shamrock: "\u2618\uFE0F", + shark: "\u{1F988}", + shaved_ice: "\u{1F367}", + sheep: "\u{1F411}", + shell: "\u{1F41A}", + shield: "\u{1F6E1}", + shinto_shrine: "\u26E9", + ship: "\u{1F6A2}", + shirt: "\u{1F455}", + shopping: "\u{1F6CD}", + shopping_cart: "\u{1F6D2}", + shower: "\u{1F6BF}", + shrimp: "\u{1F990}", + signal_strength: "\u{1F4F6}", + six_pointed_star: "\u{1F52F}", + ski: "\u{1F3BF}", + skier: "\u26F7", + skull: "\u{1F480}", + skull_and_crossbones: "\u2620\uFE0F", + sleeping: "\u{1F634}", + sleeping_bed: "\u{1F6CC}", + sleepy: "\u{1F62A}", + slightly_frowning_face: "\u{1F641}", + slightly_smiling_face: "\u{1F642}", + slot_machine: "\u{1F3B0}", + small_airplane: "\u{1F6E9}", + small_blue_diamond: "\u{1F539}", + small_orange_diamond: "\u{1F538}", + small_red_triangle: "\u{1F53A}", + small_red_triangle_down: "\u{1F53B}", + smile: "\u{1F604}", + smile_cat: "\u{1F638}", + smiley: "\u{1F603}", + smiley_cat: "\u{1F63A}", + smiling_imp: "\u{1F608}", + smirk: "\u{1F60F}", + smirk_cat: "\u{1F63C}", + smoking: "\u{1F6AC}", + snail: "\u{1F40C}", + snake: "\u{1F40D}", + sneezing_face: "\u{1F927}", + snowboarder: "\u{1F3C2}", + snowflake: "\u2744\uFE0F", + snowman: "\u26C4\uFE0F", + snowman_with_snow: "\u2603\uFE0F", + sob: "\u{1F62D}", + soccer: "\u26BD\uFE0F", + soon: "\u{1F51C}", + sos: "\u{1F198}", + sound: "\u{1F509}", + space_invader: "\u{1F47E}", + spades: "\u2660\uFE0F", + spaghetti: "\u{1F35D}", + sparkle: "\u2747\uFE0F", + sparkler: "\u{1F387}", + sparkles: "\u2728", + sparkling_heart: "\u{1F496}", + speak_no_evil: "\u{1F64A}", + speaker: "\u{1F508}", + speaking_head: "\u{1F5E3}", + speech_balloon: "\u{1F4AC}", + speedboat: "\u{1F6A4}", + spider: "\u{1F577}", + spider_web: "\u{1F578}", + spiral_calendar: "\u{1F5D3}", + spiral_notepad: "\u{1F5D2}", + spoon: "\u{1F944}", + squid: "\u{1F991}", + stadium: "\u{1F3DF}", + star: "\u2B50\uFE0F", + star2: "\u{1F31F}", + star_and_crescent: "\u262A\uFE0F", + star_of_david: "\u2721\uFE0F", + stars: "\u{1F320}", + station: "\u{1F689}", + statue_of_liberty: "\u{1F5FD}", + steam_locomotive: "\u{1F682}", + stew: "\u{1F372}", + stop_button: "\u23F9", + stop_sign: "\u{1F6D1}", + stopwatch: "\u23F1", + straight_ruler: "\u{1F4CF}", + strawberry: "\u{1F353}", + stuck_out_tongue: "\u{1F61B}", + stuck_out_tongue_closed_eyes: "\u{1F61D}", + stuck_out_tongue_winking_eye: "\u{1F61C}", + studio_microphone: "\u{1F399}", + stuffed_flatbread: "\u{1F959}", + sun_behind_large_cloud: "\u{1F325}", + sun_behind_rain_cloud: "\u{1F326}", + sun_behind_small_cloud: "\u{1F324}", + sun_with_face: "\u{1F31E}", + sunflower: "\u{1F33B}", + sunglasses: "\u{1F60E}", + sunny: "\u2600\uFE0F", + sunrise: "\u{1F305}", + sunrise_over_mountains: "\u{1F304}", + surfing_man: "\u{1F3C4}", + surfing_woman: "\u{1F3C4}‍\u2640\uFE0F", + sushi: "\u{1F363}", + suspension_railway: "\u{1F69F}", + sweat: "\u{1F613}", + sweat_drops: "\u{1F4A6}", + sweat_smile: "\u{1F605}", + sweet_potato: "\u{1F360}", + swimming_man: "\u{1F3CA}", + swimming_woman: "\u{1F3CA}‍\u2640\uFE0F", + symbols: "\u{1F523}", + synagogue: "\u{1F54D}", + syringe: "\u{1F489}", + taco: "\u{1F32E}", + tada: "\u{1F389}", + tanabata_tree: "\u{1F38B}", + taurus: "\u2649\uFE0F", + taxi: "\u{1F695}", + tea: "\u{1F375}", + telephone_receiver: "\u{1F4DE}", + telescope: "\u{1F52D}", + tennis: "\u{1F3BE}", + tent: "\u26FA\uFE0F", + thermometer: "\u{1F321}", + thinking: "\u{1F914}", + thought_balloon: "\u{1F4AD}", + ticket: "\u{1F3AB}", + tickets: "\u{1F39F}", + tiger: "\u{1F42F}", + tiger2: "\u{1F405}", + timer_clock: "\u23F2", + tipping_hand_man: "\u{1F481}‍\u2642\uFE0F", + tired_face: "\u{1F62B}", + tm: "\u2122\uFE0F", + toilet: "\u{1F6BD}", + tokyo_tower: "\u{1F5FC}", + tomato: "\u{1F345}", + tongue: "\u{1F445}", + top: "\u{1F51D}", + tophat: "\u{1F3A9}", + tornado: "\u{1F32A}", + trackball: "\u{1F5B2}", + tractor: "\u{1F69C}", + traffic_light: "\u{1F6A5}", + train: "\u{1F68B}", + train2: "\u{1F686}", + tram: "\u{1F68A}", + triangular_flag_on_post: "\u{1F6A9}", + triangular_ruler: "\u{1F4D0}", + trident: "\u{1F531}", + triumph: "\u{1F624}", + trolleybus: "\u{1F68E}", + trophy: "\u{1F3C6}", + tropical_drink: "\u{1F379}", + tropical_fish: "\u{1F420}", + truck: "\u{1F69A}", + trumpet: "\u{1F3BA}", + tulip: "\u{1F337}", + tumbler_glass: "\u{1F943}", + turkey: "\u{1F983}", + turtle: "\u{1F422}", + tv: "\u{1F4FA}", + twisted_rightwards_arrows: "\u{1F500}", + two_hearts: "\u{1F495}", + two_men_holding_hands: "\u{1F46C}", + two_women_holding_hands: "\u{1F46D}", + u5272: "\u{1F239}", + u5408: "\u{1F234}", + u55b6: "\u{1F23A}", + u6307: "\u{1F22F}\uFE0F", + u6708: "\u{1F237}\uFE0F", + u6709: "\u{1F236}", + u6e80: "\u{1F235}", + u7121: "\u{1F21A}\uFE0F", + u7533: "\u{1F238}", + u7981: "\u{1F232}", + u7a7a: "\u{1F233}", + umbrella: "\u2614\uFE0F", + unamused: "\u{1F612}", + underage: "\u{1F51E}", + unicorn: "\u{1F984}", + unlock: "\u{1F513}", + up: "\u{1F199}", + upside_down_face: "\u{1F643}", + v: "\u270C\uFE0F", + vertical_traffic_light: "\u{1F6A6}", + vhs: "\u{1F4FC}", + vibration_mode: "\u{1F4F3}", + video_camera: "\u{1F4F9}", + video_game: "\u{1F3AE}", + violin: "\u{1F3BB}", + virgo: "\u264D\uFE0F", + volcano: "\u{1F30B}", + volleyball: "\u{1F3D0}", + vs: "\u{1F19A}", + vulcan_salute: "\u{1F596}", + walking_man: "\u{1F6B6}", + walking_woman: "\u{1F6B6}‍\u2640\uFE0F", + waning_crescent_moon: "\u{1F318}", + waning_gibbous_moon: "\u{1F316}", + warning: "\u26A0\uFE0F", + wastebasket: "\u{1F5D1}", + watch: "\u231A\uFE0F", + water_buffalo: "\u{1F403}", + watermelon: "\u{1F349}", + wave: "\u{1F44B}", + wavy_dash: "\u3030\uFE0F", + waxing_crescent_moon: "\u{1F312}", + wc: "\u{1F6BE}", + weary: "\u{1F629}", + wedding: "\u{1F492}", + weight_lifting_man: "\u{1F3CB}\uFE0F", + weight_lifting_woman: "\u{1F3CB}\uFE0F‍\u2640\uFE0F", + whale: "\u{1F433}", + whale2: "\u{1F40B}", + wheel_of_dharma: "\u2638\uFE0F", + wheelchair: "\u267F\uFE0F", + white_check_mark: "\u2705", + white_circle: "\u26AA\uFE0F", + white_flag: "\u{1F3F3}\uFE0F", + white_flower: "\u{1F4AE}", + white_large_square: "\u2B1C\uFE0F", + white_medium_small_square: "\u25FD\uFE0F", + white_medium_square: "\u25FB\uFE0F", + white_small_square: "\u25AB\uFE0F", + white_square_button: "\u{1F533}", + wilted_flower: "\u{1F940}", + wind_chime: "\u{1F390}", + wind_face: "\u{1F32C}", + wine_glass: "\u{1F377}", + wink: "\u{1F609}", + wolf: "\u{1F43A}", + woman: "\u{1F469}", + woman_artist: "\u{1F469}‍\u{1F3A8}", + woman_astronaut: "\u{1F469}‍\u{1F680}", + woman_cartwheeling: "\u{1F938}‍\u2640\uFE0F", + woman_cook: "\u{1F469}‍\u{1F373}", + woman_facepalming: "\u{1F926}‍\u2640\uFE0F", + woman_factory_worker: "\u{1F469}‍\u{1F3ED}", + woman_farmer: "\u{1F469}‍\u{1F33E}", + woman_firefighter: "\u{1F469}‍\u{1F692}", + woman_health_worker: "\u{1F469}‍\u2695\uFE0F", + woman_judge: "\u{1F469}‍\u2696\uFE0F", + woman_juggling: "\u{1F939}‍\u2640\uFE0F", + woman_mechanic: "\u{1F469}‍\u{1F527}", + woman_office_worker: "\u{1F469}‍\u{1F4BC}", + woman_pilot: "\u{1F469}‍\u2708\uFE0F", + woman_playing_handball: "\u{1F93E}‍\u2640\uFE0F", + woman_playing_water_polo: "\u{1F93D}‍\u2640\uFE0F", + woman_scientist: "\u{1F469}‍\u{1F52C}", + woman_shrugging: "\u{1F937}‍\u2640\uFE0F", + woman_singer: "\u{1F469}‍\u{1F3A4}", + woman_student: "\u{1F469}‍\u{1F393}", + woman_teacher: "\u{1F469}‍\u{1F3EB}", + woman_technologist: "\u{1F469}‍\u{1F4BB}", + woman_with_turban: "\u{1F473}‍\u2640\uFE0F", + womans_clothes: "\u{1F45A}", + womans_hat: "\u{1F452}", + women_wrestling: "\u{1F93C}‍\u2640\uFE0F", + womens: "\u{1F6BA}", + world_map: "\u{1F5FA}", + worried: "\u{1F61F}", + wrench: "\u{1F527}", + writing_hand: "\u270D\uFE0F", + x: "\u274C", + yellow_heart: "\u{1F49B}", + yen: "\u{1F4B4}", + yin_yang: "\u262F\uFE0F", + yum: "\u{1F60B}", + zap: "\u26A1\uFE0F", + zipper_mouth_face: "\u{1F910}", + zzz: "\u{1F4A4}", + /* special emojis :P */ + octocat: ':octocat:', + showdown: `S` + }, a.Converter = function(t) { + var u2 = {}, s = [], i2 = [], c = {}, m = y, h2 = { + parsed: {}, + raw: "", + format: "" + }; + C(); + function C() { + t = t || {}; + for (var _2 in p) + p.hasOwnProperty(_2) && (u2[_2] = p[_2]); + if (typeof t == "object") + for (var q in t) + t.hasOwnProperty(q) && (u2[q] = t[q]); + else + throw Error("Converter expects the passed parameter to be an object, but " + typeof t + " was passed instead."); + u2.extensions && a.helper.forEach(u2.extensions, U); + } + function U(_2, q) { + if (q = q || null, a.helper.isString(_2)) + if (_2 = a.helper.stdExtName(_2), q = _2, a.extensions[_2]) { + console.warn("DEPRECATION WARNING: " + _2 + " is an old extension that uses a deprecated loading method.Please inform the developer that the extension should be updated!"), H(a.extensions[_2], _2); + return; + } else if (!a.helper.isUndefined(o2[_2])) + _2 = o2[_2]; + else + throw Error('Extension "' + _2 + '" could not be loaded. It was either not found or is not a valid extension.'); + typeof _2 == "function" && (_2 = _2()), a.helper.isArray(_2) || (_2 = [_2]); + var J = v(_2, q); + if (!J.valid) + throw Error(J.error); + for (var Z = 0; Z < _2.length; ++Z) { + switch (_2[Z].type) { + case "lang": + s.push(_2[Z]); + break; + case "output": + i2.push(_2[Z]); + break; + } + if (_2[Z].hasOwnProperty("listeners")) + for (var B in _2[Z].listeners) + _2[Z].listeners.hasOwnProperty(B) && V(B, _2[Z].listeners[B]); + } + } + function H(_2, q) { + typeof _2 == "function" && (_2 = _2(new a.Converter())), a.helper.isArray(_2) || (_2 = [_2]); + var J = v(_2, q); + if (!J.valid) + throw Error(J.error); + for (var Z = 0; Z < _2.length; ++Z) + switch (_2[Z].type) { + case "lang": + s.push(_2[Z]); + break; + case "output": + i2.push(_2[Z]); + break; + default: + throw Error("Extension loader error: Type unrecognized!!!"); + } + } + function V(_2, q) { + if (!a.helper.isString(_2)) + throw Error("Invalid argument in converter.listen() method: name must be a string, but " + typeof _2 + " given"); + if (typeof q != "function") + throw Error("Invalid argument in converter.listen() method: callback must be a function, but " + typeof q + " given"); + c.hasOwnProperty(_2) || (c[_2] = []), c[_2].push(q); + } + function G(_2) { + var q = _2.match(/^\s*/)[0].length, J = new RegExp("^\\s{0," + q + "}", "gm"); + return _2.replace(J, ""); + } + this._dispatch = function(q, J, Z, B) { + if (c.hasOwnProperty(q)) + for (var k = 0; k < c[q].length; ++k) { + var F = c[q][k](q, J, this, Z, B); + F && typeof F < "u" && (J = F); + } + return J; + }, this.listen = function(_2, q) { + return V(_2, q), this; + }, this.makeHtml = function(_2) { + if (!_2) + return _2; + var q = { + gHtmlBlocks: [], + gHtmlMdBlocks: [], + gHtmlSpans: [], + gUrls: {}, + gTitles: {}, + gDimensions: {}, + gListLevel: 0, + hashLinkCounts: {}, + langExtensions: s, + outputModifiers: i2, + converter: this, + ghCodeBlocks: [], + metadata: { + parsed: {}, + raw: "", + format: "" + } + }; + return _2 = _2.replace(/¨/g, "\xA8T"), _2 = _2.replace(/\$/g, "\xA8D"), _2 = _2.replace(/\r\n/g, ` +`), _2 = _2.replace(/\r/g, ` +`), _2 = _2.replace(/\u00A0/g, " "), u2.smartIndentationFix && (_2 = G(_2)), _2 = ` + +` + _2 + ` + +`, _2 = a.subParser("detab")(_2, u2, q), _2 = _2.replace(/^[ \t]+$/mg, ""), a.helper.forEach(s, function(J) { + _2 = a.subParser("runExtension")(J, _2, u2, q); + }), _2 = a.subParser("metadata")(_2, u2, q), _2 = a.subParser("hashPreCodeTags")(_2, u2, q), _2 = a.subParser("githubCodeBlocks")(_2, u2, q), _2 = a.subParser("hashHTMLBlocks")(_2, u2, q), _2 = a.subParser("hashCodeTags")(_2, u2, q), _2 = a.subParser("stripLinkDefinitions")(_2, u2, q), _2 = a.subParser("blockGamut")(_2, u2, q), _2 = a.subParser("unhashHTMLSpans")(_2, u2, q), _2 = a.subParser("unescapeSpecialChars")(_2, u2, q), _2 = _2.replace(/¨D/g, "$$"), _2 = _2.replace(/¨T/g, "\xA8"), _2 = a.subParser("completeHTMLDocument")(_2, u2, q), a.helper.forEach(i2, function(J) { + _2 = a.subParser("runExtension")(J, _2, u2, q); + }), h2 = q.metadata, _2; + }, this.makeMarkdown = this.makeMd = function(_2, q) { + if (_2 = _2.replace(/\r\n/g, ` +`), _2 = _2.replace(/\r/g, ` +`), _2 = _2.replace(/>[ \t]+\xA8NBSP;<"), !q) + if (window && window.document) + q = window.document; + else + throw new Error("HTMLParser is undefined. If in a webworker or nodejs environment, you need to provide a WHATWG DOM and HTML such as JSDOM"); + var J = q.createElement("div"); + J.innerHTML = _2; + var Z = { + preList: l(J) + }; + O(J); + for (var B = J.childNodes, k = "", F = 0; F < B.length; F++) + k += a.subParser("makeMarkdown.node")(B[F], Z); + function O(w2) { + for (var I = 0; I < w2.childNodes.length; ++I) { + var K = w2.childNodes[I]; + K.nodeType === 3 ? !/\S/.test(K.nodeValue) && !/^[ ]+$/.test(K.nodeValue) ? (w2.removeChild(K), --I) : (K.nodeValue = K.nodeValue.split(` +`).join(" "), K.nodeValue = K.nodeValue.replace(/(\s)+/g, "$1")) : K.nodeType === 1 && O(K); + } + } + function l(w2) { + for (var I = w2.querySelectorAll("pre"), K = [], W = 0; W < I.length; ++W) + if (I[W].childElementCount === 1 && I[W].firstChild.tagName.toLowerCase() === "code") { + var re = I[W].firstChild.innerHTML.trim(), ae = I[W].firstChild.getAttribute("data-language") || ""; + if (ae === "") + for (var fe = I[W].firstChild.className.split(" "), je = 0; je < fe.length; ++je) { + var xe = fe[je].match(/^language-(.+)$/); + if (xe !== null) { + ae = xe[1]; + break; + } + } + re = a.helper.unescapeHTMLEntities(re), K.push(re), I[W].outerHTML = ''; + } else + K.push(I[W].innerHTML), I[W].innerHTML = "", I[W].setAttribute("prenum", W.toString()); + return K; + } + return k; + }, this.setOption = function(_2, q) { + u2[_2] = q; + }, this.getOption = function(_2) { + return u2[_2]; + }, this.getOptions = function() { + return u2; + }, this.addExtension = function(_2, q) { + q = q || null, U(_2, q); + }, this.useExtension = function(_2) { + U(_2); + }, this.setFlavor = function(_2) { + if (!b.hasOwnProperty(_2)) + throw Error(_2 + " flavor was not found"); + var q = b[_2]; + m = _2; + for (var J in q) + q.hasOwnProperty(J) && (u2[J] = q[J]); + }, this.getFlavor = function() { + return m; + }, this.removeExtension = function(_2) { + a.helper.isArray(_2) || (_2 = [_2]); + for (var q = 0; q < _2.length; ++q) { + for (var J = _2[q], Z = 0; Z < s.length; ++Z) + s[Z] === J && s.splice(Z, 1); + for (var B = 0; B < i2.length; ++B) + i2[B] === J && i2.splice(B, 1); + } + }, this.getAllExtensions = function() { + return { + language: s, + output: i2 + }; + }, this.getMetadata = function(_2) { + return _2 ? h2.raw : h2.parsed; + }, this.getMetadataFormat = function() { + return h2.format; + }, this._setMetadataPair = function(_2, q) { + h2.parsed[_2] = q; + }, this._setMetadataFormat = function(_2) { + h2.format = _2; + }, this._setMetadataRaw = function(_2) { + h2.raw = _2; + }; + }, a.subParser("anchors", function(t, u2, s) { + t = s.converter._dispatch("anchors.before", t, u2, s); + var i2 = function(c, m, h2, C, U, H, V) { + if (a.helper.isUndefined(V) && (V = ""), h2 = h2.toLowerCase(), c.search(/\(? ?(['"].*['"])?\)$/m) > -1) + C = ""; + else if (!C) + if (h2 || (h2 = m.toLowerCase().replace(/ ?\n/g, " ")), C = "#" + h2, !a.helper.isUndefined(s.gUrls[h2])) + C = s.gUrls[h2], a.helper.isUndefined(s.gTitles[h2]) || (V = s.gTitles[h2]); + else + return c; + C = C.replace(a.helper.regexes.asteriskDashAndColon, a.helper.escapeCharactersCallback); + var G = '", G; + }; + return t = t.replace(/\[((?:\[[^\]]*]|[^\[\]])*)] ?(?:\n *)?\[(.*?)]()()()()/g, i2), t = t.replace( + /\[((?:\[[^\]]*]|[^\[\]])*)]()[ \t]*\([ \t]?<([^>]*)>(?:[ \t]*((["'])([^"]*?)\5))?[ \t]?\)/g, + i2 + ), t = t.replace( + /\[((?:\[[^\]]*]|[^\[\]])*)]()[ \t]*\([ \t]??(?:[ \t]*((["'])([^"]*?)\5))?[ \t]?\)/g, + i2 + ), t = t.replace(/\[([^\[\]]+)]()()()()()/g, i2), u2.ghMentions && (t = t.replace(/(^|\s)(\\)?(@([a-z\d]+(?:[a-z\d.-]+?[a-z\d]+)*))/gmi, function(c, m, h2, C, U) { + if (h2 === "\\") + return m + C; + if (!a.helper.isString(u2.ghMentionsLink)) + throw new Error("ghMentionsLink option must be a string"); + var H = u2.ghMentionsLink.replace(/\{u}/g, U), V = ""; + return u2.openLinksInNewWindow && (V = ' rel="noopener noreferrer" target="\xA8E95Eblank"'), m + '" + C + ""; + })), t = s.converter._dispatch("anchors.after", t, u2, s), t; + }); + var z = /([*~_]+|\b)(((https?|ftp|dict):\/\/|www\.)[^'">\s]+?\.[^'">\s]+?)()(\1)?(?=\s|$)(?!["<>])/gi, L = /([*~_]+|\b)(((https?|ftp|dict):\/\/|www\.)[^'">\s]+\.[^'">\s]+?)([.!?,()\[\]])?(\1)?(?=\s|$)(?!["<>])/gi, R = /()<(((https?|ftp|dict):\/\/|www\.)[^'">\s]+)()>()/gi, j = /(^|\s)(?:mailto:)?([A-Za-z0-9!#$%&'*+-/=?^_`{|}~.]+@[-a-z0-9]+(\.[-a-z0-9]+)*\.[a-z]+)(?=$|\s)/gmi, T = /<()(?:mailto:)?([-.\w]+@[-a-z0-9]+(\.[-a-z0-9]+)*\.[a-z]+)>/gi, $ = function(t) { + return function(u2, s, i2, c, m, h2, C) { + i2 = i2.replace(a.helper.regexes.asteriskDashAndColon, a.helper.escapeCharactersCallback); + var U = i2, H = "", V = "", G = s || "", _2 = C || ""; + return /^www\./i.test(i2) && (i2 = i2.replace(/^www\./i, "http://www.")), t.excludeTrailingPunctuationFromURLs && h2 && (H = h2), t.openLinksInNewWindow && (V = ' rel="noopener noreferrer" target="\xA8E95Eblank"'), G + '" + U + "" + H + _2; + }; + }, N2 = function(t, u2) { + return function(s, i2, c) { + var m = "mailto:"; + return i2 = i2 || "", c = a.subParser("unescapeSpecialChars")(c, t, u2), t.encodeEmails ? (m = a.helper.encodeEmailAddress(m + c), c = a.helper.encodeEmailAddress(c)) : m = m + c, i2 + '' + c + ""; + }; + }; + a.subParser("autoLinks", function(t, u2, s) { + return t = s.converter._dispatch("autoLinks.before", t, u2, s), t = t.replace(R, $(u2)), t = t.replace(T, N2(u2, s)), t = s.converter._dispatch("autoLinks.after", t, u2, s), t; + }), a.subParser("simplifiedAutoLinks", function(t, u2, s) { + return u2.simplifiedAutoLink && (t = s.converter._dispatch("simplifiedAutoLinks.before", t, u2, s), u2.excludeTrailingPunctuationFromURLs ? t = t.replace(L, $(u2)) : t = t.replace(z, $(u2)), t = t.replace(j, N2(u2, s)), t = s.converter._dispatch("simplifiedAutoLinks.after", t, u2, s)), t; + }), a.subParser("blockGamut", function(t, u2, s) { + return t = s.converter._dispatch("blockGamut.before", t, u2, s), t = a.subParser("blockQuotes")(t, u2, s), t = a.subParser("headers")(t, u2, s), t = a.subParser("horizontalRule")(t, u2, s), t = a.subParser("lists")(t, u2, s), t = a.subParser("codeBlocks")(t, u2, s), t = a.subParser("tables")(t, u2, s), t = a.subParser("hashHTMLBlocks")(t, u2, s), t = a.subParser("paragraphs")(t, u2, s), t = s.converter._dispatch("blockGamut.after", t, u2, s), t; + }), a.subParser("blockQuotes", function(t, u2, s) { + t = s.converter._dispatch("blockQuotes.before", t, u2, s), t = t + ` + +`; + var i2 = /(^ {0,3}>[ \t]?.+\n(.+\n)*\n*)+/gm; + return u2.splitAdjacentBlockquotes && (i2 = /^ {0,3}>[\s\S]*?(?:\n\n)/gm), t = t.replace(i2, function(c) { + return c = c.replace(/^[ \t]*>[ \t]?/gm, ""), c = c.replace(/¨0/g, ""), c = c.replace(/^[ \t]+$/gm, ""), c = a.subParser("githubCodeBlocks")(c, u2, s), c = a.subParser("blockGamut")(c, u2, s), c = c.replace(/(^|\n)/g, "$1 "), c = c.replace(/(\s*
[^\r]+?<\/pre>)/gm, function(m, h2) {
+          var C = h2;
+          return C = C.replace(/^  /mg, "\xA80"), C = C.replace(/¨0/g, ""), C;
+        }), a.subParser("hashBlock")(`
+` + c + ` +
`, u2, s); + }), t = s.converter._dispatch("blockQuotes.after", t, u2, s), t; + }), a.subParser("codeBlocks", function(t, u2, s) { + t = s.converter._dispatch("codeBlocks.before", t, u2, s), t += "\xA80"; + var i2 = /(?:\n\n|^)((?:(?:[ ]{4}|\t).*\n+)+)(\n*[ ]{0,3}[^ \t\n]|(?=¨0))/g; + return t = t.replace(i2, function(c, m, h2) { + var C = m, U = h2, H = ` +`; + return C = a.subParser("outdent")(C, u2, s), C = a.subParser("encodeCode")(C, u2, s), C = a.subParser("detab")(C, u2, s), C = C.replace(/^\n+/g, ""), C = C.replace(/\n+$/g, ""), u2.omitExtraWLInCodeBlocks && (H = ""), C = "
" + C + H + "
", a.subParser("hashBlock")(C, u2, s) + U; + }), t = t.replace(/¨0/, ""), t = s.converter._dispatch("codeBlocks.after", t, u2, s), t; + }), a.subParser("codeSpans", function(t, u2, s) { + return t = s.converter._dispatch("codeSpans.before", t, u2, s), typeof t > "u" && (t = ""), t = t.replace( + /(^|[^\\])(`+)([^\r]*?[^`])\2(?!`)/gm, + function(i2, c, m, h2) { + var C = h2; + return C = C.replace(/^([ \t]*)/g, ""), C = C.replace(/[ \t]*$/g, ""), C = a.subParser("encodeCode")(C, u2, s), C = c + "" + C + "", C = a.subParser("hashHTMLSpans")(C, u2, s), C; + } + ), t = s.converter._dispatch("codeSpans.after", t, u2, s), t; + }), a.subParser("completeHTMLDocument", function(t, u2, s) { + if (!u2.completeHTMLDocument) + return t; + t = s.converter._dispatch("completeHTMLDocument.before", t, u2, s); + var i2 = "html", c = ` +`, m = "", h2 = ` +`, C = "", U = ""; + typeof s.metadata.parsed.doctype < "u" && (c = " +`, i2 = s.metadata.parsed.doctype.toString().toLowerCase(), (i2 === "html" || i2 === "html5") && (h2 = '')); + for (var H in s.metadata.parsed) + if (s.metadata.parsed.hasOwnProperty(H)) + switch (H.toLowerCase()) { + case "doctype": + break; + case "title": + m = "" + s.metadata.parsed.title + ` +`; + break; + case "charset": + i2 === "html" || i2 === "html5" ? h2 = ' +` : h2 = ' +`; + break; + case "language": + case "lang": + C = ' lang="' + s.metadata.parsed[H] + '"', U += ' +`; + break; + default: + U += ' +`; + } + return t = c + " + +` + m + h2 + U + ` + +` + t.trim() + ` + +`, t = s.converter._dispatch("completeHTMLDocument.after", t, u2, s), t; + }), a.subParser("detab", function(t, u2, s) { + return t = s.converter._dispatch("detab.before", t, u2, s), t = t.replace(/\t(?=\t)/g, " "), t = t.replace(/\t/g, "\xA8A\xA8B"), t = t.replace(/¨B(.+?)¨A/g, function(i2, c) { + for (var m = c, h2 = 4 - m.length % 4, C = 0; C < h2; C++) + m += " "; + return m; + }), t = t.replace(/¨A/g, " "), t = t.replace(/¨B/g, ""), t = s.converter._dispatch("detab.after", t, u2, s), t; + }), a.subParser("ellipsis", function(t, u2, s) { + return u2.ellipsis && (t = s.converter._dispatch("ellipsis.before", t, u2, s), t = t.replace(/\.\.\./g, "\u2026"), t = s.converter._dispatch("ellipsis.after", t, u2, s)), t; + }), a.subParser("emoji", function(t, u2, s) { + if (!u2.emoji) + return t; + t = s.converter._dispatch("emoji.before", t, u2, s); + var i2 = /:([\S]+?):/g; + return t = t.replace(i2, function(c, m) { + return a.helper.emojis.hasOwnProperty(m) ? a.helper.emojis[m] : c; + }), t = s.converter._dispatch("emoji.after", t, u2, s), t; + }), a.subParser("encodeAmpsAndAngles", function(t, u2, s) { + return t = s.converter._dispatch("encodeAmpsAndAngles.before", t, u2, s), t = t.replace(/&(?!#?[xX]?(?:[0-9a-fA-F]+|\w+);)/g, "&"), t = t.replace(/<(?![a-z\/?$!])/gi, "<"), t = t.replace(//g, ">"), t = s.converter._dispatch("encodeAmpsAndAngles.after", t, u2, s), t; + }), a.subParser("encodeBackslashEscapes", function(t, u2, s) { + return t = s.converter._dispatch("encodeBackslashEscapes.before", t, u2, s), t = t.replace(/\\(\\)/g, a.helper.escapeCharactersCallback), t = t.replace(/\\([`*_{}\[\]()>#+.!~=|:-])/g, a.helper.escapeCharactersCallback), t = s.converter._dispatch("encodeBackslashEscapes.after", t, u2, s), t; + }), a.subParser("encodeCode", function(t, u2, s) { + return t = s.converter._dispatch("encodeCode.before", t, u2, s), t = t.replace(/&/g, "&").replace(//g, ">").replace(/([*_{}\[\]\\=~-])/g, a.helper.escapeCharactersCallback), t = s.converter._dispatch("encodeCode.after", t, u2, s), t; + }), a.subParser("escapeSpecialCharsWithinTagAttributes", function(t, u2, s) { + t = s.converter._dispatch("escapeSpecialCharsWithinTagAttributes.before", t, u2, s); + var i2 = /<\/?[a-z\d_:-]+(?:[\s]+[\s\S]+?)?>/gi, c = /-]|-[^>])(?:[^-]|-[^-])*)--)>/gi; + return t = t.replace(i2, function(m) { + return m.replace(/(.)<\/?code>(?=.)/g, "$1`").replace(/([\\`*_~=|])/g, a.helper.escapeCharactersCallback); + }), t = t.replace(c, function(m) { + return m.replace(/([\\`*_~=|])/g, a.helper.escapeCharactersCallback); + }), t = s.converter._dispatch("escapeSpecialCharsWithinTagAttributes.after", t, u2, s), t; + }), a.subParser("githubCodeBlocks", function(t, u2, s) { + return u2.ghCodeBlocks ? (t = s.converter._dispatch("githubCodeBlocks.before", t, u2, s), t += "\xA80", t = t.replace(/(?:^|\n)(?: {0,3})(```+|~~~+)(?: *)([^\s`~]*)\n([\s\S]*?)\n(?: {0,3})\1/g, function(i2, c, m, h2) { + var C = u2.omitExtraWLInCodeBlocks ? "" : ` +`; + return h2 = a.subParser("encodeCode")(h2, u2, s), h2 = a.subParser("detab")(h2, u2, s), h2 = h2.replace(/^\n+/g, ""), h2 = h2.replace(/\n+$/g, ""), h2 = "
" + h2 + C + "
", h2 = a.subParser("hashBlock")(h2, u2, s), ` + +\xA8G` + (s.ghCodeBlocks.push({ text: i2, codeblock: h2 }) - 1) + `G + +`; + }), t = t.replace(/¨0/, ""), s.converter._dispatch("githubCodeBlocks.after", t, u2, s)) : t; + }), a.subParser("hashBlock", function(t, u2, s) { + return t = s.converter._dispatch("hashBlock.before", t, u2, s), t = t.replace(/(^\n+|\n+$)/g, ""), t = ` + +\xA8K` + (s.gHtmlBlocks.push(t) - 1) + `K + +`, t = s.converter._dispatch("hashBlock.after", t, u2, s), t; + }), a.subParser("hashCodeTags", function(t, u2, s) { + t = s.converter._dispatch("hashCodeTags.before", t, u2, s); + var i2 = function(c, m, h2, C) { + var U = h2 + a.subParser("encodeCode")(m, u2, s) + C; + return "\xA8C" + (s.gHtmlSpans.push(U) - 1) + "C"; + }; + return t = a.helper.replaceRecursiveRegExp(t, i2, "]*>", "", "gim"), t = s.converter._dispatch("hashCodeTags.after", t, u2, s), t; + }), a.subParser("hashElement", function(t, u2, s) { + return function(i2, c) { + var m = c; + return m = m.replace(/\n\n/g, ` +`), m = m.replace(/^\n/, ""), m = m.replace(/\n+$/g, ""), m = ` + +\xA8K` + (s.gHtmlBlocks.push(m) - 1) + `K + +`, m; + }; + }), a.subParser("hashHTMLBlocks", function(t, u2, s) { + t = s.converter._dispatch("hashHTMLBlocks.before", t, u2, s); + var i2 = [ + "pre", + "div", + "h1", + "h2", + "h3", + "h4", + "h5", + "h6", + "blockquote", + "table", + "dl", + "ol", + "ul", + "script", + "noscript", + "form", + "fieldset", + "iframe", + "math", + "style", + "section", + "header", + "footer", + "nav", + "article", + "aside", + "address", + "audio", + "canvas", + "figure", + "hgroup", + "output", + "video", + "p" + ], c = function(_2, q, J, Z) { + var B = _2; + return J.search(/\bmarkdown\b/) !== -1 && (B = J + s.converter.makeHtml(q) + Z), ` + +\xA8K` + (s.gHtmlBlocks.push(B) - 1) + `K + +`; + }; + u2.backslashEscapesHTMLTags && (t = t.replace(/\\<(\/?[^>]+?)>/g, function(_2, q) { + return "<" + q + ">"; + })); + for (var m = 0; m < i2.length; ++m) + for (var h2, C = new RegExp("^ {0,3}(<" + i2[m] + "\\b[^>]*>)", "im"), U = "<" + i2[m] + "\\b[^>]*>", H = ""; (h2 = a.helper.regexIndexOf(t, C)) !== -1; ) { + var V = a.helper.splitAtIndex(t, h2), G = a.helper.replaceRecursiveRegExp(V[1], c, U, H, "im"); + if (G === V[1]) + break; + t = V[0].concat(G); + } + return t = t.replace( + /(\n {0,3}(<(hr)\b([^<>])*?\/?>)[ \t]*(?=\n{2,}))/g, + a.subParser("hashElement")(t, u2, s) + ), t = a.helper.replaceRecursiveRegExp(t, function(_2) { + return ` + +\xA8K` + (s.gHtmlBlocks.push(_2) - 1) + `K + +`; + }, "^ {0,3}", "gm"), t = t.replace( + /(?:\n\n)( {0,3}(?:<([?%])[^\r]*?\2>)[ \t]*(?=\n{2,}))/g, + a.subParser("hashElement")(t, u2, s) + ), t = s.converter._dispatch("hashHTMLBlocks.after", t, u2, s), t; + }), a.subParser("hashHTMLSpans", function(t, u2, s) { + t = s.converter._dispatch("hashHTMLSpans.before", t, u2, s); + function i2(c) { + return "\xA8C" + (s.gHtmlSpans.push(c) - 1) + "C"; + } + return t = t.replace(/<[^>]+?\/>/gi, function(c) { + return i2(c); + }), t = t.replace(/<([^>]+?)>[\s\S]*?<\/\1>/g, function(c) { + return i2(c); + }), t = t.replace(/<([^>]+?)\s[^>]+?>[\s\S]*?<\/\1>/g, function(c) { + return i2(c); + }), t = t.replace(/<[^>]+?>/gi, function(c) { + return i2(c); + }), t = s.converter._dispatch("hashHTMLSpans.after", t, u2, s), t; + }), a.subParser("unhashHTMLSpans", function(t, u2, s) { + t = s.converter._dispatch("unhashHTMLSpans.before", t, u2, s); + for (var i2 = 0; i2 < s.gHtmlSpans.length; ++i2) { + for (var c = s.gHtmlSpans[i2], m = 0; /¨C(\d+)C/.test(c); ) { + var h2 = RegExp.$1; + if (c = c.replace("\xA8C" + h2 + "C", s.gHtmlSpans[h2]), m === 10) { + console.error("maximum nesting of 10 spans reached!!!"); + break; + } + ++m; + } + t = t.replace("\xA8C" + i2 + "C", c); + } + return t = s.converter._dispatch("unhashHTMLSpans.after", t, u2, s), t; + }), a.subParser("hashPreCodeTags", function(t, u2, s) { + t = s.converter._dispatch("hashPreCodeTags.before", t, u2, s); + var i2 = function(c, m, h2, C) { + var U = h2 + a.subParser("encodeCode")(m, u2, s) + C; + return ` + +\xA8G` + (s.ghCodeBlocks.push({ text: c, codeblock: U }) - 1) + `G + +`; + }; + return t = a.helper.replaceRecursiveRegExp(t, i2, "^ {0,3}]*>\\s*]*>", "^ {0,3}\\s*
", "gim"), t = s.converter._dispatch("hashPreCodeTags.after", t, u2, s), t; + }), a.subParser("headers", function(t, u2, s) { + t = s.converter._dispatch("headers.before", t, u2, s); + var i2 = isNaN(parseInt(u2.headerLevelStart)) ? 1 : parseInt(u2.headerLevelStart), c = u2.smoothLivePreview ? /^(.+)[ \t]*\n={2,}[ \t]*\n+/gm : /^(.+)[ \t]*\n=+[ \t]*\n+/gm, m = u2.smoothLivePreview ? /^(.+)[ \t]*\n-{2,}[ \t]*\n+/gm : /^(.+)[ \t]*\n-+[ \t]*\n+/gm; + t = t.replace(c, function(U, H) { + var V = a.subParser("spanGamut")(H, u2, s), G = u2.noHeaderId ? "" : ' id="' + C(H) + '"', _2 = i2, q = "" + V + ""; + return a.subParser("hashBlock")(q, u2, s); + }), t = t.replace(m, function(U, H) { + var V = a.subParser("spanGamut")(H, u2, s), G = u2.noHeaderId ? "" : ' id="' + C(H) + '"', _2 = i2 + 1, q = "" + V + ""; + return a.subParser("hashBlock")(q, u2, s); + }); + var h2 = u2.requireSpaceBeforeHeadingText ? /^(#{1,6})[ \t]+(.+?)[ \t]*#*\n+/gm : /^(#{1,6})[ \t]*(.+?)[ \t]*#*\n+/gm; + t = t.replace(h2, function(U, H, V) { + var G = V; + u2.customizedHeaderId && (G = V.replace(/\s?\{([^{]+?)}\s*$/, "")); + var _2 = a.subParser("spanGamut")(G, u2, s), q = u2.noHeaderId ? "" : ' id="' + C(V) + '"', J = i2 - 1 + H.length, Z = "" + _2 + ""; + return a.subParser("hashBlock")(Z, u2, s); + }); + function C(U) { + var H, V; + if (u2.customizedHeaderId) { + var G = U.match(/\{([^{]+?)}\s*$/); + G && G[1] && (U = G[1]); + } + return H = U, a.helper.isString(u2.prefixHeaderId) ? V = u2.prefixHeaderId : u2.prefixHeaderId === true ? V = "section-" : V = "", u2.rawPrefixHeaderId || (H = V + H), u2.ghCompatibleHeaderId ? H = H.replace(/ /g, "-").replace(/&/g, "").replace(/¨T/g, "").replace(/¨D/g, "").replace(/[&+$,\/:;=?@"#{}|^¨~\[\]`\\*)(%.!'<>]/g, "").toLowerCase() : u2.rawHeaderId ? H = H.replace(/ /g, "-").replace(/&/g, "&").replace(/¨T/g, "\xA8").replace(/¨D/g, "$").replace(/["']/g, "-").toLowerCase() : H = H.replace(/[^\w]/g, "").toLowerCase(), u2.rawPrefixHeaderId && (H = V + H), s.hashLinkCounts[H] ? H = H + "-" + s.hashLinkCounts[H]++ : s.hashLinkCounts[H] = 1, H; + } + return t = s.converter._dispatch("headers.after", t, u2, s), t; + }), a.subParser("horizontalRule", function(t, u2, s) { + t = s.converter._dispatch("horizontalRule.before", t, u2, s); + var i2 = a.subParser("hashBlock")("
", u2, s); + return t = t.replace(/^ {0,2}( ?-){3,}[ \t]*$/gm, i2), t = t.replace(/^ {0,2}( ?\*){3,}[ \t]*$/gm, i2), t = t.replace(/^ {0,2}( ?_){3,}[ \t]*$/gm, i2), t = s.converter._dispatch("horizontalRule.after", t, u2, s), t; + }), a.subParser("images", function(t, u2, s) { + t = s.converter._dispatch("images.before", t, u2, s); + var i2 = /!\[([^\]]*?)][ \t]*()\([ \t]??(?: =([*\d]+[A-Za-z%]{0,4})x([*\d]+[A-Za-z%]{0,4}))?[ \t]*(?:(["'])([^"]*?)\6)?[ \t]?\)/g, c = /!\[([^\]]*?)][ \t]*()\([ \t]?<([^>]*)>(?: =([*\d]+[A-Za-z%]{0,4})x([*\d]+[A-Za-z%]{0,4}))?[ \t]*(?:(?:(["'])([^"]*?)\6))?[ \t]?\)/g, m = /!\[([^\]]*?)][ \t]*()\([ \t]??(?: =([*\d]+[A-Za-z%]{0,4})x([*\d]+[A-Za-z%]{0,4}))?[ \t]*(?:(["'])([^"]*?)\6)?[ \t]?\)/g, h2 = /!\[([^\]]*?)] ?(?:\n *)?\[([\s\S]*?)]()()()()()/g, C = /!\[([^\[\]]+)]()()()()()/g; + function U(V, G, _2, q, J, Z, B, k) { + return q = q.replace(/\s/g, ""), H(V, G, _2, q, J, Z, B, k); + } + function H(V, G, _2, q, J, Z, B, k) { + var F = s.gUrls, O = s.gTitles, l = s.gDimensions; + if (_2 = _2.toLowerCase(), k || (k = ""), V.search(/\(? ?(['"].*['"])?\)$/m) > -1) + q = ""; + else if (q === "" || q === null) + if ((_2 === "" || _2 === null) && (_2 = G.toLowerCase().replace(/ ?\n/g, " ")), q = "#" + _2, !a.helper.isUndefined(F[_2])) + q = F[_2], a.helper.isUndefined(O[_2]) || (k = O[_2]), a.helper.isUndefined(l[_2]) || (J = l[_2].width, Z = l[_2].height); + else + return V; + G = G.replace(/"/g, """).replace(a.helper.regexes.asteriskDashAndColon, a.helper.escapeCharactersCallback), q = q.replace(a.helper.regexes.asteriskDashAndColon, a.helper.escapeCharactersCallback); + var w2 = '' + G + '", "
"); + }), t = t.replace(/\b__(\S[\s\S]*?)__\b/g, function(c, m) { + return i2(m, "", ""); + }), t = t.replace(/\b_(\S[\s\S]*?)_\b/g, function(c, m) { + return i2(m, "", ""); + })) : (t = t.replace(/___(\S[\s\S]*?)___/g, function(c, m) { + return /\S$/.test(m) ? i2(m, "", "") : c; + }), t = t.replace(/__(\S[\s\S]*?)__/g, function(c, m) { + return /\S$/.test(m) ? i2(m, "", "") : c; + }), t = t.replace(/_([^\s_][\s\S]*?)_/g, function(c, m) { + return /\S$/.test(m) ? i2(m, "", "") : c; + })), u2.literalMidWordAsterisks ? (t = t.replace(/([^*]|^)\B\*\*\*(\S[\s\S]*?)\*\*\*\B(?!\*)/g, function(c, m, h2) { + return i2(h2, m + "", ""); + }), t = t.replace(/([^*]|^)\B\*\*(\S[\s\S]*?)\*\*\B(?!\*)/g, function(c, m, h2) { + return i2(h2, m + "", ""); + }), t = t.replace(/([^*]|^)\B\*(\S[\s\S]*?)\*\B(?!\*)/g, function(c, m, h2) { + return i2(h2, m + "", ""); + })) : (t = t.replace(/\*\*\*(\S[\s\S]*?)\*\*\*/g, function(c, m) { + return /\S$/.test(m) ? i2(m, "", "") : c; + }), t = t.replace(/\*\*(\S[\s\S]*?)\*\*/g, function(c, m) { + return /\S$/.test(m) ? i2(m, "", "") : c; + }), t = t.replace(/\*([^\s*][\s\S]*?)\*/g, function(c, m) { + return /\S$/.test(m) ? i2(m, "", "") : c; + })), t = s.converter._dispatch("italicsAndBold.after", t, u2, s), t; + }), a.subParser("lists", function(t, u2, s) { + function i2(h2, C) { + s.gListLevel++, h2 = h2.replace(/\n{2,}$/, ` +`), h2 += "\xA80"; + var U = /(\n)?(^ {0,3})([*+-]|\d+[.])[ \t]+((\[(x|X| )?])?[ \t]*[^\r]+?(\n{1,2}))(?=\n*(¨0| {0,3}([*+-]|\d+[.])[ \t]+))/gm, H = /\n[ \t]*\n(?!¨0)/.test(h2); + return u2.disableForced4SpacesIndentedSublists && (U = /(\n)?(^ {0,3})([*+-]|\d+[.])[ \t]+((\[(x|X| )?])?[ \t]*[^\r]+?(\n{1,2}))(?=\n*(¨0|\2([*+-]|\d+[.])[ \t]+))/gm), h2 = h2.replace(U, function(V, G, _2, q, J, Z, B) { + B = B && B.trim() !== ""; + var k = a.subParser("outdent")(J, u2, s), F = ""; + return Z && u2.tasklists && (F = ' class="task-list-item" style="list-style-type: none;"', k = k.replace(/^[ \t]*\[(x|X| )?]/m, function() { + var O = ' -1 ? (k = a.subParser("githubCodeBlocks")(k, u2, s), k = a.subParser("blockGamut")(k, u2, s)) : (k = a.subParser("lists")(k, u2, s), k = k.replace(/\n$/, ""), k = a.subParser("hashHTMLBlocks")(k, u2, s), k = k.replace(/\n\n+/g, ` + +`), H ? k = a.subParser("paragraphs")(k, u2, s) : k = a.subParser("spanGamut")(k, u2, s)), k = k.replace("\xA8A", ""), k = "" + k + ` +`, k; + }), h2 = h2.replace(/¨0/g, ""), s.gListLevel--, C && (h2 = h2.replace(/\s+$/, "")), h2; + } + function c(h2, C) { + if (C === "ol") { + var U = h2.match(/^ *(\d+)\./); + if (U && U[1] !== "1") + return ' start="' + U[1] + '"'; + } + return ""; + } + function m(h2, C, U) { + var H = u2.disableForced4SpacesIndentedSublists ? /^ ?\d+\.[ \t]/gm : /^ {0,3}\d+\.[ \t]/gm, V = u2.disableForced4SpacesIndentedSublists ? /^ ?[*+-][ \t]/gm : /^ {0,3}[*+-][ \t]/gm, G = C === "ul" ? H : V, _2 = ""; + if (h2.search(G) !== -1) + (function J(Z) { + var B = Z.search(G), k = c(h2, C); + B !== -1 ? (_2 += ` + +<` + C + k + `> +` + i2(Z.slice(0, B), !!U) + " +`, C = C === "ul" ? "ol" : "ul", G = C === "ul" ? H : V, J(Z.slice(B))) : _2 += ` + +<` + C + k + `> +` + i2(Z, !!U) + " +`; + })(h2); + else { + var q = c(h2, C); + _2 = ` + +<` + C + q + `> +` + i2(h2, !!U) + " +`; + } + return _2; + } + return t = s.converter._dispatch("lists.before", t, u2, s), t += "\xA80", s.gListLevel ? t = t.replace( + /^(( {0,3}([*+-]|\d+[.])[ \t]+)[^\r]+?(¨0|\n{2,}(?=\S)(?![ \t]*(?:[*+-]|\d+[.])[ \t]+)))/gm, + function(h2, C, U) { + var H = U.search(/[*+-]/g) > -1 ? "ul" : "ol"; + return m(C, H, true); + } + ) : t = t.replace( + /(\n\n|^\n?)(( {0,3}([*+-]|\d+[.])[ \t]+)[^\r]+?(¨0|\n{2,}(?=\S)(?![ \t]*(?:[*+-]|\d+[.])[ \t]+)))/gm, + function(h2, C, U, H) { + var V = H.search(/[*+-]/g) > -1 ? "ul" : "ol"; + return m(U, V, false); + } + ), t = t.replace(/¨0/, ""), t = s.converter._dispatch("lists.after", t, u2, s), t; + }), a.subParser("metadata", function(t, u2, s) { + if (!u2.metadata) + return t; + t = s.converter._dispatch("metadata.before", t, u2, s); + function i2(c) { + s.metadata.raw = c, c = c.replace(/&/g, "&").replace(/"/g, """), c = c.replace(/\n {4}/g, " "), c.replace(/^([\S ]+): +([\s\S]+?)$/gm, function(m, h2, C) { + return s.metadata.parsed[h2] = C, ""; + }); + } + return t = t.replace(/^\s*«««+(\S*?)\n([\s\S]+?)\n»»»+\n/, function(c, m, h2) { + return i2(h2), "\xA8M"; + }), t = t.replace(/^\s*---+(\S*?)\n([\s\S]+?)\n---+\n/, function(c, m, h2) { + return m && (s.metadata.format = m), i2(h2), "\xA8M"; + }), t = t.replace(/¨M/g, ""), t = s.converter._dispatch("metadata.after", t, u2, s), t; + }), a.subParser("outdent", function(t, u2, s) { + return t = s.converter._dispatch("outdent.before", t, u2, s), t = t.replace(/^(\t|[ ]{1,4})/gm, "\xA80"), t = t.replace(/¨0/g, ""), t = s.converter._dispatch("outdent.after", t, u2, s), t; + }), a.subParser("paragraphs", function(t, u2, s) { + t = s.converter._dispatch("paragraphs.before", t, u2, s), t = t.replace(/^\n+/g, ""), t = t.replace(/\n+$/g, ""); + for (var i2 = t.split(/\n{2,}/g), c = [], m = i2.length, h2 = 0; h2 < m; h2++) { + var C = i2[h2]; + C.search(/¨(K|G)(\d+)\1/g) >= 0 ? c.push(C) : C.search(/\S/) >= 0 && (C = a.subParser("spanGamut")(C, u2, s), C = C.replace(/^([ \t]*)/g, "

"), C += "

", c.push(C)); + } + for (m = c.length, h2 = 0; h2 < m; h2++) { + for (var U = "", H = c[h2], V = false; /¨(K|G)(\d+)\1/.test(H); ) { + var G = RegExp.$1, _2 = RegExp.$2; + G === "K" ? U = s.gHtmlBlocks[_2] : V ? U = a.subParser("encodeCode")(s.ghCodeBlocks[_2].text, u2, s) : U = s.ghCodeBlocks[_2].codeblock, U = U.replace(/\$/g, "$$$$"), H = H.replace(/(\n\n)?¨(K|G)\d+\2(\n\n)?/, U), /^]*>\s*]*>/.test(H) && (V = true); + } + c[h2] = H; + } + return t = c.join(` +`), t = t.replace(/^\n+/g, ""), t = t.replace(/\n+$/g, ""), s.converter._dispatch("paragraphs.after", t, u2, s); + }), a.subParser("runExtension", function(t, u2, s, i2) { + if (t.filter) + u2 = t.filter(u2, i2.converter, s); + else if (t.regex) { + var c = t.regex; + c instanceof RegExp || (c = new RegExp(c, "g")), u2 = u2.replace(c, t.replace); + } + return u2; + }), a.subParser("spanGamut", function(t, u2, s) { + return t = s.converter._dispatch("spanGamut.before", t, u2, s), t = a.subParser("codeSpans")(t, u2, s), t = a.subParser("escapeSpecialCharsWithinTagAttributes")(t, u2, s), t = a.subParser("encodeBackslashEscapes")(t, u2, s), t = a.subParser("images")(t, u2, s), t = a.subParser("anchors")(t, u2, s), t = a.subParser("autoLinks")(t, u2, s), t = a.subParser("simplifiedAutoLinks")(t, u2, s), t = a.subParser("emoji")(t, u2, s), t = a.subParser("underline")(t, u2, s), t = a.subParser("italicsAndBold")(t, u2, s), t = a.subParser("strikethrough")(t, u2, s), t = a.subParser("ellipsis")(t, u2, s), t = a.subParser("hashHTMLSpans")(t, u2, s), t = a.subParser("encodeAmpsAndAngles")(t, u2, s), u2.simpleLineBreaks ? /\n\n¨K/.test(t) || (t = t.replace(/\n+/g, `
+`)) : t = t.replace(/ +\n/g, `
+`), t = s.converter._dispatch("spanGamut.after", t, u2, s), t; + }), a.subParser("strikethrough", function(t, u2, s) { + function i2(c) { + return u2.simplifiedAutoLink && (c = a.subParser("simplifiedAutoLinks")(c, u2, s)), "" + c + ""; + } + return u2.strikethrough && (t = s.converter._dispatch("strikethrough.before", t, u2, s), t = t.replace(/(?:~){2}([\s\S]+?)(?:~){2}/g, function(c, m) { + return i2(m); + }), t = s.converter._dispatch("strikethrough.after", t, u2, s)), t; + }), a.subParser("stripLinkDefinitions", function(t, u2, s) { + var i2 = /^ {0,3}\[([^\]]+)]:[ \t]*\n?[ \t]*\s]+)>?(?: =([*\d]+[A-Za-z%]{0,4})x([*\d]+[A-Za-z%]{0,4}))?[ \t]*\n?[ \t]*(?:(\n*)["|'(](.+?)["|')][ \t]*)?(?:\n+|(?=¨0))/gm, c = /^ {0,3}\[([^\]]+)]:[ \t]*\n?[ \t]*?(?: =([*\d]+[A-Za-z%]{0,4})x([*\d]+[A-Za-z%]{0,4}))?[ \t]*\n?[ \t]*(?:(\n*)["|'(](.+?)["|')][ \t]*)?(?:\n\n|(?=¨0)|(?=\n\[))/gm; + t += "\xA80"; + var m = function(h2, C, U, H, V, G, _2) { + return C = C.toLowerCase(), t.toLowerCase().split(C).length - 1 < 2 ? h2 : (U.match(/^data:.+?\/.+?;base64,/) ? s.gUrls[C] = U.replace(/\s/g, "") : s.gUrls[C] = a.subParser("encodeAmpsAndAngles")(U, u2, s), G ? G + _2 : (_2 && (s.gTitles[C] = _2.replace(/"|'/g, """)), u2.parseImgDimensions && H && V && (s.gDimensions[C] = { + width: H, + height: V + }), "")); + }; + return t = t.replace(c, m), t = t.replace(i2, m), t = t.replace(/¨0/, ""), t; + }), a.subParser("tables", function(t, u2, s) { + if (!u2.tables) + return t; + var i2 = /^ {0,3}\|?.+\|.+\n {0,3}\|?[ \t]*:?[ \t]*(?:[-=]){2,}[ \t]*:?[ \t]*\|[ \t]*:?[ \t]*(?:[-=]){2,}[\s\S]+?(?:\n\n|¨0)/gm, c = /^ {0,3}\|.+\|[ \t]*\n {0,3}\|[ \t]*:?[ \t]*(?:[-=]){2,}[ \t]*:?[ \t]*\|[ \t]*\n( {0,3}\|.+\|[ \t]*\n)*(?:\n|¨0)/gm; + function m(V) { + return /^:[ \t]*--*$/.test(V) ? ' style="text-align:left;"' : /^--*[ \t]*:[ \t]*$/.test(V) ? ' style="text-align:right;"' : /^:[ \t]*--*[ \t]*:$/.test(V) ? ' style="text-align:center;"' : ""; + } + function h2(V, G) { + var _2 = ""; + return V = V.trim(), (u2.tablesHeaderId || u2.tableHeaderId) && (_2 = ' id="' + V.replace(/ /g, "_").toLowerCase() + '"'), V = a.subParser("spanGamut")(V, u2, s), "" + V + ` +`; + } + function C(V, G) { + var _2 = a.subParser("spanGamut")(V, u2, s); + return "" + _2 + ` +`; + } + function U(V, G) { + for (var _2 = ` + + +`, q = V.length, J = 0; J < q; ++J) + _2 += V[J]; + for (_2 += ` + + +`, J = 0; J < G.length; ++J) { + _2 += ` +`; + for (var Z = 0; Z < q; ++Z) + _2 += G[J][Z]; + _2 += ` +`; + } + return _2 += ` +
+`, _2; + } + function H(V) { + var G, _2 = V.split(` +`); + for (G = 0; G < _2.length; ++G) + /^ {0,3}\|/.test(_2[G]) && (_2[G] = _2[G].replace(/^ {0,3}\|/, "")), /\|[ \t]*$/.test(_2[G]) && (_2[G] = _2[G].replace(/\|[ \t]*$/, "")), _2[G] = a.subParser("codeSpans")(_2[G], u2, s); + var q = _2[0].split("|").map(function(w2) { + return w2.trim(); + }), J = _2[1].split("|").map(function(w2) { + return w2.trim(); + }), Z = [], B = [], k = [], F = []; + for (_2.shift(), _2.shift(), G = 0; G < _2.length; ++G) + _2[G].trim() !== "" && Z.push( + _2[G].split("|").map(function(w2) { + return w2.trim(); + }) + ); + if (q.length < J.length) + return V; + for (G = 0; G < J.length; ++G) + k.push(m(J[G])); + for (G = 0; G < q.length; ++G) + a.helper.isUndefined(k[G]) && (k[G] = ""), B.push(h2(q[G], k[G])); + for (G = 0; G < Z.length; ++G) { + for (var O = [], l = 0; l < B.length; ++l) + a.helper.isUndefined(Z[G][l]), O.push(C(Z[G][l], k[l])); + F.push(O); + } + return U(B, F); + } + return t = s.converter._dispatch("tables.before", t, u2, s), t = t.replace(/\\(\|)/g, a.helper.escapeCharactersCallback), t = t.replace(i2, H), t = t.replace(c, H), t = s.converter._dispatch("tables.after", t, u2, s), t; + }), a.subParser("underline", function(t, u2, s) { + return u2.underline && (t = s.converter._dispatch("underline.before", t, u2, s), u2.literalMidWordUnderscores ? (t = t.replace(/\b___(\S[\s\S]*?)___\b/g, function(i2, c) { + return "" + c + ""; + }), t = t.replace(/\b__(\S[\s\S]*?)__\b/g, function(i2, c) { + return "" + c + ""; + })) : (t = t.replace(/___(\S[\s\S]*?)___/g, function(i2, c) { + return /\S$/.test(c) ? "" + c + "" : i2; + }), t = t.replace(/__(\S[\s\S]*?)__/g, function(i2, c) { + return /\S$/.test(c) ? "" + c + "" : i2; + })), t = t.replace(/(_)/g, a.helper.escapeCharactersCallback), t = s.converter._dispatch("underline.after", t, u2, s)), t; + }), a.subParser("unescapeSpecialChars", function(t, u2, s) { + return t = s.converter._dispatch("unescapeSpecialChars.before", t, u2, s), t = t.replace(/¨E(\d+)E/g, function(i2, c) { + var m = parseInt(c); + return String.fromCharCode(m); + }), t = s.converter._dispatch("unescapeSpecialChars.after", t, u2, s), t; + }), a.subParser("makeMarkdown.blockquote", function(t, u2) { + var s = ""; + if (t.hasChildNodes()) + for (var i2 = t.childNodes, c = i2.length, m = 0; m < c; ++m) { + var h2 = a.subParser("makeMarkdown.node")(i2[m], u2); + h2 !== "" && (s += h2); + } + return s = s.trim(), s = "> " + s.split(` +`).join(` +> `), s; + }), a.subParser("makeMarkdown.codeBlock", function(t, u2) { + var s = t.getAttribute("language"), i2 = t.getAttribute("precodenum"); + return "```" + s + ` +` + u2.preList[i2] + "\n```"; + }), a.subParser("makeMarkdown.codeSpan", function(t) { + return "`" + t.innerHTML + "`"; + }), a.subParser("makeMarkdown.emphasis", function(t, u2) { + var s = ""; + if (t.hasChildNodes()) { + s += "*"; + for (var i2 = t.childNodes, c = i2.length, m = 0; m < c; ++m) + s += a.subParser("makeMarkdown.node")(i2[m], u2); + s += "*"; + } + return s; + }), a.subParser("makeMarkdown.header", function(t, u2, s) { + var i2 = new Array(s + 1).join("#"), c = ""; + if (t.hasChildNodes()) { + c = i2 + " "; + for (var m = t.childNodes, h2 = m.length, C = 0; C < h2; ++C) + c += a.subParser("makeMarkdown.node")(m[C], u2); + } + return c; + }), a.subParser("makeMarkdown.hr", function() { + return "---"; + }), a.subParser("makeMarkdown.image", function(t) { + var u2 = ""; + return t.hasAttribute("src") && (u2 += "![" + t.getAttribute("alt") + "](", u2 += "<" + t.getAttribute("src") + ">", t.hasAttribute("width") && t.hasAttribute("height") && (u2 += " =" + t.getAttribute("width") + "x" + t.getAttribute("height")), t.hasAttribute("title") && (u2 += ' "' + t.getAttribute("title") + '"'), u2 += ")"), u2; + }), a.subParser("makeMarkdown.links", function(t, u2) { + var s = ""; + if (t.hasChildNodes() && t.hasAttribute("href")) { + var i2 = t.childNodes, c = i2.length; + s = "["; + for (var m = 0; m < c; ++m) + s += a.subParser("makeMarkdown.node")(i2[m], u2); + s += "](", s += "<" + t.getAttribute("href") + ">", t.hasAttribute("title") && (s += ' "' + t.getAttribute("title") + '"'), s += ")"; + } + return s; + }), a.subParser("makeMarkdown.list", function(t, u2, s) { + var i2 = ""; + if (!t.hasChildNodes()) + return ""; + for (var c = t.childNodes, m = c.length, h2 = t.getAttribute("start") || 1, C = 0; C < m; ++C) + if (!(typeof c[C].tagName > "u" || c[C].tagName.toLowerCase() !== "li")) { + var U = ""; + s === "ol" ? U = h2.toString() + ". " : U = "- ", i2 += U + a.subParser("makeMarkdown.listItem")(c[C], u2), ++h2; + } + return i2 += ` + +`, i2.trim(); + }), a.subParser("makeMarkdown.listItem", function(t, u2) { + for (var s = "", i2 = t.childNodes, c = i2.length, m = 0; m < c; ++m) + s += a.subParser("makeMarkdown.node")(i2[m], u2); + return /\n$/.test(s) ? s = s.split(` +`).join(` + `).replace(/^ {4}$/gm, "").replace(/\n\n+/g, ` + +`) : s += ` +`, s; + }), a.subParser("makeMarkdown.node", function(t, u2, s) { + s = s || false; + var i2 = ""; + if (t.nodeType === 3) + return a.subParser("makeMarkdown.txt")(t, u2); + if (t.nodeType === 8) + return " + +`; + if (t.nodeType !== 1) + return ""; + var c = t.tagName.toLowerCase(); + switch (c) { + case "h1": + s || (i2 = a.subParser("makeMarkdown.header")(t, u2, 1) + ` + +`); + break; + case "h2": + s || (i2 = a.subParser("makeMarkdown.header")(t, u2, 2) + ` + +`); + break; + case "h3": + s || (i2 = a.subParser("makeMarkdown.header")(t, u2, 3) + ` + +`); + break; + case "h4": + s || (i2 = a.subParser("makeMarkdown.header")(t, u2, 4) + ` + +`); + break; + case "h5": + s || (i2 = a.subParser("makeMarkdown.header")(t, u2, 5) + ` + +`); + break; + case "h6": + s || (i2 = a.subParser("makeMarkdown.header")(t, u2, 6) + ` + +`); + break; + case "p": + s || (i2 = a.subParser("makeMarkdown.paragraph")(t, u2) + ` + +`); + break; + case "blockquote": + s || (i2 = a.subParser("makeMarkdown.blockquote")(t, u2) + ` + +`); + break; + case "hr": + s || (i2 = a.subParser("makeMarkdown.hr")(t, u2) + ` + +`); + break; + case "ol": + s || (i2 = a.subParser("makeMarkdown.list")(t, u2, "ol") + ` + +`); + break; + case "ul": + s || (i2 = a.subParser("makeMarkdown.list")(t, u2, "ul") + ` + +`); + break; + case "precode": + s || (i2 = a.subParser("makeMarkdown.codeBlock")(t, u2) + ` + +`); + break; + case "pre": + s || (i2 = a.subParser("makeMarkdown.pre")(t, u2) + ` + +`); + break; + case "table": + s || (i2 = a.subParser("makeMarkdown.table")(t, u2) + ` + +`); + break; + case "code": + i2 = a.subParser("makeMarkdown.codeSpan")(t, u2); + break; + case "em": + case "i": + i2 = a.subParser("makeMarkdown.emphasis")(t, u2); + break; + case "strong": + case "b": + i2 = a.subParser("makeMarkdown.strong")(t, u2); + break; + case "del": + i2 = a.subParser("makeMarkdown.strikethrough")(t, u2); + break; + case "a": + i2 = a.subParser("makeMarkdown.links")(t, u2); + break; + case "img": + i2 = a.subParser("makeMarkdown.image")(t, u2); + break; + default: + i2 = t.outerHTML + ` + +`; + } + return i2; + }), a.subParser("makeMarkdown.paragraph", function(t, u2) { + var s = ""; + if (t.hasChildNodes()) + for (var i2 = t.childNodes, c = i2.length, m = 0; m < c; ++m) + s += a.subParser("makeMarkdown.node")(i2[m], u2); + return s = s.trim(), s; + }), a.subParser("makeMarkdown.pre", function(t, u2) { + var s = t.getAttribute("prenum"); + return "
" + u2.preList[s] + "
"; + }), a.subParser("makeMarkdown.strikethrough", function(t, u2) { + var s = ""; + if (t.hasChildNodes()) { + s += "~~"; + for (var i2 = t.childNodes, c = i2.length, m = 0; m < c; ++m) + s += a.subParser("makeMarkdown.node")(i2[m], u2); + s += "~~"; + } + return s; + }), a.subParser("makeMarkdown.strong", function(t, u2) { + var s = ""; + if (t.hasChildNodes()) { + s += "**"; + for (var i2 = t.childNodes, c = i2.length, m = 0; m < c; ++m) + s += a.subParser("makeMarkdown.node")(i2[m], u2); + s += "**"; + } + return s; + }), a.subParser("makeMarkdown.table", function(t, u2) { + var s = "", i2 = [[], []], c = t.querySelectorAll("thead>tr>th"), m = t.querySelectorAll("tbody>tr"), h2, C; + for (h2 = 0; h2 < c.length; ++h2) { + var U = a.subParser("makeMarkdown.tableCell")(c[h2], u2), H = "---"; + if (c[h2].hasAttribute("style")) { + var V = c[h2].getAttribute("style").toLowerCase().replace(/\s/g, ""); + switch (V) { + case "text-align:left;": + H = ":---"; + break; + case "text-align:right;": + H = "---:"; + break; + case "text-align:center;": + H = ":---:"; + break; + } + } + i2[0][h2] = U.trim(), i2[1][h2] = H; + } + for (h2 = 0; h2 < m.length; ++h2) { + var G = i2.push([]) - 1, _2 = m[h2].getElementsByTagName("td"); + for (C = 0; C < c.length; ++C) { + var q = " "; + typeof _2[C] < "u" && (q = a.subParser("makeMarkdown.tableCell")(_2[C], u2)), i2[G].push(q); + } + } + var J = 3; + for (h2 = 0; h2 < i2.length; ++h2) + for (C = 0; C < i2[h2].length; ++C) { + var Z = i2[h2][C].length; + Z > J && (J = Z); + } + for (h2 = 0; h2 < i2.length; ++h2) { + for (C = 0; C < i2[h2].length; ++C) + h2 === 1 ? i2[h2][C].slice(-1) === ":" ? i2[h2][C] = a.helper.padEnd(i2[h2][C].slice(-1), J - 1, "-") + ":" : i2[h2][C] = a.helper.padEnd(i2[h2][C], J, "-") : i2[h2][C] = a.helper.padEnd(i2[h2][C], J); + s += "| " + i2[h2].join(" | ") + ` | +`; + } + return s.trim(); + }), a.subParser("makeMarkdown.tableCell", function(t, u2) { + var s = ""; + if (!t.hasChildNodes()) + return ""; + for (var i2 = t.childNodes, c = i2.length, m = 0; m < c; ++m) + s += a.subParser("makeMarkdown.node")(i2[m], u2, true); + return s.trim(); + }), a.subParser("makeMarkdown.txt", function(t) { + var u2 = t.nodeValue; + return u2 = u2.replace(/ +/g, " "), u2 = u2.replace(/¨NBSP;/g, " "), u2 = a.helper.unescapeHTMLEntities(u2), u2 = u2.replace(/([*_~|`])/g, "\\$1"), u2 = u2.replace(/^(\s*)>/g, "\\$1>"), u2 = u2.replace(/^#/gm, "\\#"), u2 = u2.replace(/^(\s*)([-=]{3,})(\s*)$/, "$1\\$2$3"), u2 = u2.replace(/^( {0,3}\d+)\./gm, "$1\\."), u2 = u2.replace(/^( {0,3})([+-])/gm, "$1\\$2"), u2 = u2.replace(/]([\s]*)\(/g, "\\]$1\\("), u2 = u2.replace(/^ {0,3}\[([\S \t]*?)]:/gm, "\\[$1]:"), u2; + }); + var D2 = this; + e2.exports ? e2.exports = a : D2.showdown = a; + }).call(En); +})(Go); +var $n = class { + constructor() { + be(this, "logger"); + be(this, "converter"); + this.logger = Ma.zhiLog("showdown-adaptor"), this.converter = new Nt.Converter(); + } + isAvailable() { + return typeof Nt < "u"; + } + renderMarkdownStr(r3) { + if (!this.isAvailable()) + throw new Error("Showdown is not available"); + return this.logger.info("Showdown is rendering md to HTML..."), Promise.resolve(this.converter.makeHtml(r3)); + } +}; +var cs = class { + constructor() { + be(this, "logger"); + be(this, "mdAdaptor", new $n()); + this.logger = Ma.zhiLog("markdown-util"); + } + /** + * 获取当前 MD 解析器名称 + */ + getCurrentAdaptorName() { + return this.mdAdaptor instanceof bn ? "Lute" : this.mdAdaptor instanceof $n ? "Showdown" : "None"; + } + /** + * 渲染Markdown + * + * @param md - Markdown文本 + */ + async renderHTML(r3) { + const n = new bn(); + return this.logger.debug("Lute status =>", n.isAvailable()), n.isAvailable() && (this.mdAdaptor = n), this.logger.info(`Using ${this.getCurrentAdaptorName()} as markdown renderer`), await this.mdAdaptor.renderMarkdownStr(r3); + } +}; +var Ko = class { + constructor() { + be(this, "mdUtil"); + this.mdUtil = new cs(); + } + /** + * 移除标题数字 + * + * @param str - 字符串 + */ + removeTitleNumber(r3) { + let n = r3; + const a = /([0-9]*)\./; + return n = n.replace(a, ""), n; + } + /** + * 删除挂件的HTML + * + * @param str - 原字符 + */ + removeWidgetTag(r3) { + let n = r3.toString(); + const a = //g; + n = n.replace(a, ""); + const d = //g; + n = n.replace(d, ""); + const o2 = //g; + return n = n.replace(o2, ""), n; + } + /** + * 删除Markdown文本的挂件的HTML + * + * @param str - 原字符 + */ + removeMdWidgetTag(r3) { + let n = r3.toString(); + return n = this.removeWidgetTag(n), n; + } + /** + * 去除html标签,残缺不全也可以 + * + * @param str - 字符串 + */ + filterHtml(r3) { + r3 = r3.replace(//g, ""), r3 = r3.replace(//g, ""), r3 = r3.replace(/<[^>]*>/g, ""), r3 = r3.replace(/&.*;/g, ""), r3 = r3.replace(/(^\s*)|(\s*$)/g, ""), r3 = r3.replace(//g, ""), r3 = r3.replace(/"/g, "").replace(/'/g, ""), r3 = r3.replace(/\*/g, ""), r3 = r3.replace(/\$/g, ""), r3 = r3.replace(/\./g, ""), r3 = r3.replace(/\+/g, ""), r3 = r3.replace(/\s+/g, ""), r3 = r3.replace(/[:|:]/g, "_"), r3 = r3.replace(/[;|;]/g, "_"), r3 = r3.replace(/\^/g, "_"), r3 = r3.replace(/!/g, "_"), r3 = r3.replace(/@/g, "at_"); + const n = ["\\d*/\\d/\\d*", "[\u3001|\\\\]", "[\uFF0C|,]", "\\d", "/", "-"]; + for (let a = 0; a < n.length; a++) { + const d = new RegExp(n[a], "g"); + r3 = r3.replace(d, ""); + } + return r3 = r3.toLowerCase(), r3; + } + /** + * 截取指定长度html + * + * @param html - html + * @param length - 长度 + * @param ignore - 不要结尾省略号 + */ + parseHtml(r3, n, a) { + const d = this.filterHtml(r3); + return d.length < n ? d : a === true ? d.substring(0, n) : d.substring(0, n) + "..."; + } + /** + * 将Markdown转换为HTML + * + * @param md - Markdown + */ + async mdToHtml(r3) { + const n = await this.mdUtil.renderHTML(r3); + return this.removeWidgetTag(n); + } + /** + * 将Markdown转换为纯文本 + * + * @param md - Markdown + */ + async mdToPlainText(r3) { + const n = await this.mdToHtml(r3); + return this.filterHtml(n); + } + /** + * 移除H1标签 + * + * @param html - html + */ + removeH1(r3) { + let n = r3; + const a = //g; + return n = n.replace(a, ""), n; + } + /** + * 移除Markdown里面的H1标签 + * + * JavaScript 正则表达式可以用来删除所有 Markdown 中的 h1 标签。下面是一个示例代码: + * + * const str = "# This is an H1\n## This is an H2\n### This is an H3"; + * + * const regex = /^# .*$/gm; + * const result = str.replace(regex, ''); + * + * console.log(result); + * 在这个例子中,我们使用正则表达式 /^# .*$/gm 来匹配所有的 h1 标签。 + * 在 JavaScript 中,^ 匹配行首,# 匹配 # 字符,.* 匹配任意字符,$ 匹配行尾,m 标记表示多行模式。 + */ + removeMdH1(r3) { + let n = r3; + const a = /^# .*$/gm; + return n = n.replace(a, ""), n; + } +}; +var Wo = class { + /** + * 检测是否是空对象 + * + * @param obj - 对象 + */ + isEmptyObject(r3) { + return r3 ? Object.getPrototypeOf(r3) === Object.prototype && Object.getOwnPropertyNames(r3).length === 0 && Object.getOwnPropertySymbols(r3).length === 0 : true; + } +}; +var Jo = class { + constructor() { + be(this, "dateUtil"); + be(this, "strUtil"); + be(this, "versionUtil"); + be(this, "htmlUtil"); + be(this, "markdownUtil"); + be(this, "jsonUtil"); + be(this, "objectUtil"); + this.dateUtil = new yo(), this.strUtil = new wo(), this.versionUtil = new ko(), this.htmlUtil = new Ko(), this.markdownUtil = new cs(), this.jsonUtil = new vo(), this.objectUtil = new Wo(); + } +}; +var Zo = Jo; + +// ../zhi-env/dist/index.js +var _ = Object.defineProperty; +var D = (i2, t, e2) => t in i2 ? _(i2, t, { enumerable: true, configurable: true, writable: true, value: e2 }) : i2[t] = e2; +var r = (i2, t, e2) => (D(i2, typeof t != "symbol" ? t + "" : t, e2), e2); +var E = class { +}; +r(E, "NODE_ENV_KEY", "NODE_ENV"), /** +* 开发环境 +*/ +r(E, "NODE_ENV_DEVELOPMENT", "development"), /** +* 生产环境 +*/ +r(E, "NODE_ENV_PRODUCTION", "production"), /** +* 测试环境 +*/ +r(E, "NODE_ENV_TEST", "test"), /** +* 是否处于调试模式 +*/ +r(E, "VITE_DEBUG_MODE_KEY", "VITE_DEBUG_MODE"); +var N = class { + /** + * 环境初始化 + * + * @param envMeta - 需要传入 {"BASE_URL":"/","MODE":"production","DEV":false,"PROD":true,"SSR":false} 。特别提醒:此参数是静态元数据,取决于最终使用的项目。因此仅仅在最终使用的地方显示传递此值,中间项目请保持参数传递 + * @see {@link https://vitejs.dev/guide/env-and-mode.html#production-replacement} + */ + constructor(t) { + r(this, "envMeta"); + this.envMeta = t; + } + /** + * 是否是开发阶段调试 + */ + isNodeDev() { + return this.getEnv(E.NODE_ENV_KEY) === E.NODE_ENV_DEVELOPMENT; + } + /** + * 是否是调试阶段 + */ + isDev() { + return this.isNodeDev() || this.getBooleanEnv(E.VITE_DEBUG_MODE_KEY); + } + /** + * 获取环境变量,key不存在返回undefined + * @param key - key + */ + getEnv(t) { + let e2; + try { + this.envMeta[t] && (e2 = this.envMeta[t]); + } catch { + } + return e2; + } + /** + * 获取String类型的环境变量,key不存在直接返回空值 + * @param key - key + */ + getStringEnv(t) { + return this.getEnv(t) ?? ""; + } + /** + * 获取Boolean类型的环境变量,key不存在返回false + * @param key - key + */ + getBooleanEnv(t) { + let e2 = false; + return this.getEnv(t) && (e2 = this.getStringEnv(t).toLowerCase() === "true"), e2; + } + /** + * 获取环境变量,如果未定义或者为空值,用指定的默认值代替 + * + * @param key - key + * @param defaultValue - 默认值 + * @since 0.1.0 + * @author terwer + */ + getEnvOrDefault(t, e2) { + const n = this.getStringEnv(t); + return n.trim().length == 0 ? e2 : n; + } +}; + +// src/lib/util/ZhiServerElectronUtil.ts +var ZhiServerElectronUtil = class extends yt { + static zhiEnv() { + if (!this.env) { + this.env = new N(import.meta.env); + } + return this.env; + } +}; +var ZhiServerElectronUtil_default = ZhiServerElectronUtil; + +// ../zhi-device/dist/index.js +var g = Object.defineProperty; +var P = (a, e2, t) => e2 in a ? g(a, e2, { enumerable: true, configurable: true, writable: true, value: t }) : a[e2] = t; +var r2 = (a, e2, t) => (P(a, typeof e2 != "symbol" ? e2 + "" : e2, t), t); +var u = class { + /** + * 检测是否运行在Chrome插件中 + */ + static isInChromeExtension() { + return u.isInBrowser ? window.location.href.indexOf("chrome-extension://") > -1 : false; + } +}; +var i = u; +r2(i, "isNode", typeof process < "u"), /** +* 是否在浏览器环境 +*/ +r2(i, "isInBrowser", typeof window < "u"), /** +* 浏览器路径分隔符 +*/ +r2(i, "BrowserSeperator", "/"), /** +* 是否是Electron环境 +*/ +r2(i, "isElectron", () => !u.isInBrowser || !window.navigator || !window.navigator.userAgent ? false : /Electron/.test(window.navigator.userAgent)), /** +* 是否有Node环境,目前包括 Electron 和 Node +*/ +r2(i, "hasNodeEnv", () => u.isElectron() || u.isNode), /** +* 获取url参数 +* +* @param sParam - 参数 +*/ +r2(i, "getQueryString", (e2) => { + if (!u.isInBrowser) + return ""; + const n = window.location.search.substring(1).split("&"); + for (let s = 0; s < n.length; s++) { + const c = n[s].split("="); + if (c[0] === e2) + return c[1]; + } + return ""; +}), /** +* 替换 URL 的参数 +* 思路: +* 1. 使用了 URLSearchParams 对象来解析和构建 URL 查询参数。 +* +* 2. 在处理包含 hash 片段的 URL 时使用了 split 函数将 URL 分成两部分:基本 URL 和 hash 片段。 +* +* 3. 然后,再次使用 split 函数将基本 URL 分成两部分:路径和查询参数。 +* +* 4. 将查询参数转换为 URLSearchParams 对象,然后设置指定的参数名和值。 +* +* 5. 最后,使用 toString 函数将查询参数转换为字符串,并将其与路径组合成新的基本 URL。如果 URL 包含 hash 片段,则将其添加到新的基本 URL 中。 +* +* @param url - 链接地址 +* @param paramName - 参数名 +* @param paramValue - 参数值 +*/ +r2(i, "replaceUrlParam", (e2, t, n) => { + n == null && (n = ""); + const s = new RegExp("\\b(" + t + "=).*?(&|#|$)"); + if (e2.search(s) >= 0) + return e2.replace(s, "$1" + n + "$2"); + const [c, d] = e2.split("#"), [y, b] = c.split("?"), l = new URLSearchParams(b); + l.set(t, n); + const m = l.toString(), f = y + (m ? "?" + m : ""); + return d ? f + "#" + d : f; +}), /** +* 设置url参数 +* +* @param urlstring - url +* @param key - key +* @param value - value +*/ +r2(i, "setUrlParameter", (e2, t, n) => { + if (e2.includes(t)) + return u.replaceUrlParam(e2, t, n); + const s = e2.split("#"); + let c = s[0]; + const d = s[1]; + return c.includes("?") ? c += `&${t}=${n}` : c += `?${t}=${n}`, d && (c += "#" + d), c; +}), /** +* 重新加载指定tab +* +* @param tabname - tabname +* @param t - 延迟时间 +*/ +r2(i, "reloadTabPage", (e2, t = 200) => { + setTimeout(function() { + if (u.isInBrowser) { + const n = window.location.href; + window.location.href = u.setUrlParameter(n, "tab", e2); + } + }, t); +}), /** +* 刷新当前tab页面 +*/ +r2(i, "reloadPage", () => { + setTimeout(function() { + u.isInBrowser && window.location.reload(); + }, 200); +}), /** +* 刷新当前tab页面 +* +* @param msg - 消息提示 +* @param cb - 回调 +*/ +r2(i, "reloadPageWithMessageCallback", (e2, t) => { + t && t(e2), setTimeout(function() { + u.isInBrowser && window.location.reload(); + }, 200); +}); +var o = /* @__PURE__ */ ((a) => (a.BasePathType_Appearance = "Appearance", a.BasePathType_Data = "Data", a.BasePathType_Themes = "Themes", a.BasePathType_ZhiTheme = "ZhiTheme", a.BasePathType_None = "None", a))(o || {}); +var h = class { + /** + * 检测是否运行在思源打开的浏览器中 + */ + static isInSiyuanBrowser() { + return i.isInBrowser ? typeof window.siyuan < "u" && typeof window.Lute < "u" : false; + } + /** + * 思源笔记 window 对象 + */ + static siyuanWindow() { + let e2; + return this.isInSiyuanWidget() ? e2 = parent.window : this.isInSiyuanNewWin() || this.isInSiyuanBrowser() || typeof window < "u" ? e2 = window : e2 = void 0, e2; + } + // ========================= + // require end + // ========================= + // ========================= + // import start + // ========================= + /** + * 引入json + * + * @param jsPath - js相对路径全路径 + * @param type - 类型 + */ + static async importJs(e2, t) { + let n = e2; + switch (t) { + case o.BasePathType_Appearance: + n = this.browserJoinPath(this.siyuanAppearanceRelativePath(), e2); + break; + case o.BasePathType_Data: + n = this.browserJoinPath(this.siyuanDataRelativePath(), e2); + break; + case o.BasePathType_Themes: + n = this.browserJoinPath(this.siyuanThemeRelativePath(), e2); + break; + case o.BasePathType_ZhiTheme: + n = this.browserJoinPath(this.zhiThemeRelativePath(), e2); + break; + default: + throw new Error("type must be provided"); + } + const { default: s } = await import( + /* @vite-ignore */ + n + ); + return s; + } + /** + * 引入json + * + * @param jsonPath - json相对路径全路径 + * @param type - 类型 + */ + // public static async importJson(jsonPath: string, type: BasePathTypeEnum) { + // let fullJsonPath = jsonPath + // switch (type) { + // case BasePathTypeEnum.BasePathType_Appearance: + // fullJsonPath = this.browserJoinPath(this.siyuanAppearanceRelativePath(), jsonPath) + // break + // case BasePathTypeEnum.BasePathType_Data: + // fullJsonPath = this.browserJoinPath(this.siyuanDataRelativePath(), jsonPath) + // break + // case BasePathTypeEnum.BasePathType_Themes: + // fullJsonPath = this.browserJoinPath(this.siyuanThemeRelativePath(), jsonPath) + // break + // case BasePathTypeEnum.BasePathType_ZhiTheme: + // fullJsonPath = this.browserJoinPath(this.zhiThemeRelativePath(), jsonPath) + // break + // default: + // throw new Error("type must be provided") + // } + // + // const { default: data } = await import(/* @vite-ignore */ fullJsonPath, { assert: { type: "json" } }) + // return data + // } + /** + * 引入 json - 以 data 为基本路径 + * + * @param jsonPath - 相对于 data 的相对路径 + */ + // public static async importDataJson(jsonPath: string) { + // return await this.importJson(jsonPath, BasePathTypeEnum.BasePathType_Data) + // } + /** + * 引入 json - 以 appearance 为基本路径 + * + * @param jsonPath - 相对于 appearance 的相对路径 + */ + // public static async importAppearanceJson(jsonPath: string) { + // return await this.importJson(jsonPath, BasePathTypeEnum.BasePathType_Appearance) + // } + /** + * 引入 json - 以 themes 为基本路径 + * + * @param jsonPath - 相对于 themes 的相对路径 + */ + // public static async importThemesJson(jsonPath: string) { + // return await this.importJson(jsonPath, BasePathTypeEnum.BasePathType_Themes) + // } + /** + * 引入 zhi 主题的 json - 以 zhi 主题 的根路径为基本路径 + * + * @param jsonPath - 相对于 zhi 主题根路径的相对路径 + */ + // public static async importZhiThemeJson(jsonPath: string) { + // return await this.importJson(jsonPath, BasePathTypeEnum.BasePathType_ZhiTheme) + // } + /** + * 引入 zhi 主题的 js - 以 zhi 主题 的根路径为基本路径 + * + * @param jsPath - 相对于 zhi 主题根路径的相对路径 + */ + static async importZhiThemeJs(e2) { + return await this.importJs(e2, o.BasePathType_ZhiTheme); + } + // ========================= + // import start + // ========================= + /** + * 路径拼接 + * + * @param paths - 路径数组 + */ + static joinPath(...e2) { + if (i.hasNodeEnv()) { + const t = this.requireLib("path"); + if (t) + return t.join(...e2); + } + return this.browserJoinPath(...e2); + } + static browserJoinPath(...e2) { + return e2.join(i.BrowserSeperator); + } + /** + * 思源笔记 conf 目录 + */ + static siyuanConfPath() { + const e2 = this.siyuanWindow(); + if (!e2) + throw new Error("Not in siyuan env"); + return e2.siyuan.config.system.confDir; + } + /** + * 思源笔记 data 目录 + */ + static siyuanDataPath() { + const e2 = this.siyuanWindow(); + if (!e2) + throw new Error("Not in siyuan env"); + return e2.siyuan.config.system.dataDir; + } + /** + * 思源笔记 data 目录-相对路径 + */ + static siyuanDataRelativePath() { + if (!this.siyuanWindow()) + throw new Error("Not in siyuan env"); + return ""; + } + /** + * 思源笔记 appearance 目录 + */ + static siyuanAppearancePath() { + return this.joinPath(this.siyuanConfPath(), "appearance"); + } + /** + * 思源笔记 appearance 目录-相对路径 + */ + static siyuanAppearanceRelativePath() { + if (!this.siyuanWindow()) + throw new Error("Not in siyuan env"); + return this.browserJoinPath("", "appearance"); + } + /** + * 思源笔记 themes 目录-绝对路径 + * + * 注意: 如果是非 electron 和 Node 环境,这里返回的是浏览器的路径,不是物理路径 + * 如果使用物理路径,请调用 siyuanAppearancePath 或者 siyuanDataPath + * + * @author terwer + * @since 0.1.0 + */ + static siyuanThemePath() { + if (i.hasNodeEnv()) + return this.joinPath(this.siyuanAppearancePath(), "themes"); + { + const e2 = this.siyuanWindow(); + if (!e2) + throw new Error("Not in siyuan env"); + return this.joinPath(e2.location.origin, "appearance", "themes"); + } + } + /** + * 思源笔记 themes 目录-相对路径 + */ + static siyuanThemeRelativePath() { + if (!this.siyuanWindow()) + throw new Error("Not in siyuan env"); + return this.browserJoinPath("", "appearance", "themes"); + } + /** + * zhi 主题目录 - 绝对路径 + */ + static zhiThemePath() { + return this.joinPath(this.siyuanThemePath(), "zhi"); + } + /** + * zhi 主题目录 - 相对路径 + */ + static zhiThemeRelativePath() { + return this.browserJoinPath(this.siyuanThemeRelativePath(), "zhi"); + } +}; +var w = h; +r2(w, "isInSiyuanWidget", () => i.isInBrowser ? window.frameElement != null && window.frameElement.parentElement != null && window.frameElement.parentElement.parentElement != null && window.frameElement.parentElement.parentElement.getAttribute("data-node-id") !== "" : false), /** +* 思源笔记新窗口 +* +* @deprecated window.terwer 判断方式已废弃,建议以后打开新窗口注入 window.siyuanNewWin ,这样语义会更容易理解 +* @author terwer +* @version 0.1.0 +* @since 0.0.1 +*/ +r2(w, "isInSiyuanNewWin", () => !i.isInBrowser || !i.isElectron() ? false : typeof window.terwer < "u" || typeof window.siyuanNewWin < "u"), // ========================= +// require start +// ========================= +/** + * 引入依赖 + * + * @param libpath - 依赖全路径 + * @param abs - 可选,是否使用觉得路径,默认是 true , 启用之后 type参数无效 + * @param type - 可选,以谁的基本路径为准 + */ +r2(w, "requireLib", (e2, t = true, n = o.BasePathType_None) => { + if (!i.hasNodeEnv()) + throw new Error("require ony works on node env"); + let s = e2; + if (!t) + switch (n) { + case o.BasePathType_Appearance: + s = h.joinPath(h.siyuanAppearancePath(), e2); + break; + case o.BasePathType_Data: + s = h.joinPath(h.siyuanDataPath(), e2); + break; + case o.BasePathType_Themes: + s = h.joinPath(h.siyuanAppearancePath(), "themes", e2); + break; + case o.BasePathType_ZhiTheme: + s = h.joinPath(h.siyuanAppearancePath(), "themes", "zhi", e2); + break; + default: + throw new Error("type must be provided when not use absolute path"); + } + const c = h.siyuanWindow(); + if (!c) + return __require(s); + if (typeof c.require < "u") + return c.require(s); +}), /** +* 引入依赖,以 data 的基本路径为准 +* +* @param libpath - 相对于 appearance 的相对路径 +*/ +r2(w, "requireAppearanceLib", (e2) => h.requireLib(e2, false, o.BasePathType_Appearance)), /** +* 引入依赖,以 data 的基本路径为准 +* +* @param libpath - 相对于 data 的相对路径 +*/ +r2(w, "requireDataLib", (e2) => h.requireLib(e2, false, o.BasePathType_Data)), /** +* 引入依赖,以 theme 的基本路径为准 +* +* @param libpath - 相对于 theme 的相对路径 +*/ +r2(w, "requireThemesLib", (e2) => h.requireLib(e2, false, o.BasePathType_Themes)), /** +* 引入依赖,以 ZhiTheme 的基本路径为准 +* +* @param libpath - 相对于 ZhiTheme 的相对路径 +*/ +r2(w, "requireZhiThemeLib", (e2) => h.requireLib(e2, false, o.BasePathType_ZhiTheme)); + +// src/lib/browser-window/WindowManager.ts +var WindowManager = class { + logger; + common; + constructor() { + this.logger = ZhiServerElectronUtil_default.zhiLog("window-manager"); + this.common = ZhiServerElectronUtil_default.zhiCommon(); + } + /** + * 打开新窗口 + * + * 示例: + * + * ``` + * ## development + * windowManager.openBrowserWindow("https://www.baidu.com", undefined, undefined, true, false) + * windowManager.openBrowserWindow("https://www.baidu.com", { "key1": "value1", "key2": "value2" }, undefined, true, false) + * + * ## production + * windowManager.openBrowserWindow("https://www.baidu.com") + * ``` + * + * @param url - url + * @param params - 参数 + * @param win - 父窗口 + * @param isDev - 是否打开开发者工具 + * @param modal - 是否模态 + */ + openBrowserWindow(url, params, win, isDev = false, modal = false) { + try { + if (this.common.strUtil.isEmptyString(url)) { + this.logger.error("Url cannot be empty"); + return; + } + if (!i.isElectron()) { + this.logger.info("BrowserWindow can ony be available in siyuan Electron environment"); + return; + } + if (params) { + Object.keys(params).forEach((key) => { + const value = params[key]; + url = i.setUrlParameter(url, key, value); + }); + } + this.logger.info(this.common.strUtil.f("Opening a new BrowserWindow from url => {0}", url)); + const mainWin = win ?? w.siyuanWindow(); + const { app, BrowserWindow, getCurrentWindow } = mainWin.require("@electron/remote"); + const remote = mainWin.require("@electron/remote").require("@electron/remote/main"); + const mainWindow = getCurrentWindow(); + const newWindow = new BrowserWindow({ + parent: mainWindow, + width: 900, + height: 750, + resizable: true, + modal, + icon: w.browserJoinPath( + w.siyuanWindow().siyuan.config.system.appDir, + "stage", + "icon-large.png" + ), + titleBarOverlay: { + color: "#cccccca5", + symbolColor: "black" + }, + webPreferences: { + nativeWindowOpen: true, + nodeIntegration: true, + webviewTag: true, + webSecurity: false, + contextIsolation: false + } + }); + newWindow.webContents.userAgent = `SiYuan/${app.getVersion()} https://b3log.org/siyuan Electron`; + remote.enable(newWindow.webContents); + if (isDev) { + newWindow.webContents.openDevTools(); + } + newWindow.loadURL(url); + } catch (e2) { + this.logger.error("Open browser window failed", e2); + } + } +}; +var WindowManager_default = WindowManager; + +// src/lib/browser-window/index.ts +var ZhiBrowserWindow = class { + logger; + common; + windowManager; + constructor() { + this.logger = ZhiServerElectronUtil_default.zhiLog("zhi-browser-window"); + this.common = ZhiServerElectronUtil_default.zhiCommon(); + this.windowManager = new WindowManager_default(); + } + /** + * 挂载 BrowserWindow + * + * @author terwer + * @since 1.0.0 + */ + initBrowserWindow() { + w.siyuanWindow().zhiWindow = this.windowManager; + this.logger.info("zhiWindow mounted"); + return "ok"; + } +}; +var browser_window_default = ZhiBrowserWindow; + +// src/index.ts +var init = () => { + const zhiBrowserWindow = new browser_window_default(); + zhiBrowserWindow.initBrowserWindow(); + return "ok"; +}; +var src_default = init; +export { + src_default as default +}; +/** @license URI.js v4.4.1 (c) 2011 Gary Court. License: http://github.com/garycourt/uri-js */ +//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vemhpLWNvbW1vbi9kaXN0L2luZGV4LmpzIiwgIi4uL3poaS1lbnYvZGlzdC9pbmRleC5qcyIsICJzcmMvbGliL3V0aWwvWmhpU2VydmVyRWxlY3Ryb25VdGlsLnRzIiwgIi4uL3poaS1kZXZpY2UvZGlzdC9pbmRleC5qcyIsICJzcmMvbGliL2Jyb3dzZXItd2luZG93L1dpbmRvd01hbmFnZXIudHMiLCAic3JjL2xpYi9icm93c2VyLXdpbmRvdy9pbmRleC50cyIsICJzcmMvaW5kZXgudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbInZhciAkcyA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eTtcbnZhciBFcyA9IChlLCByLCBuKSA9PiByIGluIGUgPyAkcyhlLCByLCB7IGVudW1lcmFibGU6ICEwLCBjb25maWd1cmFibGU6ICEwLCB3cml0YWJsZTogITAsIHZhbHVlOiBuIH0pIDogZVtyXSA9IG47XG52YXIgYmUgPSAoZSwgciwgbikgPT4gKEVzKGUsIHR5cGVvZiByICE9IFwic3ltYm9sXCIgPyByICsgXCJcIiA6IHIsIG4pLCBuKTtcbnZhciBFbiA9IHR5cGVvZiBnbG9iYWxUaGlzIDwgXCJ1XCIgPyBnbG9iYWxUaGlzIDogdHlwZW9mIHdpbmRvdyA8IFwidVwiID8gd2luZG93IDogdHlwZW9mIGdsb2JhbCA8IFwidVwiID8gZ2xvYmFsIDogdHlwZW9mIHNlbGYgPCBcInVcIiA/IHNlbGYgOiB7fTtcbmZ1bmN0aW9uIGtzKGUpIHtcbiAgcmV0dXJuIGUgJiYgZS5fX2VzTW9kdWxlICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLCBcImRlZmF1bHRcIikgPyBlLmRlZmF1bHQgOiBlO1xufVxudmFyIHd0ID0ge30sIFBzID0ge1xuICBnZXQgZXhwb3J0cygpIHtcbiAgICByZXR1cm4gd3Q7XG4gIH0sXG4gIHNldCBleHBvcnRzKGUpIHtcbiAgICB3dCA9IGU7XG4gIH1cbn0sIGtuID0ge30sIEhlID0ge30sIEFyID0ge30sIHJ0ID0ge30sIHNlID0ge30sIGV0ID0ge307XG4oZnVuY3Rpb24oZSkge1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6ICEwIH0pLCBlLnJlZ2V4cENvZGUgPSBlLmdldEVzbUV4cG9ydE5hbWUgPSBlLmdldFByb3BlcnR5ID0gZS5zYWZlU3RyaW5naWZ5ID0gZS5zdHJpbmdpZnkgPSBlLnN0ckNvbmNhdCA9IGUuYWRkQ29kZUFyZyA9IGUuc3RyID0gZS5fID0gZS5uaWwgPSBlLl9Db2RlID0gZS5OYW1lID0gZS5JREVOVElGSUVSID0gZS5fQ29kZU9yTmFtZSA9IHZvaWQgMDtcbiAgY2xhc3MgciB7XG4gIH1cbiAgZS5fQ29kZU9yTmFtZSA9IHIsIGUuSURFTlRJRklFUiA9IC9eW2EteiRfXVthLXokXzAtOV0qJC9pO1xuICBjbGFzcyBuIGV4dGVuZHMgciB7XG4gICAgY29uc3RydWN0b3IoTikge1xuICAgICAgaWYgKHN1cGVyKCksICFlLklERU5USUZJRVIudGVzdChOKSlcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ29kZUdlbjogbmFtZSBtdXN0IGJlIGEgdmFsaWQgaWRlbnRpZmllclwiKTtcbiAgICAgIHRoaXMuc3RyID0gTjtcbiAgICB9XG4gICAgdG9TdHJpbmcoKSB7XG4gICAgICByZXR1cm4gdGhpcy5zdHI7XG4gICAgfVxuICAgIGVtcHR5U3RyKCkge1xuICAgICAgcmV0dXJuICExO1xuICAgIH1cbiAgICBnZXQgbmFtZXMoKSB7XG4gICAgICByZXR1cm4geyBbdGhpcy5zdHJdOiAxIH07XG4gICAgfVxuICB9XG4gIGUuTmFtZSA9IG47XG4gIGNsYXNzIGEgZXh0ZW5kcyByIHtcbiAgICBjb25zdHJ1Y3RvcihOKSB7XG4gICAgICBzdXBlcigpLCB0aGlzLl9pdGVtcyA9IHR5cGVvZiBOID09IFwic3RyaW5nXCIgPyBbTl0gOiBOO1xuICAgIH1cbiAgICB0b1N0cmluZygpIHtcbiAgICAgIHJldHVybiB0aGlzLnN0cjtcbiAgICB9XG4gICAgZW1wdHlTdHIoKSB7XG4gICAgICBpZiAodGhpcy5faXRlbXMubGVuZ3RoID4gMSlcbiAgICAgICAgcmV0dXJuICExO1xuICAgICAgY29uc3QgTiA9IHRoaXMuX2l0ZW1zWzBdO1xuICAgICAgcmV0dXJuIE4gPT09IFwiXCIgfHwgTiA9PT0gJ1wiXCInO1xuICAgIH1cbiAgICBnZXQgc3RyKCkge1xuICAgICAgdmFyIE47XG4gICAgICByZXR1cm4gKE4gPSB0aGlzLl9zdHIpICE9PSBudWxsICYmIE4gIT09IHZvaWQgMCA/IE4gOiB0aGlzLl9zdHIgPSB0aGlzLl9pdGVtcy5yZWR1Y2UoKEQsIHQpID0+IGAke0R9JHt0fWAsIFwiXCIpO1xuICAgIH1cbiAgICBnZXQgbmFtZXMoKSB7XG4gICAgICB2YXIgTjtcbiAgICAgIHJldHVybiAoTiA9IHRoaXMuX25hbWVzKSAhPT0gbnVsbCAmJiBOICE9PSB2b2lkIDAgPyBOIDogdGhpcy5fbmFtZXMgPSB0aGlzLl9pdGVtcy5yZWR1Y2UoKEQsIHQpID0+ICh0IGluc3RhbmNlb2YgbiAmJiAoRFt0LnN0cl0gPSAoRFt0LnN0cl0gfHwgMCkgKyAxKSwgRCksIHt9KTtcbiAgICB9XG4gIH1cbiAgZS5fQ29kZSA9IGEsIGUubmlsID0gbmV3IGEoXCJcIik7XG4gIGZ1bmN0aW9uIGQoJCwgLi4uTikge1xuICAgIGNvbnN0IEQgPSBbJFswXV07XG4gICAgbGV0IHQgPSAwO1xuICAgIGZvciAoOyB0IDwgTi5sZW5ndGg7IClcbiAgICAgIHkoRCwgTlt0XSksIEQucHVzaCgkWysrdF0pO1xuICAgIHJldHVybiBuZXcgYShEKTtcbiAgfVxuICBlLl8gPSBkO1xuICBjb25zdCBvID0gbmV3IGEoXCIrXCIpO1xuICBmdW5jdGlvbiBwKCQsIC4uLk4pIHtcbiAgICBjb25zdCBEID0gW0woJFswXSldO1xuICAgIGxldCB0ID0gMDtcbiAgICBmb3IgKDsgdCA8IE4ubGVuZ3RoOyApXG4gICAgICBELnB1c2gobyksIHkoRCwgTlt0XSksIEQucHVzaChvLCBMKCRbKyt0XSkpO1xuICAgIHJldHVybiBiKEQpLCBuZXcgYShEKTtcbiAgfVxuICBlLnN0ciA9IHA7XG4gIGZ1bmN0aW9uIHkoJCwgTikge1xuICAgIE4gaW5zdGFuY2VvZiBhID8gJC5wdXNoKC4uLk4uX2l0ZW1zKSA6IE4gaW5zdGFuY2VvZiBuID8gJC5wdXNoKE4pIDogJC5wdXNoKFMoTikpO1xuICB9XG4gIGUuYWRkQ29kZUFyZyA9IHk7XG4gIGZ1bmN0aW9uIGIoJCkge1xuICAgIGxldCBOID0gMTtcbiAgICBmb3IgKDsgTiA8ICQubGVuZ3RoIC0gMTsgKSB7XG4gICAgICBpZiAoJFtOXSA9PT0gbykge1xuICAgICAgICBjb25zdCBEID0gdigkW04gLSAxXSwgJFtOICsgMV0pO1xuICAgICAgICBpZiAoRCAhPT0gdm9pZCAwKSB7XG4gICAgICAgICAgJC5zcGxpY2UoTiAtIDEsIDMsIEQpO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgICRbTisrXSA9IFwiK1wiO1xuICAgICAgfVxuICAgICAgTisrO1xuICAgIH1cbiAgfVxuICBmdW5jdGlvbiB2KCQsIE4pIHtcbiAgICBpZiAoTiA9PT0gJ1wiXCInKVxuICAgICAgcmV0dXJuICQ7XG4gICAgaWYgKCQgPT09ICdcIlwiJylcbiAgICAgIHJldHVybiBOO1xuICAgIGlmICh0eXBlb2YgJCA9PSBcInN0cmluZ1wiKVxuICAgICAgcmV0dXJuIE4gaW5zdGFuY2VvZiBuIHx8ICRbJC5sZW5ndGggLSAxXSAhPT0gJ1wiJyA/IHZvaWQgMCA6IHR5cGVvZiBOICE9IFwic3RyaW5nXCIgPyBgJHskLnNsaWNlKDAsIC0xKX0ke059XCJgIDogTlswXSA9PT0gJ1wiJyA/ICQuc2xpY2UoMCwgLTEpICsgTi5zbGljZSgxKSA6IHZvaWQgMDtcbiAgICBpZiAodHlwZW9mIE4gPT0gXCJzdHJpbmdcIiAmJiBOWzBdID09PSAnXCInICYmICEoJCBpbnN0YW5jZW9mIG4pKVxuICAgICAgcmV0dXJuIGBcIiR7JH0ke04uc2xpY2UoMSl9YDtcbiAgfVxuICBmdW5jdGlvbiBnKCQsIE4pIHtcbiAgICByZXR1cm4gTi5lbXB0eVN0cigpID8gJCA6ICQuZW1wdHlTdHIoKSA/IE4gOiBwYCR7JH0ke059YDtcbiAgfVxuICBlLnN0ckNvbmNhdCA9IGc7XG4gIGZ1bmN0aW9uIFMoJCkge1xuICAgIHJldHVybiB0eXBlb2YgJCA9PSBcIm51bWJlclwiIHx8IHR5cGVvZiAkID09IFwiYm9vbGVhblwiIHx8ICQgPT09IG51bGwgPyAkIDogTChBcnJheS5pc0FycmF5KCQpID8gJC5qb2luKFwiLFwiKSA6ICQpO1xuICB9XG4gIGZ1bmN0aW9uIHooJCkge1xuICAgIHJldHVybiBuZXcgYShMKCQpKTtcbiAgfVxuICBlLnN0cmluZ2lmeSA9IHo7XG4gIGZ1bmN0aW9uIEwoJCkge1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSgkKS5yZXBsYWNlKC9cXHUyMDI4L2csIFwiXFxcXHUyMDI4XCIpLnJlcGxhY2UoL1xcdTIwMjkvZywgXCJcXFxcdTIwMjlcIik7XG4gIH1cbiAgZS5zYWZlU3RyaW5naWZ5ID0gTDtcbiAgZnVuY3Rpb24gUigkKSB7XG4gICAgcmV0dXJuIHR5cGVvZiAkID09IFwic3RyaW5nXCIgJiYgZS5JREVOVElGSUVSLnRlc3QoJCkgPyBuZXcgYShgLiR7JH1gKSA6IGRgWyR7JH1dYDtcbiAgfVxuICBlLmdldFByb3BlcnR5ID0gUjtcbiAgZnVuY3Rpb24gaigkKSB7XG4gICAgaWYgKHR5cGVvZiAkID09IFwic3RyaW5nXCIgJiYgZS5JREVOVElGSUVSLnRlc3QoJCkpXG4gICAgICByZXR1cm4gbmV3IGEoYCR7JH1gKTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYENvZGVHZW46IGludmFsaWQgZXhwb3J0IG5hbWU6ICR7JH0sIHVzZSBleHBsaWNpdCAkaWQgbmFtZSBtYXBwaW5nYCk7XG4gIH1cbiAgZS5nZXRFc21FeHBvcnROYW1lID0gajtcbiAgZnVuY3Rpb24gVCgkKSB7XG4gICAgcmV0dXJuIG5ldyBhKCQudG9TdHJpbmcoKSk7XG4gIH1cbiAgZS5yZWdleHBDb2RlID0gVDtcbn0pKGV0KTtcbnZhciBCdCA9IHt9O1xuKGZ1bmN0aW9uKGUpIHtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiAhMCB9KSwgZS5WYWx1ZVNjb3BlID0gZS5WYWx1ZVNjb3BlTmFtZSA9IGUuU2NvcGUgPSBlLnZhcktpbmRzID0gZS5Vc2VkVmFsdWVTdGF0ZSA9IHZvaWQgMDtcbiAgY29uc3QgciA9IGV0O1xuICBjbGFzcyBuIGV4dGVuZHMgRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKHYpIHtcbiAgICAgIHN1cGVyKGBDb2RlR2VuOiBcImNvZGVcIiBmb3IgJHt2fSBub3QgZGVmaW5lZGApLCB0aGlzLnZhbHVlID0gdi52YWx1ZTtcbiAgICB9XG4gIH1cbiAgdmFyIGE7XG4gIChmdW5jdGlvbihiKSB7XG4gICAgYltiLlN0YXJ0ZWQgPSAwXSA9IFwiU3RhcnRlZFwiLCBiW2IuQ29tcGxldGVkID0gMV0gPSBcIkNvbXBsZXRlZFwiO1xuICB9KShhID0gZS5Vc2VkVmFsdWVTdGF0ZSB8fCAoZS5Vc2VkVmFsdWVTdGF0ZSA9IHt9KSksIGUudmFyS2luZHMgPSB7XG4gICAgY29uc3Q6IG5ldyByLk5hbWUoXCJjb25zdFwiKSxcbiAgICBsZXQ6IG5ldyByLk5hbWUoXCJsZXRcIiksXG4gICAgdmFyOiBuZXcgci5OYW1lKFwidmFyXCIpXG4gIH07XG4gIGNsYXNzIGQge1xuICAgIGNvbnN0cnVjdG9yKHsgcHJlZml4ZXM6IHYsIHBhcmVudDogZyB9ID0ge30pIHtcbiAgICAgIHRoaXMuX25hbWVzID0ge30sIHRoaXMuX3ByZWZpeGVzID0gdiwgdGhpcy5fcGFyZW50ID0gZztcbiAgICB9XG4gICAgdG9OYW1lKHYpIHtcbiAgICAgIHJldHVybiB2IGluc3RhbmNlb2Ygci5OYW1lID8gdiA6IHRoaXMubmFtZSh2KTtcbiAgICB9XG4gICAgbmFtZSh2KSB7XG4gICAgICByZXR1cm4gbmV3IHIuTmFtZSh0aGlzLl9uZXdOYW1lKHYpKTtcbiAgICB9XG4gICAgX25ld05hbWUodikge1xuICAgICAgY29uc3QgZyA9IHRoaXMuX25hbWVzW3ZdIHx8IHRoaXMuX25hbWVHcm91cCh2KTtcbiAgICAgIHJldHVybiBgJHt2fSR7Zy5pbmRleCsrfWA7XG4gICAgfVxuICAgIF9uYW1lR3JvdXAodikge1xuICAgICAgdmFyIGcsIFM7XG4gICAgICBpZiAoISgoUyA9IChnID0gdGhpcy5fcGFyZW50KSA9PT0gbnVsbCB8fCBnID09PSB2b2lkIDAgPyB2b2lkIDAgOiBnLl9wcmVmaXhlcykgPT09IG51bGwgfHwgUyA9PT0gdm9pZCAwKSAmJiBTLmhhcyh2KSB8fCB0aGlzLl9wcmVmaXhlcyAmJiAhdGhpcy5fcHJlZml4ZXMuaGFzKHYpKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENvZGVHZW46IHByZWZpeCBcIiR7dn1cIiBpcyBub3QgYWxsb3dlZCBpbiB0aGlzIHNjb3BlYCk7XG4gICAgICByZXR1cm4gdGhpcy5fbmFtZXNbdl0gPSB7IHByZWZpeDogdiwgaW5kZXg6IDAgfTtcbiAgICB9XG4gIH1cbiAgZS5TY29wZSA9IGQ7XG4gIGNsYXNzIG8gZXh0ZW5kcyByLk5hbWUge1xuICAgIGNvbnN0cnVjdG9yKHYsIGcpIHtcbiAgICAgIHN1cGVyKGcpLCB0aGlzLnByZWZpeCA9IHY7XG4gICAgfVxuICAgIHNldFZhbHVlKHYsIHsgcHJvcGVydHk6IGcsIGl0ZW1JbmRleDogUyB9KSB7XG4gICAgICB0aGlzLnZhbHVlID0gdiwgdGhpcy5zY29wZVBhdGggPSAoMCwgci5fKWAuJHtuZXcgci5OYW1lKGcpfVske1N9XWA7XG4gICAgfVxuICB9XG4gIGUuVmFsdWVTY29wZU5hbWUgPSBvO1xuICBjb25zdCBwID0gKDAsIHIuXylgXFxuYDtcbiAgY2xhc3MgeSBleHRlbmRzIGQge1xuICAgIGNvbnN0cnVjdG9yKHYpIHtcbiAgICAgIHN1cGVyKHYpLCB0aGlzLl92YWx1ZXMgPSB7fSwgdGhpcy5fc2NvcGUgPSB2LnNjb3BlLCB0aGlzLm9wdHMgPSB7IC4uLnYsIF9uOiB2LmxpbmVzID8gcCA6IHIubmlsIH07XG4gICAgfVxuICAgIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLl9zY29wZTtcbiAgICB9XG4gICAgbmFtZSh2KSB7XG4gICAgICByZXR1cm4gbmV3IG8odiwgdGhpcy5fbmV3TmFtZSh2KSk7XG4gICAgfVxuICAgIHZhbHVlKHYsIGcpIHtcbiAgICAgIHZhciBTO1xuICAgICAgaWYgKGcucmVmID09PSB2b2lkIDApXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNvZGVHZW46IHJlZiBtdXN0IGJlIHBhc3NlZCBpbiB2YWx1ZVwiKTtcbiAgICAgIGNvbnN0IHogPSB0aGlzLnRvTmFtZSh2KSwgeyBwcmVmaXg6IEwgfSA9IHosIFIgPSAoUyA9IGcua2V5KSAhPT0gbnVsbCAmJiBTICE9PSB2b2lkIDAgPyBTIDogZy5yZWY7XG4gICAgICBsZXQgaiA9IHRoaXMuX3ZhbHVlc1tMXTtcbiAgICAgIGlmIChqKSB7XG4gICAgICAgIGNvbnN0IE4gPSBqLmdldChSKTtcbiAgICAgICAgaWYgKE4pXG4gICAgICAgICAgcmV0dXJuIE47XG4gICAgICB9IGVsc2VcbiAgICAgICAgaiA9IHRoaXMuX3ZhbHVlc1tMXSA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7XG4gICAgICBqLnNldChSLCB6KTtcbiAgICAgIGNvbnN0IFQgPSB0aGlzLl9zY29wZVtMXSB8fCAodGhpcy5fc2NvcGVbTF0gPSBbXSksICQgPSBULmxlbmd0aDtcbiAgICAgIHJldHVybiBUWyRdID0gZy5yZWYsIHouc2V0VmFsdWUoZywgeyBwcm9wZXJ0eTogTCwgaXRlbUluZGV4OiAkIH0pLCB6O1xuICAgIH1cbiAgICBnZXRWYWx1ZSh2LCBnKSB7XG4gICAgICBjb25zdCBTID0gdGhpcy5fdmFsdWVzW3ZdO1xuICAgICAgaWYgKFMpXG4gICAgICAgIHJldHVybiBTLmdldChnKTtcbiAgICB9XG4gICAgc2NvcGVSZWZzKHYsIGcgPSB0aGlzLl92YWx1ZXMpIHtcbiAgICAgIHJldHVybiB0aGlzLl9yZWR1Y2VWYWx1ZXMoZywgKFMpID0+IHtcbiAgICAgICAgaWYgKFMuc2NvcGVQYXRoID09PSB2b2lkIDApXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb2RlR2VuOiBuYW1lIFwiJHtTfVwiIGhhcyBubyB2YWx1ZWApO1xuICAgICAgICByZXR1cm4gKDAsIHIuXylgJHt2fSR7Uy5zY29wZVBhdGh9YDtcbiAgICAgIH0pO1xuICAgIH1cbiAgICBzY29wZUNvZGUodiA9IHRoaXMuX3ZhbHVlcywgZywgUykge1xuICAgICAgcmV0dXJuIHRoaXMuX3JlZHVjZVZhbHVlcyh2LCAoeikgPT4ge1xuICAgICAgICBpZiAoei52YWx1ZSA9PT0gdm9pZCAwKVxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ29kZUdlbjogbmFtZSBcIiR7en1cIiBoYXMgbm8gdmFsdWVgKTtcbiAgICAgICAgcmV0dXJuIHoudmFsdWUuY29kZTtcbiAgICAgIH0sIGcsIFMpO1xuICAgIH1cbiAgICBfcmVkdWNlVmFsdWVzKHYsIGcsIFMgPSB7fSwgeikge1xuICAgICAgbGV0IEwgPSByLm5pbDtcbiAgICAgIGZvciAoY29uc3QgUiBpbiB2KSB7XG4gICAgICAgIGNvbnN0IGogPSB2W1JdO1xuICAgICAgICBpZiAoIWopXG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIGNvbnN0IFQgPSBTW1JdID0gU1tSXSB8fCAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpO1xuICAgICAgICBqLmZvckVhY2goKCQpID0+IHtcbiAgICAgICAgICBpZiAoVC5oYXMoJCkpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgVC5zZXQoJCwgYS5TdGFydGVkKTtcbiAgICAgICAgICBsZXQgTiA9IGcoJCk7XG4gICAgICAgICAgaWYgKE4pIHtcbiAgICAgICAgICAgIGNvbnN0IEQgPSB0aGlzLm9wdHMuZXM1ID8gZS52YXJLaW5kcy52YXIgOiBlLnZhcktpbmRzLmNvbnN0O1xuICAgICAgICAgICAgTCA9ICgwLCByLl8pYCR7TH0ke0R9ICR7JH0gPSAke059OyR7dGhpcy5vcHRzLl9ufWA7XG4gICAgICAgICAgfSBlbHNlIGlmIChOID0geiA9PSBudWxsID8gdm9pZCAwIDogeigkKSlcbiAgICAgICAgICAgIEwgPSAoMCwgci5fKWAke0x9JHtOfSR7dGhpcy5vcHRzLl9ufWA7XG4gICAgICAgICAgZWxzZVxuICAgICAgICAgICAgdGhyb3cgbmV3IG4oJCk7XG4gICAgICAgICAgVC5zZXQoJCwgYS5Db21wbGV0ZWQpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBMO1xuICAgIH1cbiAgfVxuICBlLlZhbHVlU2NvcGUgPSB5O1xufSkoQnQpO1xuKGZ1bmN0aW9uKGUpIHtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiAhMCB9KSwgZS5vciA9IGUuYW5kID0gZS5ub3QgPSBlLkNvZGVHZW4gPSBlLm9wZXJhdG9ycyA9IGUudmFyS2luZHMgPSBlLlZhbHVlU2NvcGVOYW1lID0gZS5WYWx1ZVNjb3BlID0gZS5TY29wZSA9IGUuTmFtZSA9IGUucmVnZXhwQ29kZSA9IGUuc3RyaW5naWZ5ID0gZS5nZXRQcm9wZXJ0eSA9IGUubmlsID0gZS5zdHJDb25jYXQgPSBlLnN0ciA9IGUuXyA9IHZvaWQgMDtcbiAgY29uc3QgciA9IGV0LCBuID0gQnQ7XG4gIHZhciBhID0gZXQ7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCBcIl9cIiwgeyBlbnVtZXJhYmxlOiAhMCwgZ2V0OiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gYS5fO1xuICB9IH0pLCBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwgXCJzdHJcIiwgeyBlbnVtZXJhYmxlOiAhMCwgZ2V0OiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gYS5zdHI7XG4gIH0gfSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCBcInN0ckNvbmNhdFwiLCB7IGVudW1lcmFibGU6ICEwLCBnZXQ6IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBhLnN0ckNvbmNhdDtcbiAgfSB9KSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIFwibmlsXCIsIHsgZW51bWVyYWJsZTogITAsIGdldDogZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIGEubmlsO1xuICB9IH0pLCBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwgXCJnZXRQcm9wZXJ0eVwiLCB7IGVudW1lcmFibGU6ICEwLCBnZXQ6IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBhLmdldFByb3BlcnR5O1xuICB9IH0pLCBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwgXCJzdHJpbmdpZnlcIiwgeyBlbnVtZXJhYmxlOiAhMCwgZ2V0OiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gYS5zdHJpbmdpZnk7XG4gIH0gfSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCBcInJlZ2V4cENvZGVcIiwgeyBlbnVtZXJhYmxlOiAhMCwgZ2V0OiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gYS5yZWdleHBDb2RlO1xuICB9IH0pLCBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwgXCJOYW1lXCIsIHsgZW51bWVyYWJsZTogITAsIGdldDogZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIGEuTmFtZTtcbiAgfSB9KTtcbiAgdmFyIGQgPSBCdDtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIFwiU2NvcGVcIiwgeyBlbnVtZXJhYmxlOiAhMCwgZ2V0OiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gZC5TY29wZTtcbiAgfSB9KSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIFwiVmFsdWVTY29wZVwiLCB7IGVudW1lcmFibGU6ICEwLCBnZXQ6IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBkLlZhbHVlU2NvcGU7XG4gIH0gfSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCBcIlZhbHVlU2NvcGVOYW1lXCIsIHsgZW51bWVyYWJsZTogITAsIGdldDogZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIGQuVmFsdWVTY29wZU5hbWU7XG4gIH0gfSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCBcInZhcktpbmRzXCIsIHsgZW51bWVyYWJsZTogITAsIGdldDogZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIGQudmFyS2luZHM7XG4gIH0gfSksIGUub3BlcmF0b3JzID0ge1xuICAgIEdUOiBuZXcgci5fQ29kZShcIj5cIiksXG4gICAgR1RFOiBuZXcgci5fQ29kZShcIj49XCIpLFxuICAgIExUOiBuZXcgci5fQ29kZShcIjxcIiksXG4gICAgTFRFOiBuZXcgci5fQ29kZShcIjw9XCIpLFxuICAgIEVROiBuZXcgci5fQ29kZShcIj09PVwiKSxcbiAgICBORVE6IG5ldyByLl9Db2RlKFwiIT09XCIpLFxuICAgIE5PVDogbmV3IHIuX0NvZGUoXCIhXCIpLFxuICAgIE9SOiBuZXcgci5fQ29kZShcInx8XCIpLFxuICAgIEFORDogbmV3IHIuX0NvZGUoXCImJlwiKSxcbiAgICBBREQ6IG5ldyByLl9Db2RlKFwiK1wiKVxuICB9O1xuICBjbGFzcyBvIHtcbiAgICBvcHRpbWl6ZU5vZGVzKCkge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIG9wdGltaXplTmFtZXMobCwgdykge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICB9XG4gIGNsYXNzIHAgZXh0ZW5kcyBvIHtcbiAgICBjb25zdHJ1Y3RvcihsLCB3LCBJKSB7XG4gICAgICBzdXBlcigpLCB0aGlzLnZhcktpbmQgPSBsLCB0aGlzLm5hbWUgPSB3LCB0aGlzLnJocyA9IEk7XG4gICAgfVxuICAgIHJlbmRlcih7IGVzNTogbCwgX246IHcgfSkge1xuICAgICAgY29uc3QgSSA9IGwgPyBuLnZhcktpbmRzLnZhciA6IHRoaXMudmFyS2luZCwgSyA9IHRoaXMucmhzID09PSB2b2lkIDAgPyBcIlwiIDogYCA9ICR7dGhpcy5yaHN9YDtcbiAgICAgIHJldHVybiBgJHtJfSAke3RoaXMubmFtZX0ke0t9O2AgKyB3O1xuICAgIH1cbiAgICBvcHRpbWl6ZU5hbWVzKGwsIHcpIHtcbiAgICAgIGlmIChsW3RoaXMubmFtZS5zdHJdKVxuICAgICAgICByZXR1cm4gdGhpcy5yaHMgJiYgKHRoaXMucmhzID0gVih0aGlzLnJocywgbCwgdykpLCB0aGlzO1xuICAgIH1cbiAgICBnZXQgbmFtZXMoKSB7XG4gICAgICByZXR1cm4gdGhpcy5yaHMgaW5zdGFuY2VvZiByLl9Db2RlT3JOYW1lID8gdGhpcy5yaHMubmFtZXMgOiB7fTtcbiAgICB9XG4gIH1cbiAgY2xhc3MgeSBleHRlbmRzIG8ge1xuICAgIGNvbnN0cnVjdG9yKGwsIHcsIEkpIHtcbiAgICAgIHN1cGVyKCksIHRoaXMubGhzID0gbCwgdGhpcy5yaHMgPSB3LCB0aGlzLnNpZGVFZmZlY3RzID0gSTtcbiAgICB9XG4gICAgcmVuZGVyKHsgX246IGwgfSkge1xuICAgICAgcmV0dXJuIGAke3RoaXMubGhzfSA9ICR7dGhpcy5yaHN9O2AgKyBsO1xuICAgIH1cbiAgICBvcHRpbWl6ZU5hbWVzKGwsIHcpIHtcbiAgICAgIGlmICghKHRoaXMubGhzIGluc3RhbmNlb2Ygci5OYW1lICYmICFsW3RoaXMubGhzLnN0cl0gJiYgIXRoaXMuc2lkZUVmZmVjdHMpKVxuICAgICAgICByZXR1cm4gdGhpcy5yaHMgPSBWKHRoaXMucmhzLCBsLCB3KSwgdGhpcztcbiAgICB9XG4gICAgZ2V0IG5hbWVzKCkge1xuICAgICAgY29uc3QgbCA9IHRoaXMubGhzIGluc3RhbmNlb2Ygci5OYW1lID8ge30gOiB7IC4uLnRoaXMubGhzLm5hbWVzIH07XG4gICAgICByZXR1cm4gSChsLCB0aGlzLnJocyk7XG4gICAgfVxuICB9XG4gIGNsYXNzIGIgZXh0ZW5kcyB5IHtcbiAgICBjb25zdHJ1Y3RvcihsLCB3LCBJLCBLKSB7XG4gICAgICBzdXBlcihsLCBJLCBLKSwgdGhpcy5vcCA9IHc7XG4gICAgfVxuICAgIHJlbmRlcih7IF9uOiBsIH0pIHtcbiAgICAgIHJldHVybiBgJHt0aGlzLmxoc30gJHt0aGlzLm9wfT0gJHt0aGlzLnJoc307YCArIGw7XG4gICAgfVxuICB9XG4gIGNsYXNzIHYgZXh0ZW5kcyBvIHtcbiAgICBjb25zdHJ1Y3RvcihsKSB7XG4gICAgICBzdXBlcigpLCB0aGlzLmxhYmVsID0gbCwgdGhpcy5uYW1lcyA9IHt9O1xuICAgIH1cbiAgICByZW5kZXIoeyBfbjogbCB9KSB7XG4gICAgICByZXR1cm4gYCR7dGhpcy5sYWJlbH06YCArIGw7XG4gICAgfVxuICB9XG4gIGNsYXNzIGcgZXh0ZW5kcyBvIHtcbiAgICBjb25zdHJ1Y3RvcihsKSB7XG4gICAgICBzdXBlcigpLCB0aGlzLmxhYmVsID0gbCwgdGhpcy5uYW1lcyA9IHt9O1xuICAgIH1cbiAgICByZW5kZXIoeyBfbjogbCB9KSB7XG4gICAgICByZXR1cm4gYGJyZWFrJHt0aGlzLmxhYmVsID8gYCAke3RoaXMubGFiZWx9YCA6IFwiXCJ9O2AgKyBsO1xuICAgIH1cbiAgfVxuICBjbGFzcyBTIGV4dGVuZHMgbyB7XG4gICAgY29uc3RydWN0b3IobCkge1xuICAgICAgc3VwZXIoKSwgdGhpcy5lcnJvciA9IGw7XG4gICAgfVxuICAgIHJlbmRlcih7IF9uOiBsIH0pIHtcbiAgICAgIHJldHVybiBgdGhyb3cgJHt0aGlzLmVycm9yfTtgICsgbDtcbiAgICB9XG4gICAgZ2V0IG5hbWVzKCkge1xuICAgICAgcmV0dXJuIHRoaXMuZXJyb3IubmFtZXM7XG4gICAgfVxuICB9XG4gIGNsYXNzIHogZXh0ZW5kcyBvIHtcbiAgICBjb25zdHJ1Y3RvcihsKSB7XG4gICAgICBzdXBlcigpLCB0aGlzLmNvZGUgPSBsO1xuICAgIH1cbiAgICByZW5kZXIoeyBfbjogbCB9KSB7XG4gICAgICByZXR1cm4gYCR7dGhpcy5jb2RlfTtgICsgbDtcbiAgICB9XG4gICAgb3B0aW1pemVOb2RlcygpIHtcbiAgICAgIHJldHVybiBgJHt0aGlzLmNvZGV9YCA/IHRoaXMgOiB2b2lkIDA7XG4gICAgfVxuICAgIG9wdGltaXplTmFtZXMobCwgdykge1xuICAgICAgcmV0dXJuIHRoaXMuY29kZSA9IFYodGhpcy5jb2RlLCBsLCB3KSwgdGhpcztcbiAgICB9XG4gICAgZ2V0IG5hbWVzKCkge1xuICAgICAgcmV0dXJuIHRoaXMuY29kZSBpbnN0YW5jZW9mIHIuX0NvZGVPck5hbWUgPyB0aGlzLmNvZGUubmFtZXMgOiB7fTtcbiAgICB9XG4gIH1cbiAgY2xhc3MgTCBleHRlbmRzIG8ge1xuICAgIGNvbnN0cnVjdG9yKGwgPSBbXSkge1xuICAgICAgc3VwZXIoKSwgdGhpcy5ub2RlcyA9IGw7XG4gICAgfVxuICAgIHJlbmRlcihsKSB7XG4gICAgICByZXR1cm4gdGhpcy5ub2Rlcy5yZWR1Y2UoKHcsIEkpID0+IHcgKyBJLnJlbmRlcihsKSwgXCJcIik7XG4gICAgfVxuICAgIG9wdGltaXplTm9kZXMoKSB7XG4gICAgICBjb25zdCB7IG5vZGVzOiBsIH0gPSB0aGlzO1xuICAgICAgbGV0IHcgPSBsLmxlbmd0aDtcbiAgICAgIGZvciAoOyB3LS07ICkge1xuICAgICAgICBjb25zdCBJID0gbFt3XS5vcHRpbWl6ZU5vZGVzKCk7XG4gICAgICAgIEFycmF5LmlzQXJyYXkoSSkgPyBsLnNwbGljZSh3LCAxLCAuLi5JKSA6IEkgPyBsW3ddID0gSSA6IGwuc3BsaWNlKHcsIDEpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGwubGVuZ3RoID4gMCA/IHRoaXMgOiB2b2lkIDA7XG4gICAgfVxuICAgIG9wdGltaXplTmFtZXMobCwgdykge1xuICAgICAgY29uc3QgeyBub2RlczogSSB9ID0gdGhpcztcbiAgICAgIGxldCBLID0gSS5sZW5ndGg7XG4gICAgICBmb3IgKDsgSy0tOyApIHtcbiAgICAgICAgY29uc3QgVyA9IElbS107XG4gICAgICAgIFcub3B0aW1pemVOYW1lcyhsLCB3KSB8fCAoRyhsLCBXLm5hbWVzKSwgSS5zcGxpY2UoSywgMSkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIEkubGVuZ3RoID4gMCA/IHRoaXMgOiB2b2lkIDA7XG4gICAgfVxuICAgIGdldCBuYW1lcygpIHtcbiAgICAgIHJldHVybiB0aGlzLm5vZGVzLnJlZHVjZSgobCwgdykgPT4gVShsLCB3Lm5hbWVzKSwge30pO1xuICAgIH1cbiAgfVxuICBjbGFzcyBSIGV4dGVuZHMgTCB7XG4gICAgcmVuZGVyKGwpIHtcbiAgICAgIHJldHVybiBcIntcIiArIGwuX24gKyBzdXBlci5yZW5kZXIobCkgKyBcIn1cIiArIGwuX247XG4gICAgfVxuICB9XG4gIGNsYXNzIGogZXh0ZW5kcyBMIHtcbiAgfVxuICBjbGFzcyBUIGV4dGVuZHMgUiB7XG4gIH1cbiAgVC5raW5kID0gXCJlbHNlXCI7XG4gIGNsYXNzICQgZXh0ZW5kcyBSIHtcbiAgICBjb25zdHJ1Y3RvcihsLCB3KSB7XG4gICAgICBzdXBlcih3KSwgdGhpcy5jb25kaXRpb24gPSBsO1xuICAgIH1cbiAgICByZW5kZXIobCkge1xuICAgICAgbGV0IHcgPSBgaWYoJHt0aGlzLmNvbmRpdGlvbn0pYCArIHN1cGVyLnJlbmRlcihsKTtcbiAgICAgIHJldHVybiB0aGlzLmVsc2UgJiYgKHcgKz0gXCJlbHNlIFwiICsgdGhpcy5lbHNlLnJlbmRlcihsKSksIHc7XG4gICAgfVxuICAgIG9wdGltaXplTm9kZXMoKSB7XG4gICAgICBzdXBlci5vcHRpbWl6ZU5vZGVzKCk7XG4gICAgICBjb25zdCBsID0gdGhpcy5jb25kaXRpb247XG4gICAgICBpZiAobCA9PT0gITApXG4gICAgICAgIHJldHVybiB0aGlzLm5vZGVzO1xuICAgICAgbGV0IHcgPSB0aGlzLmVsc2U7XG4gICAgICBpZiAodykge1xuICAgICAgICBjb25zdCBJID0gdy5vcHRpbWl6ZU5vZGVzKCk7XG4gICAgICAgIHcgPSB0aGlzLmVsc2UgPSBBcnJheS5pc0FycmF5KEkpID8gbmV3IFQoSSkgOiBJO1xuICAgICAgfVxuICAgICAgaWYgKHcpXG4gICAgICAgIHJldHVybiBsID09PSAhMSA/IHcgaW5zdGFuY2VvZiAkID8gdyA6IHcubm9kZXMgOiB0aGlzLm5vZGVzLmxlbmd0aCA/IHRoaXMgOiBuZXcgJChfKGwpLCB3IGluc3RhbmNlb2YgJCA/IFt3XSA6IHcubm9kZXMpO1xuICAgICAgaWYgKCEobCA9PT0gITEgfHwgIXRoaXMubm9kZXMubGVuZ3RoKSlcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIG9wdGltaXplTmFtZXMobCwgdykge1xuICAgICAgdmFyIEk7XG4gICAgICBpZiAodGhpcy5lbHNlID0gKEkgPSB0aGlzLmVsc2UpID09PSBudWxsIHx8IEkgPT09IHZvaWQgMCA/IHZvaWQgMCA6IEkub3B0aW1pemVOYW1lcyhsLCB3KSwgISEoc3VwZXIub3B0aW1pemVOYW1lcyhsLCB3KSB8fCB0aGlzLmVsc2UpKVxuICAgICAgICByZXR1cm4gdGhpcy5jb25kaXRpb24gPSBWKHRoaXMuY29uZGl0aW9uLCBsLCB3KSwgdGhpcztcbiAgICB9XG4gICAgZ2V0IG5hbWVzKCkge1xuICAgICAgY29uc3QgbCA9IHN1cGVyLm5hbWVzO1xuICAgICAgcmV0dXJuIEgobCwgdGhpcy5jb25kaXRpb24pLCB0aGlzLmVsc2UgJiYgVShsLCB0aGlzLmVsc2UubmFtZXMpLCBsO1xuICAgIH1cbiAgfVxuICAkLmtpbmQgPSBcImlmXCI7XG4gIGNsYXNzIE4gZXh0ZW5kcyBSIHtcbiAgfVxuICBOLmtpbmQgPSBcImZvclwiO1xuICBjbGFzcyBEIGV4dGVuZHMgTiB7XG4gICAgY29uc3RydWN0b3IobCkge1xuICAgICAgc3VwZXIoKSwgdGhpcy5pdGVyYXRpb24gPSBsO1xuICAgIH1cbiAgICByZW5kZXIobCkge1xuICAgICAgcmV0dXJuIGBmb3IoJHt0aGlzLml0ZXJhdGlvbn0pYCArIHN1cGVyLnJlbmRlcihsKTtcbiAgICB9XG4gICAgb3B0aW1pemVOYW1lcyhsLCB3KSB7XG4gICAgICBpZiAoc3VwZXIub3B0aW1pemVOYW1lcyhsLCB3KSlcbiAgICAgICAgcmV0dXJuIHRoaXMuaXRlcmF0aW9uID0gVih0aGlzLml0ZXJhdGlvbiwgbCwgdyksIHRoaXM7XG4gICAgfVxuICAgIGdldCBuYW1lcygpIHtcbiAgICAgIHJldHVybiBVKHN1cGVyLm5hbWVzLCB0aGlzLml0ZXJhdGlvbi5uYW1lcyk7XG4gICAgfVxuICB9XG4gIGNsYXNzIHQgZXh0ZW5kcyBOIHtcbiAgICBjb25zdHJ1Y3RvcihsLCB3LCBJLCBLKSB7XG4gICAgICBzdXBlcigpLCB0aGlzLnZhcktpbmQgPSBsLCB0aGlzLm5hbWUgPSB3LCB0aGlzLmZyb20gPSBJLCB0aGlzLnRvID0gSztcbiAgICB9XG4gICAgcmVuZGVyKGwpIHtcbiAgICAgIGNvbnN0IHcgPSBsLmVzNSA/IG4udmFyS2luZHMudmFyIDogdGhpcy52YXJLaW5kLCB7IG5hbWU6IEksIGZyb206IEssIHRvOiBXIH0gPSB0aGlzO1xuICAgICAgcmV0dXJuIGBmb3IoJHt3fSAke0l9PSR7S307ICR7SX08JHtXfTsgJHtJfSsrKWAgKyBzdXBlci5yZW5kZXIobCk7XG4gICAgfVxuICAgIGdldCBuYW1lcygpIHtcbiAgICAgIGNvbnN0IGwgPSBIKHN1cGVyLm5hbWVzLCB0aGlzLmZyb20pO1xuICAgICAgcmV0dXJuIEgobCwgdGhpcy50byk7XG4gICAgfVxuICB9XG4gIGNsYXNzIHUgZXh0ZW5kcyBOIHtcbiAgICBjb25zdHJ1Y3RvcihsLCB3LCBJLCBLKSB7XG4gICAgICBzdXBlcigpLCB0aGlzLmxvb3AgPSBsLCB0aGlzLnZhcktpbmQgPSB3LCB0aGlzLm5hbWUgPSBJLCB0aGlzLml0ZXJhYmxlID0gSztcbiAgICB9XG4gICAgcmVuZGVyKGwpIHtcbiAgICAgIHJldHVybiBgZm9yKCR7dGhpcy52YXJLaW5kfSAke3RoaXMubmFtZX0gJHt0aGlzLmxvb3B9ICR7dGhpcy5pdGVyYWJsZX0pYCArIHN1cGVyLnJlbmRlcihsKTtcbiAgICB9XG4gICAgb3B0aW1pemVOYW1lcyhsLCB3KSB7XG4gICAgICBpZiAoc3VwZXIub3B0aW1pemVOYW1lcyhsLCB3KSlcbiAgICAgICAgcmV0dXJuIHRoaXMuaXRlcmFibGUgPSBWKHRoaXMuaXRlcmFibGUsIGwsIHcpLCB0aGlzO1xuICAgIH1cbiAgICBnZXQgbmFtZXMoKSB7XG4gICAgICByZXR1cm4gVShzdXBlci5uYW1lcywgdGhpcy5pdGVyYWJsZS5uYW1lcyk7XG4gICAgfVxuICB9XG4gIGNsYXNzIHMgZXh0ZW5kcyBSIHtcbiAgICBjb25zdHJ1Y3RvcihsLCB3LCBJKSB7XG4gICAgICBzdXBlcigpLCB0aGlzLm5hbWUgPSBsLCB0aGlzLmFyZ3MgPSB3LCB0aGlzLmFzeW5jID0gSTtcbiAgICB9XG4gICAgcmVuZGVyKGwpIHtcbiAgICAgIHJldHVybiBgJHt0aGlzLmFzeW5jID8gXCJhc3luYyBcIiA6IFwiXCJ9ZnVuY3Rpb24gJHt0aGlzLm5hbWV9KCR7dGhpcy5hcmdzfSlgICsgc3VwZXIucmVuZGVyKGwpO1xuICAgIH1cbiAgfVxuICBzLmtpbmQgPSBcImZ1bmNcIjtcbiAgY2xhc3MgaSBleHRlbmRzIEwge1xuICAgIHJlbmRlcihsKSB7XG4gICAgICByZXR1cm4gXCJyZXR1cm4gXCIgKyBzdXBlci5yZW5kZXIobCk7XG4gICAgfVxuICB9XG4gIGkua2luZCA9IFwicmV0dXJuXCI7XG4gIGNsYXNzIGMgZXh0ZW5kcyBSIHtcbiAgICByZW5kZXIobCkge1xuICAgICAgbGV0IHcgPSBcInRyeVwiICsgc3VwZXIucmVuZGVyKGwpO1xuICAgICAgcmV0dXJuIHRoaXMuY2F0Y2ggJiYgKHcgKz0gdGhpcy5jYXRjaC5yZW5kZXIobCkpLCB0aGlzLmZpbmFsbHkgJiYgKHcgKz0gdGhpcy5maW5hbGx5LnJlbmRlcihsKSksIHc7XG4gICAgfVxuICAgIG9wdGltaXplTm9kZXMoKSB7XG4gICAgICB2YXIgbCwgdztcbiAgICAgIHJldHVybiBzdXBlci5vcHRpbWl6ZU5vZGVzKCksIChsID0gdGhpcy5jYXRjaCkgPT09IG51bGwgfHwgbCA9PT0gdm9pZCAwIHx8IGwub3B0aW1pemVOb2RlcygpLCAodyA9IHRoaXMuZmluYWxseSkgPT09IG51bGwgfHwgdyA9PT0gdm9pZCAwIHx8IHcub3B0aW1pemVOb2RlcygpLCB0aGlzO1xuICAgIH1cbiAgICBvcHRpbWl6ZU5hbWVzKGwsIHcpIHtcbiAgICAgIHZhciBJLCBLO1xuICAgICAgcmV0dXJuIHN1cGVyLm9wdGltaXplTmFtZXMobCwgdyksIChJID0gdGhpcy5jYXRjaCkgPT09IG51bGwgfHwgSSA9PT0gdm9pZCAwIHx8IEkub3B0aW1pemVOYW1lcyhsLCB3KSwgKEsgPSB0aGlzLmZpbmFsbHkpID09PSBudWxsIHx8IEsgPT09IHZvaWQgMCB8fCBLLm9wdGltaXplTmFtZXMobCwgdyksIHRoaXM7XG4gICAgfVxuICAgIGdldCBuYW1lcygpIHtcbiAgICAgIGNvbnN0IGwgPSBzdXBlci5uYW1lcztcbiAgICAgIHJldHVybiB0aGlzLmNhdGNoICYmIFUobCwgdGhpcy5jYXRjaC5uYW1lcyksIHRoaXMuZmluYWxseSAmJiBVKGwsIHRoaXMuZmluYWxseS5uYW1lcyksIGw7XG4gICAgfVxuICB9XG4gIGNsYXNzIG0gZXh0ZW5kcyBSIHtcbiAgICBjb25zdHJ1Y3RvcihsKSB7XG4gICAgICBzdXBlcigpLCB0aGlzLmVycm9yID0gbDtcbiAgICB9XG4gICAgcmVuZGVyKGwpIHtcbiAgICAgIHJldHVybiBgY2F0Y2goJHt0aGlzLmVycm9yfSlgICsgc3VwZXIucmVuZGVyKGwpO1xuICAgIH1cbiAgfVxuICBtLmtpbmQgPSBcImNhdGNoXCI7XG4gIGNsYXNzIGggZXh0ZW5kcyBSIHtcbiAgICByZW5kZXIobCkge1xuICAgICAgcmV0dXJuIFwiZmluYWxseVwiICsgc3VwZXIucmVuZGVyKGwpO1xuICAgIH1cbiAgfVxuICBoLmtpbmQgPSBcImZpbmFsbHlcIjtcbiAgY2xhc3MgQyB7XG4gICAgY29uc3RydWN0b3IobCwgdyA9IHt9KSB7XG4gICAgICB0aGlzLl92YWx1ZXMgPSB7fSwgdGhpcy5fYmxvY2tTdGFydHMgPSBbXSwgdGhpcy5fY29uc3RhbnRzID0ge30sIHRoaXMub3B0cyA9IHsgLi4udywgX246IHcubGluZXMgPyBgXG5gIDogXCJcIiB9LCB0aGlzLl9leHRTY29wZSA9IGwsIHRoaXMuX3Njb3BlID0gbmV3IG4uU2NvcGUoeyBwYXJlbnQ6IGwgfSksIHRoaXMuX25vZGVzID0gW25ldyBqKCldO1xuICAgIH1cbiAgICB0b1N0cmluZygpIHtcbiAgICAgIHJldHVybiB0aGlzLl9yb290LnJlbmRlcih0aGlzLm9wdHMpO1xuICAgIH1cbiAgICAvLyByZXR1cm5zIHVuaXF1ZSBuYW1lIGluIHRoZSBpbnRlcm5hbCBzY29wZVxuICAgIG5hbWUobCkge1xuICAgICAgcmV0dXJuIHRoaXMuX3Njb3BlLm5hbWUobCk7XG4gICAgfVxuICAgIC8vIHJlc2VydmVzIHVuaXF1ZSBuYW1lIGluIHRoZSBleHRlcm5hbCBzY29wZVxuICAgIHNjb3BlTmFtZShsKSB7XG4gICAgICByZXR1cm4gdGhpcy5fZXh0U2NvcGUubmFtZShsKTtcbiAgICB9XG4gICAgLy8gcmVzZXJ2ZXMgdW5pcXVlIG5hbWUgaW4gdGhlIGV4dGVybmFsIHNjb3BlIGFuZCBhc3NpZ25zIHZhbHVlIHRvIGl0XG4gICAgc2NvcGVWYWx1ZShsLCB3KSB7XG4gICAgICBjb25zdCBJID0gdGhpcy5fZXh0U2NvcGUudmFsdWUobCwgdyk7XG4gICAgICByZXR1cm4gKHRoaXMuX3ZhbHVlc1tJLnByZWZpeF0gfHwgKHRoaXMuX3ZhbHVlc1tJLnByZWZpeF0gPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpKSkuYWRkKEkpLCBJO1xuICAgIH1cbiAgICBnZXRTY29wZVZhbHVlKGwsIHcpIHtcbiAgICAgIHJldHVybiB0aGlzLl9leHRTY29wZS5nZXRWYWx1ZShsLCB3KTtcbiAgICB9XG4gICAgLy8gcmV0dXJuIGNvZGUgdGhhdCBhc3NpZ25zIHZhbHVlcyBpbiB0aGUgZXh0ZXJuYWwgc2NvcGUgdG8gdGhlIG5hbWVzIHRoYXQgYXJlIHVzZWQgaW50ZXJuYWxseVxuICAgIC8vIChzYW1lIG5hbWVzIHRoYXQgd2VyZSByZXR1cm5lZCBieSBnZW4uc2NvcGVOYW1lIG9yIGdlbi5zY29wZVZhbHVlKVxuICAgIHNjb3BlUmVmcyhsKSB7XG4gICAgICByZXR1cm4gdGhpcy5fZXh0U2NvcGUuc2NvcGVSZWZzKGwsIHRoaXMuX3ZhbHVlcyk7XG4gICAgfVxuICAgIHNjb3BlQ29kZSgpIHtcbiAgICAgIHJldHVybiB0aGlzLl9leHRTY29wZS5zY29wZUNvZGUodGhpcy5fdmFsdWVzKTtcbiAgICB9XG4gICAgX2RlZihsLCB3LCBJLCBLKSB7XG4gICAgICBjb25zdCBXID0gdGhpcy5fc2NvcGUudG9OYW1lKHcpO1xuICAgICAgcmV0dXJuIEkgIT09IHZvaWQgMCAmJiBLICYmICh0aGlzLl9jb25zdGFudHNbVy5zdHJdID0gSSksIHRoaXMuX2xlYWZOb2RlKG5ldyBwKGwsIFcsIEkpKSwgVztcbiAgICB9XG4gICAgLy8gYGNvbnN0YCBkZWNsYXJhdGlvbiAoYHZhcmAgaW4gZXM1IG1vZGUpXG4gICAgY29uc3QobCwgdywgSSkge1xuICAgICAgcmV0dXJuIHRoaXMuX2RlZihuLnZhcktpbmRzLmNvbnN0LCBsLCB3LCBJKTtcbiAgICB9XG4gICAgLy8gYGxldGAgZGVjbGFyYXRpb24gd2l0aCBvcHRpb25hbCBhc3NpZ25tZW50IChgdmFyYCBpbiBlczUgbW9kZSlcbiAgICBsZXQobCwgdywgSSkge1xuICAgICAgcmV0dXJuIHRoaXMuX2RlZihuLnZhcktpbmRzLmxldCwgbCwgdywgSSk7XG4gICAgfVxuICAgIC8vIGB2YXJgIGRlY2xhcmF0aW9uIHdpdGggb3B0aW9uYWwgYXNzaWdubWVudFxuICAgIHZhcihsLCB3LCBJKSB7XG4gICAgICByZXR1cm4gdGhpcy5fZGVmKG4udmFyS2luZHMudmFyLCBsLCB3LCBJKTtcbiAgICB9XG4gICAgLy8gYXNzaWdubWVudCBjb2RlXG4gICAgYXNzaWduKGwsIHcsIEkpIHtcbiAgICAgIHJldHVybiB0aGlzLl9sZWFmTm9kZShuZXcgeShsLCB3LCBJKSk7XG4gICAgfVxuICAgIC8vIGArPWAgY29kZVxuICAgIGFkZChsLCB3KSB7XG4gICAgICByZXR1cm4gdGhpcy5fbGVhZk5vZGUobmV3IGIobCwgZS5vcGVyYXRvcnMuQURELCB3KSk7XG4gICAgfVxuICAgIC8vIGFwcGVuZHMgcGFzc2VkIFNhZmVFeHByIHRvIGNvZGUgb3IgZXhlY3V0ZXMgQmxvY2tcbiAgICBjb2RlKGwpIHtcbiAgICAgIHJldHVybiB0eXBlb2YgbCA9PSBcImZ1bmN0aW9uXCIgPyBsKCkgOiBsICE9PSByLm5pbCAmJiB0aGlzLl9sZWFmTm9kZShuZXcgeihsKSksIHRoaXM7XG4gICAgfVxuICAgIC8vIHJldHVybnMgY29kZSBmb3Igb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSBwYXNzZWQgYXJndW1lbnQgbGlzdCBvZiBrZXktdmFsdWUgcGFpcnNcbiAgICBvYmplY3QoLi4ubCkge1xuICAgICAgY29uc3QgdyA9IFtcIntcIl07XG4gICAgICBmb3IgKGNvbnN0IFtJLCBLXSBvZiBsKVxuICAgICAgICB3Lmxlbmd0aCA+IDEgJiYgdy5wdXNoKFwiLFwiKSwgdy5wdXNoKEkpLCAoSSAhPT0gSyB8fCB0aGlzLm9wdHMuZXM1KSAmJiAody5wdXNoKFwiOlwiKSwgKDAsIHIuYWRkQ29kZUFyZykodywgSykpO1xuICAgICAgcmV0dXJuIHcucHVzaChcIn1cIiksIG5ldyByLl9Db2RlKHcpO1xuICAgIH1cbiAgICAvLyBgaWZgIGNsYXVzZSAob3Igc3RhdGVtZW50IGlmIGB0aGVuQm9keWAgYW5kLCBvcHRpb25hbGx5LCBgZWxzZUJvZHlgIGFyZSBwYXNzZWQpXG4gICAgaWYobCwgdywgSSkge1xuICAgICAgaWYgKHRoaXMuX2Jsb2NrTm9kZShuZXcgJChsKSksIHcgJiYgSSlcbiAgICAgICAgdGhpcy5jb2RlKHcpLmVsc2UoKS5jb2RlKEkpLmVuZElmKCk7XG4gICAgICBlbHNlIGlmICh3KVxuICAgICAgICB0aGlzLmNvZGUodykuZW5kSWYoKTtcbiAgICAgIGVsc2UgaWYgKEkpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignQ29kZUdlbjogXCJlbHNlXCIgYm9keSB3aXRob3V0IFwidGhlblwiIGJvZHknKTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvLyBgZWxzZSBpZmAgY2xhdXNlIC0gaW52YWxpZCB3aXRob3V0IGBpZmAgb3IgYWZ0ZXIgYGVsc2VgIGNsYXVzZXNcbiAgICBlbHNlSWYobCkge1xuICAgICAgcmV0dXJuIHRoaXMuX2Vsc2VOb2RlKG5ldyAkKGwpKTtcbiAgICB9XG4gICAgLy8gYGVsc2VgIGNsYXVzZSAtIG9ubHkgdmFsaWQgYWZ0ZXIgYGlmYCBvciBgZWxzZSBpZmAgY2xhdXNlc1xuICAgIGVsc2UoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fZWxzZU5vZGUobmV3IFQoKSk7XG4gICAgfVxuICAgIC8vIGVuZCBgaWZgIHN0YXRlbWVudCAobmVlZGVkIGlmIGdlbi5pZiB3YXMgdXNlZCBvbmx5IHdpdGggY29uZGl0aW9uKVxuICAgIGVuZElmKCkge1xuICAgICAgcmV0dXJuIHRoaXMuX2VuZEJsb2NrTm9kZSgkLCBUKTtcbiAgICB9XG4gICAgX2ZvcihsLCB3KSB7XG4gICAgICByZXR1cm4gdGhpcy5fYmxvY2tOb2RlKGwpLCB3ICYmIHRoaXMuY29kZSh3KS5lbmRGb3IoKSwgdGhpcztcbiAgICB9XG4gICAgLy8gYSBnZW5lcmljIGBmb3JgIGNsYXVzZSAob3Igc3RhdGVtZW50IGlmIGBmb3JCb2R5YCBpcyBwYXNzZWQpXG4gICAgZm9yKGwsIHcpIHtcbiAgICAgIHJldHVybiB0aGlzLl9mb3IobmV3IEQobCksIHcpO1xuICAgIH1cbiAgICAvLyBgZm9yYCBzdGF0ZW1lbnQgZm9yIGEgcmFuZ2Ugb2YgdmFsdWVzXG4gICAgZm9yUmFuZ2UobCwgdywgSSwgSywgVyA9IHRoaXMub3B0cy5lczUgPyBuLnZhcktpbmRzLnZhciA6IG4udmFyS2luZHMubGV0KSB7XG4gICAgICBjb25zdCByZSA9IHRoaXMuX3Njb3BlLnRvTmFtZShsKTtcbiAgICAgIHJldHVybiB0aGlzLl9mb3IobmV3IHQoVywgcmUsIHcsIEkpLCAoKSA9PiBLKHJlKSk7XG4gICAgfVxuICAgIC8vIGBmb3Itb2ZgIHN0YXRlbWVudCAoaW4gZXM1IG1vZGUgcmVwbGFjZSB3aXRoIGEgbm9ybWFsIGZvciBsb29wKVxuICAgIGZvck9mKGwsIHcsIEksIEsgPSBuLnZhcktpbmRzLmNvbnN0KSB7XG4gICAgICBjb25zdCBXID0gdGhpcy5fc2NvcGUudG9OYW1lKGwpO1xuICAgICAgaWYgKHRoaXMub3B0cy5lczUpIHtcbiAgICAgICAgY29uc3QgcmUgPSB3IGluc3RhbmNlb2Ygci5OYW1lID8gdyA6IHRoaXMudmFyKFwiX2FyclwiLCB3KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZm9yUmFuZ2UoXCJfaVwiLCAwLCAoMCwgci5fKWAke3JlfS5sZW5ndGhgLCAoYWUpID0+IHtcbiAgICAgICAgICB0aGlzLnZhcihXLCAoMCwgci5fKWAke3JlfVske2FlfV1gKSwgSShXKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5fZm9yKG5ldyB1KFwib2ZcIiwgSywgVywgdyksICgpID0+IEkoVykpO1xuICAgIH1cbiAgICAvLyBgZm9yLWluYCBzdGF0ZW1lbnQuXG4gICAgLy8gV2l0aCBvcHRpb24gYG93blByb3BlcnRpZXNgIHJlcGxhY2VkIHdpdGggYSBgZm9yLW9mYCBsb29wIGZvciBvYmplY3Qga2V5c1xuICAgIGZvckluKGwsIHcsIEksIEsgPSB0aGlzLm9wdHMuZXM1ID8gbi52YXJLaW5kcy52YXIgOiBuLnZhcktpbmRzLmNvbnN0KSB7XG4gICAgICBpZiAodGhpcy5vcHRzLm93blByb3BlcnRpZXMpXG4gICAgICAgIHJldHVybiB0aGlzLmZvck9mKGwsICgwLCByLl8pYE9iamVjdC5rZXlzKCR7d30pYCwgSSk7XG4gICAgICBjb25zdCBXID0gdGhpcy5fc2NvcGUudG9OYW1lKGwpO1xuICAgICAgcmV0dXJuIHRoaXMuX2ZvcihuZXcgdShcImluXCIsIEssIFcsIHcpLCAoKSA9PiBJKFcpKTtcbiAgICB9XG4gICAgLy8gZW5kIGBmb3JgIGxvb3BcbiAgICBlbmRGb3IoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fZW5kQmxvY2tOb2RlKE4pO1xuICAgIH1cbiAgICAvLyBgbGFiZWxgIHN0YXRlbWVudFxuICAgIGxhYmVsKGwpIHtcbiAgICAgIHJldHVybiB0aGlzLl9sZWFmTm9kZShuZXcgdihsKSk7XG4gICAgfVxuICAgIC8vIGBicmVha2Agc3RhdGVtZW50XG4gICAgYnJlYWsobCkge1xuICAgICAgcmV0dXJuIHRoaXMuX2xlYWZOb2RlKG5ldyBnKGwpKTtcbiAgICB9XG4gICAgLy8gYHJldHVybmAgc3RhdGVtZW50XG4gICAgcmV0dXJuKGwpIHtcbiAgICAgIGNvbnN0IHcgPSBuZXcgaSgpO1xuICAgICAgaWYgKHRoaXMuX2Jsb2NrTm9kZSh3KSwgdGhpcy5jb2RlKGwpLCB3Lm5vZGVzLmxlbmd0aCAhPT0gMSlcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb2RlR2VuOiBcInJldHVyblwiIHNob3VsZCBoYXZlIG9uZSBub2RlJyk7XG4gICAgICByZXR1cm4gdGhpcy5fZW5kQmxvY2tOb2RlKGkpO1xuICAgIH1cbiAgICAvLyBgdHJ5YCBzdGF0ZW1lbnRcbiAgICB0cnkobCwgdywgSSkge1xuICAgICAgaWYgKCF3ICYmICFJKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvZGVHZW46IFwidHJ5XCIgd2l0aG91dCBcImNhdGNoXCIgYW5kIFwiZmluYWxseVwiJyk7XG4gICAgICBjb25zdCBLID0gbmV3IGMoKTtcbiAgICAgIGlmICh0aGlzLl9ibG9ja05vZGUoSyksIHRoaXMuY29kZShsKSwgdykge1xuICAgICAgICBjb25zdCBXID0gdGhpcy5uYW1lKFwiZVwiKTtcbiAgICAgICAgdGhpcy5fY3Vyck5vZGUgPSBLLmNhdGNoID0gbmV3IG0oVyksIHcoVyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gSSAmJiAodGhpcy5fY3Vyck5vZGUgPSBLLmZpbmFsbHkgPSBuZXcgaCgpLCB0aGlzLmNvZGUoSSkpLCB0aGlzLl9lbmRCbG9ja05vZGUobSwgaCk7XG4gICAgfVxuICAgIC8vIGB0aHJvd2Agc3RhdGVtZW50XG4gICAgdGhyb3cobCkge1xuICAgICAgcmV0dXJuIHRoaXMuX2xlYWZOb2RlKG5ldyBTKGwpKTtcbiAgICB9XG4gICAgLy8gc3RhcnQgc2VsZi1iYWxhbmNpbmcgYmxvY2tcbiAgICBibG9jayhsLCB3KSB7XG4gICAgICByZXR1cm4gdGhpcy5fYmxvY2tTdGFydHMucHVzaCh0aGlzLl9ub2Rlcy5sZW5ndGgpLCBsICYmIHRoaXMuY29kZShsKS5lbmRCbG9jayh3KSwgdGhpcztcbiAgICB9XG4gICAgLy8gZW5kIHRoZSBjdXJyZW50IHNlbGYtYmFsYW5jaW5nIGJsb2NrXG4gICAgZW5kQmxvY2sobCkge1xuICAgICAgY29uc3QgdyA9IHRoaXMuX2Jsb2NrU3RhcnRzLnBvcCgpO1xuICAgICAgaWYgKHcgPT09IHZvaWQgMClcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ29kZUdlbjogbm90IGluIHNlbGYtYmFsYW5jaW5nIGJsb2NrXCIpO1xuICAgICAgY29uc3QgSSA9IHRoaXMuX25vZGVzLmxlbmd0aCAtIHc7XG4gICAgICBpZiAoSSA8IDAgfHwgbCAhPT0gdm9pZCAwICYmIEkgIT09IGwpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQ29kZUdlbjogd3JvbmcgbnVtYmVyIG9mIG5vZGVzOiAke0l9IHZzICR7bH0gZXhwZWN0ZWRgKTtcbiAgICAgIHJldHVybiB0aGlzLl9ub2Rlcy5sZW5ndGggPSB3LCB0aGlzO1xuICAgIH1cbiAgICAvLyBgZnVuY3Rpb25gIGhlYWRpbmcgKG9yIGRlZmluaXRpb24gaWYgZnVuY0JvZHkgaXMgcGFzc2VkKVxuICAgIGZ1bmMobCwgdyA9IHIubmlsLCBJLCBLKSB7XG4gICAgICByZXR1cm4gdGhpcy5fYmxvY2tOb2RlKG5ldyBzKGwsIHcsIEkpKSwgSyAmJiB0aGlzLmNvZGUoSykuZW5kRnVuYygpLCB0aGlzO1xuICAgIH1cbiAgICAvLyBlbmQgZnVuY3Rpb24gZGVmaW5pdGlvblxuICAgIGVuZEZ1bmMoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fZW5kQmxvY2tOb2RlKHMpO1xuICAgIH1cbiAgICBvcHRpbWl6ZShsID0gMSkge1xuICAgICAgZm9yICg7IGwtLSA+IDA7IClcbiAgICAgICAgdGhpcy5fcm9vdC5vcHRpbWl6ZU5vZGVzKCksIHRoaXMuX3Jvb3Qub3B0aW1pemVOYW1lcyh0aGlzLl9yb290Lm5hbWVzLCB0aGlzLl9jb25zdGFudHMpO1xuICAgIH1cbiAgICBfbGVhZk5vZGUobCkge1xuICAgICAgcmV0dXJuIHRoaXMuX2N1cnJOb2RlLm5vZGVzLnB1c2gobCksIHRoaXM7XG4gICAgfVxuICAgIF9ibG9ja05vZGUobCkge1xuICAgICAgdGhpcy5fY3Vyck5vZGUubm9kZXMucHVzaChsKSwgdGhpcy5fbm9kZXMucHVzaChsKTtcbiAgICB9XG4gICAgX2VuZEJsb2NrTm9kZShsLCB3KSB7XG4gICAgICBjb25zdCBJID0gdGhpcy5fY3Vyck5vZGU7XG4gICAgICBpZiAoSSBpbnN0YW5jZW9mIGwgfHwgdyAmJiBJIGluc3RhbmNlb2YgdylcbiAgICAgICAgcmV0dXJuIHRoaXMuX25vZGVzLnBvcCgpLCB0aGlzO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb2RlR2VuOiBub3QgaW4gYmxvY2sgXCIke3cgPyBgJHtsLmtpbmR9LyR7dy5raW5kfWAgOiBsLmtpbmR9XCJgKTtcbiAgICB9XG4gICAgX2Vsc2VOb2RlKGwpIHtcbiAgICAgIGNvbnN0IHcgPSB0aGlzLl9jdXJyTm9kZTtcbiAgICAgIGlmICghKHcgaW5zdGFuY2VvZiAkKSlcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb2RlR2VuOiBcImVsc2VcIiB3aXRob3V0IFwiaWZcIicpO1xuICAgICAgcmV0dXJuIHRoaXMuX2N1cnJOb2RlID0gdy5lbHNlID0gbCwgdGhpcztcbiAgICB9XG4gICAgZ2V0IF9yb290KCkge1xuICAgICAgcmV0dXJuIHRoaXMuX25vZGVzWzBdO1xuICAgIH1cbiAgICBnZXQgX2N1cnJOb2RlKCkge1xuICAgICAgY29uc3QgbCA9IHRoaXMuX25vZGVzO1xuICAgICAgcmV0dXJuIGxbbC5sZW5ndGggLSAxXTtcbiAgICB9XG4gICAgc2V0IF9jdXJyTm9kZShsKSB7XG4gICAgICBjb25zdCB3ID0gdGhpcy5fbm9kZXM7XG4gICAgICB3W3cubGVuZ3RoIC0gMV0gPSBsO1xuICAgIH1cbiAgfVxuICBlLkNvZGVHZW4gPSBDO1xuICBmdW5jdGlvbiBVKE8sIGwpIHtcbiAgICBmb3IgKGNvbnN0IHcgaW4gbClcbiAgICAgIE9bd10gPSAoT1t3XSB8fCAwKSArIChsW3ddIHx8IDApO1xuICAgIHJldHVybiBPO1xuICB9XG4gIGZ1bmN0aW9uIEgoTywgbCkge1xuICAgIHJldHVybiBsIGluc3RhbmNlb2Ygci5fQ29kZU9yTmFtZSA/IFUoTywgbC5uYW1lcykgOiBPO1xuICB9XG4gIGZ1bmN0aW9uIFYoTywgbCwgdykge1xuICAgIGlmIChPIGluc3RhbmNlb2Ygci5OYW1lKVxuICAgICAgcmV0dXJuIEkoTyk7XG4gICAgaWYgKCFLKE8pKVxuICAgICAgcmV0dXJuIE87XG4gICAgcmV0dXJuIG5ldyByLl9Db2RlKE8uX2l0ZW1zLnJlZHVjZSgoVywgcmUpID0+IChyZSBpbnN0YW5jZW9mIHIuTmFtZSAmJiAocmUgPSBJKHJlKSksIHJlIGluc3RhbmNlb2Ygci5fQ29kZSA/IFcucHVzaCguLi5yZS5faXRlbXMpIDogVy5wdXNoKHJlKSwgVyksIFtdKSk7XG4gICAgZnVuY3Rpb24gSShXKSB7XG4gICAgICBjb25zdCByZSA9IHdbVy5zdHJdO1xuICAgICAgcmV0dXJuIHJlID09PSB2b2lkIDAgfHwgbFtXLnN0cl0gIT09IDEgPyBXIDogKGRlbGV0ZSBsW1cuc3RyXSwgcmUpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBLKFcpIHtcbiAgICAgIHJldHVybiBXIGluc3RhbmNlb2Ygci5fQ29kZSAmJiBXLl9pdGVtcy5zb21lKChyZSkgPT4gcmUgaW5zdGFuY2VvZiByLk5hbWUgJiYgbFtyZS5zdHJdID09PSAxICYmIHdbcmUuc3RyXSAhPT0gdm9pZCAwKTtcbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gRyhPLCBsKSB7XG4gICAgZm9yIChjb25zdCB3IGluIGwpXG4gICAgICBPW3ddID0gKE9bd10gfHwgMCkgLSAobFt3XSB8fCAwKTtcbiAgfVxuICBmdW5jdGlvbiBfKE8pIHtcbiAgICByZXR1cm4gdHlwZW9mIE8gPT0gXCJib29sZWFuXCIgfHwgdHlwZW9mIE8gPT0gXCJudW1iZXJcIiB8fCBPID09PSBudWxsID8gIU8gOiAoMCwgci5fKWAhJHtGKE8pfWA7XG4gIH1cbiAgZS5ub3QgPSBfO1xuICBjb25zdCBxID0gayhlLm9wZXJhdG9ycy5BTkQpO1xuICBmdW5jdGlvbiBKKC4uLk8pIHtcbiAgICByZXR1cm4gTy5yZWR1Y2UocSk7XG4gIH1cbiAgZS5hbmQgPSBKO1xuICBjb25zdCBaID0gayhlLm9wZXJhdG9ycy5PUik7XG4gIGZ1bmN0aW9uIEIoLi4uTykge1xuICAgIHJldHVybiBPLnJlZHVjZShaKTtcbiAgfVxuICBlLm9yID0gQjtcbiAgZnVuY3Rpb24gayhPKSB7XG4gICAgcmV0dXJuIChsLCB3KSA9PiBsID09PSByLm5pbCA/IHcgOiB3ID09PSByLm5pbCA/IGwgOiAoMCwgci5fKWAke0YobCl9ICR7T30gJHtGKHcpfWA7XG4gIH1cbiAgZnVuY3Rpb24gRihPKSB7XG4gICAgcmV0dXJuIE8gaW5zdGFuY2VvZiByLk5hbWUgPyBPIDogKDAsIHIuXylgKCR7T30pYDtcbiAgfVxufSkoc2UpO1xudmFyIGllID0ge307XG4oZnVuY3Rpb24oZSkge1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6ICEwIH0pLCBlLmNoZWNrU3RyaWN0TW9kZSA9IGUuZ2V0RXJyb3JQYXRoID0gZS5UeXBlID0gZS51c2VGdW5jID0gZS5zZXRFdmFsdWF0ZWQgPSBlLmV2YWx1YXRlZFByb3BzVG9OYW1lID0gZS5tZXJnZUV2YWx1YXRlZCA9IGUuZWFjaEl0ZW0gPSBlLnVuZXNjYXBlSnNvblBvaW50ZXIgPSBlLmVzY2FwZUpzb25Qb2ludGVyID0gZS5lc2NhcGVGcmFnbWVudCA9IGUudW5lc2NhcGVGcmFnbWVudCA9IGUuc2NoZW1hUmVmT3JWYWwgPSBlLnNjaGVtYUhhc1J1bGVzQnV0UmVmID0gZS5zY2hlbWFIYXNSdWxlcyA9IGUuY2hlY2tVbmtub3duUnVsZXMgPSBlLmFsd2F5c1ZhbGlkU2NoZW1hID0gZS50b0hhc2ggPSB2b2lkIDA7XG4gIGNvbnN0IHIgPSBzZSwgbiA9IGV0O1xuICBmdW5jdGlvbiBhKHMpIHtcbiAgICBjb25zdCBpID0ge307XG4gICAgZm9yIChjb25zdCBjIG9mIHMpXG4gICAgICBpW2NdID0gITA7XG4gICAgcmV0dXJuIGk7XG4gIH1cbiAgZS50b0hhc2ggPSBhO1xuICBmdW5jdGlvbiBkKHMsIGkpIHtcbiAgICByZXR1cm4gdHlwZW9mIGkgPT0gXCJib29sZWFuXCIgPyBpIDogT2JqZWN0LmtleXMoaSkubGVuZ3RoID09PSAwID8gITAgOiAobyhzLCBpKSwgIXAoaSwgcy5zZWxmLlJVTEVTLmFsbCkpO1xuICB9XG4gIGUuYWx3YXlzVmFsaWRTY2hlbWEgPSBkO1xuICBmdW5jdGlvbiBvKHMsIGkgPSBzLnNjaGVtYSkge1xuICAgIGNvbnN0IHsgb3B0czogYywgc2VsZjogbSB9ID0gcztcbiAgICBpZiAoIWMuc3RyaWN0U2NoZW1hIHx8IHR5cGVvZiBpID09IFwiYm9vbGVhblwiKVxuICAgICAgcmV0dXJuO1xuICAgIGNvbnN0IGggPSBtLlJVTEVTLmtleXdvcmRzO1xuICAgIGZvciAoY29uc3QgQyBpbiBpKVxuICAgICAgaFtDXSB8fCB1KHMsIGB1bmtub3duIGtleXdvcmQ6IFwiJHtDfVwiYCk7XG4gIH1cbiAgZS5jaGVja1Vua25vd25SdWxlcyA9IG87XG4gIGZ1bmN0aW9uIHAocywgaSkge1xuICAgIGlmICh0eXBlb2YgcyA9PSBcImJvb2xlYW5cIilcbiAgICAgIHJldHVybiAhcztcbiAgICBmb3IgKGNvbnN0IGMgaW4gcylcbiAgICAgIGlmIChpW2NdKVxuICAgICAgICByZXR1cm4gITA7XG4gICAgcmV0dXJuICExO1xuICB9XG4gIGUuc2NoZW1hSGFzUnVsZXMgPSBwO1xuICBmdW5jdGlvbiB5KHMsIGkpIHtcbiAgICBpZiAodHlwZW9mIHMgPT0gXCJib29sZWFuXCIpXG4gICAgICByZXR1cm4gIXM7XG4gICAgZm9yIChjb25zdCBjIGluIHMpXG4gICAgICBpZiAoYyAhPT0gXCIkcmVmXCIgJiYgaS5hbGxbY10pXG4gICAgICAgIHJldHVybiAhMDtcbiAgICByZXR1cm4gITE7XG4gIH1cbiAgZS5zY2hlbWFIYXNSdWxlc0J1dFJlZiA9IHk7XG4gIGZ1bmN0aW9uIGIoeyB0b3BTY2hlbWFSZWY6IHMsIHNjaGVtYVBhdGg6IGkgfSwgYywgbSwgaCkge1xuICAgIGlmICghaCkge1xuICAgICAgaWYgKHR5cGVvZiBjID09IFwibnVtYmVyXCIgfHwgdHlwZW9mIGMgPT0gXCJib29sZWFuXCIpXG4gICAgICAgIHJldHVybiBjO1xuICAgICAgaWYgKHR5cGVvZiBjID09IFwic3RyaW5nXCIpXG4gICAgICAgIHJldHVybiAoMCwgci5fKWAke2N9YDtcbiAgICB9XG4gICAgcmV0dXJuICgwLCByLl8pYCR7c30ke2l9JHsoMCwgci5nZXRQcm9wZXJ0eSkobSl9YDtcbiAgfVxuICBlLnNjaGVtYVJlZk9yVmFsID0gYjtcbiAgZnVuY3Rpb24gdihzKSB7XG4gICAgcmV0dXJuIHooZGVjb2RlVVJJQ29tcG9uZW50KHMpKTtcbiAgfVxuICBlLnVuZXNjYXBlRnJhZ21lbnQgPSB2O1xuICBmdW5jdGlvbiBnKHMpIHtcbiAgICByZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KFMocykpO1xuICB9XG4gIGUuZXNjYXBlRnJhZ21lbnQgPSBnO1xuICBmdW5jdGlvbiBTKHMpIHtcbiAgICByZXR1cm4gdHlwZW9mIHMgPT0gXCJudW1iZXJcIiA/IGAke3N9YCA6IHMucmVwbGFjZSgvfi9nLCBcIn4wXCIpLnJlcGxhY2UoL1xcLy9nLCBcIn4xXCIpO1xuICB9XG4gIGUuZXNjYXBlSnNvblBvaW50ZXIgPSBTO1xuICBmdW5jdGlvbiB6KHMpIHtcbiAgICByZXR1cm4gcy5yZXBsYWNlKC9+MS9nLCBcIi9cIikucmVwbGFjZSgvfjAvZywgXCJ+XCIpO1xuICB9XG4gIGUudW5lc2NhcGVKc29uUG9pbnRlciA9IHo7XG4gIGZ1bmN0aW9uIEwocywgaSkge1xuICAgIGlmIChBcnJheS5pc0FycmF5KHMpKVxuICAgICAgZm9yIChjb25zdCBjIG9mIHMpXG4gICAgICAgIGkoYyk7XG4gICAgZWxzZVxuICAgICAgaShzKTtcbiAgfVxuICBlLmVhY2hJdGVtID0gTDtcbiAgZnVuY3Rpb24gUih7IG1lcmdlTmFtZXM6IHMsIG1lcmdlVG9OYW1lOiBpLCBtZXJnZVZhbHVlczogYywgcmVzdWx0VG9OYW1lOiBtIH0pIHtcbiAgICByZXR1cm4gKGgsIEMsIFUsIEgpID0+IHtcbiAgICAgIGNvbnN0IFYgPSBVID09PSB2b2lkIDAgPyBDIDogVSBpbnN0YW5jZW9mIHIuTmFtZSA/IChDIGluc3RhbmNlb2Ygci5OYW1lID8gcyhoLCBDLCBVKSA6IGkoaCwgQywgVSksIFUpIDogQyBpbnN0YW5jZW9mIHIuTmFtZSA/IChpKGgsIFUsIEMpLCBDKSA6IGMoQywgVSk7XG4gICAgICByZXR1cm4gSCA9PT0gci5OYW1lICYmICEoViBpbnN0YW5jZW9mIHIuTmFtZSkgPyBtKGgsIFYpIDogVjtcbiAgICB9O1xuICB9XG4gIGUubWVyZ2VFdmFsdWF0ZWQgPSB7XG4gICAgcHJvcHM6IFIoe1xuICAgICAgbWVyZ2VOYW1lczogKHMsIGksIGMpID0+IHMuaWYoKDAsIHIuXylgJHtjfSAhPT0gdHJ1ZSAmJiAke2l9ICE9PSB1bmRlZmluZWRgLCAoKSA9PiB7XG4gICAgICAgIHMuaWYoKDAsIHIuXylgJHtpfSA9PT0gdHJ1ZWAsICgpID0+IHMuYXNzaWduKGMsICEwKSwgKCkgPT4gcy5hc3NpZ24oYywgKDAsIHIuXylgJHtjfSB8fCB7fWApLmNvZGUoKDAsIHIuXylgT2JqZWN0LmFzc2lnbigke2N9LCAke2l9KWApKTtcbiAgICAgIH0pLFxuICAgICAgbWVyZ2VUb05hbWU6IChzLCBpLCBjKSA9PiBzLmlmKCgwLCByLl8pYCR7Y30gIT09IHRydWVgLCAoKSA9PiB7XG4gICAgICAgIGkgPT09ICEwID8gcy5hc3NpZ24oYywgITApIDogKHMuYXNzaWduKGMsICgwLCByLl8pYCR7Y30gfHwge31gKSwgVChzLCBjLCBpKSk7XG4gICAgICB9KSxcbiAgICAgIG1lcmdlVmFsdWVzOiAocywgaSkgPT4gcyA9PT0gITAgPyAhMCA6IHsgLi4ucywgLi4uaSB9LFxuICAgICAgcmVzdWx0VG9OYW1lOiBqXG4gICAgfSksXG4gICAgaXRlbXM6IFIoe1xuICAgICAgbWVyZ2VOYW1lczogKHMsIGksIGMpID0+IHMuaWYoKDAsIHIuXylgJHtjfSAhPT0gdHJ1ZSAmJiAke2l9ICE9PSB1bmRlZmluZWRgLCAoKSA9PiBzLmFzc2lnbihjLCAoMCwgci5fKWAke2l9ID09PSB0cnVlID8gdHJ1ZSA6ICR7Y30gPiAke2l9ID8gJHtjfSA6ICR7aX1gKSksXG4gICAgICBtZXJnZVRvTmFtZTogKHMsIGksIGMpID0+IHMuaWYoKDAsIHIuXylgJHtjfSAhPT0gdHJ1ZWAsICgpID0+IHMuYXNzaWduKGMsIGkgPT09ICEwID8gITAgOiAoMCwgci5fKWAke2N9ID4gJHtpfSA/ICR7Y30gOiAke2l9YCkpLFxuICAgICAgbWVyZ2VWYWx1ZXM6IChzLCBpKSA9PiBzID09PSAhMCA/ICEwIDogTWF0aC5tYXgocywgaSksXG4gICAgICByZXN1bHRUb05hbWU6IChzLCBpKSA9PiBzLnZhcihcIml0ZW1zXCIsIGkpXG4gICAgfSlcbiAgfTtcbiAgZnVuY3Rpb24gaihzLCBpKSB7XG4gICAgaWYgKGkgPT09ICEwKVxuICAgICAgcmV0dXJuIHMudmFyKFwicHJvcHNcIiwgITApO1xuICAgIGNvbnN0IGMgPSBzLnZhcihcInByb3BzXCIsICgwLCByLl8pYHt9YCk7XG4gICAgcmV0dXJuIGkgIT09IHZvaWQgMCAmJiBUKHMsIGMsIGkpLCBjO1xuICB9XG4gIGUuZXZhbHVhdGVkUHJvcHNUb05hbWUgPSBqO1xuICBmdW5jdGlvbiBUKHMsIGksIGMpIHtcbiAgICBPYmplY3Qua2V5cyhjKS5mb3JFYWNoKChtKSA9PiBzLmFzc2lnbigoMCwgci5fKWAke2l9JHsoMCwgci5nZXRQcm9wZXJ0eSkobSl9YCwgITApKTtcbiAgfVxuICBlLnNldEV2YWx1YXRlZCA9IFQ7XG4gIGNvbnN0ICQgPSB7fTtcbiAgZnVuY3Rpb24gTihzLCBpKSB7XG4gICAgcmV0dXJuIHMuc2NvcGVWYWx1ZShcImZ1bmNcIiwge1xuICAgICAgcmVmOiBpLFxuICAgICAgY29kZTogJFtpLmNvZGVdIHx8ICgkW2kuY29kZV0gPSBuZXcgbi5fQ29kZShpLmNvZGUpKVxuICAgIH0pO1xuICB9XG4gIGUudXNlRnVuYyA9IE47XG4gIHZhciBEO1xuICAoZnVuY3Rpb24ocykge1xuICAgIHNbcy5OdW0gPSAwXSA9IFwiTnVtXCIsIHNbcy5TdHIgPSAxXSA9IFwiU3RyXCI7XG4gIH0pKEQgPSBlLlR5cGUgfHwgKGUuVHlwZSA9IHt9KSk7XG4gIGZ1bmN0aW9uIHQocywgaSwgYykge1xuICAgIGlmIChzIGluc3RhbmNlb2Ygci5OYW1lKSB7XG4gICAgICBjb25zdCBtID0gaSA9PT0gRC5OdW07XG4gICAgICByZXR1cm4gYyA/IG0gPyAoMCwgci5fKWBcIltcIiArICR7c30gKyBcIl1cImAgOiAoMCwgci5fKWBcIlsnXCIgKyAke3N9ICsgXCInXVwiYCA6IG0gPyAoMCwgci5fKWBcIi9cIiArICR7c31gIDogKDAsIHIuXylgXCIvXCIgKyAke3N9LnJlcGxhY2UoL34vZywgXCJ+MFwiKS5yZXBsYWNlKC9cXFxcLy9nLCBcIn4xXCIpYDtcbiAgICB9XG4gICAgcmV0dXJuIGMgPyAoMCwgci5nZXRQcm9wZXJ0eSkocykudG9TdHJpbmcoKSA6IFwiL1wiICsgUyhzKTtcbiAgfVxuICBlLmdldEVycm9yUGF0aCA9IHQ7XG4gIGZ1bmN0aW9uIHUocywgaSwgYyA9IHMub3B0cy5zdHJpY3RTY2hlbWEpIHtcbiAgICBpZiAoYykge1xuICAgICAgaWYgKGkgPSBgc3RyaWN0IG1vZGU6ICR7aX1gLCBjID09PSAhMClcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGkpO1xuICAgICAgcy5zZWxmLmxvZ2dlci53YXJuKGkpO1xuICAgIH1cbiAgfVxuICBlLmNoZWNrU3RyaWN0TW9kZSA9IHU7XG59KShpZSk7XG52YXIgUWUgPSB7fTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShRZSwgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6ICEwIH0pO1xuY29uc3QgUGUgPSBzZSwgU3MgPSB7XG4gIC8vIHZhbGlkYXRpb24gZnVuY3Rpb24gYXJndW1lbnRzXG4gIGRhdGE6IG5ldyBQZS5OYW1lKFwiZGF0YVwiKSxcbiAgLy8gYXJncyBwYXNzZWQgZnJvbSByZWZlcmVuY2luZyBzY2hlbWFcbiAgdmFsQ3h0OiBuZXcgUGUuTmFtZShcInZhbEN4dFwiKSxcbiAgaW5zdGFuY2VQYXRoOiBuZXcgUGUuTmFtZShcImluc3RhbmNlUGF0aFwiKSxcbiAgcGFyZW50RGF0YTogbmV3IFBlLk5hbWUoXCJwYXJlbnREYXRhXCIpLFxuICBwYXJlbnREYXRhUHJvcGVydHk6IG5ldyBQZS5OYW1lKFwicGFyZW50RGF0YVByb3BlcnR5XCIpLFxuICByb290RGF0YTogbmV3IFBlLk5hbWUoXCJyb290RGF0YVwiKSxcbiAgZHluYW1pY0FuY2hvcnM6IG5ldyBQZS5OYW1lKFwiZHluYW1pY0FuY2hvcnNcIiksXG4gIC8vIGZ1bmN0aW9uIHNjb3BlZCB2YXJpYWJsZXNcbiAgdkVycm9yczogbmV3IFBlLk5hbWUoXCJ2RXJyb3JzXCIpLFxuICBlcnJvcnM6IG5ldyBQZS5OYW1lKFwiZXJyb3JzXCIpLFxuICB0aGlzOiBuZXcgUGUuTmFtZShcInRoaXNcIiksXG4gIC8vIFwiZ2xvYmFsc1wiXG4gIHNlbGY6IG5ldyBQZS5OYW1lKFwic2VsZlwiKSxcbiAgc2NvcGU6IG5ldyBQZS5OYW1lKFwic2NvcGVcIiksXG4gIC8vIEpURCBzZXJpYWxpemUvcGFyc2UgbmFtZSBmb3IgSlNPTiBzdHJpbmcgYW5kIHBvc2l0aW9uXG4gIGpzb246IG5ldyBQZS5OYW1lKFwianNvblwiKSxcbiAganNvblBvczogbmV3IFBlLk5hbWUoXCJqc29uUG9zXCIpLFxuICBqc29uTGVuOiBuZXcgUGUuTmFtZShcImpzb25MZW5cIiksXG4gIGpzb25QYXJ0OiBuZXcgUGUuTmFtZShcImpzb25QYXJ0XCIpXG59O1xuUWUuZGVmYXVsdCA9IFNzO1xuKGZ1bmN0aW9uKGUpIHtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiAhMCB9KSwgZS5leHRlbmRFcnJvcnMgPSBlLnJlc2V0RXJyb3JzQ291bnQgPSBlLnJlcG9ydEV4dHJhRXJyb3IgPSBlLnJlcG9ydEVycm9yID0gZS5rZXl3b3JkJERhdGFFcnJvciA9IGUua2V5d29yZEVycm9yID0gdm9pZCAwO1xuICBjb25zdCByID0gc2UsIG4gPSBpZSwgYSA9IFFlO1xuICBlLmtleXdvcmRFcnJvciA9IHtcbiAgICBtZXNzYWdlOiAoeyBrZXl3b3JkOiBUIH0pID0+ICgwLCByLnN0cilgbXVzdCBwYXNzIFwiJHtUfVwiIGtleXdvcmQgdmFsaWRhdGlvbmBcbiAgfSwgZS5rZXl3b3JkJERhdGFFcnJvciA9IHtcbiAgICBtZXNzYWdlOiAoeyBrZXl3b3JkOiBULCBzY2hlbWFUeXBlOiAkIH0pID0+ICQgPyAoMCwgci5zdHIpYFwiJHtUfVwiIGtleXdvcmQgbXVzdCBiZSAkeyR9ICgkZGF0YSlgIDogKDAsIHIuc3RyKWBcIiR7VH1cIiBrZXl3b3JkIGlzIGludmFsaWQgKCRkYXRhKWBcbiAgfTtcbiAgZnVuY3Rpb24gZChULCAkID0gZS5rZXl3b3JkRXJyb3IsIE4sIEQpIHtcbiAgICBjb25zdCB7IGl0OiB0IH0gPSBULCB7IGdlbjogdSwgY29tcG9zaXRlUnVsZTogcywgYWxsRXJyb3JzOiBpIH0gPSB0LCBjID0gUyhULCAkLCBOKTtcbiAgICBEID8/IChzIHx8IGkpID8gYih1LCBjKSA6IHYodCwgKDAsIHIuXylgWyR7Y31dYCk7XG4gIH1cbiAgZS5yZXBvcnRFcnJvciA9IGQ7XG4gIGZ1bmN0aW9uIG8oVCwgJCA9IGUua2V5d29yZEVycm9yLCBOKSB7XG4gICAgY29uc3QgeyBpdDogRCB9ID0gVCwgeyBnZW46IHQsIGNvbXBvc2l0ZVJ1bGU6IHUsIGFsbEVycm9yczogcyB9ID0gRCwgaSA9IFMoVCwgJCwgTik7XG4gICAgYih0LCBpKSwgdSB8fCBzIHx8IHYoRCwgYS5kZWZhdWx0LnZFcnJvcnMpO1xuICB9XG4gIGUucmVwb3J0RXh0cmFFcnJvciA9IG87XG4gIGZ1bmN0aW9uIHAoVCwgJCkge1xuICAgIFQuYXNzaWduKGEuZGVmYXVsdC5lcnJvcnMsICQpLCBULmlmKCgwLCByLl8pYCR7YS5kZWZhdWx0LnZFcnJvcnN9ICE9PSBudWxsYCwgKCkgPT4gVC5pZigkLCAoKSA9PiBULmFzc2lnbigoMCwgci5fKWAke2EuZGVmYXVsdC52RXJyb3JzfS5sZW5ndGhgLCAkKSwgKCkgPT4gVC5hc3NpZ24oYS5kZWZhdWx0LnZFcnJvcnMsIG51bGwpKSk7XG4gIH1cbiAgZS5yZXNldEVycm9yc0NvdW50ID0gcDtcbiAgZnVuY3Rpb24geSh7IGdlbjogVCwga2V5d29yZDogJCwgc2NoZW1hVmFsdWU6IE4sIGRhdGE6IEQsIGVycnNDb3VudDogdCwgaXQ6IHUgfSkge1xuICAgIGlmICh0ID09PSB2b2lkIDApXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJhanYgaW1wbGVtZW50YXRpb24gZXJyb3JcIik7XG4gICAgY29uc3QgcyA9IFQubmFtZShcImVyclwiKTtcbiAgICBULmZvclJhbmdlKFwiaVwiLCB0LCBhLmRlZmF1bHQuZXJyb3JzLCAoaSkgPT4ge1xuICAgICAgVC5jb25zdChzLCAoMCwgci5fKWAke2EuZGVmYXVsdC52RXJyb3JzfVske2l9XWApLCBULmlmKCgwLCByLl8pYCR7c30uaW5zdGFuY2VQYXRoID09PSB1bmRlZmluZWRgLCAoKSA9PiBULmFzc2lnbigoMCwgci5fKWAke3N9Lmluc3RhbmNlUGF0aGAsICgwLCByLnN0ckNvbmNhdCkoYS5kZWZhdWx0Lmluc3RhbmNlUGF0aCwgdS5lcnJvclBhdGgpKSksIFQuYXNzaWduKCgwLCByLl8pYCR7c30uc2NoZW1hUGF0aGAsICgwLCByLnN0cilgJHt1LmVyclNjaGVtYVBhdGh9LyR7JH1gKSwgdS5vcHRzLnZlcmJvc2UgJiYgKFQuYXNzaWduKCgwLCByLl8pYCR7c30uc2NoZW1hYCwgTiksIFQuYXNzaWduKCgwLCByLl8pYCR7c30uZGF0YWAsIEQpKTtcbiAgICB9KTtcbiAgfVxuICBlLmV4dGVuZEVycm9ycyA9IHk7XG4gIGZ1bmN0aW9uIGIoVCwgJCkge1xuICAgIGNvbnN0IE4gPSBULmNvbnN0KFwiZXJyXCIsICQpO1xuICAgIFQuaWYoKDAsIHIuXylgJHthLmRlZmF1bHQudkVycm9yc30gPT09IG51bGxgLCAoKSA9PiBULmFzc2lnbihhLmRlZmF1bHQudkVycm9ycywgKDAsIHIuXylgWyR7Tn1dYCksICgwLCByLl8pYCR7YS5kZWZhdWx0LnZFcnJvcnN9LnB1c2goJHtOfSlgKSwgVC5jb2RlKCgwLCByLl8pYCR7YS5kZWZhdWx0LmVycm9yc30rK2ApO1xuICB9XG4gIGZ1bmN0aW9uIHYoVCwgJCkge1xuICAgIGNvbnN0IHsgZ2VuOiBOLCB2YWxpZGF0ZU5hbWU6IEQsIHNjaGVtYUVudjogdCB9ID0gVDtcbiAgICB0LiRhc3luYyA/IE4udGhyb3coKDAsIHIuXylgbmV3ICR7VC5WYWxpZGF0aW9uRXJyb3J9KCR7JH0pYCkgOiAoTi5hc3NpZ24oKDAsIHIuXylgJHtEfS5lcnJvcnNgLCAkKSwgTi5yZXR1cm4oITEpKTtcbiAgfVxuICBjb25zdCBnID0ge1xuICAgIGtleXdvcmQ6IG5ldyByLk5hbWUoXCJrZXl3b3JkXCIpLFxuICAgIHNjaGVtYVBhdGg6IG5ldyByLk5hbWUoXCJzY2hlbWFQYXRoXCIpLFxuICAgIHBhcmFtczogbmV3IHIuTmFtZShcInBhcmFtc1wiKSxcbiAgICBwcm9wZXJ0eU5hbWU6IG5ldyByLk5hbWUoXCJwcm9wZXJ0eU5hbWVcIiksXG4gICAgbWVzc2FnZTogbmV3IHIuTmFtZShcIm1lc3NhZ2VcIiksXG4gICAgc2NoZW1hOiBuZXcgci5OYW1lKFwic2NoZW1hXCIpLFxuICAgIHBhcmVudFNjaGVtYTogbmV3IHIuTmFtZShcInBhcmVudFNjaGVtYVwiKVxuICB9O1xuICBmdW5jdGlvbiBTKFQsICQsIE4pIHtcbiAgICBjb25zdCB7IGNyZWF0ZUVycm9yczogRCB9ID0gVC5pdDtcbiAgICByZXR1cm4gRCA9PT0gITEgPyAoMCwgci5fKWB7fWAgOiB6KFQsICQsIE4pO1xuICB9XG4gIGZ1bmN0aW9uIHooVCwgJCwgTiA9IHt9KSB7XG4gICAgY29uc3QgeyBnZW46IEQsIGl0OiB0IH0gPSBULCB1ID0gW1xuICAgICAgTCh0LCBOKSxcbiAgICAgIFIoVCwgTilcbiAgICBdO1xuICAgIHJldHVybiBqKFQsICQsIHUpLCBELm9iamVjdCguLi51KTtcbiAgfVxuICBmdW5jdGlvbiBMKHsgZXJyb3JQYXRoOiBUIH0sIHsgaW5zdGFuY2VQYXRoOiAkIH0pIHtcbiAgICBjb25zdCBOID0gJCA/ICgwLCByLnN0cilgJHtUfSR7KDAsIG4uZ2V0RXJyb3JQYXRoKSgkLCBuLlR5cGUuU3RyKX1gIDogVDtcbiAgICByZXR1cm4gW2EuZGVmYXVsdC5pbnN0YW5jZVBhdGgsICgwLCByLnN0ckNvbmNhdCkoYS5kZWZhdWx0Lmluc3RhbmNlUGF0aCwgTildO1xuICB9XG4gIGZ1bmN0aW9uIFIoeyBrZXl3b3JkOiBULCBpdDogeyBlcnJTY2hlbWFQYXRoOiAkIH0gfSwgeyBzY2hlbWFQYXRoOiBOLCBwYXJlbnRTY2hlbWE6IEQgfSkge1xuICAgIGxldCB0ID0gRCA/ICQgOiAoMCwgci5zdHIpYCR7JH0vJHtUfWA7XG4gICAgcmV0dXJuIE4gJiYgKHQgPSAoMCwgci5zdHIpYCR7dH0keygwLCBuLmdldEVycm9yUGF0aCkoTiwgbi5UeXBlLlN0cil9YCksIFtnLnNjaGVtYVBhdGgsIHRdO1xuICB9XG4gIGZ1bmN0aW9uIGooVCwgeyBwYXJhbXM6ICQsIG1lc3NhZ2U6IE4gfSwgRCkge1xuICAgIGNvbnN0IHsga2V5d29yZDogdCwgZGF0YTogdSwgc2NoZW1hVmFsdWU6IHMsIGl0OiBpIH0gPSBULCB7IG9wdHM6IGMsIHByb3BlcnR5TmFtZTogbSwgdG9wU2NoZW1hUmVmOiBoLCBzY2hlbWFQYXRoOiBDIH0gPSBpO1xuICAgIEQucHVzaChbZy5rZXl3b3JkLCB0XSwgW2cucGFyYW1zLCB0eXBlb2YgJCA9PSBcImZ1bmN0aW9uXCIgPyAkKFQpIDogJCB8fCAoMCwgci5fKWB7fWBdKSwgYy5tZXNzYWdlcyAmJiBELnB1c2goW2cubWVzc2FnZSwgdHlwZW9mIE4gPT0gXCJmdW5jdGlvblwiID8gTihUKSA6IE5dKSwgYy52ZXJib3NlICYmIEQucHVzaChbZy5zY2hlbWEsIHNdLCBbZy5wYXJlbnRTY2hlbWEsICgwLCByLl8pYCR7aH0ke0N9YF0sIFthLmRlZmF1bHQuZGF0YSwgdV0pLCBtICYmIEQucHVzaChbZy5wcm9wZXJ0eU5hbWUsIG1dKTtcbiAgfVxufSkocnQpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KEFyLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogITAgfSk7XG5Bci5ib29sT3JFbXB0eVNjaGVtYSA9IEFyLnRvcEJvb2xPckVtcHR5U2NoZW1hID0gdm9pZCAwO1xuY29uc3QgQ3MgPSBydCwgVHMgPSBzZSwganMgPSBRZSwgTnMgPSB7XG4gIG1lc3NhZ2U6IFwiYm9vbGVhbiBzY2hlbWEgaXMgZmFsc2VcIlxufTtcbmZ1bmN0aW9uIE9zKGUpIHtcbiAgY29uc3QgeyBnZW46IHIsIHNjaGVtYTogbiwgdmFsaWRhdGVOYW1lOiBhIH0gPSBlO1xuICBuID09PSAhMSA/IFBuKGUsICExKSA6IHR5cGVvZiBuID09IFwib2JqZWN0XCIgJiYgbi4kYXN5bmMgPT09ICEwID8gci5yZXR1cm4oanMuZGVmYXVsdC5kYXRhKSA6IChyLmFzc2lnbigoMCwgVHMuXylgJHthfS5lcnJvcnNgLCBudWxsKSwgci5yZXR1cm4oITApKTtcbn1cbkFyLnRvcEJvb2xPckVtcHR5U2NoZW1hID0gT3M7XG5mdW5jdGlvbiBScyhlLCByKSB7XG4gIGNvbnN0IHsgZ2VuOiBuLCBzY2hlbWE6IGEgfSA9IGU7XG4gIGEgPT09ICExID8gKG4udmFyKHIsICExKSwgUG4oZSkpIDogbi52YXIociwgITApO1xufVxuQXIuYm9vbE9yRW1wdHlTY2hlbWEgPSBScztcbmZ1bmN0aW9uIFBuKGUsIHIpIHtcbiAgY29uc3QgeyBnZW46IG4sIGRhdGE6IGEgfSA9IGUsIGQgPSB7XG4gICAgZ2VuOiBuLFxuICAgIGtleXdvcmQ6IFwiZmFsc2Ugc2NoZW1hXCIsXG4gICAgZGF0YTogYSxcbiAgICBzY2hlbWE6ICExLFxuICAgIHNjaGVtYUNvZGU6ICExLFxuICAgIHNjaGVtYVZhbHVlOiAhMSxcbiAgICBwYXJhbXM6IHt9LFxuICAgIGl0OiBlXG4gIH07XG4gICgwLCBDcy5yZXBvcnRFcnJvcikoZCwgTnMsIHZvaWQgMCwgcik7XG59XG52YXIgdHQgPSB7fSwgdnIgPSB7fTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eSh2ciwgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6ICEwIH0pO1xudnIuZ2V0UnVsZXMgPSB2ci5pc0pTT05UeXBlID0gdm9pZCAwO1xuY29uc3QgQXMgPSBbXCJzdHJpbmdcIiwgXCJudW1iZXJcIiwgXCJpbnRlZ2VyXCIsIFwiYm9vbGVhblwiLCBcIm51bGxcIiwgXCJvYmplY3RcIiwgXCJhcnJheVwiXSwgSXMgPSBuZXcgU2V0KEFzKTtcbmZ1bmN0aW9uIE1zKGUpIHtcbiAgcmV0dXJuIHR5cGVvZiBlID09IFwic3RyaW5nXCIgJiYgSXMuaGFzKGUpO1xufVxudnIuaXNKU09OVHlwZSA9IE1zO1xuZnVuY3Rpb24gRHMoKSB7XG4gIGNvbnN0IGUgPSB7XG4gICAgbnVtYmVyOiB7IHR5cGU6IFwibnVtYmVyXCIsIHJ1bGVzOiBbXSB9LFxuICAgIHN0cmluZzogeyB0eXBlOiBcInN0cmluZ1wiLCBydWxlczogW10gfSxcbiAgICBhcnJheTogeyB0eXBlOiBcImFycmF5XCIsIHJ1bGVzOiBbXSB9LFxuICAgIG9iamVjdDogeyB0eXBlOiBcIm9iamVjdFwiLCBydWxlczogW10gfVxuICB9O1xuICByZXR1cm4ge1xuICAgIHR5cGVzOiB7IC4uLmUsIGludGVnZXI6ICEwLCBib29sZWFuOiAhMCwgbnVsbDogITAgfSxcbiAgICBydWxlczogW3sgcnVsZXM6IFtdIH0sIGUubnVtYmVyLCBlLnN0cmluZywgZS5hcnJheSwgZS5vYmplY3RdLFxuICAgIHBvc3Q6IHsgcnVsZXM6IFtdIH0sXG4gICAgYWxsOiB7fSxcbiAgICBrZXl3b3Jkczoge31cbiAgfTtcbn1cbnZyLmdldFJ1bGVzID0gRHM7XG52YXIgcnIgPSB7fTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShyciwgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6ICEwIH0pO1xucnIuc2hvdWxkVXNlUnVsZSA9IHJyLnNob3VsZFVzZUdyb3VwID0gcnIuc2NoZW1hSGFzUnVsZXNGb3JUeXBlID0gdm9pZCAwO1xuZnVuY3Rpb24gTHMoeyBzY2hlbWE6IGUsIHNlbGY6IHIgfSwgbikge1xuICBjb25zdCBhID0gci5SVUxFUy50eXBlc1tuXTtcbiAgcmV0dXJuIGEgJiYgYSAhPT0gITAgJiYgU24oZSwgYSk7XG59XG5yci5zY2hlbWFIYXNSdWxlc0ZvclR5cGUgPSBMcztcbmZ1bmN0aW9uIFNuKGUsIHIpIHtcbiAgcmV0dXJuIHIucnVsZXMuc29tZSgobikgPT4gQ24oZSwgbikpO1xufVxucnIuc2hvdWxkVXNlR3JvdXAgPSBTbjtcbmZ1bmN0aW9uIENuKGUsIHIpIHtcbiAgdmFyIG47XG4gIHJldHVybiBlW3Iua2V5d29yZF0gIT09IHZvaWQgMCB8fCAoKG4gPSByLmRlZmluaXRpb24uaW1wbGVtZW50cykgPT09IG51bGwgfHwgbiA9PT0gdm9pZCAwID8gdm9pZCAwIDogbi5zb21lKChhKSA9PiBlW2FdICE9PSB2b2lkIDApKTtcbn1cbnJyLnNob3VsZFVzZVJ1bGUgPSBDbjtcbihmdW5jdGlvbihlKSB7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogITAgfSksIGUucmVwb3J0VHlwZUVycm9yID0gZS5jaGVja0RhdGFUeXBlcyA9IGUuY2hlY2tEYXRhVHlwZSA9IGUuY29lcmNlQW5kQ2hlY2tEYXRhVHlwZSA9IGUuZ2V0SlNPTlR5cGVzID0gZS5nZXRTY2hlbWFUeXBlcyA9IGUuRGF0YVR5cGUgPSB2b2lkIDA7XG4gIGNvbnN0IHIgPSB2ciwgbiA9IHJyLCBhID0gcnQsIGQgPSBzZSwgbyA9IGllO1xuICB2YXIgcDtcbiAgKGZ1bmN0aW9uKEQpIHtcbiAgICBEW0QuQ29ycmVjdCA9IDBdID0gXCJDb3JyZWN0XCIsIERbRC5Xcm9uZyA9IDFdID0gXCJXcm9uZ1wiO1xuICB9KShwID0gZS5EYXRhVHlwZSB8fCAoZS5EYXRhVHlwZSA9IHt9KSk7XG4gIGZ1bmN0aW9uIHkoRCkge1xuICAgIGNvbnN0IHQgPSBiKEQudHlwZSk7XG4gICAgaWYgKHQuaW5jbHVkZXMoXCJudWxsXCIpKSB7XG4gICAgICBpZiAoRC5udWxsYWJsZSA9PT0gITEpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcInR5cGU6IG51bGwgY29udHJhZGljdHMgbnVsbGFibGU6IGZhbHNlXCIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoIXQubGVuZ3RoICYmIEQubnVsbGFibGUgIT09IHZvaWQgMClcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdcIm51bGxhYmxlXCIgY2Fubm90IGJlIHVzZWQgd2l0aG91dCBcInR5cGVcIicpO1xuICAgICAgRC5udWxsYWJsZSA9PT0gITAgJiYgdC5wdXNoKFwibnVsbFwiKTtcbiAgICB9XG4gICAgcmV0dXJuIHQ7XG4gIH1cbiAgZS5nZXRTY2hlbWFUeXBlcyA9IHk7XG4gIGZ1bmN0aW9uIGIoRCkge1xuICAgIGNvbnN0IHQgPSBBcnJheS5pc0FycmF5KEQpID8gRCA6IEQgPyBbRF0gOiBbXTtcbiAgICBpZiAodC5ldmVyeShyLmlzSlNPTlR5cGUpKVxuICAgICAgcmV0dXJuIHQ7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwidHlwZSBtdXN0IGJlIEpTT05UeXBlIG9yIEpTT05UeXBlW106IFwiICsgdC5qb2luKFwiLFwiKSk7XG4gIH1cbiAgZS5nZXRKU09OVHlwZXMgPSBiO1xuICBmdW5jdGlvbiB2KEQsIHQpIHtcbiAgICBjb25zdCB7IGdlbjogdSwgZGF0YTogcywgb3B0czogaSB9ID0gRCwgYyA9IFModCwgaS5jb2VyY2VUeXBlcyksIG0gPSB0Lmxlbmd0aCA+IDAgJiYgIShjLmxlbmd0aCA9PT0gMCAmJiB0Lmxlbmd0aCA9PT0gMSAmJiAoMCwgbi5zY2hlbWFIYXNSdWxlc0ZvclR5cGUpKEQsIHRbMF0pKTtcbiAgICBpZiAobSkge1xuICAgICAgY29uc3QgaCA9IGoodCwgcywgaS5zdHJpY3ROdW1iZXJzLCBwLldyb25nKTtcbiAgICAgIHUuaWYoaCwgKCkgPT4ge1xuICAgICAgICBjLmxlbmd0aCA/IHooRCwgdCwgYykgOiAkKEQpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBtO1xuICB9XG4gIGUuY29lcmNlQW5kQ2hlY2tEYXRhVHlwZSA9IHY7XG4gIGNvbnN0IGcgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldChbXCJzdHJpbmdcIiwgXCJudW1iZXJcIiwgXCJpbnRlZ2VyXCIsIFwiYm9vbGVhblwiLCBcIm51bGxcIl0pO1xuICBmdW5jdGlvbiBTKEQsIHQpIHtcbiAgICByZXR1cm4gdCA/IEQuZmlsdGVyKCh1KSA9PiBnLmhhcyh1KSB8fCB0ID09PSBcImFycmF5XCIgJiYgdSA9PT0gXCJhcnJheVwiKSA6IFtdO1xuICB9XG4gIGZ1bmN0aW9uIHooRCwgdCwgdSkge1xuICAgIGNvbnN0IHsgZ2VuOiBzLCBkYXRhOiBpLCBvcHRzOiBjIH0gPSBELCBtID0gcy5sZXQoXCJkYXRhVHlwZVwiLCAoMCwgZC5fKWB0eXBlb2YgJHtpfWApLCBoID0gcy5sZXQoXCJjb2VyY2VkXCIsICgwLCBkLl8pYHVuZGVmaW5lZGApO1xuICAgIGMuY29lcmNlVHlwZXMgPT09IFwiYXJyYXlcIiAmJiBzLmlmKCgwLCBkLl8pYCR7bX0gPT0gJ29iamVjdCcgJiYgQXJyYXkuaXNBcnJheSgke2l9KSAmJiAke2l9Lmxlbmd0aCA9PSAxYCwgKCkgPT4gcy5hc3NpZ24oaSwgKDAsIGQuXylgJHtpfVswXWApLmFzc2lnbihtLCAoMCwgZC5fKWB0eXBlb2YgJHtpfWApLmlmKGoodCwgaSwgYy5zdHJpY3ROdW1iZXJzKSwgKCkgPT4gcy5hc3NpZ24oaCwgaSkpKSwgcy5pZigoMCwgZC5fKWAke2h9ICE9PSB1bmRlZmluZWRgKTtcbiAgICBmb3IgKGNvbnN0IFUgb2YgdSlcbiAgICAgIChnLmhhcyhVKSB8fCBVID09PSBcImFycmF5XCIgJiYgYy5jb2VyY2VUeXBlcyA9PT0gXCJhcnJheVwiKSAmJiBDKFUpO1xuICAgIHMuZWxzZSgpLCAkKEQpLCBzLmVuZElmKCksIHMuaWYoKDAsIGQuXylgJHtofSAhPT0gdW5kZWZpbmVkYCwgKCkgPT4ge1xuICAgICAgcy5hc3NpZ24oaSwgaCksIEwoRCwgaCk7XG4gICAgfSk7XG4gICAgZnVuY3Rpb24gQyhVKSB7XG4gICAgICBzd2l0Y2ggKFUpIHtcbiAgICAgICAgY2FzZSBcInN0cmluZ1wiOlxuICAgICAgICAgIHMuZWxzZUlmKCgwLCBkLl8pYCR7bX0gPT0gXCJudW1iZXJcIiB8fCAke219ID09IFwiYm9vbGVhblwiYCkuYXNzaWduKGgsICgwLCBkLl8pYFwiXCIgKyAke2l9YCkuZWxzZUlmKCgwLCBkLl8pYCR7aX0gPT09IG51bGxgKS5hc3NpZ24oaCwgKDAsIGQuXylgXCJcImApO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgY2FzZSBcIm51bWJlclwiOlxuICAgICAgICAgIHMuZWxzZUlmKCgwLCBkLl8pYCR7bX0gPT0gXCJib29sZWFuXCIgfHwgJHtpfSA9PT0gbnVsbFxuICAgICAgICAgICAgICB8fCAoJHttfSA9PSBcInN0cmluZ1wiICYmICR7aX0gJiYgJHtpfSA9PSArJHtpfSlgKS5hc3NpZ24oaCwgKDAsIGQuXylgKyR7aX1gKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIGNhc2UgXCJpbnRlZ2VyXCI6XG4gICAgICAgICAgcy5lbHNlSWYoKDAsIGQuXylgJHttfSA9PT0gXCJib29sZWFuXCIgfHwgJHtpfSA9PT0gbnVsbFxuICAgICAgICAgICAgICB8fCAoJHttfSA9PT0gXCJzdHJpbmdcIiAmJiAke2l9ICYmICR7aX0gPT0gKyR7aX0gJiYgISgke2l9ICUgMSkpYCkuYXNzaWduKGgsICgwLCBkLl8pYCske2l9YCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICBjYXNlIFwiYm9vbGVhblwiOlxuICAgICAgICAgIHMuZWxzZUlmKCgwLCBkLl8pYCR7aX0gPT09IFwiZmFsc2VcIiB8fCAke2l9ID09PSAwIHx8ICR7aX0gPT09IG51bGxgKS5hc3NpZ24oaCwgITEpLmVsc2VJZigoMCwgZC5fKWAke2l9ID09PSBcInRydWVcIiB8fCAke2l9ID09PSAxYCkuYXNzaWduKGgsICEwKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIGNhc2UgXCJudWxsXCI6XG4gICAgICAgICAgcy5lbHNlSWYoKDAsIGQuXylgJHtpfSA9PT0gXCJcIiB8fCAke2l9ID09PSAwIHx8ICR7aX0gPT09IGZhbHNlYCksIHMuYXNzaWduKGgsIG51bGwpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgY2FzZSBcImFycmF5XCI6XG4gICAgICAgICAgcy5lbHNlSWYoKDAsIGQuXylgJHttfSA9PT0gXCJzdHJpbmdcIiB8fCAke219ID09PSBcIm51bWJlclwiXG4gICAgICAgICAgICAgIHx8ICR7bX0gPT09IFwiYm9vbGVhblwiIHx8ICR7aX0gPT09IG51bGxgKS5hc3NpZ24oaCwgKDAsIGQuXylgWyR7aX1dYCk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIEwoeyBnZW46IEQsIHBhcmVudERhdGE6IHQsIHBhcmVudERhdGFQcm9wZXJ0eTogdSB9LCBzKSB7XG4gICAgRC5pZigoMCwgZC5fKWAke3R9ICE9PSB1bmRlZmluZWRgLCAoKSA9PiBELmFzc2lnbigoMCwgZC5fKWAke3R9WyR7dX1dYCwgcykpO1xuICB9XG4gIGZ1bmN0aW9uIFIoRCwgdCwgdSwgcyA9IHAuQ29ycmVjdCkge1xuICAgIGNvbnN0IGkgPSBzID09PSBwLkNvcnJlY3QgPyBkLm9wZXJhdG9ycy5FUSA6IGQub3BlcmF0b3JzLk5FUTtcbiAgICBsZXQgYztcbiAgICBzd2l0Y2ggKEQpIHtcbiAgICAgIGNhc2UgXCJudWxsXCI6XG4gICAgICAgIHJldHVybiAoMCwgZC5fKWAke3R9ICR7aX0gbnVsbGA7XG4gICAgICBjYXNlIFwiYXJyYXlcIjpcbiAgICAgICAgYyA9ICgwLCBkLl8pYEFycmF5LmlzQXJyYXkoJHt0fSlgO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJvYmplY3RcIjpcbiAgICAgICAgYyA9ICgwLCBkLl8pYCR7dH0gJiYgdHlwZW9mICR7dH0gPT0gXCJvYmplY3RcIiAmJiAhQXJyYXkuaXNBcnJheSgke3R9KWA7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcImludGVnZXJcIjpcbiAgICAgICAgYyA9IG0oKDAsIGQuXylgISgke3R9ICUgMSkgJiYgIWlzTmFOKCR7dH0pYCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcIm51bWJlclwiOlxuICAgICAgICBjID0gbSgpO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiAoMCwgZC5fKWB0eXBlb2YgJHt0fSAke2l9ICR7RH1gO1xuICAgIH1cbiAgICByZXR1cm4gcyA9PT0gcC5Db3JyZWN0ID8gYyA6ICgwLCBkLm5vdCkoYyk7XG4gICAgZnVuY3Rpb24gbShoID0gZC5uaWwpIHtcbiAgICAgIHJldHVybiAoMCwgZC5hbmQpKCgwLCBkLl8pYHR5cGVvZiAke3R9ID09IFwibnVtYmVyXCJgLCBoLCB1ID8gKDAsIGQuXylgaXNGaW5pdGUoJHt0fSlgIDogZC5uaWwpO1xuICAgIH1cbiAgfVxuICBlLmNoZWNrRGF0YVR5cGUgPSBSO1xuICBmdW5jdGlvbiBqKEQsIHQsIHUsIHMpIHtcbiAgICBpZiAoRC5sZW5ndGggPT09IDEpXG4gICAgICByZXR1cm4gUihEWzBdLCB0LCB1LCBzKTtcbiAgICBsZXQgaTtcbiAgICBjb25zdCBjID0gKDAsIG8udG9IYXNoKShEKTtcbiAgICBpZiAoYy5hcnJheSAmJiBjLm9iamVjdCkge1xuICAgICAgY29uc3QgbSA9ICgwLCBkLl8pYHR5cGVvZiAke3R9ICE9IFwib2JqZWN0XCJgO1xuICAgICAgaSA9IGMubnVsbCA/IG0gOiAoMCwgZC5fKWAhJHt0fSB8fCAke219YCwgZGVsZXRlIGMubnVsbCwgZGVsZXRlIGMuYXJyYXksIGRlbGV0ZSBjLm9iamVjdDtcbiAgICB9IGVsc2VcbiAgICAgIGkgPSBkLm5pbDtcbiAgICBjLm51bWJlciAmJiBkZWxldGUgYy5pbnRlZ2VyO1xuICAgIGZvciAoY29uc3QgbSBpbiBjKVxuICAgICAgaSA9ICgwLCBkLmFuZCkoaSwgUihtLCB0LCB1LCBzKSk7XG4gICAgcmV0dXJuIGk7XG4gIH1cbiAgZS5jaGVja0RhdGFUeXBlcyA9IGo7XG4gIGNvbnN0IFQgPSB7XG4gICAgbWVzc2FnZTogKHsgc2NoZW1hOiBEIH0pID0+IGBtdXN0IGJlICR7RH1gLFxuICAgIHBhcmFtczogKHsgc2NoZW1hOiBELCBzY2hlbWFWYWx1ZTogdCB9KSA9PiB0eXBlb2YgRCA9PSBcInN0cmluZ1wiID8gKDAsIGQuXylge3R5cGU6ICR7RH19YCA6ICgwLCBkLl8pYHt0eXBlOiAke3R9fWBcbiAgfTtcbiAgZnVuY3Rpb24gJChEKSB7XG4gICAgY29uc3QgdCA9IE4oRCk7XG4gICAgKDAsIGEucmVwb3J0RXJyb3IpKHQsIFQpO1xuICB9XG4gIGUucmVwb3J0VHlwZUVycm9yID0gJDtcbiAgZnVuY3Rpb24gTihEKSB7XG4gICAgY29uc3QgeyBnZW46IHQsIGRhdGE6IHUsIHNjaGVtYTogcyB9ID0gRCwgaSA9ICgwLCBvLnNjaGVtYVJlZk9yVmFsKShELCBzLCBcInR5cGVcIik7XG4gICAgcmV0dXJuIHtcbiAgICAgIGdlbjogdCxcbiAgICAgIGtleXdvcmQ6IFwidHlwZVwiLFxuICAgICAgZGF0YTogdSxcbiAgICAgIHNjaGVtYTogcy50eXBlLFxuICAgICAgc2NoZW1hQ29kZTogaSxcbiAgICAgIHNjaGVtYVZhbHVlOiBpLFxuICAgICAgcGFyZW50U2NoZW1hOiBzLFxuICAgICAgcGFyYW1zOiB7fSxcbiAgICAgIGl0OiBEXG4gICAgfTtcbiAgfVxufSkodHQpO1xudmFyIE90ID0ge307XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoT3QsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiAhMCB9KTtcbk90LmFzc2lnbkRlZmF1bHRzID0gdm9pZCAwO1xuY29uc3QgU3IgPSBzZSwgenMgPSBpZTtcbmZ1bmN0aW9uIFZzKGUsIHIpIHtcbiAgY29uc3QgeyBwcm9wZXJ0aWVzOiBuLCBpdGVtczogYSB9ID0gZS5zY2hlbWE7XG4gIGlmIChyID09PSBcIm9iamVjdFwiICYmIG4pXG4gICAgZm9yIChjb25zdCBkIGluIG4pXG4gICAgICBKYShlLCBkLCBuW2RdLmRlZmF1bHQpO1xuICBlbHNlXG4gICAgciA9PT0gXCJhcnJheVwiICYmIEFycmF5LmlzQXJyYXkoYSkgJiYgYS5mb3JFYWNoKChkLCBvKSA9PiBKYShlLCBvLCBkLmRlZmF1bHQpKTtcbn1cbk90LmFzc2lnbkRlZmF1bHRzID0gVnM7XG5mdW5jdGlvbiBKYShlLCByLCBuKSB7XG4gIGNvbnN0IHsgZ2VuOiBhLCBjb21wb3NpdGVSdWxlOiBkLCBkYXRhOiBvLCBvcHRzOiBwIH0gPSBlO1xuICBpZiAobiA9PT0gdm9pZCAwKVxuICAgIHJldHVybjtcbiAgY29uc3QgeSA9ICgwLCBTci5fKWAke299JHsoMCwgU3IuZ2V0UHJvcGVydHkpKHIpfWA7XG4gIGlmIChkKSB7XG4gICAgKDAsIHpzLmNoZWNrU3RyaWN0TW9kZSkoZSwgYGRlZmF1bHQgaXMgaWdub3JlZCBmb3I6ICR7eX1gKTtcbiAgICByZXR1cm47XG4gIH1cbiAgbGV0IGIgPSAoMCwgU3IuXylgJHt5fSA9PT0gdW5kZWZpbmVkYDtcbiAgcC51c2VEZWZhdWx0cyA9PT0gXCJlbXB0eVwiICYmIChiID0gKDAsIFNyLl8pYCR7Yn0gfHwgJHt5fSA9PT0gbnVsbCB8fCAke3l9ID09PSBcIlwiYCksIGEuaWYoYiwgKDAsIFNyLl8pYCR7eX0gPSAkeygwLCBTci5zdHJpbmdpZnkpKG4pfWApO1xufVxudmFyIFhlID0ge30sIG5lID0ge307XG5PYmplY3QuZGVmaW5lUHJvcGVydHkobmUsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiAhMCB9KTtcbm5lLnZhbGlkYXRlVW5pb24gPSBuZS52YWxpZGF0ZUFycmF5ID0gbmUudXNlUGF0dGVybiA9IG5lLmNhbGxWYWxpZGF0ZUNvZGUgPSBuZS5zY2hlbWFQcm9wZXJ0aWVzID0gbmUuYWxsU2NoZW1hUHJvcGVydGllcyA9IG5lLm5vUHJvcGVydHlJbkRhdGEgPSBuZS5wcm9wZXJ0eUluRGF0YSA9IG5lLmlzT3duUHJvcGVydHkgPSBuZS5oYXNQcm9wRnVuYyA9IG5lLnJlcG9ydE1pc3NpbmdQcm9wID0gbmUuY2hlY2tNaXNzaW5nUHJvcCA9IG5lLmNoZWNrUmVwb3J0TWlzc2luZ1Byb3AgPSB2b2lkIDA7XG5jb25zdCBwZSA9IHNlLCBZdCA9IGllLCBuciA9IFFlLCBGcyA9IGllO1xuZnVuY3Rpb24gVXMoZSwgcikge1xuICBjb25zdCB7IGdlbjogbiwgZGF0YTogYSwgaXQ6IGQgfSA9IGU7XG4gIG4uaWYoUXQobiwgYSwgciwgZC5vcHRzLm93blByb3BlcnRpZXMpLCAoKSA9PiB7XG4gICAgZS5zZXRQYXJhbXMoeyBtaXNzaW5nUHJvcGVydHk6ICgwLCBwZS5fKWAke3J9YCB9LCAhMCksIGUuZXJyb3IoKTtcbiAgfSk7XG59XG5uZS5jaGVja1JlcG9ydE1pc3NpbmdQcm9wID0gVXM7XG5mdW5jdGlvbiBCcyh7IGdlbjogZSwgZGF0YTogciwgaXQ6IHsgb3B0czogbiB9IH0sIGEsIGQpIHtcbiAgcmV0dXJuICgwLCBwZS5vcikoLi4uYS5tYXAoKG8pID0+ICgwLCBwZS5hbmQpKFF0KGUsIHIsIG8sIG4ub3duUHJvcGVydGllcyksICgwLCBwZS5fKWAke2R9ID0gJHtvfWApKSk7XG59XG5uZS5jaGVja01pc3NpbmdQcm9wID0gQnM7XG5mdW5jdGlvbiBIcyhlLCByKSB7XG4gIGUuc2V0UGFyYW1zKHsgbWlzc2luZ1Byb3BlcnR5OiByIH0sICEwKSwgZS5lcnJvcigpO1xufVxubmUucmVwb3J0TWlzc2luZ1Byb3AgPSBIcztcbmZ1bmN0aW9uIFRuKGUpIHtcbiAgcmV0dXJuIGUuc2NvcGVWYWx1ZShcImZ1bmNcIiwge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvdW5ib3VuZC1tZXRob2RcbiAgICByZWY6IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHksXG4gICAgY29kZTogKDAsIHBlLl8pYE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHlgXG4gIH0pO1xufVxubmUuaGFzUHJvcEZ1bmMgPSBUbjtcbmZ1bmN0aW9uIFh0KGUsIHIsIG4pIHtcbiAgcmV0dXJuICgwLCBwZS5fKWAke1RuKGUpfS5jYWxsKCR7cn0sICR7bn0pYDtcbn1cbm5lLmlzT3duUHJvcGVydHkgPSBYdDtcbmZ1bmN0aW9uIHFzKGUsIHIsIG4sIGEpIHtcbiAgY29uc3QgZCA9ICgwLCBwZS5fKWAke3J9JHsoMCwgcGUuZ2V0UHJvcGVydHkpKG4pfSAhPT0gdW5kZWZpbmVkYDtcbiAgcmV0dXJuIGEgPyAoMCwgcGUuXylgJHtkfSAmJiAke1h0KGUsIHIsIG4pfWAgOiBkO1xufVxubmUucHJvcGVydHlJbkRhdGEgPSBxcztcbmZ1bmN0aW9uIFF0KGUsIHIsIG4sIGEpIHtcbiAgY29uc3QgZCA9ICgwLCBwZS5fKWAke3J9JHsoMCwgcGUuZ2V0UHJvcGVydHkpKG4pfSA9PT0gdW5kZWZpbmVkYDtcbiAgcmV0dXJuIGEgPyAoMCwgcGUub3IpKGQsICgwLCBwZS5ub3QpKFh0KGUsIHIsIG4pKSkgOiBkO1xufVxubmUubm9Qcm9wZXJ0eUluRGF0YSA9IFF0O1xuZnVuY3Rpb24gam4oZSkge1xuICByZXR1cm4gZSA/IE9iamVjdC5rZXlzKGUpLmZpbHRlcigocikgPT4gciAhPT0gXCJfX3Byb3RvX19cIikgOiBbXTtcbn1cbm5lLmFsbFNjaGVtYVByb3BlcnRpZXMgPSBqbjtcbmZ1bmN0aW9uIEdzKGUsIHIpIHtcbiAgcmV0dXJuIGpuKHIpLmZpbHRlcigobikgPT4gISgwLCBZdC5hbHdheXNWYWxpZFNjaGVtYSkoZSwgcltuXSkpO1xufVxubmUuc2NoZW1hUHJvcGVydGllcyA9IEdzO1xuZnVuY3Rpb24gS3MoeyBzY2hlbWFDb2RlOiBlLCBkYXRhOiByLCBpdDogeyBnZW46IG4sIHRvcFNjaGVtYVJlZjogYSwgc2NoZW1hUGF0aDogZCwgZXJyb3JQYXRoOiBvIH0sIGl0OiBwIH0sIHksIGIsIHYpIHtcbiAgY29uc3QgZyA9IHYgPyAoMCwgcGUuXylgJHtlfSwgJHtyfSwgJHthfSR7ZH1gIDogciwgUyA9IFtcbiAgICBbbnIuZGVmYXVsdC5pbnN0YW5jZVBhdGgsICgwLCBwZS5zdHJDb25jYXQpKG5yLmRlZmF1bHQuaW5zdGFuY2VQYXRoLCBvKV0sXG4gICAgW25yLmRlZmF1bHQucGFyZW50RGF0YSwgcC5wYXJlbnREYXRhXSxcbiAgICBbbnIuZGVmYXVsdC5wYXJlbnREYXRhUHJvcGVydHksIHAucGFyZW50RGF0YVByb3BlcnR5XSxcbiAgICBbbnIuZGVmYXVsdC5yb290RGF0YSwgbnIuZGVmYXVsdC5yb290RGF0YV1cbiAgXTtcbiAgcC5vcHRzLmR5bmFtaWNSZWYgJiYgUy5wdXNoKFtuci5kZWZhdWx0LmR5bmFtaWNBbmNob3JzLCBuci5kZWZhdWx0LmR5bmFtaWNBbmNob3JzXSk7XG4gIGNvbnN0IHogPSAoMCwgcGUuXylgJHtnfSwgJHtuLm9iamVjdCguLi5TKX1gO1xuICByZXR1cm4gYiAhPT0gcGUubmlsID8gKDAsIHBlLl8pYCR7eX0uY2FsbCgke2J9LCAke3p9KWAgOiAoMCwgcGUuXylgJHt5fSgke3p9KWA7XG59XG5uZS5jYWxsVmFsaWRhdGVDb2RlID0gS3M7XG5jb25zdCBXcyA9ICgwLCBwZS5fKWBuZXcgUmVnRXhwYDtcbmZ1bmN0aW9uIEpzKHsgZ2VuOiBlLCBpdDogeyBvcHRzOiByIH0gfSwgbikge1xuICBjb25zdCBhID0gci51bmljb2RlUmVnRXhwID8gXCJ1XCIgOiBcIlwiLCB7IHJlZ0V4cDogZCB9ID0gci5jb2RlLCBvID0gZChuLCBhKTtcbiAgcmV0dXJuIGUuc2NvcGVWYWx1ZShcInBhdHRlcm5cIiwge1xuICAgIGtleTogby50b1N0cmluZygpLFxuICAgIHJlZjogbyxcbiAgICBjb2RlOiAoMCwgcGUuXylgJHtkLmNvZGUgPT09IFwibmV3IFJlZ0V4cFwiID8gV3MgOiAoMCwgRnMudXNlRnVuYykoZSwgZCl9KCR7bn0sICR7YX0pYFxuICB9KTtcbn1cbm5lLnVzZVBhdHRlcm4gPSBKcztcbmZ1bmN0aW9uIFpzKGUpIHtcbiAgY29uc3QgeyBnZW46IHIsIGRhdGE6IG4sIGtleXdvcmQ6IGEsIGl0OiBkIH0gPSBlLCBvID0gci5uYW1lKFwidmFsaWRcIik7XG4gIGlmIChkLmFsbEVycm9ycykge1xuICAgIGNvbnN0IHkgPSByLmxldChcInZhbGlkXCIsICEwKTtcbiAgICByZXR1cm4gcCgoKSA9PiByLmFzc2lnbih5LCAhMSkpLCB5O1xuICB9XG4gIHJldHVybiByLnZhcihvLCAhMCksIHAoKCkgPT4gci5icmVhaygpKSwgbztcbiAgZnVuY3Rpb24gcCh5KSB7XG4gICAgY29uc3QgYiA9IHIuY29uc3QoXCJsZW5cIiwgKDAsIHBlLl8pYCR7bn0ubGVuZ3RoYCk7XG4gICAgci5mb3JSYW5nZShcImlcIiwgMCwgYiwgKHYpID0+IHtcbiAgICAgIGUuc3Vic2NoZW1hKHtcbiAgICAgICAga2V5d29yZDogYSxcbiAgICAgICAgZGF0YVByb3A6IHYsXG4gICAgICAgIGRhdGFQcm9wVHlwZTogWXQuVHlwZS5OdW1cbiAgICAgIH0sIG8pLCByLmlmKCgwLCBwZS5ub3QpKG8pLCB5KTtcbiAgICB9KTtcbiAgfVxufVxubmUudmFsaWRhdGVBcnJheSA9IFpzO1xuZnVuY3Rpb24gWXMoZSkge1xuICBjb25zdCB7IGdlbjogciwgc2NoZW1hOiBuLCBrZXl3b3JkOiBhLCBpdDogZCB9ID0gZTtcbiAgaWYgKCFBcnJheS5pc0FycmF5KG4pKVxuICAgIHRocm93IG5ldyBFcnJvcihcImFqdiBpbXBsZW1lbnRhdGlvbiBlcnJvclwiKTtcbiAgaWYgKG4uc29tZSgoYikgPT4gKDAsIFl0LmFsd2F5c1ZhbGlkU2NoZW1hKShkLCBiKSkgJiYgIWQub3B0cy51bmV2YWx1YXRlZClcbiAgICByZXR1cm47XG4gIGNvbnN0IHAgPSByLmxldChcInZhbGlkXCIsICExKSwgeSA9IHIubmFtZShcIl92YWxpZFwiKTtcbiAgci5ibG9jaygoKSA9PiBuLmZvckVhY2goKGIsIHYpID0+IHtcbiAgICBjb25zdCBnID0gZS5zdWJzY2hlbWEoe1xuICAgICAga2V5d29yZDogYSxcbiAgICAgIHNjaGVtYVByb3A6IHYsXG4gICAgICBjb21wb3NpdGVSdWxlOiAhMFxuICAgIH0sIHkpO1xuICAgIHIuYXNzaWduKHAsICgwLCBwZS5fKWAke3B9IHx8ICR7eX1gKSwgZS5tZXJnZVZhbGlkRXZhbHVhdGVkKGcsIHkpIHx8IHIuaWYoKDAsIHBlLm5vdCkocCkpO1xuICB9KSksIGUucmVzdWx0KHAsICgpID0+IGUucmVzZXQoKSwgKCkgPT4gZS5lcnJvcighMCkpO1xufVxubmUudmFsaWRhdGVVbmlvbiA9IFlzO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KFhlLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogITAgfSk7XG5YZS52YWxpZGF0ZUtleXdvcmRVc2FnZSA9IFhlLnZhbGlkU2NoZW1hVHlwZSA9IFhlLmZ1bmNLZXl3b3JkQ29kZSA9IFhlLm1hY3JvS2V5d29yZENvZGUgPSB2b2lkIDA7XG5jb25zdCBDZSA9IHNlLCBtciA9IFFlLCBYcyA9IG5lLCBRcyA9IHJ0O1xuZnVuY3Rpb24geHMoZSwgcikge1xuICBjb25zdCB7IGdlbjogbiwga2V5d29yZDogYSwgc2NoZW1hOiBkLCBwYXJlbnRTY2hlbWE6IG8sIGl0OiBwIH0gPSBlLCB5ID0gci5tYWNyby5jYWxsKHAuc2VsZiwgZCwgbywgcCksIGIgPSBObihuLCBhLCB5KTtcbiAgcC5vcHRzLnZhbGlkYXRlU2NoZW1hICE9PSAhMSAmJiBwLnNlbGYudmFsaWRhdGVTY2hlbWEoeSwgITApO1xuICBjb25zdCB2ID0gbi5uYW1lKFwidmFsaWRcIik7XG4gIGUuc3Vic2NoZW1hKHtcbiAgICBzY2hlbWE6IHksXG4gICAgc2NoZW1hUGF0aDogQ2UubmlsLFxuICAgIGVyclNjaGVtYVBhdGg6IGAke3AuZXJyU2NoZW1hUGF0aH0vJHthfWAsXG4gICAgdG9wU2NoZW1hUmVmOiBiLFxuICAgIGNvbXBvc2l0ZVJ1bGU6ICEwXG4gIH0sIHYpLCBlLnBhc3ModiwgKCkgPT4gZS5lcnJvcighMCkpO1xufVxuWGUubWFjcm9LZXl3b3JkQ29kZSA9IHhzO1xuZnVuY3Rpb24gZXUoZSwgcikge1xuICB2YXIgbjtcbiAgY29uc3QgeyBnZW46IGEsIGtleXdvcmQ6IGQsIHNjaGVtYTogbywgcGFyZW50U2NoZW1hOiBwLCAkZGF0YTogeSwgaXQ6IGIgfSA9IGU7XG4gIHR1KGIsIHIpO1xuICBjb25zdCB2ID0gIXkgJiYgci5jb21waWxlID8gci5jb21waWxlLmNhbGwoYi5zZWxmLCBvLCBwLCBiKSA6IHIudmFsaWRhdGUsIGcgPSBObihhLCBkLCB2KSwgUyA9IGEubGV0KFwidmFsaWRcIik7XG4gIGUuYmxvY2skZGF0YShTLCB6KSwgZS5vaygobiA9IHIudmFsaWQpICE9PSBudWxsICYmIG4gIT09IHZvaWQgMCA/IG4gOiBTKTtcbiAgZnVuY3Rpb24geigpIHtcbiAgICBpZiAoci5lcnJvcnMgPT09ICExKVxuICAgICAgaigpLCByLm1vZGlmeWluZyAmJiBaYShlKSwgVCgoKSA9PiBlLmVycm9yKCkpO1xuICAgIGVsc2Uge1xuICAgICAgY29uc3QgJCA9IHIuYXN5bmMgPyBMKCkgOiBSKCk7XG4gICAgICByLm1vZGlmeWluZyAmJiBaYShlKSwgVCgoKSA9PiBydShlLCAkKSk7XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIEwoKSB7XG4gICAgY29uc3QgJCA9IGEubGV0KFwicnVsZUVycnNcIiwgbnVsbCk7XG4gICAgcmV0dXJuIGEudHJ5KCgpID0+IGooKDAsIENlLl8pYGF3YWl0IGApLCAoTikgPT4gYS5hc3NpZ24oUywgITEpLmlmKCgwLCBDZS5fKWAke059IGluc3RhbmNlb2YgJHtiLlZhbGlkYXRpb25FcnJvcn1gLCAoKSA9PiBhLmFzc2lnbigkLCAoMCwgQ2UuXylgJHtOfS5lcnJvcnNgKSwgKCkgPT4gYS50aHJvdyhOKSkpLCAkO1xuICB9XG4gIGZ1bmN0aW9uIFIoKSB7XG4gICAgY29uc3QgJCA9ICgwLCBDZS5fKWAke2d9LmVycm9yc2A7XG4gICAgcmV0dXJuIGEuYXNzaWduKCQsIG51bGwpLCBqKENlLm5pbCksICQ7XG4gIH1cbiAgZnVuY3Rpb24gaigkID0gci5hc3luYyA/ICgwLCBDZS5fKWBhd2FpdCBgIDogQ2UubmlsKSB7XG4gICAgY29uc3QgTiA9IGIub3B0cy5wYXNzQ29udGV4dCA/IG1yLmRlZmF1bHQudGhpcyA6IG1yLmRlZmF1bHQuc2VsZiwgRCA9ICEoXCJjb21waWxlXCIgaW4gciAmJiAheSB8fCByLnNjaGVtYSA9PT0gITEpO1xuICAgIGEuYXNzaWduKFMsICgwLCBDZS5fKWAkeyR9JHsoMCwgWHMuY2FsbFZhbGlkYXRlQ29kZSkoZSwgZywgTiwgRCl9YCwgci5tb2RpZnlpbmcpO1xuICB9XG4gIGZ1bmN0aW9uIFQoJCkge1xuICAgIHZhciBOO1xuICAgIGEuaWYoKDAsIENlLm5vdCkoKE4gPSByLnZhbGlkKSAhPT0gbnVsbCAmJiBOICE9PSB2b2lkIDAgPyBOIDogUyksICQpO1xuICB9XG59XG5YZS5mdW5jS2V5d29yZENvZGUgPSBldTtcbmZ1bmN0aW9uIFphKGUpIHtcbiAgY29uc3QgeyBnZW46IHIsIGRhdGE6IG4sIGl0OiBhIH0gPSBlO1xuICByLmlmKGEucGFyZW50RGF0YSwgKCkgPT4gci5hc3NpZ24obiwgKDAsIENlLl8pYCR7YS5wYXJlbnREYXRhfVske2EucGFyZW50RGF0YVByb3BlcnR5fV1gKSk7XG59XG5mdW5jdGlvbiBydShlLCByKSB7XG4gIGNvbnN0IHsgZ2VuOiBuIH0gPSBlO1xuICBuLmlmKCgwLCBDZS5fKWBBcnJheS5pc0FycmF5KCR7cn0pYCwgKCkgPT4ge1xuICAgIG4uYXNzaWduKG1yLmRlZmF1bHQudkVycm9ycywgKDAsIENlLl8pYCR7bXIuZGVmYXVsdC52RXJyb3JzfSA9PT0gbnVsbCA/ICR7cn0gOiAke21yLmRlZmF1bHQudkVycm9yc30uY29uY2F0KCR7cn0pYCkuYXNzaWduKG1yLmRlZmF1bHQuZXJyb3JzLCAoMCwgQ2UuXylgJHttci5kZWZhdWx0LnZFcnJvcnN9Lmxlbmd0aGApLCAoMCwgUXMuZXh0ZW5kRXJyb3JzKShlKTtcbiAgfSwgKCkgPT4gZS5lcnJvcigpKTtcbn1cbmZ1bmN0aW9uIHR1KHsgc2NoZW1hRW52OiBlIH0sIHIpIHtcbiAgaWYgKHIuYXN5bmMgJiYgIWUuJGFzeW5jKVxuICAgIHRocm93IG5ldyBFcnJvcihcImFzeW5jIGtleXdvcmQgaW4gc3luYyBzY2hlbWFcIik7XG59XG5mdW5jdGlvbiBObihlLCByLCBuKSB7XG4gIGlmIChuID09PSB2b2lkIDApXG4gICAgdGhyb3cgbmV3IEVycm9yKGBrZXl3b3JkIFwiJHtyfVwiIGZhaWxlZCB0byBjb21waWxlYCk7XG4gIHJldHVybiBlLnNjb3BlVmFsdWUoXCJrZXl3b3JkXCIsIHR5cGVvZiBuID09IFwiZnVuY3Rpb25cIiA/IHsgcmVmOiBuIH0gOiB7IHJlZjogbiwgY29kZTogKDAsIENlLnN0cmluZ2lmeSkobikgfSk7XG59XG5mdW5jdGlvbiBhdShlLCByLCBuID0gITEpIHtcbiAgcmV0dXJuICFyLmxlbmd0aCB8fCByLnNvbWUoKGEpID0+IGEgPT09IFwiYXJyYXlcIiA/IEFycmF5LmlzQXJyYXkoZSkgOiBhID09PSBcIm9iamVjdFwiID8gZSAmJiB0eXBlb2YgZSA9PSBcIm9iamVjdFwiICYmICFBcnJheS5pc0FycmF5KGUpIDogdHlwZW9mIGUgPT0gYSB8fCBuICYmIHR5cGVvZiBlID4gXCJ1XCIpO1xufVxuWGUudmFsaWRTY2hlbWFUeXBlID0gYXU7XG5mdW5jdGlvbiBudSh7IHNjaGVtYTogZSwgb3B0czogciwgc2VsZjogbiwgZXJyU2NoZW1hUGF0aDogYSB9LCBkLCBvKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KGQua2V5d29yZCkgPyAhZC5rZXl3b3JkLmluY2x1ZGVzKG8pIDogZC5rZXl3b3JkICE9PSBvKVxuICAgIHRocm93IG5ldyBFcnJvcihcImFqdiBpbXBsZW1lbnRhdGlvbiBlcnJvclwiKTtcbiAgY29uc3QgcCA9IGQuZGVwZW5kZW5jaWVzO1xuICBpZiAocCAhPSBudWxsICYmIHAuc29tZSgoeSkgPT4gIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLCB5KSkpXG4gICAgdGhyb3cgbmV3IEVycm9yKGBwYXJlbnQgc2NoZW1hIG11c3QgaGF2ZSBkZXBlbmRlbmNpZXMgb2YgJHtvfTogJHtwLmpvaW4oXCIsXCIpfWApO1xuICBpZiAoZC52YWxpZGF0ZVNjaGVtYSAmJiAhZC52YWxpZGF0ZVNjaGVtYShlW29dKSkge1xuICAgIGNvbnN0IGIgPSBga2V5d29yZCBcIiR7b31cIiB2YWx1ZSBpcyBpbnZhbGlkIGF0IHBhdGggXCIke2F9XCI6IGAgKyBuLmVycm9yc1RleHQoZC52YWxpZGF0ZVNjaGVtYS5lcnJvcnMpO1xuICAgIGlmIChyLnZhbGlkYXRlU2NoZW1hID09PSBcImxvZ1wiKVxuICAgICAgbi5sb2dnZXIuZXJyb3IoYik7XG4gICAgZWxzZVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGIpO1xuICB9XG59XG5YZS52YWxpZGF0ZUtleXdvcmRVc2FnZSA9IG51O1xudmFyIGlyID0ge307XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoaXIsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiAhMCB9KTtcbmlyLmV4dGVuZFN1YnNjaGVtYU1vZGUgPSBpci5leHRlbmRTdWJzY2hlbWFEYXRhID0gaXIuZ2V0U3Vic2NoZW1hID0gdm9pZCAwO1xuY29uc3QgWWUgPSBzZSwgT24gPSBpZTtcbmZ1bmN0aW9uIHN1KGUsIHsga2V5d29yZDogciwgc2NoZW1hUHJvcDogbiwgc2NoZW1hOiBhLCBzY2hlbWFQYXRoOiBkLCBlcnJTY2hlbWFQYXRoOiBvLCB0b3BTY2hlbWFSZWY6IHAgfSkge1xuICBpZiAociAhPT0gdm9pZCAwICYmIGEgIT09IHZvaWQgMClcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2JvdGggXCJrZXl3b3JkXCIgYW5kIFwic2NoZW1hXCIgcGFzc2VkLCBvbmx5IG9uZSBhbGxvd2VkJyk7XG4gIGlmIChyICE9PSB2b2lkIDApIHtcbiAgICBjb25zdCB5ID0gZS5zY2hlbWFbcl07XG4gICAgcmV0dXJuIG4gPT09IHZvaWQgMCA/IHtcbiAgICAgIHNjaGVtYTogeSxcbiAgICAgIHNjaGVtYVBhdGg6ICgwLCBZZS5fKWAke2Uuc2NoZW1hUGF0aH0keygwLCBZZS5nZXRQcm9wZXJ0eSkocil9YCxcbiAgICAgIGVyclNjaGVtYVBhdGg6IGAke2UuZXJyU2NoZW1hUGF0aH0vJHtyfWBcbiAgICB9IDoge1xuICAgICAgc2NoZW1hOiB5W25dLFxuICAgICAgc2NoZW1hUGF0aDogKDAsIFllLl8pYCR7ZS5zY2hlbWFQYXRofSR7KDAsIFllLmdldFByb3BlcnR5KShyKX0keygwLCBZZS5nZXRQcm9wZXJ0eSkobil9YCxcbiAgICAgIGVyclNjaGVtYVBhdGg6IGAke2UuZXJyU2NoZW1hUGF0aH0vJHtyfS8keygwLCBPbi5lc2NhcGVGcmFnbWVudCkobil9YFxuICAgIH07XG4gIH1cbiAgaWYgKGEgIT09IHZvaWQgMCkge1xuICAgIGlmIChkID09PSB2b2lkIDAgfHwgbyA9PT0gdm9pZCAwIHx8IHAgPT09IHZvaWQgMClcbiAgICAgIHRocm93IG5ldyBFcnJvcignXCJzY2hlbWFQYXRoXCIsIFwiZXJyU2NoZW1hUGF0aFwiIGFuZCBcInRvcFNjaGVtYVJlZlwiIGFyZSByZXF1aXJlZCB3aXRoIFwic2NoZW1hXCInKTtcbiAgICByZXR1cm4ge1xuICAgICAgc2NoZW1hOiBhLFxuICAgICAgc2NoZW1hUGF0aDogZCxcbiAgICAgIHRvcFNjaGVtYVJlZjogcCxcbiAgICAgIGVyclNjaGVtYVBhdGg6IG9cbiAgICB9O1xuICB9XG4gIHRocm93IG5ldyBFcnJvcignZWl0aGVyIFwia2V5d29yZFwiIG9yIFwic2NoZW1hXCIgbXVzdCBiZSBwYXNzZWQnKTtcbn1cbmlyLmdldFN1YnNjaGVtYSA9IHN1O1xuZnVuY3Rpb24gdXUoZSwgciwgeyBkYXRhUHJvcDogbiwgZGF0YVByb3BUeXBlOiBhLCBkYXRhOiBkLCBkYXRhVHlwZXM6IG8sIHByb3BlcnR5TmFtZTogcCB9KSB7XG4gIGlmIChkICE9PSB2b2lkIDAgJiYgbiAhPT0gdm9pZCAwKVxuICAgIHRocm93IG5ldyBFcnJvcignYm90aCBcImRhdGFcIiBhbmQgXCJkYXRhUHJvcFwiIHBhc3NlZCwgb25seSBvbmUgYWxsb3dlZCcpO1xuICBjb25zdCB7IGdlbjogeSB9ID0gcjtcbiAgaWYgKG4gIT09IHZvaWQgMCkge1xuICAgIGNvbnN0IHsgZXJyb3JQYXRoOiB2LCBkYXRhUGF0aEFycjogZywgb3B0czogUyB9ID0gciwgeiA9IHkubGV0KFwiZGF0YVwiLCAoMCwgWWUuXylgJHtyLmRhdGF9JHsoMCwgWWUuZ2V0UHJvcGVydHkpKG4pfWAsICEwKTtcbiAgICBiKHopLCBlLmVycm9yUGF0aCA9ICgwLCBZZS5zdHIpYCR7dn0keygwLCBPbi5nZXRFcnJvclBhdGgpKG4sIGEsIFMuanNQcm9wZXJ0eVN5bnRheCl9YCwgZS5wYXJlbnREYXRhUHJvcGVydHkgPSAoMCwgWWUuXylgJHtufWAsIGUuZGF0YVBhdGhBcnIgPSBbLi4uZywgZS5wYXJlbnREYXRhUHJvcGVydHldO1xuICB9XG4gIGlmIChkICE9PSB2b2lkIDApIHtcbiAgICBjb25zdCB2ID0gZCBpbnN0YW5jZW9mIFllLk5hbWUgPyBkIDogeS5sZXQoXCJkYXRhXCIsIGQsICEwKTtcbiAgICBiKHYpLCBwICE9PSB2b2lkIDAgJiYgKGUucHJvcGVydHlOYW1lID0gcCk7XG4gIH1cbiAgbyAmJiAoZS5kYXRhVHlwZXMgPSBvKTtcbiAgZnVuY3Rpb24gYih2KSB7XG4gICAgZS5kYXRhID0gdiwgZS5kYXRhTGV2ZWwgPSByLmRhdGFMZXZlbCArIDEsIGUuZGF0YVR5cGVzID0gW10sIHIuZGVmaW5lZFByb3BlcnRpZXMgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpLCBlLnBhcmVudERhdGEgPSByLmRhdGEsIGUuZGF0YU5hbWVzID0gWy4uLnIuZGF0YU5hbWVzLCB2XTtcbiAgfVxufVxuaXIuZXh0ZW5kU3Vic2NoZW1hRGF0YSA9IHV1O1xuZnVuY3Rpb24gZHUoZSwgeyBqdGREaXNjcmltaW5hdG9yOiByLCBqdGRNZXRhZGF0YTogbiwgY29tcG9zaXRlUnVsZTogYSwgY3JlYXRlRXJyb3JzOiBkLCBhbGxFcnJvcnM6IG8gfSkge1xuICBhICE9PSB2b2lkIDAgJiYgKGUuY29tcG9zaXRlUnVsZSA9IGEpLCBkICE9PSB2b2lkIDAgJiYgKGUuY3JlYXRlRXJyb3JzID0gZCksIG8gIT09IHZvaWQgMCAmJiAoZS5hbGxFcnJvcnMgPSBvKSwgZS5qdGREaXNjcmltaW5hdG9yID0gciwgZS5qdGRNZXRhZGF0YSA9IG47XG59XG5pci5leHRlbmRTdWJzY2hlbWFNb2RlID0gZHU7XG52YXIga2UgPSB7fSwgUm4gPSBmdW5jdGlvbiBlKHIsIG4pIHtcbiAgaWYgKHIgPT09IG4pXG4gICAgcmV0dXJuICEwO1xuICBpZiAociAmJiBuICYmIHR5cGVvZiByID09IFwib2JqZWN0XCIgJiYgdHlwZW9mIG4gPT0gXCJvYmplY3RcIikge1xuICAgIGlmIChyLmNvbnN0cnVjdG9yICE9PSBuLmNvbnN0cnVjdG9yKVxuICAgICAgcmV0dXJuICExO1xuICAgIHZhciBhLCBkLCBvO1xuICAgIGlmIChBcnJheS5pc0FycmF5KHIpKSB7XG4gICAgICBpZiAoYSA9IHIubGVuZ3RoLCBhICE9IG4ubGVuZ3RoKVxuICAgICAgICByZXR1cm4gITE7XG4gICAgICBmb3IgKGQgPSBhOyBkLS0gIT09IDA7IClcbiAgICAgICAgaWYgKCFlKHJbZF0sIG5bZF0pKVxuICAgICAgICAgIHJldHVybiAhMTtcbiAgICAgIHJldHVybiAhMDtcbiAgICB9XG4gICAgaWYgKHIuY29uc3RydWN0b3IgPT09IFJlZ0V4cClcbiAgICAgIHJldHVybiByLnNvdXJjZSA9PT0gbi5zb3VyY2UgJiYgci5mbGFncyA9PT0gbi5mbGFncztcbiAgICBpZiAoci52YWx1ZU9mICE9PSBPYmplY3QucHJvdG90eXBlLnZhbHVlT2YpXG4gICAgICByZXR1cm4gci52YWx1ZU9mKCkgPT09IG4udmFsdWVPZigpO1xuICAgIGlmIChyLnRvU3RyaW5nICE9PSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nKVxuICAgICAgcmV0dXJuIHIudG9TdHJpbmcoKSA9PT0gbi50b1N0cmluZygpO1xuICAgIGlmIChvID0gT2JqZWN0LmtleXMociksIGEgPSBvLmxlbmd0aCwgYSAhPT0gT2JqZWN0LmtleXMobikubGVuZ3RoKVxuICAgICAgcmV0dXJuICExO1xuICAgIGZvciAoZCA9IGE7IGQtLSAhPT0gMDsgKVxuICAgICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobiwgb1tkXSkpXG4gICAgICAgIHJldHVybiAhMTtcbiAgICBmb3IgKGQgPSBhOyBkLS0gIT09IDA7ICkge1xuICAgICAgdmFyIHAgPSBvW2RdO1xuICAgICAgaWYgKCFlKHJbcF0sIG5bcF0pKVxuICAgICAgICByZXR1cm4gITE7XG4gICAgfVxuICAgIHJldHVybiAhMDtcbiAgfVxuICByZXR1cm4gciAhPT0gciAmJiBuICE9PSBuO1xufSwgSHQgPSB7fSwgaXUgPSB7XG4gIGdldCBleHBvcnRzKCkge1xuICAgIHJldHVybiBIdDtcbiAgfSxcbiAgc2V0IGV4cG9ydHMoZSkge1xuICAgIEh0ID0gZTtcbiAgfVxufSwgZHIgPSBpdS5leHBvcnRzID0gZnVuY3Rpb24oZSwgciwgbikge1xuICB0eXBlb2YgciA9PSBcImZ1bmN0aW9uXCIgJiYgKG4gPSByLCByID0ge30pLCBuID0gci5jYiB8fCBuO1xuICB2YXIgYSA9IHR5cGVvZiBuID09IFwiZnVuY3Rpb25cIiA/IG4gOiBuLnByZSB8fCBmdW5jdGlvbigpIHtcbiAgfSwgZCA9IG4ucG9zdCB8fCBmdW5jdGlvbigpIHtcbiAgfTtcbiAgbXQociwgYSwgZCwgZSwgXCJcIiwgZSk7XG59O1xuZHIua2V5d29yZHMgPSB7XG4gIGFkZGl0aW9uYWxJdGVtczogITAsXG4gIGl0ZW1zOiAhMCxcbiAgY29udGFpbnM6ICEwLFxuICBhZGRpdGlvbmFsUHJvcGVydGllczogITAsXG4gIHByb3BlcnR5TmFtZXM6ICEwLFxuICBub3Q6ICEwLFxuICBpZjogITAsXG4gIHRoZW46ICEwLFxuICBlbHNlOiAhMFxufTtcbmRyLmFycmF5S2V5d29yZHMgPSB7XG4gIGl0ZW1zOiAhMCxcbiAgYWxsT2Y6ICEwLFxuICBhbnlPZjogITAsXG4gIG9uZU9mOiAhMFxufTtcbmRyLnByb3BzS2V5d29yZHMgPSB7XG4gICRkZWZzOiAhMCxcbiAgZGVmaW5pdGlvbnM6ICEwLFxuICBwcm9wZXJ0aWVzOiAhMCxcbiAgcGF0dGVyblByb3BlcnRpZXM6ICEwLFxuICBkZXBlbmRlbmNpZXM6ICEwXG59O1xuZHIuc2tpcEtleXdvcmRzID0ge1xuICBkZWZhdWx0OiAhMCxcbiAgZW51bTogITAsXG4gIGNvbnN0OiAhMCxcbiAgcmVxdWlyZWQ6ICEwLFxuICBtYXhpbXVtOiAhMCxcbiAgbWluaW11bTogITAsXG4gIGV4Y2x1c2l2ZU1heGltdW06ICEwLFxuICBleGNsdXNpdmVNaW5pbXVtOiAhMCxcbiAgbXVsdGlwbGVPZjogITAsXG4gIG1heExlbmd0aDogITAsXG4gIG1pbkxlbmd0aDogITAsXG4gIHBhdHRlcm46ICEwLFxuICBmb3JtYXQ6ICEwLFxuICBtYXhJdGVtczogITAsXG4gIG1pbkl0ZW1zOiAhMCxcbiAgdW5pcXVlSXRlbXM6ICEwLFxuICBtYXhQcm9wZXJ0aWVzOiAhMCxcbiAgbWluUHJvcGVydGllczogITBcbn07XG5mdW5jdGlvbiBtdChlLCByLCBuLCBhLCBkLCBvLCBwLCB5LCBiLCB2KSB7XG4gIGlmIChhICYmIHR5cGVvZiBhID09IFwib2JqZWN0XCIgJiYgIUFycmF5LmlzQXJyYXkoYSkpIHtcbiAgICByKGEsIGQsIG8sIHAsIHksIGIsIHYpO1xuICAgIGZvciAodmFyIGcgaW4gYSkge1xuICAgICAgdmFyIFMgPSBhW2ddO1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoUykpIHtcbiAgICAgICAgaWYgKGcgaW4gZHIuYXJyYXlLZXl3b3JkcylcbiAgICAgICAgICBmb3IgKHZhciB6ID0gMDsgeiA8IFMubGVuZ3RoOyB6KyspXG4gICAgICAgICAgICBtdChlLCByLCBuLCBTW3pdLCBkICsgXCIvXCIgKyBnICsgXCIvXCIgKyB6LCBvLCBkLCBnLCBhLCB6KTtcbiAgICAgIH0gZWxzZSBpZiAoZyBpbiBkci5wcm9wc0tleXdvcmRzKSB7XG4gICAgICAgIGlmIChTICYmIHR5cGVvZiBTID09IFwib2JqZWN0XCIpXG4gICAgICAgICAgZm9yICh2YXIgTCBpbiBTKVxuICAgICAgICAgICAgbXQoZSwgciwgbiwgU1tMXSwgZCArIFwiL1wiICsgZyArIFwiL1wiICsgb3UoTCksIG8sIGQsIGcsIGEsIEwpO1xuICAgICAgfSBlbHNlXG4gICAgICAgIChnIGluIGRyLmtleXdvcmRzIHx8IGUuYWxsS2V5cyAmJiAhKGcgaW4gZHIuc2tpcEtleXdvcmRzKSkgJiYgbXQoZSwgciwgbiwgUywgZCArIFwiL1wiICsgZywgbywgZCwgZywgYSk7XG4gICAgfVxuICAgIG4oYSwgZCwgbywgcCwgeSwgYiwgdik7XG4gIH1cbn1cbmZ1bmN0aW9uIG91KGUpIHtcbiAgcmV0dXJuIGUucmVwbGFjZSgvfi9nLCBcIn4wXCIpLnJlcGxhY2UoL1xcLy9nLCBcIn4xXCIpO1xufVxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGtlLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogITAgfSk7XG5rZS5nZXRTY2hlbWFSZWZzID0ga2UucmVzb2x2ZVVybCA9IGtlLm5vcm1hbGl6ZUlkID0ga2UuX2dldEZ1bGxQYXRoID0ga2UuZ2V0RnVsbFBhdGggPSBrZS5pbmxpbmVSZWYgPSB2b2lkIDA7XG5jb25zdCBjdSA9IGllLCBsdSA9IFJuLCBmdSA9IEh0LCBodSA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KFtcbiAgXCJ0eXBlXCIsXG4gIFwiZm9ybWF0XCIsXG4gIFwicGF0dGVyblwiLFxuICBcIm1heExlbmd0aFwiLFxuICBcIm1pbkxlbmd0aFwiLFxuICBcIm1heFByb3BlcnRpZXNcIixcbiAgXCJtaW5Qcm9wZXJ0aWVzXCIsXG4gIFwibWF4SXRlbXNcIixcbiAgXCJtaW5JdGVtc1wiLFxuICBcIm1heGltdW1cIixcbiAgXCJtaW5pbXVtXCIsXG4gIFwidW5pcXVlSXRlbXNcIixcbiAgXCJtdWx0aXBsZU9mXCIsXG4gIFwicmVxdWlyZWRcIixcbiAgXCJlbnVtXCIsXG4gIFwiY29uc3RcIlxuXSk7XG5mdW5jdGlvbiBwdShlLCByID0gITApIHtcbiAgcmV0dXJuIHR5cGVvZiBlID09IFwiYm9vbGVhblwiID8gITAgOiByID09PSAhMCA/ICFxdChlKSA6IHIgPyBBbihlKSA8PSByIDogITE7XG59XG5rZS5pbmxpbmVSZWYgPSBwdTtcbmNvbnN0IG11ID0gLyogQF9fUFVSRV9fICovIG5ldyBTZXQoW1xuICBcIiRyZWZcIixcbiAgXCIkcmVjdXJzaXZlUmVmXCIsXG4gIFwiJHJlY3Vyc2l2ZUFuY2hvclwiLFxuICBcIiRkeW5hbWljUmVmXCIsXG4gIFwiJGR5bmFtaWNBbmNob3JcIlxuXSk7XG5mdW5jdGlvbiBxdChlKSB7XG4gIGZvciAoY29uc3QgciBpbiBlKSB7XG4gICAgaWYgKG11LmhhcyhyKSlcbiAgICAgIHJldHVybiAhMDtcbiAgICBjb25zdCBuID0gZVtyXTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShuKSAmJiBuLnNvbWUocXQpIHx8IHR5cGVvZiBuID09IFwib2JqZWN0XCIgJiYgcXQobikpXG4gICAgICByZXR1cm4gITA7XG4gIH1cbiAgcmV0dXJuICExO1xufVxuZnVuY3Rpb24gQW4oZSkge1xuICBsZXQgciA9IDA7XG4gIGZvciAoY29uc3QgbiBpbiBlKSB7XG4gICAgaWYgKG4gPT09IFwiJHJlZlwiKVxuICAgICAgcmV0dXJuIDEgLyAwO1xuICAgIGlmIChyKyssICFodS5oYXMobikgJiYgKHR5cGVvZiBlW25dID09IFwib2JqZWN0XCIgJiYgKDAsIGN1LmVhY2hJdGVtKShlW25dLCAoYSkgPT4gciArPSBBbihhKSksIHIgPT09IDEgLyAwKSlcbiAgICAgIHJldHVybiAxIC8gMDtcbiAgfVxuICByZXR1cm4gcjtcbn1cbmZ1bmN0aW9uIEluKGUsIHIgPSBcIlwiLCBuKSB7XG4gIG4gIT09ICExICYmIChyID0gT3IocikpO1xuICBjb25zdCBhID0gZS5wYXJzZShyKTtcbiAgcmV0dXJuIE1uKGUsIGEpO1xufVxua2UuZ2V0RnVsbFBhdGggPSBJbjtcbmZ1bmN0aW9uIE1uKGUsIHIpIHtcbiAgcmV0dXJuIGUuc2VyaWFsaXplKHIpLnNwbGl0KFwiI1wiKVswXSArIFwiI1wiO1xufVxua2UuX2dldEZ1bGxQYXRoID0gTW47XG5jb25zdCBndSA9IC8jXFwvPyQvO1xuZnVuY3Rpb24gT3IoZSkge1xuICByZXR1cm4gZSA/IGUucmVwbGFjZShndSwgXCJcIikgOiBcIlwiO1xufVxua2Uubm9ybWFsaXplSWQgPSBPcjtcbmZ1bmN0aW9uIF91KGUsIHIsIG4pIHtcbiAgcmV0dXJuIG4gPSBPcihuKSwgZS5yZXNvbHZlKHIsIG4pO1xufVxua2UucmVzb2x2ZVVybCA9IF91O1xuY29uc3QgdnUgPSAvXlthLXpfXVstYS16MC05Ll9dKiQvaTtcbmZ1bmN0aW9uIHl1KGUsIHIpIHtcbiAgaWYgKHR5cGVvZiBlID09IFwiYm9vbGVhblwiKVxuICAgIHJldHVybiB7fTtcbiAgY29uc3QgeyBzY2hlbWFJZDogbiwgdXJpUmVzb2x2ZXI6IGEgfSA9IHRoaXMub3B0cywgZCA9IE9yKGVbbl0gfHwgciksIG8gPSB7IFwiXCI6IGQgfSwgcCA9IEluKGEsIGQsICExKSwgeSA9IHt9LCBiID0gLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKTtcbiAgcmV0dXJuIGZ1KGUsIHsgYWxsS2V5czogITAgfSwgKFMsIHosIEwsIFIpID0+IHtcbiAgICBpZiAoUiA9PT0gdm9pZCAwKVxuICAgICAgcmV0dXJuO1xuICAgIGNvbnN0IGogPSBwICsgejtcbiAgICBsZXQgVCA9IG9bUl07XG4gICAgdHlwZW9mIFNbbl0gPT0gXCJzdHJpbmdcIiAmJiAoVCA9ICQuY2FsbCh0aGlzLCBTW25dKSksIE4uY2FsbCh0aGlzLCBTLiRhbmNob3IpLCBOLmNhbGwodGhpcywgUy4kZHluYW1pY0FuY2hvciksIG9bel0gPSBUO1xuICAgIGZ1bmN0aW9uICQoRCkge1xuICAgICAgY29uc3QgdCA9IHRoaXMub3B0cy51cmlSZXNvbHZlci5yZXNvbHZlO1xuICAgICAgaWYgKEQgPSBPcihUID8gdChULCBEKSA6IEQpLCBiLmhhcyhEKSlcbiAgICAgICAgdGhyb3cgZyhEKTtcbiAgICAgIGIuYWRkKEQpO1xuICAgICAgbGV0IHUgPSB0aGlzLnJlZnNbRF07XG4gICAgICByZXR1cm4gdHlwZW9mIHUgPT0gXCJzdHJpbmdcIiAmJiAodSA9IHRoaXMucmVmc1t1XSksIHR5cGVvZiB1ID09IFwib2JqZWN0XCIgPyB2KFMsIHUuc2NoZW1hLCBEKSA6IEQgIT09IE9yKGopICYmIChEWzBdID09PSBcIiNcIiA/ICh2KFMsIHlbRF0sIEQpLCB5W0RdID0gUykgOiB0aGlzLnJlZnNbRF0gPSBqKSwgRDtcbiAgICB9XG4gICAgZnVuY3Rpb24gTihEKSB7XG4gICAgICBpZiAodHlwZW9mIEQgPT0gXCJzdHJpbmdcIikge1xuICAgICAgICBpZiAoIXZ1LnRlc3QoRCkpXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIGFuY2hvciBcIiR7RH1cImApO1xuICAgICAgICAkLmNhbGwodGhpcywgYCMke0R9YCk7XG4gICAgICB9XG4gICAgfVxuICB9KSwgeTtcbiAgZnVuY3Rpb24gdihTLCB6LCBMKSB7XG4gICAgaWYgKHogIT09IHZvaWQgMCAmJiAhbHUoUywgeikpXG4gICAgICB0aHJvdyBnKEwpO1xuICB9XG4gIGZ1bmN0aW9uIGcoUykge1xuICAgIHJldHVybiBuZXcgRXJyb3IoYHJlZmVyZW5jZSBcIiR7U31cIiByZXNvbHZlcyB0byBtb3JlIHRoYW4gb25lIHNjaGVtYWApO1xuICB9XG59XG5rZS5nZXRTY2hlbWFSZWZzID0geXU7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoSGUsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiAhMCB9KTtcbkhlLmdldERhdGEgPSBIZS5LZXl3b3JkQ3h0ID0gSGUudmFsaWRhdGVGdW5jdGlvbkNvZGUgPSB2b2lkIDA7XG5jb25zdCBEbiA9IEFyLCBZYSA9IHR0LCB4dCA9IHJyLCBidCA9IHR0LCB3dSA9IE90LCBaciA9IFhlLCBEdCA9IGlyLCBZID0gc2UsIHggPSBRZSwgYnUgPSBrZSwgdHIgPSBpZSwgS3IgPSBydDtcbmZ1bmN0aW9uICR1KGUpIHtcbiAgaWYgKFZuKGUpICYmIChGbihlKSwgem4oZSkpKSB7XG4gICAgUHUoZSk7XG4gICAgcmV0dXJuO1xuICB9XG4gIExuKGUsICgpID0+ICgwLCBEbi50b3BCb29sT3JFbXB0eVNjaGVtYSkoZSkpO1xufVxuSGUudmFsaWRhdGVGdW5jdGlvbkNvZGUgPSAkdTtcbmZ1bmN0aW9uIExuKHsgZ2VuOiBlLCB2YWxpZGF0ZU5hbWU6IHIsIHNjaGVtYTogbiwgc2NoZW1hRW52OiBhLCBvcHRzOiBkIH0sIG8pIHtcbiAgZC5jb2RlLmVzNSA/IGUuZnVuYyhyLCAoMCwgWS5fKWAke3guZGVmYXVsdC5kYXRhfSwgJHt4LmRlZmF1bHQudmFsQ3h0fWAsIGEuJGFzeW5jLCAoKSA9PiB7XG4gICAgZS5jb2RlKCgwLCBZLl8pYFwidXNlIHN0cmljdFwiOyAke1hhKG4sIGQpfWApLCBrdShlLCBkKSwgZS5jb2RlKG8pO1xuICB9KSA6IGUuZnVuYyhyLCAoMCwgWS5fKWAke3guZGVmYXVsdC5kYXRhfSwgJHtFdShkKX1gLCBhLiRhc3luYywgKCkgPT4gZS5jb2RlKFhhKG4sIGQpKS5jb2RlKG8pKTtcbn1cbmZ1bmN0aW9uIEV1KGUpIHtcbiAgcmV0dXJuICgwLCBZLl8pYHske3guZGVmYXVsdC5pbnN0YW5jZVBhdGh9PVwiXCIsICR7eC5kZWZhdWx0LnBhcmVudERhdGF9LCAke3guZGVmYXVsdC5wYXJlbnREYXRhUHJvcGVydHl9LCAke3guZGVmYXVsdC5yb290RGF0YX09JHt4LmRlZmF1bHQuZGF0YX0ke2UuZHluYW1pY1JlZiA/ICgwLCBZLl8pYCwgJHt4LmRlZmF1bHQuZHluYW1pY0FuY2hvcnN9PXt9YCA6IFkubmlsfX09e31gO1xufVxuZnVuY3Rpb24ga3UoZSwgcikge1xuICBlLmlmKHguZGVmYXVsdC52YWxDeHQsICgpID0+IHtcbiAgICBlLnZhcih4LmRlZmF1bHQuaW5zdGFuY2VQYXRoLCAoMCwgWS5fKWAke3guZGVmYXVsdC52YWxDeHR9LiR7eC5kZWZhdWx0Lmluc3RhbmNlUGF0aH1gKSwgZS52YXIoeC5kZWZhdWx0LnBhcmVudERhdGEsICgwLCBZLl8pYCR7eC5kZWZhdWx0LnZhbEN4dH0uJHt4LmRlZmF1bHQucGFyZW50RGF0YX1gKSwgZS52YXIoeC5kZWZhdWx0LnBhcmVudERhdGFQcm9wZXJ0eSwgKDAsIFkuXylgJHt4LmRlZmF1bHQudmFsQ3h0fS4ke3guZGVmYXVsdC5wYXJlbnREYXRhUHJvcGVydHl9YCksIGUudmFyKHguZGVmYXVsdC5yb290RGF0YSwgKDAsIFkuXylgJHt4LmRlZmF1bHQudmFsQ3h0fS4ke3guZGVmYXVsdC5yb290RGF0YX1gKSwgci5keW5hbWljUmVmICYmIGUudmFyKHguZGVmYXVsdC5keW5hbWljQW5jaG9ycywgKDAsIFkuXylgJHt4LmRlZmF1bHQudmFsQ3h0fS4ke3guZGVmYXVsdC5keW5hbWljQW5jaG9yc31gKTtcbiAgfSwgKCkgPT4ge1xuICAgIGUudmFyKHguZGVmYXVsdC5pbnN0YW5jZVBhdGgsICgwLCBZLl8pYFwiXCJgKSwgZS52YXIoeC5kZWZhdWx0LnBhcmVudERhdGEsICgwLCBZLl8pYHVuZGVmaW5lZGApLCBlLnZhcih4LmRlZmF1bHQucGFyZW50RGF0YVByb3BlcnR5LCAoMCwgWS5fKWB1bmRlZmluZWRgKSwgZS52YXIoeC5kZWZhdWx0LnJvb3REYXRhLCB4LmRlZmF1bHQuZGF0YSksIHIuZHluYW1pY1JlZiAmJiBlLnZhcih4LmRlZmF1bHQuZHluYW1pY0FuY2hvcnMsICgwLCBZLl8pYHt9YCk7XG4gIH0pO1xufVxuZnVuY3Rpb24gUHUoZSkge1xuICBjb25zdCB7IHNjaGVtYTogciwgb3B0czogbiwgZ2VuOiBhIH0gPSBlO1xuICBMbihlLCAoKSA9PiB7XG4gICAgbi4kY29tbWVudCAmJiByLiRjb21tZW50ICYmIEJuKGUpLCBOdShlKSwgYS5sZXQoeC5kZWZhdWx0LnZFcnJvcnMsIG51bGwpLCBhLmxldCh4LmRlZmF1bHQuZXJyb3JzLCAwKSwgbi51bmV2YWx1YXRlZCAmJiBTdShlKSwgVW4oZSksIEF1KGUpO1xuICB9KTtcbn1cbmZ1bmN0aW9uIFN1KGUpIHtcbiAgY29uc3QgeyBnZW46IHIsIHZhbGlkYXRlTmFtZTogbiB9ID0gZTtcbiAgZS5ldmFsdWF0ZWQgPSByLmNvbnN0KFwiZXZhbHVhdGVkXCIsICgwLCBZLl8pYCR7bn0uZXZhbHVhdGVkYCksIHIuaWYoKDAsIFkuXylgJHtlLmV2YWx1YXRlZH0uZHluYW1pY1Byb3BzYCwgKCkgPT4gci5hc3NpZ24oKDAsIFkuXylgJHtlLmV2YWx1YXRlZH0ucHJvcHNgLCAoMCwgWS5fKWB1bmRlZmluZWRgKSksIHIuaWYoKDAsIFkuXylgJHtlLmV2YWx1YXRlZH0uZHluYW1pY0l0ZW1zYCwgKCkgPT4gci5hc3NpZ24oKDAsIFkuXylgJHtlLmV2YWx1YXRlZH0uaXRlbXNgLCAoMCwgWS5fKWB1bmRlZmluZWRgKSk7XG59XG5mdW5jdGlvbiBYYShlLCByKSB7XG4gIGNvbnN0IG4gPSB0eXBlb2YgZSA9PSBcIm9iamVjdFwiICYmIGVbci5zY2hlbWFJZF07XG4gIHJldHVybiBuICYmIChyLmNvZGUuc291cmNlIHx8IHIuY29kZS5wcm9jZXNzKSA/ICgwLCBZLl8pYC8qIyBzb3VyY2VVUkw9JHtufSAqL2AgOiBZLm5pbDtcbn1cbmZ1bmN0aW9uIEN1KGUsIHIpIHtcbiAgaWYgKFZuKGUpICYmIChGbihlKSwgem4oZSkpKSB7XG4gICAgVHUoZSwgcik7XG4gICAgcmV0dXJuO1xuICB9XG4gICgwLCBEbi5ib29sT3JFbXB0eVNjaGVtYSkoZSwgcik7XG59XG5mdW5jdGlvbiB6bih7IHNjaGVtYTogZSwgc2VsZjogciB9KSB7XG4gIGlmICh0eXBlb2YgZSA9PSBcImJvb2xlYW5cIilcbiAgICByZXR1cm4gIWU7XG4gIGZvciAoY29uc3QgbiBpbiBlKVxuICAgIGlmIChyLlJVTEVTLmFsbFtuXSlcbiAgICAgIHJldHVybiAhMDtcbiAgcmV0dXJuICExO1xufVxuZnVuY3Rpb24gVm4oZSkge1xuICByZXR1cm4gdHlwZW9mIGUuc2NoZW1hICE9IFwiYm9vbGVhblwiO1xufVxuZnVuY3Rpb24gVHUoZSwgcikge1xuICBjb25zdCB7IHNjaGVtYTogbiwgZ2VuOiBhLCBvcHRzOiBkIH0gPSBlO1xuICBkLiRjb21tZW50ICYmIG4uJGNvbW1lbnQgJiYgQm4oZSksIE91KGUpLCBSdShlKTtcbiAgY29uc3QgbyA9IGEuY29uc3QoXCJfZXJyc1wiLCB4LmRlZmF1bHQuZXJyb3JzKTtcbiAgVW4oZSwgbyksIGEudmFyKHIsICgwLCBZLl8pYCR7b30gPT09ICR7eC5kZWZhdWx0LmVycm9yc31gKTtcbn1cbmZ1bmN0aW9uIEZuKGUpIHtcbiAgKDAsIHRyLmNoZWNrVW5rbm93blJ1bGVzKShlKSwganUoZSk7XG59XG5mdW5jdGlvbiBVbihlLCByKSB7XG4gIGlmIChlLm9wdHMuanRkKVxuICAgIHJldHVybiBRYShlLCBbXSwgITEsIHIpO1xuICBjb25zdCBuID0gKDAsIFlhLmdldFNjaGVtYVR5cGVzKShlLnNjaGVtYSksIGEgPSAoMCwgWWEuY29lcmNlQW5kQ2hlY2tEYXRhVHlwZSkoZSwgbik7XG4gIFFhKGUsIG4sICFhLCByKTtcbn1cbmZ1bmN0aW9uIGp1KGUpIHtcbiAgY29uc3QgeyBzY2hlbWE6IHIsIGVyclNjaGVtYVBhdGg6IG4sIG9wdHM6IGEsIHNlbGY6IGQgfSA9IGU7XG4gIHIuJHJlZiAmJiBhLmlnbm9yZUtleXdvcmRzV2l0aFJlZiAmJiAoMCwgdHIuc2NoZW1hSGFzUnVsZXNCdXRSZWYpKHIsIGQuUlVMRVMpICYmIGQubG9nZ2VyLndhcm4oYCRyZWY6IGtleXdvcmRzIGlnbm9yZWQgaW4gc2NoZW1hIGF0IHBhdGggXCIke259XCJgKTtcbn1cbmZ1bmN0aW9uIE51KGUpIHtcbiAgY29uc3QgeyBzY2hlbWE6IHIsIG9wdHM6IG4gfSA9IGU7XG4gIHIuZGVmYXVsdCAhPT0gdm9pZCAwICYmIG4udXNlRGVmYXVsdHMgJiYgbi5zdHJpY3RTY2hlbWEgJiYgKDAsIHRyLmNoZWNrU3RyaWN0TW9kZSkoZSwgXCJkZWZhdWx0IGlzIGlnbm9yZWQgaW4gdGhlIHNjaGVtYSByb290XCIpO1xufVxuZnVuY3Rpb24gT3UoZSkge1xuICBjb25zdCByID0gZS5zY2hlbWFbZS5vcHRzLnNjaGVtYUlkXTtcbiAgciAmJiAoZS5iYXNlSWQgPSAoMCwgYnUucmVzb2x2ZVVybCkoZS5vcHRzLnVyaVJlc29sdmVyLCBlLmJhc2VJZCwgcikpO1xufVxuZnVuY3Rpb24gUnUoZSkge1xuICBpZiAoZS5zY2hlbWEuJGFzeW5jICYmICFlLnNjaGVtYUVudi4kYXN5bmMpXG4gICAgdGhyb3cgbmV3IEVycm9yKFwiYXN5bmMgc2NoZW1hIGluIHN5bmMgc2NoZW1hXCIpO1xufVxuZnVuY3Rpb24gQm4oeyBnZW46IGUsIHNjaGVtYUVudjogciwgc2NoZW1hOiBuLCBlcnJTY2hlbWFQYXRoOiBhLCBvcHRzOiBkIH0pIHtcbiAgY29uc3QgbyA9IG4uJGNvbW1lbnQ7XG4gIGlmIChkLiRjb21tZW50ID09PSAhMClcbiAgICBlLmNvZGUoKDAsIFkuXylgJHt4LmRlZmF1bHQuc2VsZn0ubG9nZ2VyLmxvZygke299KWApO1xuICBlbHNlIGlmICh0eXBlb2YgZC4kY29tbWVudCA9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICBjb25zdCBwID0gKDAsIFkuc3RyKWAke2F9LyRjb21tZW50YCwgeSA9IGUuc2NvcGVWYWx1ZShcInJvb3RcIiwgeyByZWY6IHIucm9vdCB9KTtcbiAgICBlLmNvZGUoKDAsIFkuXylgJHt4LmRlZmF1bHQuc2VsZn0ub3B0cy4kY29tbWVudCgke299LCAke3B9LCAke3l9LnNjaGVtYSlgKTtcbiAgfVxufVxuZnVuY3Rpb24gQXUoZSkge1xuICBjb25zdCB7IGdlbjogciwgc2NoZW1hRW52OiBuLCB2YWxpZGF0ZU5hbWU6IGEsIFZhbGlkYXRpb25FcnJvcjogZCwgb3B0czogbyB9ID0gZTtcbiAgbi4kYXN5bmMgPyByLmlmKCgwLCBZLl8pYCR7eC5kZWZhdWx0LmVycm9yc30gPT09IDBgLCAoKSA9PiByLnJldHVybih4LmRlZmF1bHQuZGF0YSksICgpID0+IHIudGhyb3coKDAsIFkuXylgbmV3ICR7ZH0oJHt4LmRlZmF1bHQudkVycm9yc30pYCkpIDogKHIuYXNzaWduKCgwLCBZLl8pYCR7YX0uZXJyb3JzYCwgeC5kZWZhdWx0LnZFcnJvcnMpLCBvLnVuZXZhbHVhdGVkICYmIEl1KGUpLCByLnJldHVybigoMCwgWS5fKWAke3guZGVmYXVsdC5lcnJvcnN9ID09PSAwYCkpO1xufVxuZnVuY3Rpb24gSXUoeyBnZW46IGUsIGV2YWx1YXRlZDogciwgcHJvcHM6IG4sIGl0ZW1zOiBhIH0pIHtcbiAgbiBpbnN0YW5jZW9mIFkuTmFtZSAmJiBlLmFzc2lnbigoMCwgWS5fKWAke3J9LnByb3BzYCwgbiksIGEgaW5zdGFuY2VvZiBZLk5hbWUgJiYgZS5hc3NpZ24oKDAsIFkuXylgJHtyfS5pdGVtc2AsIGEpO1xufVxuZnVuY3Rpb24gUWEoZSwgciwgbiwgYSkge1xuICBjb25zdCB7IGdlbjogZCwgc2NoZW1hOiBvLCBkYXRhOiBwLCBhbGxFcnJvcnM6IHksIG9wdHM6IGIsIHNlbGY6IHYgfSA9IGUsIHsgUlVMRVM6IGcgfSA9IHY7XG4gIGlmIChvLiRyZWYgJiYgKGIuaWdub3JlS2V5d29yZHNXaXRoUmVmIHx8ICEoMCwgdHIuc2NoZW1hSGFzUnVsZXNCdXRSZWYpKG8sIGcpKSkge1xuICAgIGQuYmxvY2soKCkgPT4gR24oZSwgXCIkcmVmXCIsIGcuYWxsLiRyZWYuZGVmaW5pdGlvbikpO1xuICAgIHJldHVybjtcbiAgfVxuICBiLmp0ZCB8fCBNdShlLCByKSwgZC5ibG9jaygoKSA9PiB7XG4gICAgZm9yIChjb25zdCB6IG9mIGcucnVsZXMpXG4gICAgICBTKHopO1xuICAgIFMoZy5wb3N0KTtcbiAgfSk7XG4gIGZ1bmN0aW9uIFMoeikge1xuICAgICgwLCB4dC5zaG91bGRVc2VHcm91cCkobywgeikgJiYgKHoudHlwZSA/IChkLmlmKCgwLCBidC5jaGVja0RhdGFUeXBlKSh6LnR5cGUsIHAsIGIuc3RyaWN0TnVtYmVycykpLCB4YShlLCB6KSwgci5sZW5ndGggPT09IDEgJiYgclswXSA9PT0gei50eXBlICYmIG4gJiYgKGQuZWxzZSgpLCAoMCwgYnQucmVwb3J0VHlwZUVycm9yKShlKSksIGQuZW5kSWYoKSkgOiB4YShlLCB6KSwgeSB8fCBkLmlmKCgwLCBZLl8pYCR7eC5kZWZhdWx0LmVycm9yc30gPT09ICR7YSB8fCAwfWApKTtcbiAgfVxufVxuZnVuY3Rpb24geGEoZSwgcikge1xuICBjb25zdCB7IGdlbjogbiwgc2NoZW1hOiBhLCBvcHRzOiB7IHVzZURlZmF1bHRzOiBkIH0gfSA9IGU7XG4gIGQgJiYgKDAsIHd1LmFzc2lnbkRlZmF1bHRzKShlLCByLnR5cGUpLCBuLmJsb2NrKCgpID0+IHtcbiAgICBmb3IgKGNvbnN0IG8gb2Ygci5ydWxlcylcbiAgICAgICgwLCB4dC5zaG91bGRVc2VSdWxlKShhLCBvKSAmJiBHbihlLCBvLmtleXdvcmQsIG8uZGVmaW5pdGlvbiwgci50eXBlKTtcbiAgfSk7XG59XG5mdW5jdGlvbiBNdShlLCByKSB7XG4gIGUuc2NoZW1hRW52Lm1ldGEgfHwgIWUub3B0cy5zdHJpY3RUeXBlcyB8fCAoRHUoZSwgciksIGUub3B0cy5hbGxvd1VuaW9uVHlwZXMgfHwgTHUoZSwgciksIHp1KGUsIGUuZGF0YVR5cGVzKSk7XG59XG5mdW5jdGlvbiBEdShlLCByKSB7XG4gIGlmIChyLmxlbmd0aCkge1xuICAgIGlmICghZS5kYXRhVHlwZXMubGVuZ3RoKSB7XG4gICAgICBlLmRhdGFUeXBlcyA9IHI7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHIuZm9yRWFjaCgobikgPT4ge1xuICAgICAgSG4oZS5kYXRhVHlwZXMsIG4pIHx8IGVhKGUsIGB0eXBlIFwiJHtufVwiIG5vdCBhbGxvd2VkIGJ5IGNvbnRleHQgXCIke2UuZGF0YVR5cGVzLmpvaW4oXCIsXCIpfVwiYCk7XG4gICAgfSksIEZ1KGUsIHIpO1xuICB9XG59XG5mdW5jdGlvbiBMdShlLCByKSB7XG4gIHIubGVuZ3RoID4gMSAmJiAhKHIubGVuZ3RoID09PSAyICYmIHIuaW5jbHVkZXMoXCJudWxsXCIpKSAmJiBlYShlLCBcInVzZSBhbGxvd1VuaW9uVHlwZXMgdG8gYWxsb3cgdW5pb24gdHlwZSBrZXl3b3JkXCIpO1xufVxuZnVuY3Rpb24genUoZSwgcikge1xuICBjb25zdCBuID0gZS5zZWxmLlJVTEVTLmFsbDtcbiAgZm9yIChjb25zdCBhIGluIG4pIHtcbiAgICBjb25zdCBkID0gblthXTtcbiAgICBpZiAodHlwZW9mIGQgPT0gXCJvYmplY3RcIiAmJiAoMCwgeHQuc2hvdWxkVXNlUnVsZSkoZS5zY2hlbWEsIGQpKSB7XG4gICAgICBjb25zdCB7IHR5cGU6IG8gfSA9IGQuZGVmaW5pdGlvbjtcbiAgICAgIG8ubGVuZ3RoICYmICFvLnNvbWUoKHApID0+IFZ1KHIsIHApKSAmJiBlYShlLCBgbWlzc2luZyB0eXBlIFwiJHtvLmpvaW4oXCIsXCIpfVwiIGZvciBrZXl3b3JkIFwiJHthfVwiYCk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBWdShlLCByKSB7XG4gIHJldHVybiBlLmluY2x1ZGVzKHIpIHx8IHIgPT09IFwibnVtYmVyXCIgJiYgZS5pbmNsdWRlcyhcImludGVnZXJcIik7XG59XG5mdW5jdGlvbiBIbihlLCByKSB7XG4gIHJldHVybiBlLmluY2x1ZGVzKHIpIHx8IHIgPT09IFwiaW50ZWdlclwiICYmIGUuaW5jbHVkZXMoXCJudW1iZXJcIik7XG59XG5mdW5jdGlvbiBGdShlLCByKSB7XG4gIGNvbnN0IG4gPSBbXTtcbiAgZm9yIChjb25zdCBhIG9mIGUuZGF0YVR5cGVzKVxuICAgIEhuKHIsIGEpID8gbi5wdXNoKGEpIDogci5pbmNsdWRlcyhcImludGVnZXJcIikgJiYgYSA9PT0gXCJudW1iZXJcIiAmJiBuLnB1c2goXCJpbnRlZ2VyXCIpO1xuICBlLmRhdGFUeXBlcyA9IG47XG59XG5mdW5jdGlvbiBlYShlLCByKSB7XG4gIGNvbnN0IG4gPSBlLnNjaGVtYUVudi5iYXNlSWQgKyBlLmVyclNjaGVtYVBhdGg7XG4gIHIgKz0gYCBhdCBcIiR7bn1cIiAoc3RyaWN0VHlwZXMpYCwgKDAsIHRyLmNoZWNrU3RyaWN0TW9kZSkoZSwgciwgZS5vcHRzLnN0cmljdFR5cGVzKTtcbn1cbmNsYXNzIHFuIHtcbiAgY29uc3RydWN0b3IociwgbiwgYSkge1xuICAgIGlmICgoMCwgWnIudmFsaWRhdGVLZXl3b3JkVXNhZ2UpKHIsIG4sIGEpLCB0aGlzLmdlbiA9IHIuZ2VuLCB0aGlzLmFsbEVycm9ycyA9IHIuYWxsRXJyb3JzLCB0aGlzLmtleXdvcmQgPSBhLCB0aGlzLmRhdGEgPSByLmRhdGEsIHRoaXMuc2NoZW1hID0gci5zY2hlbWFbYV0sIHRoaXMuJGRhdGEgPSBuLiRkYXRhICYmIHIub3B0cy4kZGF0YSAmJiB0aGlzLnNjaGVtYSAmJiB0aGlzLnNjaGVtYS4kZGF0YSwgdGhpcy5zY2hlbWFWYWx1ZSA9ICgwLCB0ci5zY2hlbWFSZWZPclZhbCkociwgdGhpcy5zY2hlbWEsIGEsIHRoaXMuJGRhdGEpLCB0aGlzLnNjaGVtYVR5cGUgPSBuLnNjaGVtYVR5cGUsIHRoaXMucGFyZW50U2NoZW1hID0gci5zY2hlbWEsIHRoaXMucGFyYW1zID0ge30sIHRoaXMuaXQgPSByLCB0aGlzLmRlZiA9IG4sIHRoaXMuJGRhdGEpXG4gICAgICB0aGlzLnNjaGVtYUNvZGUgPSByLmdlbi5jb25zdChcInZTY2hlbWFcIiwgS24odGhpcy4kZGF0YSwgcikpO1xuICAgIGVsc2UgaWYgKHRoaXMuc2NoZW1hQ29kZSA9IHRoaXMuc2NoZW1hVmFsdWUsICEoMCwgWnIudmFsaWRTY2hlbWFUeXBlKSh0aGlzLnNjaGVtYSwgbi5zY2hlbWFUeXBlLCBuLmFsbG93VW5kZWZpbmVkKSlcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHthfSB2YWx1ZSBtdXN0IGJlICR7SlNPTi5zdHJpbmdpZnkobi5zY2hlbWFUeXBlKX1gKTtcbiAgICAoXCJjb2RlXCIgaW4gbiA/IG4udHJhY2tFcnJvcnMgOiBuLmVycm9ycyAhPT0gITEpICYmICh0aGlzLmVycnNDb3VudCA9IHIuZ2VuLmNvbnN0KFwiX2VycnNcIiwgeC5kZWZhdWx0LmVycm9ycykpO1xuICB9XG4gIHJlc3VsdChyLCBuLCBhKSB7XG4gICAgdGhpcy5mYWlsUmVzdWx0KCgwLCBZLm5vdCkociksIG4sIGEpO1xuICB9XG4gIGZhaWxSZXN1bHQociwgbiwgYSkge1xuICAgIHRoaXMuZ2VuLmlmKHIpLCBhID8gYSgpIDogdGhpcy5lcnJvcigpLCBuID8gKHRoaXMuZ2VuLmVsc2UoKSwgbigpLCB0aGlzLmFsbEVycm9ycyAmJiB0aGlzLmdlbi5lbmRJZigpKSA6IHRoaXMuYWxsRXJyb3JzID8gdGhpcy5nZW4uZW5kSWYoKSA6IHRoaXMuZ2VuLmVsc2UoKTtcbiAgfVxuICBwYXNzKHIsIG4pIHtcbiAgICB0aGlzLmZhaWxSZXN1bHQoKDAsIFkubm90KShyKSwgdm9pZCAwLCBuKTtcbiAgfVxuICBmYWlsKHIpIHtcbiAgICBpZiAociA9PT0gdm9pZCAwKSB7XG4gICAgICB0aGlzLmVycm9yKCksIHRoaXMuYWxsRXJyb3JzIHx8IHRoaXMuZ2VuLmlmKCExKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5nZW4uaWYociksIHRoaXMuZXJyb3IoKSwgdGhpcy5hbGxFcnJvcnMgPyB0aGlzLmdlbi5lbmRJZigpIDogdGhpcy5nZW4uZWxzZSgpO1xuICB9XG4gIGZhaWwkZGF0YShyKSB7XG4gICAgaWYgKCF0aGlzLiRkYXRhKVxuICAgICAgcmV0dXJuIHRoaXMuZmFpbChyKTtcbiAgICBjb25zdCB7IHNjaGVtYUNvZGU6IG4gfSA9IHRoaXM7XG4gICAgdGhpcy5mYWlsKCgwLCBZLl8pYCR7bn0gIT09IHVuZGVmaW5lZCAmJiAoJHsoMCwgWS5vcikodGhpcy5pbnZhbGlkJGRhdGEoKSwgcil9KWApO1xuICB9XG4gIGVycm9yKHIsIG4sIGEpIHtcbiAgICBpZiAobikge1xuICAgICAgdGhpcy5zZXRQYXJhbXMobiksIHRoaXMuX2Vycm9yKHIsIGEpLCB0aGlzLnNldFBhcmFtcyh7fSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX2Vycm9yKHIsIGEpO1xuICB9XG4gIF9lcnJvcihyLCBuKSB7XG4gICAgKHIgPyBLci5yZXBvcnRFeHRyYUVycm9yIDogS3IucmVwb3J0RXJyb3IpKHRoaXMsIHRoaXMuZGVmLmVycm9yLCBuKTtcbiAgfVxuICAkZGF0YUVycm9yKCkge1xuICAgICgwLCBLci5yZXBvcnRFcnJvcikodGhpcywgdGhpcy5kZWYuJGRhdGFFcnJvciB8fCBLci5rZXl3b3JkJERhdGFFcnJvcik7XG4gIH1cbiAgcmVzZXQoKSB7XG4gICAgaWYgKHRoaXMuZXJyc0NvdW50ID09PSB2b2lkIDApXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2FkZCBcInRyYWNrRXJyb3JzXCIgdG8ga2V5d29yZCBkZWZpbml0aW9uJyk7XG4gICAgKDAsIEtyLnJlc2V0RXJyb3JzQ291bnQpKHRoaXMuZ2VuLCB0aGlzLmVycnNDb3VudCk7XG4gIH1cbiAgb2socikge1xuICAgIHRoaXMuYWxsRXJyb3JzIHx8IHRoaXMuZ2VuLmlmKHIpO1xuICB9XG4gIHNldFBhcmFtcyhyLCBuKSB7XG4gICAgbiA/IE9iamVjdC5hc3NpZ24odGhpcy5wYXJhbXMsIHIpIDogdGhpcy5wYXJhbXMgPSByO1xuICB9XG4gIGJsb2NrJGRhdGEociwgbiwgYSA9IFkubmlsKSB7XG4gICAgdGhpcy5nZW4uYmxvY2soKCkgPT4ge1xuICAgICAgdGhpcy5jaGVjayRkYXRhKHIsIGEpLCBuKCk7XG4gICAgfSk7XG4gIH1cbiAgY2hlY2skZGF0YShyID0gWS5uaWwsIG4gPSBZLm5pbCkge1xuICAgIGlmICghdGhpcy4kZGF0YSlcbiAgICAgIHJldHVybjtcbiAgICBjb25zdCB7IGdlbjogYSwgc2NoZW1hQ29kZTogZCwgc2NoZW1hVHlwZTogbywgZGVmOiBwIH0gPSB0aGlzO1xuICAgIGEuaWYoKDAsIFkub3IpKCgwLCBZLl8pYCR7ZH0gPT09IHVuZGVmaW5lZGAsIG4pKSwgciAhPT0gWS5uaWwgJiYgYS5hc3NpZ24ociwgITApLCAoby5sZW5ndGggfHwgcC52YWxpZGF0ZVNjaGVtYSkgJiYgKGEuZWxzZUlmKHRoaXMuaW52YWxpZCRkYXRhKCkpLCB0aGlzLiRkYXRhRXJyb3IoKSwgciAhPT0gWS5uaWwgJiYgYS5hc3NpZ24ociwgITEpKSwgYS5lbHNlKCk7XG4gIH1cbiAgaW52YWxpZCRkYXRhKCkge1xuICAgIGNvbnN0IHsgZ2VuOiByLCBzY2hlbWFDb2RlOiBuLCBzY2hlbWFUeXBlOiBhLCBkZWY6IGQsIGl0OiBvIH0gPSB0aGlzO1xuICAgIHJldHVybiAoMCwgWS5vcikocCgpLCB5KCkpO1xuICAgIGZ1bmN0aW9uIHAoKSB7XG4gICAgICBpZiAoYS5sZW5ndGgpIHtcbiAgICAgICAgaWYgKCEobiBpbnN0YW5jZW9mIFkuTmFtZSkpXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiYWp2IGltcGxlbWVudGF0aW9uIGVycm9yXCIpO1xuICAgICAgICBjb25zdCBiID0gQXJyYXkuaXNBcnJheShhKSA/IGEgOiBbYV07XG4gICAgICAgIHJldHVybiAoMCwgWS5fKWAkeygwLCBidC5jaGVja0RhdGFUeXBlcykoYiwgbiwgby5vcHRzLnN0cmljdE51bWJlcnMsIGJ0LkRhdGFUeXBlLldyb25nKX1gO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFkubmlsO1xuICAgIH1cbiAgICBmdW5jdGlvbiB5KCkge1xuICAgICAgaWYgKGQudmFsaWRhdGVTY2hlbWEpIHtcbiAgICAgICAgY29uc3QgYiA9IHIuc2NvcGVWYWx1ZShcInZhbGlkYXRlJGRhdGFcIiwgeyByZWY6IGQudmFsaWRhdGVTY2hlbWEgfSk7XG4gICAgICAgIHJldHVybiAoMCwgWS5fKWAhJHtifSgke259KWA7XG4gICAgICB9XG4gICAgICByZXR1cm4gWS5uaWw7XG4gICAgfVxuICB9XG4gIHN1YnNjaGVtYShyLCBuKSB7XG4gICAgY29uc3QgYSA9ICgwLCBEdC5nZXRTdWJzY2hlbWEpKHRoaXMuaXQsIHIpO1xuICAgICgwLCBEdC5leHRlbmRTdWJzY2hlbWFEYXRhKShhLCB0aGlzLml0LCByKSwgKDAsIER0LmV4dGVuZFN1YnNjaGVtYU1vZGUpKGEsIHIpO1xuICAgIGNvbnN0IGQgPSB7IC4uLnRoaXMuaXQsIC4uLmEsIGl0ZW1zOiB2b2lkIDAsIHByb3BzOiB2b2lkIDAgfTtcbiAgICByZXR1cm4gQ3UoZCwgbiksIGQ7XG4gIH1cbiAgbWVyZ2VFdmFsdWF0ZWQociwgbikge1xuICAgIGNvbnN0IHsgaXQ6IGEsIGdlbjogZCB9ID0gdGhpcztcbiAgICBhLm9wdHMudW5ldmFsdWF0ZWQgJiYgKGEucHJvcHMgIT09ICEwICYmIHIucHJvcHMgIT09IHZvaWQgMCAmJiAoYS5wcm9wcyA9IHRyLm1lcmdlRXZhbHVhdGVkLnByb3BzKGQsIHIucHJvcHMsIGEucHJvcHMsIG4pKSwgYS5pdGVtcyAhPT0gITAgJiYgci5pdGVtcyAhPT0gdm9pZCAwICYmIChhLml0ZW1zID0gdHIubWVyZ2VFdmFsdWF0ZWQuaXRlbXMoZCwgci5pdGVtcywgYS5pdGVtcywgbikpKTtcbiAgfVxuICBtZXJnZVZhbGlkRXZhbHVhdGVkKHIsIG4pIHtcbiAgICBjb25zdCB7IGl0OiBhLCBnZW46IGQgfSA9IHRoaXM7XG4gICAgaWYgKGEub3B0cy51bmV2YWx1YXRlZCAmJiAoYS5wcm9wcyAhPT0gITAgfHwgYS5pdGVtcyAhPT0gITApKVxuICAgICAgcmV0dXJuIGQuaWYobiwgKCkgPT4gdGhpcy5tZXJnZUV2YWx1YXRlZChyLCBZLk5hbWUpKSwgITA7XG4gIH1cbn1cbkhlLktleXdvcmRDeHQgPSBxbjtcbmZ1bmN0aW9uIEduKGUsIHIsIG4sIGEpIHtcbiAgY29uc3QgZCA9IG5ldyBxbihlLCBuLCByKTtcbiAgXCJjb2RlXCIgaW4gbiA/IG4uY29kZShkLCBhKSA6IGQuJGRhdGEgJiYgbi52YWxpZGF0ZSA/ICgwLCBaci5mdW5jS2V5d29yZENvZGUpKGQsIG4pIDogXCJtYWNyb1wiIGluIG4gPyAoMCwgWnIubWFjcm9LZXl3b3JkQ29kZSkoZCwgbikgOiAobi5jb21waWxlIHx8IG4udmFsaWRhdGUpICYmICgwLCBaci5mdW5jS2V5d29yZENvZGUpKGQsIG4pO1xufVxuY29uc3QgVXUgPSAvXlxcLyg/Oltefl18fjB8fjEpKiQvLCBCdSA9IC9eKFswLTldKykoI3xcXC8oPzpbXn5dfH4wfH4xKSopPyQvO1xuZnVuY3Rpb24gS24oZSwgeyBkYXRhTGV2ZWw6IHIsIGRhdGFOYW1lczogbiwgZGF0YVBhdGhBcnI6IGEgfSkge1xuICBsZXQgZCwgbztcbiAgaWYgKGUgPT09IFwiXCIpXG4gICAgcmV0dXJuIHguZGVmYXVsdC5yb290RGF0YTtcbiAgaWYgKGVbMF0gPT09IFwiL1wiKSB7XG4gICAgaWYgKCFVdS50ZXN0KGUpKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIEpTT04tcG9pbnRlcjogJHtlfWApO1xuICAgIGQgPSBlLCBvID0geC5kZWZhdWx0LnJvb3REYXRhO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IHYgPSBCdS5leGVjKGUpO1xuICAgIGlmICghdilcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBKU09OLXBvaW50ZXI6ICR7ZX1gKTtcbiAgICBjb25zdCBnID0gK3ZbMV07XG4gICAgaWYgKGQgPSB2WzJdLCBkID09PSBcIiNcIikge1xuICAgICAgaWYgKGcgPj0gcilcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGIoXCJwcm9wZXJ0eS9pbmRleFwiLCBnKSk7XG4gICAgICByZXR1cm4gYVtyIC0gZ107XG4gICAgfVxuICAgIGlmIChnID4gcilcbiAgICAgIHRocm93IG5ldyBFcnJvcihiKFwiZGF0YVwiLCBnKSk7XG4gICAgaWYgKG8gPSBuW3IgLSBnXSwgIWQpXG4gICAgICByZXR1cm4gbztcbiAgfVxuICBsZXQgcCA9IG87XG4gIGNvbnN0IHkgPSBkLnNwbGl0KFwiL1wiKTtcbiAgZm9yIChjb25zdCB2IG9mIHkpXG4gICAgdiAmJiAobyA9ICgwLCBZLl8pYCR7b30keygwLCBZLmdldFByb3BlcnR5KSgoMCwgdHIudW5lc2NhcGVKc29uUG9pbnRlcikodikpfWAsIHAgPSAoMCwgWS5fKWAke3B9ICYmICR7b31gKTtcbiAgcmV0dXJuIHA7XG4gIGZ1bmN0aW9uIGIodiwgZykge1xuICAgIHJldHVybiBgQ2Fubm90IGFjY2VzcyAke3Z9ICR7Z30gbGV2ZWxzIHVwLCBjdXJyZW50IGxldmVsIGlzICR7cn1gO1xuICB9XG59XG5IZS5nZXREYXRhID0gS247XG52YXIgYXQgPSB7fTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShhdCwgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6ICEwIH0pO1xuY2xhc3MgSHUgZXh0ZW5kcyBFcnJvciB7XG4gIGNvbnN0cnVjdG9yKHIpIHtcbiAgICBzdXBlcihcInZhbGlkYXRpb24gZmFpbGVkXCIpLCB0aGlzLmVycm9ycyA9IHIsIHRoaXMuYWp2ID0gdGhpcy52YWxpZGF0aW9uID0gITA7XG4gIH1cbn1cbmF0LmRlZmF1bHQgPSBIdTtcbnZhciBudCA9IHt9O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KG50LCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogITAgfSk7XG5jb25zdCBMdCA9IGtlO1xuY2xhc3MgcXUgZXh0ZW5kcyBFcnJvciB7XG4gIGNvbnN0cnVjdG9yKHIsIG4sIGEsIGQpIHtcbiAgICBzdXBlcihkIHx8IGBjYW4ndCByZXNvbHZlIHJlZmVyZW5jZSAke2F9IGZyb20gaWQgJHtufWApLCB0aGlzLm1pc3NpbmdSZWYgPSAoMCwgTHQucmVzb2x2ZVVybCkociwgbiwgYSksIHRoaXMubWlzc2luZ1NjaGVtYSA9ICgwLCBMdC5ub3JtYWxpemVJZCkoKDAsIEx0LmdldEZ1bGxQYXRoKShyLCB0aGlzLm1pc3NpbmdSZWYpKTtcbiAgfVxufVxubnQuZGVmYXVsdCA9IHF1O1xudmFyIEFlID0ge307XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoQWUsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiAhMCB9KTtcbkFlLnJlc29sdmVTY2hlbWEgPSBBZS5nZXRDb21waWxpbmdTY2hlbWEgPSBBZS5yZXNvbHZlUmVmID0gQWUuY29tcGlsZVNjaGVtYSA9IEFlLlNjaGVtYUVudiA9IHZvaWQgMDtcbmNvbnN0IFZlID0gc2UsIEd1ID0gYXQsIGhyID0gUWUsIEJlID0ga2UsIGVuID0gaWUsIEt1ID0gSGU7XG5jbGFzcyBSdCB7XG4gIGNvbnN0cnVjdG9yKHIpIHtcbiAgICB2YXIgbjtcbiAgICB0aGlzLnJlZnMgPSB7fSwgdGhpcy5keW5hbWljQW5jaG9ycyA9IHt9O1xuICAgIGxldCBhO1xuICAgIHR5cGVvZiByLnNjaGVtYSA9PSBcIm9iamVjdFwiICYmIChhID0gci5zY2hlbWEpLCB0aGlzLnNjaGVtYSA9IHIuc2NoZW1hLCB0aGlzLnNjaGVtYUlkID0gci5zY2hlbWFJZCwgdGhpcy5yb290ID0gci5yb290IHx8IHRoaXMsIHRoaXMuYmFzZUlkID0gKG4gPSByLmJhc2VJZCkgIT09IG51bGwgJiYgbiAhPT0gdm9pZCAwID8gbiA6ICgwLCBCZS5ub3JtYWxpemVJZCkoYSA9PSBudWxsID8gdm9pZCAwIDogYVtyLnNjaGVtYUlkIHx8IFwiJGlkXCJdKSwgdGhpcy5zY2hlbWFQYXRoID0gci5zY2hlbWFQYXRoLCB0aGlzLmxvY2FsUmVmcyA9IHIubG9jYWxSZWZzLCB0aGlzLm1ldGEgPSByLm1ldGEsIHRoaXMuJGFzeW5jID0gYSA9PSBudWxsID8gdm9pZCAwIDogYS4kYXN5bmMsIHRoaXMucmVmcyA9IHt9O1xuICB9XG59XG5BZS5TY2hlbWFFbnYgPSBSdDtcbmZ1bmN0aW9uIHJhKGUpIHtcbiAgY29uc3QgciA9IFduLmNhbGwodGhpcywgZSk7XG4gIGlmIChyKVxuICAgIHJldHVybiByO1xuICBjb25zdCBuID0gKDAsIEJlLmdldEZ1bGxQYXRoKSh0aGlzLm9wdHMudXJpUmVzb2x2ZXIsIGUucm9vdC5iYXNlSWQpLCB7IGVzNTogYSwgbGluZXM6IGQgfSA9IHRoaXMub3B0cy5jb2RlLCB7IG93blByb3BlcnRpZXM6IG8gfSA9IHRoaXMub3B0cywgcCA9IG5ldyBWZS5Db2RlR2VuKHRoaXMuc2NvcGUsIHsgZXM1OiBhLCBsaW5lczogZCwgb3duUHJvcGVydGllczogbyB9KTtcbiAgbGV0IHk7XG4gIGUuJGFzeW5jICYmICh5ID0gcC5zY29wZVZhbHVlKFwiRXJyb3JcIiwge1xuICAgIHJlZjogR3UuZGVmYXVsdCxcbiAgICBjb2RlOiAoMCwgVmUuXylgcmVxdWlyZShcImFqdi9kaXN0L3J1bnRpbWUvdmFsaWRhdGlvbl9lcnJvclwiKS5kZWZhdWx0YFxuICB9KSk7XG4gIGNvbnN0IGIgPSBwLnNjb3BlTmFtZShcInZhbGlkYXRlXCIpO1xuICBlLnZhbGlkYXRlTmFtZSA9IGI7XG4gIGNvbnN0IHYgPSB7XG4gICAgZ2VuOiBwLFxuICAgIGFsbEVycm9yczogdGhpcy5vcHRzLmFsbEVycm9ycyxcbiAgICBkYXRhOiBoci5kZWZhdWx0LmRhdGEsXG4gICAgcGFyZW50RGF0YTogaHIuZGVmYXVsdC5wYXJlbnREYXRhLFxuICAgIHBhcmVudERhdGFQcm9wZXJ0eTogaHIuZGVmYXVsdC5wYXJlbnREYXRhUHJvcGVydHksXG4gICAgZGF0YU5hbWVzOiBbaHIuZGVmYXVsdC5kYXRhXSxcbiAgICBkYXRhUGF0aEFycjogW1ZlLm5pbF0sXG4gICAgZGF0YUxldmVsOiAwLFxuICAgIGRhdGFUeXBlczogW10sXG4gICAgZGVmaW5lZFByb3BlcnRpZXM6IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCksXG4gICAgdG9wU2NoZW1hUmVmOiBwLnNjb3BlVmFsdWUoXCJzY2hlbWFcIiwgdGhpcy5vcHRzLmNvZGUuc291cmNlID09PSAhMCA/IHsgcmVmOiBlLnNjaGVtYSwgY29kZTogKDAsIFZlLnN0cmluZ2lmeSkoZS5zY2hlbWEpIH0gOiB7IHJlZjogZS5zY2hlbWEgfSksXG4gICAgdmFsaWRhdGVOYW1lOiBiLFxuICAgIFZhbGlkYXRpb25FcnJvcjogeSxcbiAgICBzY2hlbWE6IGUuc2NoZW1hLFxuICAgIHNjaGVtYUVudjogZSxcbiAgICByb290SWQ6IG4sXG4gICAgYmFzZUlkOiBlLmJhc2VJZCB8fCBuLFxuICAgIHNjaGVtYVBhdGg6IFZlLm5pbCxcbiAgICBlcnJTY2hlbWFQYXRoOiBlLnNjaGVtYVBhdGggfHwgKHRoaXMub3B0cy5qdGQgPyBcIlwiIDogXCIjXCIpLFxuICAgIGVycm9yUGF0aDogKDAsIFZlLl8pYFwiXCJgLFxuICAgIG9wdHM6IHRoaXMub3B0cyxcbiAgICBzZWxmOiB0aGlzXG4gIH07XG4gIGxldCBnO1xuICB0cnkge1xuICAgIHRoaXMuX2NvbXBpbGF0aW9ucy5hZGQoZSksICgwLCBLdS52YWxpZGF0ZUZ1bmN0aW9uQ29kZSkodiksIHAub3B0aW1pemUodGhpcy5vcHRzLmNvZGUub3B0aW1pemUpO1xuICAgIGNvbnN0IFMgPSBwLnRvU3RyaW5nKCk7XG4gICAgZyA9IGAke3Auc2NvcGVSZWZzKGhyLmRlZmF1bHQuc2NvcGUpfXJldHVybiAke1N9YCwgdGhpcy5vcHRzLmNvZGUucHJvY2VzcyAmJiAoZyA9IHRoaXMub3B0cy5jb2RlLnByb2Nlc3MoZywgZSkpO1xuICAgIGNvbnN0IEwgPSBuZXcgRnVuY3Rpb24oYCR7aHIuZGVmYXVsdC5zZWxmfWAsIGAke2hyLmRlZmF1bHQuc2NvcGV9YCwgZykodGhpcywgdGhpcy5zY29wZS5nZXQoKSk7XG4gICAgaWYgKHRoaXMuc2NvcGUudmFsdWUoYiwgeyByZWY6IEwgfSksIEwuZXJyb3JzID0gbnVsbCwgTC5zY2hlbWEgPSBlLnNjaGVtYSwgTC5zY2hlbWFFbnYgPSBlLCBlLiRhc3luYyAmJiAoTC4kYXN5bmMgPSAhMCksIHRoaXMub3B0cy5jb2RlLnNvdXJjZSA9PT0gITAgJiYgKEwuc291cmNlID0geyB2YWxpZGF0ZU5hbWU6IGIsIHZhbGlkYXRlQ29kZTogUywgc2NvcGVWYWx1ZXM6IHAuX3ZhbHVlcyB9KSwgdGhpcy5vcHRzLnVuZXZhbHVhdGVkKSB7XG4gICAgICBjb25zdCB7IHByb3BzOiBSLCBpdGVtczogaiB9ID0gdjtcbiAgICAgIEwuZXZhbHVhdGVkID0ge1xuICAgICAgICBwcm9wczogUiBpbnN0YW5jZW9mIFZlLk5hbWUgPyB2b2lkIDAgOiBSLFxuICAgICAgICBpdGVtczogaiBpbnN0YW5jZW9mIFZlLk5hbWUgPyB2b2lkIDAgOiBqLFxuICAgICAgICBkeW5hbWljUHJvcHM6IFIgaW5zdGFuY2VvZiBWZS5OYW1lLFxuICAgICAgICBkeW5hbWljSXRlbXM6IGogaW5zdGFuY2VvZiBWZS5OYW1lXG4gICAgICB9LCBMLnNvdXJjZSAmJiAoTC5zb3VyY2UuZXZhbHVhdGVkID0gKDAsIFZlLnN0cmluZ2lmeSkoTC5ldmFsdWF0ZWQpKTtcbiAgICB9XG4gICAgcmV0dXJuIGUudmFsaWRhdGUgPSBMLCBlO1xuICB9IGNhdGNoIChTKSB7XG4gICAgdGhyb3cgZGVsZXRlIGUudmFsaWRhdGUsIGRlbGV0ZSBlLnZhbGlkYXRlTmFtZSwgZyAmJiB0aGlzLmxvZ2dlci5lcnJvcihcIkVycm9yIGNvbXBpbGluZyBzY2hlbWEsIGZ1bmN0aW9uIGNvZGU6XCIsIGcpLCBTO1xuICB9IGZpbmFsbHkge1xuICAgIHRoaXMuX2NvbXBpbGF0aW9ucy5kZWxldGUoZSk7XG4gIH1cbn1cbkFlLmNvbXBpbGVTY2hlbWEgPSByYTtcbmZ1bmN0aW9uIFd1KGUsIHIsIG4pIHtcbiAgdmFyIGE7XG4gIG4gPSAoMCwgQmUucmVzb2x2ZVVybCkodGhpcy5vcHRzLnVyaVJlc29sdmVyLCByLCBuKTtcbiAgY29uc3QgZCA9IGUucmVmc1tuXTtcbiAgaWYgKGQpXG4gICAgcmV0dXJuIGQ7XG4gIGxldCBvID0gWXUuY2FsbCh0aGlzLCBlLCBuKTtcbiAgaWYgKG8gPT09IHZvaWQgMCkge1xuICAgIGNvbnN0IHAgPSAoYSA9IGUubG9jYWxSZWZzKSA9PT0gbnVsbCB8fCBhID09PSB2b2lkIDAgPyB2b2lkIDAgOiBhW25dLCB7IHNjaGVtYUlkOiB5IH0gPSB0aGlzLm9wdHM7XG4gICAgcCAmJiAobyA9IG5ldyBSdCh7IHNjaGVtYTogcCwgc2NoZW1hSWQ6IHksIHJvb3Q6IGUsIGJhc2VJZDogciB9KSk7XG4gIH1cbiAgaWYgKG8gIT09IHZvaWQgMClcbiAgICByZXR1cm4gZS5yZWZzW25dID0gSnUuY2FsbCh0aGlzLCBvKTtcbn1cbkFlLnJlc29sdmVSZWYgPSBXdTtcbmZ1bmN0aW9uIEp1KGUpIHtcbiAgcmV0dXJuICgwLCBCZS5pbmxpbmVSZWYpKGUuc2NoZW1hLCB0aGlzLm9wdHMuaW5saW5lUmVmcykgPyBlLnNjaGVtYSA6IGUudmFsaWRhdGUgPyBlIDogcmEuY2FsbCh0aGlzLCBlKTtcbn1cbmZ1bmN0aW9uIFduKGUpIHtcbiAgZm9yIChjb25zdCByIG9mIHRoaXMuX2NvbXBpbGF0aW9ucylcbiAgICBpZiAoWnUociwgZSkpXG4gICAgICByZXR1cm4gcjtcbn1cbkFlLmdldENvbXBpbGluZ1NjaGVtYSA9IFduO1xuZnVuY3Rpb24gWnUoZSwgcikge1xuICByZXR1cm4gZS5zY2hlbWEgPT09IHIuc2NoZW1hICYmIGUucm9vdCA9PT0gci5yb290ICYmIGUuYmFzZUlkID09PSByLmJhc2VJZDtcbn1cbmZ1bmN0aW9uIFl1KGUsIHIpIHtcbiAgbGV0IG47XG4gIGZvciAoOyB0eXBlb2YgKG4gPSB0aGlzLnJlZnNbcl0pID09IFwic3RyaW5nXCI7IClcbiAgICByID0gbjtcbiAgcmV0dXJuIG4gfHwgdGhpcy5zY2hlbWFzW3JdIHx8IEF0LmNhbGwodGhpcywgZSwgcik7XG59XG5mdW5jdGlvbiBBdChlLCByKSB7XG4gIGNvbnN0IG4gPSB0aGlzLm9wdHMudXJpUmVzb2x2ZXIucGFyc2UociksIGEgPSAoMCwgQmUuX2dldEZ1bGxQYXRoKSh0aGlzLm9wdHMudXJpUmVzb2x2ZXIsIG4pO1xuICBsZXQgZCA9ICgwLCBCZS5nZXRGdWxsUGF0aCkodGhpcy5vcHRzLnVyaVJlc29sdmVyLCBlLmJhc2VJZCwgdm9pZCAwKTtcbiAgaWYgKE9iamVjdC5rZXlzKGUuc2NoZW1hKS5sZW5ndGggPiAwICYmIGEgPT09IGQpXG4gICAgcmV0dXJuIHp0LmNhbGwodGhpcywgbiwgZSk7XG4gIGNvbnN0IG8gPSAoMCwgQmUubm9ybWFsaXplSWQpKGEpLCBwID0gdGhpcy5yZWZzW29dIHx8IHRoaXMuc2NoZW1hc1tvXTtcbiAgaWYgKHR5cGVvZiBwID09IFwic3RyaW5nXCIpIHtcbiAgICBjb25zdCB5ID0gQXQuY2FsbCh0aGlzLCBlLCBwKTtcbiAgICByZXR1cm4gdHlwZW9mICh5ID09IG51bGwgPyB2b2lkIDAgOiB5LnNjaGVtYSkgIT0gXCJvYmplY3RcIiA/IHZvaWQgMCA6IHp0LmNhbGwodGhpcywgbiwgeSk7XG4gIH1cbiAgaWYgKHR5cGVvZiAocCA9PSBudWxsID8gdm9pZCAwIDogcC5zY2hlbWEpID09IFwib2JqZWN0XCIpIHtcbiAgICBpZiAocC52YWxpZGF0ZSB8fCByYS5jYWxsKHRoaXMsIHApLCBvID09PSAoMCwgQmUubm9ybWFsaXplSWQpKHIpKSB7XG4gICAgICBjb25zdCB7IHNjaGVtYTogeSB9ID0gcCwgeyBzY2hlbWFJZDogYiB9ID0gdGhpcy5vcHRzLCB2ID0geVtiXTtcbiAgICAgIHJldHVybiB2ICYmIChkID0gKDAsIEJlLnJlc29sdmVVcmwpKHRoaXMub3B0cy51cmlSZXNvbHZlciwgZCwgdikpLCBuZXcgUnQoeyBzY2hlbWE6IHksIHNjaGVtYUlkOiBiLCByb290OiBlLCBiYXNlSWQ6IGQgfSk7XG4gICAgfVxuICAgIHJldHVybiB6dC5jYWxsKHRoaXMsIG4sIHApO1xuICB9XG59XG5BZS5yZXNvbHZlU2NoZW1hID0gQXQ7XG5jb25zdCBYdSA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KFtcbiAgXCJwcm9wZXJ0aWVzXCIsXG4gIFwicGF0dGVyblByb3BlcnRpZXNcIixcbiAgXCJlbnVtXCIsXG4gIFwiZGVwZW5kZW5jaWVzXCIsXG4gIFwiZGVmaW5pdGlvbnNcIlxuXSk7XG5mdW5jdGlvbiB6dChlLCB7IGJhc2VJZDogciwgc2NoZW1hOiBuLCByb290OiBhIH0pIHtcbiAgdmFyIGQ7XG4gIGlmICgoKGQgPSBlLmZyYWdtZW50KSA9PT0gbnVsbCB8fCBkID09PSB2b2lkIDAgPyB2b2lkIDAgOiBkWzBdKSAhPT0gXCIvXCIpXG4gICAgcmV0dXJuO1xuICBmb3IgKGNvbnN0IHkgb2YgZS5mcmFnbWVudC5zbGljZSgxKS5zcGxpdChcIi9cIikpIHtcbiAgICBpZiAodHlwZW9mIG4gPT0gXCJib29sZWFuXCIpXG4gICAgICByZXR1cm47XG4gICAgY29uc3QgYiA9IG5bKDAsIGVuLnVuZXNjYXBlRnJhZ21lbnQpKHkpXTtcbiAgICBpZiAoYiA9PT0gdm9pZCAwKVxuICAgICAgcmV0dXJuO1xuICAgIG4gPSBiO1xuICAgIGNvbnN0IHYgPSB0eXBlb2YgbiA9PSBcIm9iamVjdFwiICYmIG5bdGhpcy5vcHRzLnNjaGVtYUlkXTtcbiAgICAhWHUuaGFzKHkpICYmIHYgJiYgKHIgPSAoMCwgQmUucmVzb2x2ZVVybCkodGhpcy5vcHRzLnVyaVJlc29sdmVyLCByLCB2KSk7XG4gIH1cbiAgbGV0IG87XG4gIGlmICh0eXBlb2YgbiAhPSBcImJvb2xlYW5cIiAmJiBuLiRyZWYgJiYgISgwLCBlbi5zY2hlbWFIYXNSdWxlc0J1dFJlZikobiwgdGhpcy5SVUxFUykpIHtcbiAgICBjb25zdCB5ID0gKDAsIEJlLnJlc29sdmVVcmwpKHRoaXMub3B0cy51cmlSZXNvbHZlciwgciwgbi4kcmVmKTtcbiAgICBvID0gQXQuY2FsbCh0aGlzLCBhLCB5KTtcbiAgfVxuICBjb25zdCB7IHNjaGVtYUlkOiBwIH0gPSB0aGlzLm9wdHM7XG4gIGlmIChvID0gbyB8fCBuZXcgUnQoeyBzY2hlbWE6IG4sIHNjaGVtYUlkOiBwLCByb290OiBhLCBiYXNlSWQ6IHIgfSksIG8uc2NoZW1hICE9PSBvLnJvb3Quc2NoZW1hKVxuICAgIHJldHVybiBvO1xufVxuY29uc3QgUXUgPSBcImh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9hanYtdmFsaWRhdG9yL2Fqdi9tYXN0ZXIvbGliL3JlZnMvZGF0YS5qc29uI1wiLCB4dSA9IFwiTWV0YS1zY2hlbWEgZm9yICRkYXRhIHJlZmVyZW5jZSAoSlNPTiBBbnlTY2hlbWEgZXh0ZW5zaW9uIHByb3Bvc2FsKVwiLCBlZCA9IFwib2JqZWN0XCIsIHJkID0gW1xuICBcIiRkYXRhXCJcbl0sIHRkID0ge1xuICAkZGF0YToge1xuICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgYW55T2Y6IFtcbiAgICAgIHtcbiAgICAgICAgZm9ybWF0OiBcInJlbGF0aXZlLWpzb24tcG9pbnRlclwiXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBmb3JtYXQ6IFwianNvbi1wb2ludGVyXCJcbiAgICAgIH1cbiAgICBdXG4gIH1cbn0sIGFkID0gITEsIG5kID0ge1xuICAkaWQ6IFF1LFxuICBkZXNjcmlwdGlvbjogeHUsXG4gIHR5cGU6IGVkLFxuICByZXF1aXJlZDogcmQsXG4gIHByb3BlcnRpZXM6IHRkLFxuICBhZGRpdGlvbmFsUHJvcGVydGllczogYWRcbn07XG52YXIgdGEgPSB7fSwgJHQgPSB7fSwgc2QgPSB7XG4gIGdldCBleHBvcnRzKCkge1xuICAgIHJldHVybiAkdDtcbiAgfSxcbiAgc2V0IGV4cG9ydHMoZSkge1xuICAgICR0ID0gZTtcbiAgfVxufTtcbi8qKiBAbGljZW5zZSBVUkkuanMgdjQuNC4xIChjKSAyMDExIEdhcnkgQ291cnQuIExpY2Vuc2U6IGh0dHA6Ly9naXRodWIuY29tL2dhcnljb3VydC91cmktanMgKi9cbihmdW5jdGlvbihlLCByKSB7XG4gIChmdW5jdGlvbihuLCBhKSB7XG4gICAgYShyKTtcbiAgfSkoRW4sIGZ1bmN0aW9uKG4pIHtcbiAgICBmdW5jdGlvbiBhKCkge1xuICAgICAgZm9yICh2YXIgRSA9IGFyZ3VtZW50cy5sZW5ndGgsIGYgPSBBcnJheShFKSwgUCA9IDA7IFAgPCBFOyBQKyspXG4gICAgICAgIGZbUF0gPSBhcmd1bWVudHNbUF07XG4gICAgICBpZiAoZi5sZW5ndGggPiAxKSB7XG4gICAgICAgIGZbMF0gPSBmWzBdLnNsaWNlKDAsIC0xKTtcbiAgICAgICAgZm9yICh2YXIgTSA9IGYubGVuZ3RoIC0gMSwgQSA9IDE7IEEgPCBNOyArK0EpXG4gICAgICAgICAgZltBXSA9IGZbQV0uc2xpY2UoMSwgLTEpO1xuICAgICAgICByZXR1cm4gZltNXSA9IGZbTV0uc2xpY2UoMSksIGYuam9pbihcIlwiKTtcbiAgICAgIH0gZWxzZVxuICAgICAgICByZXR1cm4gZlswXTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZChFKSB7XG4gICAgICByZXR1cm4gXCIoPzpcIiArIEUgKyBcIilcIjtcbiAgICB9XG4gICAgZnVuY3Rpb24gbyhFKSB7XG4gICAgICByZXR1cm4gRSA9PT0gdm9pZCAwID8gXCJ1bmRlZmluZWRcIiA6IEUgPT09IG51bGwgPyBcIm51bGxcIiA6IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChFKS5zcGxpdChcIiBcIikucG9wKCkuc3BsaXQoXCJdXCIpLnNoaWZ0KCkudG9Mb3dlckNhc2UoKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gcChFKSB7XG4gICAgICByZXR1cm4gRS50b1VwcGVyQ2FzZSgpO1xuICAgIH1cbiAgICBmdW5jdGlvbiB5KEUpIHtcbiAgICAgIHJldHVybiBFICE9IG51bGwgPyBFIGluc3RhbmNlb2YgQXJyYXkgPyBFIDogdHlwZW9mIEUubGVuZ3RoICE9IFwibnVtYmVyXCIgfHwgRS5zcGxpdCB8fCBFLnNldEludGVydmFsIHx8IEUuY2FsbCA/IFtFXSA6IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKEUpIDogW107XG4gICAgfVxuICAgIGZ1bmN0aW9uIGIoRSwgZikge1xuICAgICAgdmFyIFAgPSBFO1xuICAgICAgaWYgKGYpXG4gICAgICAgIGZvciAodmFyIE0gaW4gZilcbiAgICAgICAgICBQW01dID0gZltNXTtcbiAgICAgIHJldHVybiBQO1xuICAgIH1cbiAgICBmdW5jdGlvbiB2KEUpIHtcbiAgICAgIHZhciBmID0gXCJbQS1aYS16XVwiLCBQID0gXCJbMC05XVwiLCBNID0gYShQLCBcIltBLUZhLWZdXCIpLCBBID0gZChkKFwiJVtFRmVmXVwiICsgTSArIFwiJVwiICsgTSArIE0gKyBcIiVcIiArIE0gKyBNKSArIFwifFwiICsgZChcIiVbODlBLUZhLWZdXCIgKyBNICsgXCIlXCIgKyBNICsgTSkgKyBcInxcIiArIGQoXCIlXCIgKyBNICsgTSkpLCBYID0gXCJbXFxcXDpcXFxcL1xcXFw/XFxcXCNcXFxcW1xcXFxdXFxcXEBdXCIsIFEgPSBcIltcXFxcIVxcXFwkXFxcXCZcXFxcJ1xcXFwoXFxcXClcXFxcKlxcXFwrXFxcXCxcXFxcO1xcXFw9XVwiLCBkZSA9IGEoWCwgUSksIGhlID0gRSA/IFwiW1xcXFx4QTAtXFxcXHUyMDBEXFxcXHUyMDEwLVxcXFx1MjAyOVxcXFx1MjAyRi1cXFxcdUQ3RkZcXFxcdUY5MDAtXFxcXHVGRENGXFxcXHVGREYwLVxcXFx1RkZFRl1cIiA6IFwiW11cIiwgX2UgPSBFID8gXCJbXFxcXHVFMDAwLVxcXFx1RjhGRl1cIiA6IFwiW11cIiwgdWUgPSBhKGYsIFAsIFwiW1xcXFwtXFxcXC5cXFxcX1xcXFx+XVwiLCBoZSk7XG4gICAgICBkKGYgKyBhKGYsIFAsIFwiW1xcXFwrXFxcXC1cXFxcLl1cIikgKyBcIipcIiksIGQoZChBICsgXCJ8XCIgKyBhKHVlLCBRLCBcIltcXFxcOl1cIikpICsgXCIqXCIpO1xuICAgICAgdmFyIGNlID0gZChkKFwiMjVbMC01XVwiKSArIFwifFwiICsgZChcIjJbMC00XVwiICsgUCkgKyBcInxcIiArIGQoXCIxXCIgKyBQICsgUCkgKyBcInxcIiArIGQoXCIwP1sxLTldXCIgKyBQKSArIFwifDA/MD9cIiArIFApLCB2ZSA9IGQoY2UgKyBcIlxcXFwuXCIgKyBjZSArIFwiXFxcXC5cIiArIGNlICsgXCJcXFxcLlwiICsgY2UpLCBlZSA9IGQoTSArIFwiezEsNH1cIiksIG1lID0gZChkKGVlICsgXCJcXFxcOlwiICsgZWUpICsgXCJ8XCIgKyB2ZSksIHdlID0gZChkKGVlICsgXCJcXFxcOlwiKSArIFwiezZ9XCIgKyBtZSksIGdlID0gZChcIlxcXFw6XFxcXDpcIiArIGQoZWUgKyBcIlxcXFw6XCIpICsgXCJ7NX1cIiArIG1lKSwgYXIgPSBkKGQoZWUpICsgXCI/XFxcXDpcXFxcOlwiICsgZChlZSArIFwiXFxcXDpcIikgKyBcIns0fVwiICsgbWUpLCBLZSA9IGQoZChkKGVlICsgXCJcXFxcOlwiKSArIFwiezAsMX1cIiArIGVlKSArIFwiP1xcXFw6XFxcXDpcIiArIGQoZWUgKyBcIlxcXFw6XCIpICsgXCJ7M31cIiArIG1lKSwgV2UgPSBkKGQoZChlZSArIFwiXFxcXDpcIikgKyBcInswLDJ9XCIgKyBlZSkgKyBcIj9cXFxcOlxcXFw6XCIgKyBkKGVlICsgXCJcXFxcOlwiKSArIFwiezJ9XCIgKyBtZSksIFByID0gZChkKGQoZWUgKyBcIlxcXFw6XCIpICsgXCJ7MCwzfVwiICsgZWUpICsgXCI/XFxcXDpcXFxcOlwiICsgZWUgKyBcIlxcXFw6XCIgKyBtZSksIGxyID0gZChkKGQoZWUgKyBcIlxcXFw6XCIpICsgXCJ7MCw0fVwiICsgZWUpICsgXCI/XFxcXDpcXFxcOlwiICsgbWUpLCBEZSA9IGQoZChkKGVlICsgXCJcXFxcOlwiKSArIFwiezAsNX1cIiArIGVlKSArIFwiP1xcXFw6XFxcXDpcIiArIGVlKSwgSmUgPSBkKGQoZChlZSArIFwiXFxcXDpcIikgKyBcInswLDZ9XCIgKyBlZSkgKyBcIj9cXFxcOlxcXFw6XCIpLCBmciA9IGQoW3dlLCBnZSwgYXIsIEtlLCBXZSwgUHIsIGxyLCBEZSwgSmVdLmpvaW4oXCJ8XCIpKSwgZXIgPSBkKGQodWUgKyBcInxcIiArIEEpICsgXCIrXCIpO1xuICAgICAgZChcIlt2Vl1cIiArIE0gKyBcIitcXFxcLlwiICsgYSh1ZSwgUSwgXCJbXFxcXDpdXCIpICsgXCIrXCIpLCBkKGQoQSArIFwifFwiICsgYSh1ZSwgUSkpICsgXCIqXCIpO1xuICAgICAgdmFyIHFyID0gZChBICsgXCJ8XCIgKyBhKHVlLCBRLCBcIltcXFxcOlxcXFxAXVwiKSk7XG4gICAgICByZXR1cm4gZChkKEEgKyBcInxcIiArIGEodWUsIFEsIFwiW1xcXFxAXVwiKSkgKyBcIitcIiksIGQoZChxciArIFwifFwiICsgYShcIltcXFxcL1xcXFw/XVwiLCBfZSkpICsgXCIqXCIpLCB7XG4gICAgICAgIE5PVF9TQ0hFTUU6IG5ldyBSZWdFeHAoYShcIlteXVwiLCBmLCBQLCBcIltcXFxcK1xcXFwtXFxcXC5dXCIpLCBcImdcIiksXG4gICAgICAgIE5PVF9VU0VSSU5GTzogbmV3IFJlZ0V4cChhKFwiW15cXFxcJVxcXFw6XVwiLCB1ZSwgUSksIFwiZ1wiKSxcbiAgICAgICAgTk9UX0hPU1Q6IG5ldyBSZWdFeHAoYShcIlteXFxcXCVcXFxcW1xcXFxdXFxcXDpdXCIsIHVlLCBRKSwgXCJnXCIpLFxuICAgICAgICBOT1RfUEFUSDogbmV3IFJlZ0V4cChhKFwiW15cXFxcJVxcXFwvXFxcXDpcXFxcQF1cIiwgdWUsIFEpLCBcImdcIiksXG4gICAgICAgIE5PVF9QQVRIX05PU0NIRU1FOiBuZXcgUmVnRXhwKGEoXCJbXlxcXFwlXFxcXC9cXFxcQF1cIiwgdWUsIFEpLCBcImdcIiksXG4gICAgICAgIE5PVF9RVUVSWTogbmV3IFJlZ0V4cChhKFwiW15cXFxcJV1cIiwgdWUsIFEsIFwiW1xcXFw6XFxcXEBcXFxcL1xcXFw/XVwiLCBfZSksIFwiZ1wiKSxcbiAgICAgICAgTk9UX0ZSQUdNRU5UOiBuZXcgUmVnRXhwKGEoXCJbXlxcXFwlXVwiLCB1ZSwgUSwgXCJbXFxcXDpcXFxcQFxcXFwvXFxcXD9dXCIpLCBcImdcIiksXG4gICAgICAgIEVTQ0FQRTogbmV3IFJlZ0V4cChhKFwiW15dXCIsIHVlLCBRKSwgXCJnXCIpLFxuICAgICAgICBVTlJFU0VSVkVEOiBuZXcgUmVnRXhwKHVlLCBcImdcIiksXG4gICAgICAgIE9USEVSX0NIQVJTOiBuZXcgUmVnRXhwKGEoXCJbXlxcXFwlXVwiLCB1ZSwgZGUpLCBcImdcIiksXG4gICAgICAgIFBDVF9FTkNPREVEOiBuZXcgUmVnRXhwKEEsIFwiZ1wiKSxcbiAgICAgICAgSVBWNEFERFJFU1M6IG5ldyBSZWdFeHAoXCJeKFwiICsgdmUgKyBcIikkXCIpLFxuICAgICAgICBJUFY2QUREUkVTUzogbmV3IFJlZ0V4cChcIl5cXFxcWz8oXCIgKyBmciArIFwiKVwiICsgZChkKFwiXFxcXCUyNXxcXFxcJSg/IVwiICsgTSArIFwiezJ9KVwiKSArIFwiKFwiICsgZXIgKyBcIilcIikgKyBcIj9cXFxcXT8kXCIpXG4gICAgICAgIC8vUkZDIDY4NzQsIHdpdGggcmVsYXhlZCBwYXJzaW5nIHJ1bGVzXG4gICAgICB9O1xuICAgIH1cbiAgICB2YXIgZyA9IHYoITEpLCBTID0gdighMCksIHogPSBmdW5jdGlvbigpIHtcbiAgICAgIGZ1bmN0aW9uIEUoZiwgUCkge1xuICAgICAgICB2YXIgTSA9IFtdLCBBID0gITAsIFggPSAhMSwgUSA9IHZvaWQgMDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBmb3IgKHZhciBkZSA9IGZbU3ltYm9sLml0ZXJhdG9yXSgpLCBoZTsgIShBID0gKGhlID0gZGUubmV4dCgpKS5kb25lKSAmJiAoTS5wdXNoKGhlLnZhbHVlKSwgIShQICYmIE0ubGVuZ3RoID09PSBQKSk7IEEgPSAhMClcbiAgICAgICAgICAgIDtcbiAgICAgICAgfSBjYXRjaCAoX2UpIHtcbiAgICAgICAgICBYID0gITAsIFEgPSBfZTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgIUEgJiYgZGUucmV0dXJuICYmIGRlLnJldHVybigpO1xuICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICBpZiAoWClcbiAgICAgICAgICAgICAgdGhyb3cgUTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIE07XG4gICAgICB9XG4gICAgICByZXR1cm4gZnVuY3Rpb24oZiwgUCkge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShmKSlcbiAgICAgICAgICByZXR1cm4gZjtcbiAgICAgICAgaWYgKFN5bWJvbC5pdGVyYXRvciBpbiBPYmplY3QoZikpXG4gICAgICAgICAgcmV0dXJuIEUoZiwgUCk7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gZGVzdHJ1Y3R1cmUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlXCIpO1xuICAgICAgfTtcbiAgICB9KCksIEwgPSBmdW5jdGlvbihFKSB7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShFKSkge1xuICAgICAgICBmb3IgKHZhciBmID0gMCwgUCA9IEFycmF5KEUubGVuZ3RoKTsgZiA8IEUubGVuZ3RoOyBmKyspXG4gICAgICAgICAgUFtmXSA9IEVbZl07XG4gICAgICAgIHJldHVybiBQO1xuICAgICAgfSBlbHNlXG4gICAgICAgIHJldHVybiBBcnJheS5mcm9tKEUpO1xuICAgIH0sIFIgPSAyMTQ3NDgzNjQ3LCBqID0gMzYsIFQgPSAxLCAkID0gMjYsIE4gPSAzOCwgRCA9IDcwMCwgdCA9IDcyLCB1ID0gMTI4LCBzID0gXCItXCIsIGkgPSAvXnhuLS0vLCBjID0gL1teXFwwLVxceDdFXS8sIG0gPSAvW1xceDJFXFx1MzAwMlxcdUZGMEVcXHVGRjYxXS9nLCBoID0ge1xuICAgICAgb3ZlcmZsb3c6IFwiT3ZlcmZsb3c6IGlucHV0IG5lZWRzIHdpZGVyIGludGVnZXJzIHRvIHByb2Nlc3NcIixcbiAgICAgIFwibm90LWJhc2ljXCI6IFwiSWxsZWdhbCBpbnB1dCA+PSAweDgwIChub3QgYSBiYXNpYyBjb2RlIHBvaW50KVwiLFxuICAgICAgXCJpbnZhbGlkLWlucHV0XCI6IFwiSW52YWxpZCBpbnB1dFwiXG4gICAgfSwgQyA9IGogLSBULCBVID0gTWF0aC5mbG9vciwgSCA9IFN0cmluZy5mcm9tQ2hhckNvZGU7XG4gICAgZnVuY3Rpb24gVihFKSB7XG4gICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihoW0VdKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gRyhFLCBmKSB7XG4gICAgICBmb3IgKHZhciBQID0gW10sIE0gPSBFLmxlbmd0aDsgTS0tOyApXG4gICAgICAgIFBbTV0gPSBmKEVbTV0pO1xuICAgICAgcmV0dXJuIFA7XG4gICAgfVxuICAgIGZ1bmN0aW9uIF8oRSwgZikge1xuICAgICAgdmFyIFAgPSBFLnNwbGl0KFwiQFwiKSwgTSA9IFwiXCI7XG4gICAgICBQLmxlbmd0aCA+IDEgJiYgKE0gPSBQWzBdICsgXCJAXCIsIEUgPSBQWzFdKSwgRSA9IEUucmVwbGFjZShtLCBcIi5cIik7XG4gICAgICB2YXIgQSA9IEUuc3BsaXQoXCIuXCIpLCBYID0gRyhBLCBmKS5qb2luKFwiLlwiKTtcbiAgICAgIHJldHVybiBNICsgWDtcbiAgICB9XG4gICAgZnVuY3Rpb24gcShFKSB7XG4gICAgICBmb3IgKHZhciBmID0gW10sIFAgPSAwLCBNID0gRS5sZW5ndGg7IFAgPCBNOyApIHtcbiAgICAgICAgdmFyIEEgPSBFLmNoYXJDb2RlQXQoUCsrKTtcbiAgICAgICAgaWYgKEEgPj0gNTUyOTYgJiYgQSA8PSA1NjMxOSAmJiBQIDwgTSkge1xuICAgICAgICAgIHZhciBYID0gRS5jaGFyQ29kZUF0KFArKyk7XG4gICAgICAgICAgKFggJiA2NDUxMikgPT0gNTYzMjAgPyBmLnB1c2goKChBICYgMTAyMykgPDwgMTApICsgKFggJiAxMDIzKSArIDY1NTM2KSA6IChmLnB1c2goQSksIFAtLSk7XG4gICAgICAgIH0gZWxzZVxuICAgICAgICAgIGYucHVzaChBKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmO1xuICAgIH1cbiAgICB2YXIgSiA9IGZ1bmN0aW9uKGYpIHtcbiAgICAgIHJldHVybiBTdHJpbmcuZnJvbUNvZGVQb2ludC5hcHBseShTdHJpbmcsIEwoZikpO1xuICAgIH0sIFogPSBmdW5jdGlvbihmKSB7XG4gICAgICByZXR1cm4gZiAtIDQ4IDwgMTAgPyBmIC0gMjIgOiBmIC0gNjUgPCAyNiA/IGYgLSA2NSA6IGYgLSA5NyA8IDI2ID8gZiAtIDk3IDogajtcbiAgICB9LCBCID0gZnVuY3Rpb24oZiwgUCkge1xuICAgICAgcmV0dXJuIGYgKyAyMiArIDc1ICogKGYgPCAyNikgLSAoKFAgIT0gMCkgPDwgNSk7XG4gICAgfSwgayA9IGZ1bmN0aW9uKGYsIFAsIE0pIHtcbiAgICAgIHZhciBBID0gMDtcbiAgICAgIGZvciAoXG4gICAgICAgIGYgPSBNID8gVShmIC8gRCkgOiBmID4+IDEsIGYgKz0gVShmIC8gUCk7XG4gICAgICAgIC8qIG5vIGluaXRpYWxpemF0aW9uICovXG4gICAgICAgIGYgPiBDICogJCA+PiAxO1xuICAgICAgICBBICs9IGpcbiAgICAgIClcbiAgICAgICAgZiA9IFUoZiAvIEMpO1xuICAgICAgcmV0dXJuIFUoQSArIChDICsgMSkgKiBmIC8gKGYgKyBOKSk7XG4gICAgfSwgRiA9IGZ1bmN0aW9uKGYpIHtcbiAgICAgIHZhciBQID0gW10sIE0gPSBmLmxlbmd0aCwgQSA9IDAsIFggPSB1LCBRID0gdCwgZGUgPSBmLmxhc3RJbmRleE9mKHMpO1xuICAgICAgZGUgPCAwICYmIChkZSA9IDApO1xuICAgICAgZm9yICh2YXIgaGUgPSAwOyBoZSA8IGRlOyArK2hlKVxuICAgICAgICBmLmNoYXJDb2RlQXQoaGUpID49IDEyOCAmJiBWKFwibm90LWJhc2ljXCIpLCBQLnB1c2goZi5jaGFyQ29kZUF0KGhlKSk7XG4gICAgICBmb3IgKHZhciBfZSA9IGRlID4gMCA/IGRlICsgMSA6IDA7IF9lIDwgTTsgKSB7XG4gICAgICAgIGZvciAoXG4gICAgICAgICAgdmFyIHVlID0gQSwgY2UgPSAxLCB2ZSA9IGo7XG4gICAgICAgICAgO1xuICAgICAgICAgIC8qIG5vIGNvbmRpdGlvbiAqL1xuICAgICAgICAgIHZlICs9IGpcbiAgICAgICAgKSB7XG4gICAgICAgICAgX2UgPj0gTSAmJiBWKFwiaW52YWxpZC1pbnB1dFwiKTtcbiAgICAgICAgICB2YXIgZWUgPSBaKGYuY2hhckNvZGVBdChfZSsrKSk7XG4gICAgICAgICAgKGVlID49IGogfHwgZWUgPiBVKChSIC0gQSkgLyBjZSkpICYmIFYoXCJvdmVyZmxvd1wiKSwgQSArPSBlZSAqIGNlO1xuICAgICAgICAgIHZhciBtZSA9IHZlIDw9IFEgPyBUIDogdmUgPj0gUSArICQgPyAkIDogdmUgLSBRO1xuICAgICAgICAgIGlmIChlZSA8IG1lKVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgdmFyIHdlID0gaiAtIG1lO1xuICAgICAgICAgIGNlID4gVShSIC8gd2UpICYmIFYoXCJvdmVyZmxvd1wiKSwgY2UgKj0gd2U7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGdlID0gUC5sZW5ndGggKyAxO1xuICAgICAgICBRID0gayhBIC0gdWUsIGdlLCB1ZSA9PSAwKSwgVShBIC8gZ2UpID4gUiAtIFggJiYgVihcIm92ZXJmbG93XCIpLCBYICs9IFUoQSAvIGdlKSwgQSAlPSBnZSwgUC5zcGxpY2UoQSsrLCAwLCBYKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBTdHJpbmcuZnJvbUNvZGVQb2ludC5hcHBseShTdHJpbmcsIFApO1xuICAgIH0sIE8gPSBmdW5jdGlvbihmKSB7XG4gICAgICB2YXIgUCA9IFtdO1xuICAgICAgZiA9IHEoZik7XG4gICAgICB2YXIgTSA9IGYubGVuZ3RoLCBBID0gdSwgWCA9IDAsIFEgPSB0LCBkZSA9ICEwLCBoZSA9ICExLCBfZSA9IHZvaWQgMDtcbiAgICAgIHRyeSB7XG4gICAgICAgIGZvciAodmFyIHVlID0gZltTeW1ib2wuaXRlcmF0b3JdKCksIGNlOyAhKGRlID0gKGNlID0gdWUubmV4dCgpKS5kb25lKTsgZGUgPSAhMCkge1xuICAgICAgICAgIHZhciB2ZSA9IGNlLnZhbHVlO1xuICAgICAgICAgIHZlIDwgMTI4ICYmIFAucHVzaChIKHZlKSk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKEdyKSB7XG4gICAgICAgIGhlID0gITAsIF9lID0gR3I7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICFkZSAmJiB1ZS5yZXR1cm4gJiYgdWUucmV0dXJuKCk7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgaWYgKGhlKVxuICAgICAgICAgICAgdGhyb3cgX2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHZhciBlZSA9IFAubGVuZ3RoLCBtZSA9IGVlO1xuICAgICAgZm9yIChlZSAmJiBQLnB1c2gocyk7IG1lIDwgTTsgKSB7XG4gICAgICAgIHZhciB3ZSA9IFIsIGdlID0gITAsIGFyID0gITEsIEtlID0gdm9pZCAwO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGZvciAodmFyIFdlID0gZltTeW1ib2wuaXRlcmF0b3JdKCksIFByOyAhKGdlID0gKFByID0gV2UubmV4dCgpKS5kb25lKTsgZ2UgPSAhMCkge1xuICAgICAgICAgICAgdmFyIGxyID0gUHIudmFsdWU7XG4gICAgICAgICAgICBsciA+PSBBICYmIGxyIDwgd2UgJiYgKHdlID0gbHIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoR3IpIHtcbiAgICAgICAgICBhciA9ICEwLCBLZSA9IEdyO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAhZ2UgJiYgV2UucmV0dXJuICYmIFdlLnJldHVybigpO1xuICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICBpZiAoYXIpXG4gICAgICAgICAgICAgIHRocm93IEtlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB2YXIgRGUgPSBtZSArIDE7XG4gICAgICAgIHdlIC0gQSA+IFUoKFIgLSBYKSAvIERlKSAmJiBWKFwib3ZlcmZsb3dcIiksIFggKz0gKHdlIC0gQSkgKiBEZSwgQSA9IHdlO1xuICAgICAgICB2YXIgSmUgPSAhMCwgZnIgPSAhMSwgZXIgPSB2b2lkIDA7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgZm9yICh2YXIgcXIgPSBmW1N5bWJvbC5pdGVyYXRvcl0oKSwgcWE7ICEoSmUgPSAocWEgPSBxci5uZXh0KCkpLmRvbmUpOyBKZSA9ICEwKSB7XG4gICAgICAgICAgICB2YXIgR2EgPSBxYS52YWx1ZTtcbiAgICAgICAgICAgIGlmIChHYSA8IEEgJiYgKytYID4gUiAmJiBWKFwib3ZlcmZsb3dcIiksIEdhID09IEEpIHtcbiAgICAgICAgICAgICAgZm9yIChcbiAgICAgICAgICAgICAgICB2YXIgZHQgPSBYLCBpdCA9IGo7XG4gICAgICAgICAgICAgICAgO1xuICAgICAgICAgICAgICAgIC8qIG5vIGNvbmRpdGlvbiAqL1xuICAgICAgICAgICAgICAgIGl0ICs9IGpcbiAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgdmFyIG90ID0gaXQgPD0gUSA/IFQgOiBpdCA+PSBRICsgJCA/ICQgOiBpdCAtIFE7XG4gICAgICAgICAgICAgICAgaWYgKGR0IDwgb3QpXG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB2YXIgS2EgPSBkdCAtIG90LCBXYSA9IGogLSBvdDtcbiAgICAgICAgICAgICAgICBQLnB1c2goSChCKG90ICsgS2EgJSBXYSwgMCkpKSwgZHQgPSBVKEthIC8gV2EpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIFAucHVzaChIKEIoZHQsIDApKSksIFEgPSBrKFgsIERlLCBtZSA9PSBlZSksIFggPSAwLCArK21lO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoR3IpIHtcbiAgICAgICAgICBmciA9ICEwLCBlciA9IEdyO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAhSmUgJiYgcXIucmV0dXJuICYmIHFyLnJldHVybigpO1xuICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICBpZiAoZnIpXG4gICAgICAgICAgICAgIHRocm93IGVyO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICArK1gsICsrQTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBQLmpvaW4oXCJcIik7XG4gICAgfSwgbCA9IGZ1bmN0aW9uKGYpIHtcbiAgICAgIHJldHVybiBfKGYsIGZ1bmN0aW9uKFApIHtcbiAgICAgICAgcmV0dXJuIGkudGVzdChQKSA/IEYoUC5zbGljZSg0KS50b0xvd2VyQ2FzZSgpKSA6IFA7XG4gICAgICB9KTtcbiAgICB9LCB3ID0gZnVuY3Rpb24oZikge1xuICAgICAgcmV0dXJuIF8oZiwgZnVuY3Rpb24oUCkge1xuICAgICAgICByZXR1cm4gYy50ZXN0KFApID8gXCJ4bi0tXCIgKyBPKFApIDogUDtcbiAgICAgIH0pO1xuICAgIH0sIEkgPSB7XG4gICAgICAvKipcbiAgICAgICAqIEEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgY3VycmVudCBQdW55Y29kZS5qcyB2ZXJzaW9uIG51bWJlci5cbiAgICAgICAqIEBtZW1iZXJPZiBwdW55Y29kZVxuICAgICAgICogQHR5cGUgU3RyaW5nXG4gICAgICAgKi9cbiAgICAgIHZlcnNpb246IFwiMi4xLjBcIixcbiAgICAgIC8qKlxuICAgICAgICogQW4gb2JqZWN0IG9mIG1ldGhvZHMgdG8gY29udmVydCBmcm9tIEphdmFTY3JpcHQncyBpbnRlcm5hbCBjaGFyYWN0ZXJcbiAgICAgICAqIHJlcHJlc2VudGF0aW9uIChVQ1MtMikgdG8gVW5pY29kZSBjb2RlIHBvaW50cywgYW5kIGJhY2suXG4gICAgICAgKiBAc2VlIDxodHRwczovL21hdGhpYXNieW5lbnMuYmUvbm90ZXMvamF2YXNjcmlwdC1lbmNvZGluZz5cbiAgICAgICAqIEBtZW1iZXJPZiBwdW55Y29kZVxuICAgICAgICogQHR5cGUgT2JqZWN0XG4gICAgICAgKi9cbiAgICAgIHVjczI6IHtcbiAgICAgICAgZGVjb2RlOiBxLFxuICAgICAgICBlbmNvZGU6IEpcbiAgICAgIH0sXG4gICAgICBkZWNvZGU6IEYsXG4gICAgICBlbmNvZGU6IE8sXG4gICAgICB0b0FTQ0lJOiB3LFxuICAgICAgdG9Vbmljb2RlOiBsXG4gICAgfSwgSyA9IHt9O1xuICAgIGZ1bmN0aW9uIFcoRSkge1xuICAgICAgdmFyIGYgPSBFLmNoYXJDb2RlQXQoMCksIFAgPSB2b2lkIDA7XG4gICAgICByZXR1cm4gZiA8IDE2ID8gUCA9IFwiJTBcIiArIGYudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCkgOiBmIDwgMTI4ID8gUCA9IFwiJVwiICsgZi50b1N0cmluZygxNikudG9VcHBlckNhc2UoKSA6IGYgPCAyMDQ4ID8gUCA9IFwiJVwiICsgKGYgPj4gNiB8IDE5MikudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCkgKyBcIiVcIiArIChmICYgNjMgfCAxMjgpLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpIDogUCA9IFwiJVwiICsgKGYgPj4gMTIgfCAyMjQpLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpICsgXCIlXCIgKyAoZiA+PiA2ICYgNjMgfCAxMjgpLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpICsgXCIlXCIgKyAoZiAmIDYzIHwgMTI4KS50b1N0cmluZygxNikudG9VcHBlckNhc2UoKSwgUDtcbiAgICB9XG4gICAgZnVuY3Rpb24gcmUoRSkge1xuICAgICAgZm9yICh2YXIgZiA9IFwiXCIsIFAgPSAwLCBNID0gRS5sZW5ndGg7IFAgPCBNOyApIHtcbiAgICAgICAgdmFyIEEgPSBwYXJzZUludChFLnN1YnN0cihQICsgMSwgMiksIDE2KTtcbiAgICAgICAgaWYgKEEgPCAxMjgpXG4gICAgICAgICAgZiArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKEEpLCBQICs9IDM7XG4gICAgICAgIGVsc2UgaWYgKEEgPj0gMTk0ICYmIEEgPCAyMjQpIHtcbiAgICAgICAgICBpZiAoTSAtIFAgPj0gNikge1xuICAgICAgICAgICAgdmFyIFggPSBwYXJzZUludChFLnN1YnN0cihQICsgNCwgMiksIDE2KTtcbiAgICAgICAgICAgIGYgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSgoQSAmIDMxKSA8PCA2IHwgWCAmIDYzKTtcbiAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgIGYgKz0gRS5zdWJzdHIoUCwgNik7XG4gICAgICAgICAgUCArPSA2O1xuICAgICAgICB9IGVsc2UgaWYgKEEgPj0gMjI0KSB7XG4gICAgICAgICAgaWYgKE0gLSBQID49IDkpIHtcbiAgICAgICAgICAgIHZhciBRID0gcGFyc2VJbnQoRS5zdWJzdHIoUCArIDQsIDIpLCAxNiksIGRlID0gcGFyc2VJbnQoRS5zdWJzdHIoUCArIDcsIDIpLCAxNik7XG4gICAgICAgICAgICBmICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoKEEgJiAxNSkgPDwgMTIgfCAoUSAmIDYzKSA8PCA2IHwgZGUgJiA2Myk7XG4gICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICBmICs9IEUuc3Vic3RyKFAsIDkpO1xuICAgICAgICAgIFAgKz0gOTtcbiAgICAgICAgfSBlbHNlXG4gICAgICAgICAgZiArPSBFLnN1YnN0cihQLCAzKSwgUCArPSAzO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGY7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGFlKEUsIGYpIHtcbiAgICAgIGZ1bmN0aW9uIFAoTSkge1xuICAgICAgICB2YXIgQSA9IHJlKE0pO1xuICAgICAgICByZXR1cm4gQS5tYXRjaChmLlVOUkVTRVJWRUQpID8gQSA6IE07XG4gICAgICB9XG4gICAgICByZXR1cm4gRS5zY2hlbWUgJiYgKEUuc2NoZW1lID0gU3RyaW5nKEUuc2NoZW1lKS5yZXBsYWNlKGYuUENUX0VOQ09ERUQsIFApLnRvTG93ZXJDYXNlKCkucmVwbGFjZShmLk5PVF9TQ0hFTUUsIFwiXCIpKSwgRS51c2VyaW5mbyAhPT0gdm9pZCAwICYmIChFLnVzZXJpbmZvID0gU3RyaW5nKEUudXNlcmluZm8pLnJlcGxhY2UoZi5QQ1RfRU5DT0RFRCwgUCkucmVwbGFjZShmLk5PVF9VU0VSSU5GTywgVykucmVwbGFjZShmLlBDVF9FTkNPREVELCBwKSksIEUuaG9zdCAhPT0gdm9pZCAwICYmIChFLmhvc3QgPSBTdHJpbmcoRS5ob3N0KS5yZXBsYWNlKGYuUENUX0VOQ09ERUQsIFApLnRvTG93ZXJDYXNlKCkucmVwbGFjZShmLk5PVF9IT1NULCBXKS5yZXBsYWNlKGYuUENUX0VOQ09ERUQsIHApKSwgRS5wYXRoICE9PSB2b2lkIDAgJiYgKEUucGF0aCA9IFN0cmluZyhFLnBhdGgpLnJlcGxhY2UoZi5QQ1RfRU5DT0RFRCwgUCkucmVwbGFjZShFLnNjaGVtZSA/IGYuTk9UX1BBVEggOiBmLk5PVF9QQVRIX05PU0NIRU1FLCBXKS5yZXBsYWNlKGYuUENUX0VOQ09ERUQsIHApKSwgRS5xdWVyeSAhPT0gdm9pZCAwICYmIChFLnF1ZXJ5ID0gU3RyaW5nKEUucXVlcnkpLnJlcGxhY2UoZi5QQ1RfRU5DT0RFRCwgUCkucmVwbGFjZShmLk5PVF9RVUVSWSwgVykucmVwbGFjZShmLlBDVF9FTkNPREVELCBwKSksIEUuZnJhZ21lbnQgIT09IHZvaWQgMCAmJiAoRS5mcmFnbWVudCA9IFN0cmluZyhFLmZyYWdtZW50KS5yZXBsYWNlKGYuUENUX0VOQ09ERUQsIFApLnJlcGxhY2UoZi5OT1RfRlJBR01FTlQsIFcpLnJlcGxhY2UoZi5QQ1RfRU5DT0RFRCwgcCkpLCBFO1xuICAgIH1cbiAgICBmdW5jdGlvbiBmZShFKSB7XG4gICAgICByZXR1cm4gRS5yZXBsYWNlKC9eMCooLiopLywgXCIkMVwiKSB8fCBcIjBcIjtcbiAgICB9XG4gICAgZnVuY3Rpb24gamUoRSwgZikge1xuICAgICAgdmFyIFAgPSBFLm1hdGNoKGYuSVBWNEFERFJFU1MpIHx8IFtdLCBNID0geihQLCAyKSwgQSA9IE1bMV07XG4gICAgICByZXR1cm4gQSA/IEEuc3BsaXQoXCIuXCIpLm1hcChmZSkuam9pbihcIi5cIikgOiBFO1xuICAgIH1cbiAgICBmdW5jdGlvbiB4ZShFLCBmKSB7XG4gICAgICB2YXIgUCA9IEUubWF0Y2goZi5JUFY2QUREUkVTUykgfHwgW10sIE0gPSB6KFAsIDMpLCBBID0gTVsxXSwgWCA9IE1bMl07XG4gICAgICBpZiAoQSkge1xuICAgICAgICBmb3IgKHZhciBRID0gQS50b0xvd2VyQ2FzZSgpLnNwbGl0KFwiOjpcIikucmV2ZXJzZSgpLCBkZSA9IHooUSwgMiksIGhlID0gZGVbMF0sIF9lID0gZGVbMV0sIHVlID0gX2UgPyBfZS5zcGxpdChcIjpcIikubWFwKGZlKSA6IFtdLCBjZSA9IGhlLnNwbGl0KFwiOlwiKS5tYXAoZmUpLCB2ZSA9IGYuSVBWNEFERFJFU1MudGVzdChjZVtjZS5sZW5ndGggLSAxXSksIGVlID0gdmUgPyA3IDogOCwgbWUgPSBjZS5sZW5ndGggLSBlZSwgd2UgPSBBcnJheShlZSksIGdlID0gMDsgZ2UgPCBlZTsgKytnZSlcbiAgICAgICAgICB3ZVtnZV0gPSB1ZVtnZV0gfHwgY2VbbWUgKyBnZV0gfHwgXCJcIjtcbiAgICAgICAgdmUgJiYgKHdlW2VlIC0gMV0gPSBqZSh3ZVtlZSAtIDFdLCBmKSk7XG4gICAgICAgIHZhciBhciA9IHdlLnJlZHVjZShmdW5jdGlvbihEZSwgSmUsIGZyKSB7XG4gICAgICAgICAgaWYgKCFKZSB8fCBKZSA9PT0gXCIwXCIpIHtcbiAgICAgICAgICAgIHZhciBlciA9IERlW0RlLmxlbmd0aCAtIDFdO1xuICAgICAgICAgICAgZXIgJiYgZXIuaW5kZXggKyBlci5sZW5ndGggPT09IGZyID8gZXIubGVuZ3RoKysgOiBEZS5wdXNoKHsgaW5kZXg6IGZyLCBsZW5ndGg6IDEgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBEZTtcbiAgICAgICAgfSwgW10pLCBLZSA9IGFyLnNvcnQoZnVuY3Rpb24oRGUsIEplKSB7XG4gICAgICAgICAgcmV0dXJuIEplLmxlbmd0aCAtIERlLmxlbmd0aDtcbiAgICAgICAgfSlbMF0sIFdlID0gdm9pZCAwO1xuICAgICAgICBpZiAoS2UgJiYgS2UubGVuZ3RoID4gMSkge1xuICAgICAgICAgIHZhciBQciA9IHdlLnNsaWNlKDAsIEtlLmluZGV4KSwgbHIgPSB3ZS5zbGljZShLZS5pbmRleCArIEtlLmxlbmd0aCk7XG4gICAgICAgICAgV2UgPSBQci5qb2luKFwiOlwiKSArIFwiOjpcIiArIGxyLmpvaW4oXCI6XCIpO1xuICAgICAgICB9IGVsc2VcbiAgICAgICAgICBXZSA9IHdlLmpvaW4oXCI6XCIpO1xuICAgICAgICByZXR1cm4gWCAmJiAoV2UgKz0gXCIlXCIgKyBYKSwgV2U7XG4gICAgICB9IGVsc2VcbiAgICAgICAgcmV0dXJuIEU7XG4gICAgfVxuICAgIHZhciBMciA9IC9eKD86KFteOlxcLz8jXSspOik/KD86XFwvXFwvKCg/OihbXlxcLz8jQF0qKUApPyhcXFtbXlxcLz8jXFxdXStcXF18W15cXC8/IzpdKikoPzpcXDooXFxkKikpPykpPyhbXj8jXSopKD86XFw/KFteI10qKSk/KD86IygoPzoufFxcbnxcXHIpKikpPy9pLCB6ciA9IFwiXCIubWF0Y2goLygpezB9LylbMV0gPT09IHZvaWQgMDtcbiAgICBmdW5jdGlvbiBJZShFKSB7XG4gICAgICB2YXIgZiA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdm9pZCAwID8gYXJndW1lbnRzWzFdIDoge30sIFAgPSB7fSwgTSA9IGYuaXJpICE9PSAhMSA/IFMgOiBnO1xuICAgICAgZi5yZWZlcmVuY2UgPT09IFwic3VmZml4XCIgJiYgKEUgPSAoZi5zY2hlbWUgPyBmLnNjaGVtZSArIFwiOlwiIDogXCJcIikgKyBcIi8vXCIgKyBFKTtcbiAgICAgIHZhciBBID0gRS5tYXRjaChMcik7XG4gICAgICBpZiAoQSkge1xuICAgICAgICB6ciA/IChQLnNjaGVtZSA9IEFbMV0sIFAudXNlcmluZm8gPSBBWzNdLCBQLmhvc3QgPSBBWzRdLCBQLnBvcnQgPSBwYXJzZUludChBWzVdLCAxMCksIFAucGF0aCA9IEFbNl0gfHwgXCJcIiwgUC5xdWVyeSA9IEFbN10sIFAuZnJhZ21lbnQgPSBBWzhdLCBpc05hTihQLnBvcnQpICYmIChQLnBvcnQgPSBBWzVdKSkgOiAoUC5zY2hlbWUgPSBBWzFdIHx8IHZvaWQgMCwgUC51c2VyaW5mbyA9IEUuaW5kZXhPZihcIkBcIikgIT09IC0xID8gQVszXSA6IHZvaWQgMCwgUC5ob3N0ID0gRS5pbmRleE9mKFwiLy9cIikgIT09IC0xID8gQVs0XSA6IHZvaWQgMCwgUC5wb3J0ID0gcGFyc2VJbnQoQVs1XSwgMTApLCBQLnBhdGggPSBBWzZdIHx8IFwiXCIsIFAucXVlcnkgPSBFLmluZGV4T2YoXCI/XCIpICE9PSAtMSA/IEFbN10gOiB2b2lkIDAsIFAuZnJhZ21lbnQgPSBFLmluZGV4T2YoXCIjXCIpICE9PSAtMSA/IEFbOF0gOiB2b2lkIDAsIGlzTmFOKFAucG9ydCkgJiYgKFAucG9ydCA9IEUubWF0Y2goL1xcL1xcLyg/Oi58XFxuKSpcXDooPzpcXC98XFw/fFxcI3wkKS8pID8gQVs0XSA6IHZvaWQgMCkpLCBQLmhvc3QgJiYgKFAuaG9zdCA9IHhlKGplKFAuaG9zdCwgTSksIE0pKSwgUC5zY2hlbWUgPT09IHZvaWQgMCAmJiBQLnVzZXJpbmZvID09PSB2b2lkIDAgJiYgUC5ob3N0ID09PSB2b2lkIDAgJiYgUC5wb3J0ID09PSB2b2lkIDAgJiYgIVAucGF0aCAmJiBQLnF1ZXJ5ID09PSB2b2lkIDAgPyBQLnJlZmVyZW5jZSA9IFwic2FtZS1kb2N1bWVudFwiIDogUC5zY2hlbWUgPT09IHZvaWQgMCA/IFAucmVmZXJlbmNlID0gXCJyZWxhdGl2ZVwiIDogUC5mcmFnbWVudCA9PT0gdm9pZCAwID8gUC5yZWZlcmVuY2UgPSBcImFic29sdXRlXCIgOiBQLnJlZmVyZW5jZSA9IFwidXJpXCIsIGYucmVmZXJlbmNlICYmIGYucmVmZXJlbmNlICE9PSBcInN1ZmZpeFwiICYmIGYucmVmZXJlbmNlICE9PSBQLnJlZmVyZW5jZSAmJiAoUC5lcnJvciA9IFAuZXJyb3IgfHwgXCJVUkkgaXMgbm90IGEgXCIgKyBmLnJlZmVyZW5jZSArIFwiIHJlZmVyZW5jZS5cIik7XG4gICAgICAgIHZhciBYID0gS1soZi5zY2hlbWUgfHwgUC5zY2hlbWUgfHwgXCJcIikudG9Mb3dlckNhc2UoKV07XG4gICAgICAgIGlmICghZi51bmljb2RlU3VwcG9ydCAmJiAoIVggfHwgIVgudW5pY29kZVN1cHBvcnQpKSB7XG4gICAgICAgICAgaWYgKFAuaG9zdCAmJiAoZi5kb21haW5Ib3N0IHx8IFggJiYgWC5kb21haW5Ib3N0KSlcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIFAuaG9zdCA9IEkudG9BU0NJSShQLmhvc3QucmVwbGFjZShNLlBDVF9FTkNPREVELCByZSkudG9Mb3dlckNhc2UoKSk7XG4gICAgICAgICAgICB9IGNhdGNoIChRKSB7XG4gICAgICAgICAgICAgIFAuZXJyb3IgPSBQLmVycm9yIHx8IFwiSG9zdCdzIGRvbWFpbiBuYW1lIGNhbiBub3QgYmUgY29udmVydGVkIHRvIEFTQ0lJIHZpYSBwdW55Y29kZTogXCIgKyBRO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIGFlKFAsIGcpO1xuICAgICAgICB9IGVsc2VcbiAgICAgICAgICBhZShQLCBNKTtcbiAgICAgICAgWCAmJiBYLnBhcnNlICYmIFgucGFyc2UoUCwgZik7XG4gICAgICB9IGVsc2VcbiAgICAgICAgUC5lcnJvciA9IFAuZXJyb3IgfHwgXCJVUkkgY2FuIG5vdCBiZSBwYXJzZWQuXCI7XG4gICAgICByZXR1cm4gUDtcbiAgICB9XG4gICAgZnVuY3Rpb24gVnIoRSwgZikge1xuICAgICAgdmFyIFAgPSBmLmlyaSAhPT0gITEgPyBTIDogZywgTSA9IFtdO1xuICAgICAgcmV0dXJuIEUudXNlcmluZm8gIT09IHZvaWQgMCAmJiAoTS5wdXNoKEUudXNlcmluZm8pLCBNLnB1c2goXCJAXCIpKSwgRS5ob3N0ICE9PSB2b2lkIDAgJiYgTS5wdXNoKHhlKGplKFN0cmluZyhFLmhvc3QpLCBQKSwgUCkucmVwbGFjZShQLklQVjZBRERSRVNTLCBmdW5jdGlvbihBLCBYLCBRKSB7XG4gICAgICAgIHJldHVybiBcIltcIiArIFggKyAoUSA/IFwiJTI1XCIgKyBRIDogXCJcIikgKyBcIl1cIjtcbiAgICAgIH0pKSwgKHR5cGVvZiBFLnBvcnQgPT0gXCJudW1iZXJcIiB8fCB0eXBlb2YgRS5wb3J0ID09IFwic3RyaW5nXCIpICYmIChNLnB1c2goXCI6XCIpLCBNLnB1c2goU3RyaW5nKEUucG9ydCkpKSwgTS5sZW5ndGggPyBNLmpvaW4oXCJcIikgOiB2b2lkIDA7XG4gICAgfVxuICAgIHZhciB3ciA9IC9eXFwuXFwuP1xcLy8sIGJyID0gL15cXC9cXC4oXFwvfCQpLywgJHIgPSAvXlxcL1xcLlxcLihcXC98JCkvLCBGciA9IC9eXFwvPyg/Oi58XFxuKSo/KD89XFwvfCQpLztcbiAgICBmdW5jdGlvbiBxZShFKSB7XG4gICAgICBmb3IgKHZhciBmID0gW107IEUubGVuZ3RoOyApXG4gICAgICAgIGlmIChFLm1hdGNoKHdyKSlcbiAgICAgICAgICBFID0gRS5yZXBsYWNlKHdyLCBcIlwiKTtcbiAgICAgICAgZWxzZSBpZiAoRS5tYXRjaChicikpXG4gICAgICAgICAgRSA9IEUucmVwbGFjZShiciwgXCIvXCIpO1xuICAgICAgICBlbHNlIGlmIChFLm1hdGNoKCRyKSlcbiAgICAgICAgICBFID0gRS5yZXBsYWNlKCRyLCBcIi9cIiksIGYucG9wKCk7XG4gICAgICAgIGVsc2UgaWYgKEUgPT09IFwiLlwiIHx8IEUgPT09IFwiLi5cIilcbiAgICAgICAgICBFID0gXCJcIjtcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgdmFyIFAgPSBFLm1hdGNoKEZyKTtcbiAgICAgICAgICBpZiAoUCkge1xuICAgICAgICAgICAgdmFyIE0gPSBQWzBdO1xuICAgICAgICAgICAgRSA9IEUuc2xpY2UoTS5sZW5ndGgpLCBmLnB1c2goTSk7XG4gICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbmV4cGVjdGVkIGRvdCBzZWdtZW50IGNvbmRpdGlvblwiKTtcbiAgICAgICAgfVxuICAgICAgcmV0dXJuIGYuam9pbihcIlwiKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gTmUoRSkge1xuICAgICAgdmFyIGYgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHZvaWQgMCA/IGFyZ3VtZW50c1sxXSA6IHt9LCBQID0gZi5pcmkgPyBTIDogZywgTSA9IFtdLCBBID0gS1soZi5zY2hlbWUgfHwgRS5zY2hlbWUgfHwgXCJcIikudG9Mb3dlckNhc2UoKV07XG4gICAgICBpZiAoQSAmJiBBLnNlcmlhbGl6ZSAmJiBBLnNlcmlhbGl6ZShFLCBmKSwgRS5ob3N0ICYmICFQLklQVjZBRERSRVNTLnRlc3QoRS5ob3N0KSkge1xuICAgICAgICBpZiAoZi5kb21haW5Ib3N0IHx8IEEgJiYgQS5kb21haW5Ib3N0KVxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBFLmhvc3QgPSBmLmlyaSA/IEkudG9Vbmljb2RlKEUuaG9zdCkgOiBJLnRvQVNDSUkoRS5ob3N0LnJlcGxhY2UoUC5QQ1RfRU5DT0RFRCwgcmUpLnRvTG93ZXJDYXNlKCkpO1xuICAgICAgICAgIH0gY2F0Y2ggKGRlKSB7XG4gICAgICAgICAgICBFLmVycm9yID0gRS5lcnJvciB8fCBcIkhvc3QncyBkb21haW4gbmFtZSBjYW4gbm90IGJlIGNvbnZlcnRlZCB0byBcIiArIChmLmlyaSA/IFwiVW5pY29kZVwiIDogXCJBU0NJSVwiKSArIFwiIHZpYSBwdW55Y29kZTogXCIgKyBkZTtcbiAgICAgICAgICB9XG4gICAgICB9XG4gICAgICBhZShFLCBQKSwgZi5yZWZlcmVuY2UgIT09IFwic3VmZml4XCIgJiYgRS5zY2hlbWUgJiYgKE0ucHVzaChFLnNjaGVtZSksIE0ucHVzaChcIjpcIikpO1xuICAgICAgdmFyIFggPSBWcihFLCBmKTtcbiAgICAgIGlmIChYICE9PSB2b2lkIDAgJiYgKGYucmVmZXJlbmNlICE9PSBcInN1ZmZpeFwiICYmIE0ucHVzaChcIi8vXCIpLCBNLnB1c2goWCksIEUucGF0aCAmJiBFLnBhdGguY2hhckF0KDApICE9PSBcIi9cIiAmJiBNLnB1c2goXCIvXCIpKSwgRS5wYXRoICE9PSB2b2lkIDApIHtcbiAgICAgICAgdmFyIFEgPSBFLnBhdGg7XG4gICAgICAgICFmLmFic29sdXRlUGF0aCAmJiAoIUEgfHwgIUEuYWJzb2x1dGVQYXRoKSAmJiAoUSA9IHFlKFEpKSwgWCA9PT0gdm9pZCAwICYmIChRID0gUS5yZXBsYWNlKC9eXFwvXFwvLywgXCIvJTJGXCIpKSwgTS5wdXNoKFEpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIEUucXVlcnkgIT09IHZvaWQgMCAmJiAoTS5wdXNoKFwiP1wiKSwgTS5wdXNoKEUucXVlcnkpKSwgRS5mcmFnbWVudCAhPT0gdm9pZCAwICYmIChNLnB1c2goXCIjXCIpLCBNLnB1c2goRS5mcmFnbWVudCkpLCBNLmpvaW4oXCJcIik7XG4gICAgfVxuICAgIGZ1bmN0aW9uIEVyKEUsIGYpIHtcbiAgICAgIHZhciBQID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB2b2lkIDAgPyBhcmd1bWVudHNbMl0gOiB7fSwgTSA9IGFyZ3VtZW50c1szXSwgQSA9IHt9O1xuICAgICAgcmV0dXJuIE0gfHwgKEUgPSBJZShOZShFLCBQKSwgUCksIGYgPSBJZShOZShmLCBQKSwgUCkpLCBQID0gUCB8fCB7fSwgIVAudG9sZXJhbnQgJiYgZi5zY2hlbWUgPyAoQS5zY2hlbWUgPSBmLnNjaGVtZSwgQS51c2VyaW5mbyA9IGYudXNlcmluZm8sIEEuaG9zdCA9IGYuaG9zdCwgQS5wb3J0ID0gZi5wb3J0LCBBLnBhdGggPSBxZShmLnBhdGggfHwgXCJcIiksIEEucXVlcnkgPSBmLnF1ZXJ5KSA6IChmLnVzZXJpbmZvICE9PSB2b2lkIDAgfHwgZi5ob3N0ICE9PSB2b2lkIDAgfHwgZi5wb3J0ICE9PSB2b2lkIDAgPyAoQS51c2VyaW5mbyA9IGYudXNlcmluZm8sIEEuaG9zdCA9IGYuaG9zdCwgQS5wb3J0ID0gZi5wb3J0LCBBLnBhdGggPSBxZShmLnBhdGggfHwgXCJcIiksIEEucXVlcnkgPSBmLnF1ZXJ5KSA6IChmLnBhdGggPyAoZi5wYXRoLmNoYXJBdCgwKSA9PT0gXCIvXCIgPyBBLnBhdGggPSBxZShmLnBhdGgpIDogKChFLnVzZXJpbmZvICE9PSB2b2lkIDAgfHwgRS5ob3N0ICE9PSB2b2lkIDAgfHwgRS5wb3J0ICE9PSB2b2lkIDApICYmICFFLnBhdGggPyBBLnBhdGggPSBcIi9cIiArIGYucGF0aCA6IEUucGF0aCA/IEEucGF0aCA9IEUucGF0aC5zbGljZSgwLCBFLnBhdGgubGFzdEluZGV4T2YoXCIvXCIpICsgMSkgKyBmLnBhdGggOiBBLnBhdGggPSBmLnBhdGgsIEEucGF0aCA9IHFlKEEucGF0aCkpLCBBLnF1ZXJ5ID0gZi5xdWVyeSkgOiAoQS5wYXRoID0gRS5wYXRoLCBmLnF1ZXJ5ICE9PSB2b2lkIDAgPyBBLnF1ZXJ5ID0gZi5xdWVyeSA6IEEucXVlcnkgPSBFLnF1ZXJ5KSwgQS51c2VyaW5mbyA9IEUudXNlcmluZm8sIEEuaG9zdCA9IEUuaG9zdCwgQS5wb3J0ID0gRS5wb3J0KSwgQS5zY2hlbWUgPSBFLnNjaGVtZSksIEEuZnJhZ21lbnQgPSBmLmZyYWdtZW50LCBBO1xuICAgIH1cbiAgICBmdW5jdGlvbiBVcihFLCBmLCBQKSB7XG4gICAgICB2YXIgTSA9IGIoeyBzY2hlbWU6IFwibnVsbFwiIH0sIFApO1xuICAgICAgcmV0dXJuIE5lKEVyKEllKEUsIE0pLCBJZShmLCBNKSwgTSwgITApLCBNKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gb3IoRSwgZikge1xuICAgICAgcmV0dXJuIHR5cGVvZiBFID09IFwic3RyaW5nXCIgPyBFID0gTmUoSWUoRSwgZiksIGYpIDogbyhFKSA9PT0gXCJvYmplY3RcIiAmJiAoRSA9IEllKE5lKEUsIGYpLCBmKSksIEU7XG4gICAgfVxuICAgIGZ1bmN0aW9uIEJyKEUsIGYsIFApIHtcbiAgICAgIHJldHVybiB0eXBlb2YgRSA9PSBcInN0cmluZ1wiID8gRSA9IE5lKEllKEUsIFApLCBQKSA6IG8oRSkgPT09IFwib2JqZWN0XCIgJiYgKEUgPSBOZShFLCBQKSksIHR5cGVvZiBmID09IFwic3RyaW5nXCIgPyBmID0gTmUoSWUoZiwgUCksIFApIDogbyhmKSA9PT0gXCJvYmplY3RcIiAmJiAoZiA9IE5lKGYsIFApKSwgRSA9PT0gZjtcbiAgICB9XG4gICAgZnVuY3Rpb24gdXQoRSwgZikge1xuICAgICAgcmV0dXJuIEUgJiYgRS50b1N0cmluZygpLnJlcGxhY2UoIWYgfHwgIWYuaXJpID8gZy5FU0NBUEUgOiBTLkVTQ0FQRSwgVyk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIE1lKEUsIGYpIHtcbiAgICAgIHJldHVybiBFICYmIEUudG9TdHJpbmcoKS5yZXBsYWNlKCFmIHx8ICFmLmlyaSA/IGcuUENUX0VOQ09ERUQgOiBTLlBDVF9FTkNPREVELCByZSk7XG4gICAgfVxuICAgIHZhciBjciA9IHtcbiAgICAgIHNjaGVtZTogXCJodHRwXCIsXG4gICAgICBkb21haW5Ib3N0OiAhMCxcbiAgICAgIHBhcnNlOiBmdW5jdGlvbihmLCBQKSB7XG4gICAgICAgIHJldHVybiBmLmhvc3QgfHwgKGYuZXJyb3IgPSBmLmVycm9yIHx8IFwiSFRUUCBVUklzIG11c3QgaGF2ZSBhIGhvc3QuXCIpLCBmO1xuICAgICAgfSxcbiAgICAgIHNlcmlhbGl6ZTogZnVuY3Rpb24oZiwgUCkge1xuICAgICAgICB2YXIgTSA9IFN0cmluZyhmLnNjaGVtZSkudG9Mb3dlckNhc2UoKSA9PT0gXCJodHRwc1wiO1xuICAgICAgICByZXR1cm4gKGYucG9ydCA9PT0gKE0gPyA0NDMgOiA4MCkgfHwgZi5wb3J0ID09PSBcIlwiKSAmJiAoZi5wb3J0ID0gdm9pZCAwKSwgZi5wYXRoIHx8IChmLnBhdGggPSBcIi9cIiksIGY7XG4gICAgICB9XG4gICAgfSwgRGEgPSB7XG4gICAgICBzY2hlbWU6IFwiaHR0cHNcIixcbiAgICAgIGRvbWFpbkhvc3Q6IGNyLmRvbWFpbkhvc3QsXG4gICAgICBwYXJzZTogY3IucGFyc2UsXG4gICAgICBzZXJpYWxpemU6IGNyLnNlcmlhbGl6ZVxuICAgIH07XG4gICAgZnVuY3Rpb24gTGEoRSkge1xuICAgICAgcmV0dXJuIHR5cGVvZiBFLnNlY3VyZSA9PSBcImJvb2xlYW5cIiA/IEUuc2VjdXJlIDogU3RyaW5nKEUuc2NoZW1lKS50b0xvd2VyQ2FzZSgpID09PSBcIndzc1wiO1xuICAgIH1cbiAgICB2YXIgSHIgPSB7XG4gICAgICBzY2hlbWU6IFwid3NcIixcbiAgICAgIGRvbWFpbkhvc3Q6ICEwLFxuICAgICAgcGFyc2U6IGZ1bmN0aW9uKGYsIFApIHtcbiAgICAgICAgdmFyIE0gPSBmO1xuICAgICAgICByZXR1cm4gTS5zZWN1cmUgPSBMYShNKSwgTS5yZXNvdXJjZU5hbWUgPSAoTS5wYXRoIHx8IFwiL1wiKSArIChNLnF1ZXJ5ID8gXCI/XCIgKyBNLnF1ZXJ5IDogXCJcIiksIE0ucGF0aCA9IHZvaWQgMCwgTS5xdWVyeSA9IHZvaWQgMCwgTTtcbiAgICAgIH0sXG4gICAgICBzZXJpYWxpemU6IGZ1bmN0aW9uKGYsIFApIHtcbiAgICAgICAgaWYgKChmLnBvcnQgPT09IChMYShmKSA/IDQ0MyA6IDgwKSB8fCBmLnBvcnQgPT09IFwiXCIpICYmIChmLnBvcnQgPSB2b2lkIDApLCB0eXBlb2YgZi5zZWN1cmUgPT0gXCJib29sZWFuXCIgJiYgKGYuc2NoZW1lID0gZi5zZWN1cmUgPyBcIndzc1wiIDogXCJ3c1wiLCBmLnNlY3VyZSA9IHZvaWQgMCksIGYucmVzb3VyY2VOYW1lKSB7XG4gICAgICAgICAgdmFyIE0gPSBmLnJlc291cmNlTmFtZS5zcGxpdChcIj9cIiksIEEgPSB6KE0sIDIpLCBYID0gQVswXSwgUSA9IEFbMV07XG4gICAgICAgICAgZi5wYXRoID0gWCAmJiBYICE9PSBcIi9cIiA/IFggOiB2b2lkIDAsIGYucXVlcnkgPSBRLCBmLnJlc291cmNlTmFtZSA9IHZvaWQgMDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZi5mcmFnbWVudCA9IHZvaWQgMCwgZjtcbiAgICAgIH1cbiAgICB9LCB6YSA9IHtcbiAgICAgIHNjaGVtZTogXCJ3c3NcIixcbiAgICAgIGRvbWFpbkhvc3Q6IEhyLmRvbWFpbkhvc3QsXG4gICAgICBwYXJzZTogSHIucGFyc2UsXG4gICAgICBzZXJpYWxpemU6IEhyLnNlcmlhbGl6ZVxuICAgIH0sIGxzID0ge30sIFZhID0gXCJbQS1aYS16MC05XFxcXC1cXFxcLlxcXFxfXFxcXH5cXFxceEEwLVxcXFx1MjAwRFxcXFx1MjAxMC1cXFxcdTIwMjlcXFxcdTIwMkYtXFxcXHVEN0ZGXFxcXHVGOTAwLVxcXFx1RkRDRlxcXFx1RkRGMC1cXFxcdUZGRUZdXCIsIEdlID0gXCJbMC05QS1GYS1mXVwiLCBmcyA9IGQoZChcIiVbRUZlZl1cIiArIEdlICsgXCIlXCIgKyBHZSArIEdlICsgXCIlXCIgKyBHZSArIEdlKSArIFwifFwiICsgZChcIiVbODlBLUZhLWZdXCIgKyBHZSArIFwiJVwiICsgR2UgKyBHZSkgKyBcInxcIiArIGQoXCIlXCIgKyBHZSArIEdlKSksIGhzID0gXCJbQS1aYS16MC05XFxcXCFcXFxcJFxcXFwlXFxcXCdcXFxcKlxcXFwrXFxcXC1cXFxcXlxcXFxfXFxcXGBcXFxce1xcXFx8XFxcXH1cXFxcfl1cIiwgcHMgPSBcIltcXFxcIVxcXFwkXFxcXCVcXFxcJ1xcXFwoXFxcXClcXFxcKlxcXFwrXFxcXCxcXFxcLVxcXFwuMC05XFxcXDxcXFxcPkEtWlxcXFx4NUUtXFxcXHg3RV1cIiwgbXMgPSBhKHBzLCAnW1xcXFxcIlxcXFxcXFxcXScpLCBncyA9IFwiW1xcXFwhXFxcXCRcXFxcJ1xcXFwoXFxcXClcXFxcKlxcXFwrXFxcXCxcXFxcO1xcXFw6XFxcXEBdXCIsIF9zID0gbmV3IFJlZ0V4cChWYSwgXCJnXCIpLCBrciA9IG5ldyBSZWdFeHAoZnMsIFwiZ1wiKSwgdnMgPSBuZXcgUmVnRXhwKGEoXCJbXl1cIiwgaHMsIFwiW1xcXFwuXVwiLCAnW1xcXFxcIl0nLCBtcyksIFwiZ1wiKSwgRmEgPSBuZXcgUmVnRXhwKGEoXCJbXl1cIiwgVmEsIGdzKSwgXCJnXCIpLCB5cyA9IEZhO1xuICAgIGZ1bmN0aW9uIE10KEUpIHtcbiAgICAgIHZhciBmID0gcmUoRSk7XG4gICAgICByZXR1cm4gZi5tYXRjaChfcykgPyBmIDogRTtcbiAgICB9XG4gICAgdmFyIFVhID0ge1xuICAgICAgc2NoZW1lOiBcIm1haWx0b1wiLFxuICAgICAgcGFyc2U6IGZ1bmN0aW9uKGYsIFApIHtcbiAgICAgICAgdmFyIE0gPSBmLCBBID0gTS50byA9IE0ucGF0aCA/IE0ucGF0aC5zcGxpdChcIixcIikgOiBbXTtcbiAgICAgICAgaWYgKE0ucGF0aCA9IHZvaWQgMCwgTS5xdWVyeSkge1xuICAgICAgICAgIGZvciAodmFyIFggPSAhMSwgUSA9IHt9LCBkZSA9IE0ucXVlcnkuc3BsaXQoXCImXCIpLCBoZSA9IDAsIF9lID0gZGUubGVuZ3RoOyBoZSA8IF9lOyArK2hlKSB7XG4gICAgICAgICAgICB2YXIgdWUgPSBkZVtoZV0uc3BsaXQoXCI9XCIpO1xuICAgICAgICAgICAgc3dpdGNoICh1ZVswXSkge1xuICAgICAgICAgICAgICBjYXNlIFwidG9cIjpcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBjZSA9IHVlWzFdLnNwbGl0KFwiLFwiKSwgdmUgPSAwLCBlZSA9IGNlLmxlbmd0aDsgdmUgPCBlZTsgKyt2ZSlcbiAgICAgICAgICAgICAgICAgIEEucHVzaChjZVt2ZV0pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlIFwic3ViamVjdFwiOlxuICAgICAgICAgICAgICAgIE0uc3ViamVjdCA9IE1lKHVlWzFdLCBQKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSBcImJvZHlcIjpcbiAgICAgICAgICAgICAgICBNLmJvZHkgPSBNZSh1ZVsxXSwgUCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgWCA9ICEwLCBRW01lKHVlWzBdLCBQKV0gPSBNZSh1ZVsxXSwgUCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIFggJiYgKE0uaGVhZGVycyA9IFEpO1xuICAgICAgICB9XG4gICAgICAgIE0ucXVlcnkgPSB2b2lkIDA7XG4gICAgICAgIGZvciAodmFyIG1lID0gMCwgd2UgPSBBLmxlbmd0aDsgbWUgPCB3ZTsgKyttZSkge1xuICAgICAgICAgIHZhciBnZSA9IEFbbWVdLnNwbGl0KFwiQFwiKTtcbiAgICAgICAgICBpZiAoZ2VbMF0gPSBNZShnZVswXSksIFAudW5pY29kZVN1cHBvcnQpXG4gICAgICAgICAgICBnZVsxXSA9IE1lKGdlWzFdLCBQKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGdlWzFdID0gSS50b0FTQ0lJKE1lKGdlWzFdLCBQKS50b0xvd2VyQ2FzZSgpKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGFyKSB7XG4gICAgICAgICAgICAgIE0uZXJyb3IgPSBNLmVycm9yIHx8IFwiRW1haWwgYWRkcmVzcydzIGRvbWFpbiBuYW1lIGNhbiBub3QgYmUgY29udmVydGVkIHRvIEFTQ0lJIHZpYSBwdW55Y29kZTogXCIgKyBhcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICBBW21lXSA9IGdlLmpvaW4oXCJAXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBNO1xuICAgICAgfSxcbiAgICAgIHNlcmlhbGl6ZTogZnVuY3Rpb24oZiwgUCkge1xuICAgICAgICB2YXIgTSA9IGYsIEEgPSB5KGYudG8pO1xuICAgICAgICBpZiAoQSkge1xuICAgICAgICAgIGZvciAodmFyIFggPSAwLCBRID0gQS5sZW5ndGg7IFggPCBROyArK1gpIHtcbiAgICAgICAgICAgIHZhciBkZSA9IFN0cmluZyhBW1hdKSwgaGUgPSBkZS5sYXN0SW5kZXhPZihcIkBcIiksIF9lID0gZGUuc2xpY2UoMCwgaGUpLnJlcGxhY2Uoa3IsIE10KS5yZXBsYWNlKGtyLCBwKS5yZXBsYWNlKHZzLCBXKSwgdWUgPSBkZS5zbGljZShoZSArIDEpO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgdWUgPSBQLmlyaSA/IEkudG9Vbmljb2RlKHVlKSA6IEkudG9BU0NJSShNZSh1ZSwgUCkudG9Mb3dlckNhc2UoKSk7XG4gICAgICAgICAgICB9IGNhdGNoIChtZSkge1xuICAgICAgICAgICAgICBNLmVycm9yID0gTS5lcnJvciB8fCBcIkVtYWlsIGFkZHJlc3MncyBkb21haW4gbmFtZSBjYW4gbm90IGJlIGNvbnZlcnRlZCB0byBcIiArIChQLmlyaSA/IFwiVW5pY29kZVwiIDogXCJBU0NJSVwiKSArIFwiIHZpYSBwdW55Y29kZTogXCIgKyBtZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEFbWF0gPSBfZSArIFwiQFwiICsgdWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIE0ucGF0aCA9IEEuam9pbihcIixcIik7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGNlID0gZi5oZWFkZXJzID0gZi5oZWFkZXJzIHx8IHt9O1xuICAgICAgICBmLnN1YmplY3QgJiYgKGNlLnN1YmplY3QgPSBmLnN1YmplY3QpLCBmLmJvZHkgJiYgKGNlLmJvZHkgPSBmLmJvZHkpO1xuICAgICAgICB2YXIgdmUgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgZWUgaW4gY2UpXG4gICAgICAgICAgY2VbZWVdICE9PSBsc1tlZV0gJiYgdmUucHVzaChlZS5yZXBsYWNlKGtyLCBNdCkucmVwbGFjZShrciwgcCkucmVwbGFjZShGYSwgVykgKyBcIj1cIiArIGNlW2VlXS5yZXBsYWNlKGtyLCBNdCkucmVwbGFjZShrciwgcCkucmVwbGFjZSh5cywgVykpO1xuICAgICAgICByZXR1cm4gdmUubGVuZ3RoICYmIChNLnF1ZXJ5ID0gdmUuam9pbihcIiZcIikpLCBNO1xuICAgICAgfVxuICAgIH0sIHdzID0gL14oW15cXDpdKylcXDooLiopLywgQmEgPSB7XG4gICAgICBzY2hlbWU6IFwidXJuXCIsXG4gICAgICBwYXJzZTogZnVuY3Rpb24oZiwgUCkge1xuICAgICAgICB2YXIgTSA9IGYucGF0aCAmJiBmLnBhdGgubWF0Y2god3MpLCBBID0gZjtcbiAgICAgICAgaWYgKE0pIHtcbiAgICAgICAgICB2YXIgWCA9IFAuc2NoZW1lIHx8IEEuc2NoZW1lIHx8IFwidXJuXCIsIFEgPSBNWzFdLnRvTG93ZXJDYXNlKCksIGRlID0gTVsyXSwgaGUgPSBYICsgXCI6XCIgKyAoUC5uaWQgfHwgUSksIF9lID0gS1toZV07XG4gICAgICAgICAgQS5uaWQgPSBRLCBBLm5zcyA9IGRlLCBBLnBhdGggPSB2b2lkIDAsIF9lICYmIChBID0gX2UucGFyc2UoQSwgUCkpO1xuICAgICAgICB9IGVsc2VcbiAgICAgICAgICBBLmVycm9yID0gQS5lcnJvciB8fCBcIlVSTiBjYW4gbm90IGJlIHBhcnNlZC5cIjtcbiAgICAgICAgcmV0dXJuIEE7XG4gICAgICB9LFxuICAgICAgc2VyaWFsaXplOiBmdW5jdGlvbihmLCBQKSB7XG4gICAgICAgIHZhciBNID0gUC5zY2hlbWUgfHwgZi5zY2hlbWUgfHwgXCJ1cm5cIiwgQSA9IGYubmlkLCBYID0gTSArIFwiOlwiICsgKFAubmlkIHx8IEEpLCBRID0gS1tYXTtcbiAgICAgICAgUSAmJiAoZiA9IFEuc2VyaWFsaXplKGYsIFApKTtcbiAgICAgICAgdmFyIGRlID0gZiwgaGUgPSBmLm5zcztcbiAgICAgICAgcmV0dXJuIGRlLnBhdGggPSAoQSB8fCBQLm5pZCkgKyBcIjpcIiArIGhlLCBkZTtcbiAgICAgIH1cbiAgICB9LCBicyA9IC9eWzAtOUEtRmEtZl17OH0oPzpcXC1bMC05QS1GYS1mXXs0fSl7M31cXC1bMC05QS1GYS1mXXsxMn0kLywgSGEgPSB7XG4gICAgICBzY2hlbWU6IFwidXJuOnV1aWRcIixcbiAgICAgIHBhcnNlOiBmdW5jdGlvbihmLCBQKSB7XG4gICAgICAgIHZhciBNID0gZjtcbiAgICAgICAgcmV0dXJuIE0udXVpZCA9IE0ubnNzLCBNLm5zcyA9IHZvaWQgMCwgIVAudG9sZXJhbnQgJiYgKCFNLnV1aWQgfHwgIU0udXVpZC5tYXRjaChicykpICYmIChNLmVycm9yID0gTS5lcnJvciB8fCBcIlVVSUQgaXMgbm90IHZhbGlkLlwiKSwgTTtcbiAgICAgIH0sXG4gICAgICBzZXJpYWxpemU6IGZ1bmN0aW9uKGYsIFApIHtcbiAgICAgICAgdmFyIE0gPSBmO1xuICAgICAgICByZXR1cm4gTS5uc3MgPSAoZi51dWlkIHx8IFwiXCIpLnRvTG93ZXJDYXNlKCksIE07XG4gICAgICB9XG4gICAgfTtcbiAgICBLW2NyLnNjaGVtZV0gPSBjciwgS1tEYS5zY2hlbWVdID0gRGEsIEtbSHIuc2NoZW1lXSA9IEhyLCBLW3phLnNjaGVtZV0gPSB6YSwgS1tVYS5zY2hlbWVdID0gVWEsIEtbQmEuc2NoZW1lXSA9IEJhLCBLW0hhLnNjaGVtZV0gPSBIYSwgbi5TQ0hFTUVTID0gSywgbi5wY3RFbmNDaGFyID0gVywgbi5wY3REZWNDaGFycyA9IHJlLCBuLnBhcnNlID0gSWUsIG4ucmVtb3ZlRG90U2VnbWVudHMgPSBxZSwgbi5zZXJpYWxpemUgPSBOZSwgbi5yZXNvbHZlQ29tcG9uZW50cyA9IEVyLCBuLnJlc29sdmUgPSBVciwgbi5ub3JtYWxpemUgPSBvciwgbi5lcXVhbCA9IEJyLCBuLmVzY2FwZUNvbXBvbmVudCA9IHV0LCBuLnVuZXNjYXBlQ29tcG9uZW50ID0gTWUsIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShuLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogITAgfSk7XG4gIH0pO1xufSkoc2QsICR0KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YSwgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6ICEwIH0pO1xuY29uc3QgSm4gPSAkdDtcbkpuLmNvZGUgPSAncmVxdWlyZShcImFqdi9kaXN0L3J1bnRpbWUvdXJpXCIpLmRlZmF1bHQnO1xudGEuZGVmYXVsdCA9IEpuO1xuKGZ1bmN0aW9uKGUpIHtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiAhMCB9KSwgZS5Db2RlR2VuID0gZS5OYW1lID0gZS5uaWwgPSBlLnN0cmluZ2lmeSA9IGUuc3RyID0gZS5fID0gZS5LZXl3b3JkQ3h0ID0gdm9pZCAwO1xuICB2YXIgciA9IEhlO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwgXCJLZXl3b3JkQ3h0XCIsIHsgZW51bWVyYWJsZTogITAsIGdldDogZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHIuS2V5d29yZEN4dDtcbiAgfSB9KTtcbiAgdmFyIG4gPSBzZTtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIFwiX1wiLCB7IGVudW1lcmFibGU6ICEwLCBnZXQ6IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBuLl87XG4gIH0gfSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCBcInN0clwiLCB7IGVudW1lcmFibGU6ICEwLCBnZXQ6IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBuLnN0cjtcbiAgfSB9KSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIFwic3RyaW5naWZ5XCIsIHsgZW51bWVyYWJsZTogITAsIGdldDogZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIG4uc3RyaW5naWZ5O1xuICB9IH0pLCBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwgXCJuaWxcIiwgeyBlbnVtZXJhYmxlOiAhMCwgZ2V0OiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gbi5uaWw7XG4gIH0gfSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCBcIk5hbWVcIiwgeyBlbnVtZXJhYmxlOiAhMCwgZ2V0OiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gbi5OYW1lO1xuICB9IH0pLCBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwgXCJDb2RlR2VuXCIsIHsgZW51bWVyYWJsZTogITAsIGdldDogZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIG4uQ29kZUdlbjtcbiAgfSB9KTtcbiAgY29uc3QgYSA9IGF0LCBkID0gbnQsIG8gPSB2ciwgcCA9IEFlLCB5ID0gc2UsIGIgPSBrZSwgdiA9IHR0LCBnID0gaWUsIFMgPSBuZCwgeiA9IHRhLCBMID0gKEIsIGspID0+IG5ldyBSZWdFeHAoQiwgayk7XG4gIEwuY29kZSA9IFwibmV3IFJlZ0V4cFwiO1xuICBjb25zdCBSID0gW1wicmVtb3ZlQWRkaXRpb25hbFwiLCBcInVzZURlZmF1bHRzXCIsIFwiY29lcmNlVHlwZXNcIl0sIGogPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldChbXG4gICAgXCJ2YWxpZGF0ZVwiLFxuICAgIFwic2VyaWFsaXplXCIsXG4gICAgXCJwYXJzZVwiLFxuICAgIFwid3JhcHBlclwiLFxuICAgIFwicm9vdFwiLFxuICAgIFwic2NoZW1hXCIsXG4gICAgXCJrZXl3b3JkXCIsXG4gICAgXCJwYXR0ZXJuXCIsXG4gICAgXCJmb3JtYXRzXCIsXG4gICAgXCJ2YWxpZGF0ZSRkYXRhXCIsXG4gICAgXCJmdW5jXCIsXG4gICAgXCJvYmpcIixcbiAgICBcIkVycm9yXCJcbiAgXSksIFQgPSB7XG4gICAgZXJyb3JEYXRhUGF0aDogXCJcIixcbiAgICBmb3JtYXQ6IFwiYHZhbGlkYXRlRm9ybWF0czogZmFsc2VgIGNhbiBiZSB1c2VkIGluc3RlYWQuXCIsXG4gICAgbnVsbGFibGU6ICdcIm51bGxhYmxlXCIga2V5d29yZCBpcyBzdXBwb3J0ZWQgYnkgZGVmYXVsdC4nLFxuICAgIGpzb25Qb2ludGVyczogXCJEZXByZWNhdGVkIGpzUHJvcGVydHlTeW50YXggY2FuIGJlIHVzZWQgaW5zdGVhZC5cIixcbiAgICBleHRlbmRSZWZzOiBcIkRlcHJlY2F0ZWQgaWdub3JlS2V5d29yZHNXaXRoUmVmIGNhbiBiZSB1c2VkIGluc3RlYWQuXCIsXG4gICAgbWlzc2luZ1JlZnM6IFwiUGFzcyBlbXB0eSBzY2hlbWEgd2l0aCAkaWQgdGhhdCBzaG91bGQgYmUgaWdub3JlZCB0byBhanYuYWRkU2NoZW1hLlwiLFxuICAgIHByb2Nlc3NDb2RlOiBcIlVzZSBvcHRpb24gYGNvZGU6IHtwcm9jZXNzOiAoY29kZSwgc2NoZW1hRW52OiBvYmplY3QpID0+IHN0cmluZ31gXCIsXG4gICAgc291cmNlQ29kZTogXCJVc2Ugb3B0aW9uIGBjb2RlOiB7c291cmNlOiB0cnVlfWBcIixcbiAgICBzdHJpY3REZWZhdWx0czogXCJJdCBpcyBkZWZhdWx0IG5vdywgc2VlIG9wdGlvbiBgc3RyaWN0YC5cIixcbiAgICBzdHJpY3RLZXl3b3JkczogXCJJdCBpcyBkZWZhdWx0IG5vdywgc2VlIG9wdGlvbiBgc3RyaWN0YC5cIixcbiAgICB1bmlxdWVJdGVtczogJ1widW5pcXVlSXRlbXNcIiBrZXl3b3JkIGlzIGFsd2F5cyB2YWxpZGF0ZWQuJyxcbiAgICB1bmtub3duRm9ybWF0czogXCJEaXNhYmxlIHN0cmljdCBtb2RlIG9yIHBhc3MgYHRydWVgIHRvIGBhanYuYWRkRm9ybWF0YCAob3IgYGZvcm1hdHNgIG9wdGlvbikuXCIsXG4gICAgY2FjaGU6IFwiTWFwIGlzIHVzZWQgYXMgY2FjaGUsIHNjaGVtYSBvYmplY3QgYXMga2V5LlwiLFxuICAgIHNlcmlhbGl6ZTogXCJNYXAgaXMgdXNlZCBhcyBjYWNoZSwgc2NoZW1hIG9iamVjdCBhcyBrZXkuXCIsXG4gICAgYWp2RXJyb3JzOiBcIkl0IGlzIGRlZmF1bHQgbm93LlwiXG4gIH0sICQgPSB7XG4gICAgaWdub3JlS2V5d29yZHNXaXRoUmVmOiBcIlwiLFxuICAgIGpzUHJvcGVydHlTeW50YXg6IFwiXCIsXG4gICAgdW5pY29kZTogJ1wibWluTGVuZ3RoXCIvXCJtYXhMZW5ndGhcIiBhY2NvdW50IGZvciB1bmljb2RlIGNoYXJhY3RlcnMgYnkgZGVmYXVsdC4nXG4gIH0sIE4gPSAyMDA7XG4gIGZ1bmN0aW9uIEQoQikge1xuICAgIHZhciBrLCBGLCBPLCBsLCB3LCBJLCBLLCBXLCByZSwgYWUsIGZlLCBqZSwgeGUsIExyLCB6ciwgSWUsIFZyLCB3ciwgYnIsICRyLCBGciwgcWUsIE5lLCBFciwgVXI7XG4gICAgY29uc3Qgb3IgPSBCLnN0cmljdCwgQnIgPSAoayA9IEIuY29kZSkgPT09IG51bGwgfHwgayA9PT0gdm9pZCAwID8gdm9pZCAwIDogay5vcHRpbWl6ZSwgdXQgPSBCciA9PT0gITAgfHwgQnIgPT09IHZvaWQgMCA/IDEgOiBCciB8fCAwLCBNZSA9IChPID0gKEYgPSBCLmNvZGUpID09PSBudWxsIHx8IEYgPT09IHZvaWQgMCA/IHZvaWQgMCA6IEYucmVnRXhwKSAhPT0gbnVsbCAmJiBPICE9PSB2b2lkIDAgPyBPIDogTCwgY3IgPSAobCA9IEIudXJpUmVzb2x2ZXIpICE9PSBudWxsICYmIGwgIT09IHZvaWQgMCA/IGwgOiB6LmRlZmF1bHQ7XG4gICAgcmV0dXJuIHtcbiAgICAgIHN0cmljdFNjaGVtYTogKEkgPSAodyA9IEIuc3RyaWN0U2NoZW1hKSAhPT0gbnVsbCAmJiB3ICE9PSB2b2lkIDAgPyB3IDogb3IpICE9PSBudWxsICYmIEkgIT09IHZvaWQgMCA/IEkgOiAhMCxcbiAgICAgIHN0cmljdE51bWJlcnM6IChXID0gKEsgPSBCLnN0cmljdE51bWJlcnMpICE9PSBudWxsICYmIEsgIT09IHZvaWQgMCA/IEsgOiBvcikgIT09IG51bGwgJiYgVyAhPT0gdm9pZCAwID8gVyA6ICEwLFxuICAgICAgc3RyaWN0VHlwZXM6IChhZSA9IChyZSA9IEIuc3RyaWN0VHlwZXMpICE9PSBudWxsICYmIHJlICE9PSB2b2lkIDAgPyByZSA6IG9yKSAhPT0gbnVsbCAmJiBhZSAhPT0gdm9pZCAwID8gYWUgOiBcImxvZ1wiLFxuICAgICAgc3RyaWN0VHVwbGVzOiAoamUgPSAoZmUgPSBCLnN0cmljdFR1cGxlcykgIT09IG51bGwgJiYgZmUgIT09IHZvaWQgMCA/IGZlIDogb3IpICE9PSBudWxsICYmIGplICE9PSB2b2lkIDAgPyBqZSA6IFwibG9nXCIsXG4gICAgICBzdHJpY3RSZXF1aXJlZDogKExyID0gKHhlID0gQi5zdHJpY3RSZXF1aXJlZCkgIT09IG51bGwgJiYgeGUgIT09IHZvaWQgMCA/IHhlIDogb3IpICE9PSBudWxsICYmIExyICE9PSB2b2lkIDAgPyBMciA6ICExLFxuICAgICAgY29kZTogQi5jb2RlID8geyAuLi5CLmNvZGUsIG9wdGltaXplOiB1dCwgcmVnRXhwOiBNZSB9IDogeyBvcHRpbWl6ZTogdXQsIHJlZ0V4cDogTWUgfSxcbiAgICAgIGxvb3BSZXF1aXJlZDogKHpyID0gQi5sb29wUmVxdWlyZWQpICE9PSBudWxsICYmIHpyICE9PSB2b2lkIDAgPyB6ciA6IE4sXG4gICAgICBsb29wRW51bTogKEllID0gQi5sb29wRW51bSkgIT09IG51bGwgJiYgSWUgIT09IHZvaWQgMCA/IEllIDogTixcbiAgICAgIG1ldGE6IChWciA9IEIubWV0YSkgIT09IG51bGwgJiYgVnIgIT09IHZvaWQgMCA/IFZyIDogITAsXG4gICAgICBtZXNzYWdlczogKHdyID0gQi5tZXNzYWdlcykgIT09IG51bGwgJiYgd3IgIT09IHZvaWQgMCA/IHdyIDogITAsXG4gICAgICBpbmxpbmVSZWZzOiAoYnIgPSBCLmlubGluZVJlZnMpICE9PSBudWxsICYmIGJyICE9PSB2b2lkIDAgPyBiciA6ICEwLFxuICAgICAgc2NoZW1hSWQ6ICgkciA9IEIuc2NoZW1hSWQpICE9PSBudWxsICYmICRyICE9PSB2b2lkIDAgPyAkciA6IFwiJGlkXCIsXG4gICAgICBhZGRVc2VkU2NoZW1hOiAoRnIgPSBCLmFkZFVzZWRTY2hlbWEpICE9PSBudWxsICYmIEZyICE9PSB2b2lkIDAgPyBGciA6ICEwLFxuICAgICAgdmFsaWRhdGVTY2hlbWE6IChxZSA9IEIudmFsaWRhdGVTY2hlbWEpICE9PSBudWxsICYmIHFlICE9PSB2b2lkIDAgPyBxZSA6ICEwLFxuICAgICAgdmFsaWRhdGVGb3JtYXRzOiAoTmUgPSBCLnZhbGlkYXRlRm9ybWF0cykgIT09IG51bGwgJiYgTmUgIT09IHZvaWQgMCA/IE5lIDogITAsXG4gICAgICB1bmljb2RlUmVnRXhwOiAoRXIgPSBCLnVuaWNvZGVSZWdFeHApICE9PSBudWxsICYmIEVyICE9PSB2b2lkIDAgPyBFciA6ICEwLFxuICAgICAgaW50MzJyYW5nZTogKFVyID0gQi5pbnQzMnJhbmdlKSAhPT0gbnVsbCAmJiBVciAhPT0gdm9pZCAwID8gVXIgOiAhMCxcbiAgICAgIHVyaVJlc29sdmVyOiBjclxuICAgIH07XG4gIH1cbiAgY2xhc3MgdCB7XG4gICAgY29uc3RydWN0b3IoayA9IHt9KSB7XG4gICAgICB0aGlzLnNjaGVtYXMgPSB7fSwgdGhpcy5yZWZzID0ge30sIHRoaXMuZm9ybWF0cyA9IHt9LCB0aGlzLl9jb21waWxhdGlvbnMgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpLCB0aGlzLl9sb2FkaW5nID0ge30sIHRoaXMuX2NhY2hlID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKSwgayA9IHRoaXMub3B0cyA9IHsgLi4uaywgLi4uRChrKSB9O1xuICAgICAgY29uc3QgeyBlczU6IEYsIGxpbmVzOiBPIH0gPSB0aGlzLm9wdHMuY29kZTtcbiAgICAgIHRoaXMuc2NvcGUgPSBuZXcgeS5WYWx1ZVNjb3BlKHsgc2NvcGU6IHt9LCBwcmVmaXhlczogaiwgZXM1OiBGLCBsaW5lczogTyB9KSwgdGhpcy5sb2dnZXIgPSBVKGsubG9nZ2VyKTtcbiAgICAgIGNvbnN0IGwgPSBrLnZhbGlkYXRlRm9ybWF0cztcbiAgICAgIGsudmFsaWRhdGVGb3JtYXRzID0gITEsIHRoaXMuUlVMRVMgPSAoMCwgby5nZXRSdWxlcykoKSwgdS5jYWxsKHRoaXMsIFQsIGssIFwiTk9UIFNVUFBPUlRFRFwiKSwgdS5jYWxsKHRoaXMsICQsIGssIFwiREVQUkVDQVRFRFwiLCBcIndhcm5cIiksIHRoaXMuX21ldGFPcHRzID0gaC5jYWxsKHRoaXMpLCBrLmZvcm1hdHMgJiYgYy5jYWxsKHRoaXMpLCB0aGlzLl9hZGRWb2NhYnVsYXJpZXMoKSwgdGhpcy5fYWRkRGVmYXVsdE1ldGFTY2hlbWEoKSwgay5rZXl3b3JkcyAmJiBtLmNhbGwodGhpcywgay5rZXl3b3JkcyksIHR5cGVvZiBrLm1ldGEgPT0gXCJvYmplY3RcIiAmJiB0aGlzLmFkZE1ldGFTY2hlbWEoay5tZXRhKSwgaS5jYWxsKHRoaXMpLCBrLnZhbGlkYXRlRm9ybWF0cyA9IGw7XG4gICAgfVxuICAgIF9hZGRWb2NhYnVsYXJpZXMoKSB7XG4gICAgICB0aGlzLmFkZEtleXdvcmQoXCIkYXN5bmNcIik7XG4gICAgfVxuICAgIF9hZGREZWZhdWx0TWV0YVNjaGVtYSgpIHtcbiAgICAgIGNvbnN0IHsgJGRhdGE6IGssIG1ldGE6IEYsIHNjaGVtYUlkOiBPIH0gPSB0aGlzLm9wdHM7XG4gICAgICBsZXQgbCA9IFM7XG4gICAgICBPID09PSBcImlkXCIgJiYgKGwgPSB7IC4uLlMgfSwgbC5pZCA9IGwuJGlkLCBkZWxldGUgbC4kaWQpLCBGICYmIGsgJiYgdGhpcy5hZGRNZXRhU2NoZW1hKGwsIGxbT10sICExKTtcbiAgICB9XG4gICAgZGVmYXVsdE1ldGEoKSB7XG4gICAgICBjb25zdCB7IG1ldGE6IGssIHNjaGVtYUlkOiBGIH0gPSB0aGlzLm9wdHM7XG4gICAgICByZXR1cm4gdGhpcy5vcHRzLmRlZmF1bHRNZXRhID0gdHlwZW9mIGsgPT0gXCJvYmplY3RcIiA/IGtbRl0gfHwgayA6IHZvaWQgMDtcbiAgICB9XG4gICAgdmFsaWRhdGUoaywgRikge1xuICAgICAgbGV0IE87XG4gICAgICBpZiAodHlwZW9mIGsgPT0gXCJzdHJpbmdcIikge1xuICAgICAgICBpZiAoTyA9IHRoaXMuZ2V0U2NoZW1hKGspLCAhTylcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYG5vIHNjaGVtYSB3aXRoIGtleSBvciByZWYgXCIke2t9XCJgKTtcbiAgICAgIH0gZWxzZVxuICAgICAgICBPID0gdGhpcy5jb21waWxlKGspO1xuICAgICAgY29uc3QgbCA9IE8oRik7XG4gICAgICByZXR1cm4gXCIkYXN5bmNcIiBpbiBPIHx8ICh0aGlzLmVycm9ycyA9IE8uZXJyb3JzKSwgbDtcbiAgICB9XG4gICAgY29tcGlsZShrLCBGKSB7XG4gICAgICBjb25zdCBPID0gdGhpcy5fYWRkU2NoZW1hKGssIEYpO1xuICAgICAgcmV0dXJuIE8udmFsaWRhdGUgfHwgdGhpcy5fY29tcGlsZVNjaGVtYUVudihPKTtcbiAgICB9XG4gICAgY29tcGlsZUFzeW5jKGssIEYpIHtcbiAgICAgIGlmICh0eXBlb2YgdGhpcy5vcHRzLmxvYWRTY2hlbWEgIT0gXCJmdW5jdGlvblwiKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJvcHRpb25zLmxvYWRTY2hlbWEgc2hvdWxkIGJlIGEgZnVuY3Rpb25cIik7XG4gICAgICBjb25zdCB7IGxvYWRTY2hlbWE6IE8gfSA9IHRoaXMub3B0cztcbiAgICAgIHJldHVybiBsLmNhbGwodGhpcywgaywgRik7XG4gICAgICBhc3luYyBmdW5jdGlvbiBsKGFlLCBmZSkge1xuICAgICAgICBhd2FpdCB3LmNhbGwodGhpcywgYWUuJHNjaGVtYSk7XG4gICAgICAgIGNvbnN0IGplID0gdGhpcy5fYWRkU2NoZW1hKGFlLCBmZSk7XG4gICAgICAgIHJldHVybiBqZS52YWxpZGF0ZSB8fCBJLmNhbGwodGhpcywgamUpO1xuICAgICAgfVxuICAgICAgYXN5bmMgZnVuY3Rpb24gdyhhZSkge1xuICAgICAgICBhZSAmJiAhdGhpcy5nZXRTY2hlbWEoYWUpICYmIGF3YWl0IGwuY2FsbCh0aGlzLCB7ICRyZWY6IGFlIH0sICEwKTtcbiAgICAgIH1cbiAgICAgIGFzeW5jIGZ1bmN0aW9uIEkoYWUpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5fY29tcGlsZVNjaGVtYUVudihhZSk7XG4gICAgICAgIH0gY2F0Y2ggKGZlKSB7XG4gICAgICAgICAgaWYgKCEoZmUgaW5zdGFuY2VvZiBkLmRlZmF1bHQpKVxuICAgICAgICAgICAgdGhyb3cgZmU7XG4gICAgICAgICAgcmV0dXJuIEsuY2FsbCh0aGlzLCBmZSksIGF3YWl0IFcuY2FsbCh0aGlzLCBmZS5taXNzaW5nU2NoZW1hKSwgSS5jYWxsKHRoaXMsIGFlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZnVuY3Rpb24gSyh7IG1pc3NpbmdTY2hlbWE6IGFlLCBtaXNzaW5nUmVmOiBmZSB9KSB7XG4gICAgICAgIGlmICh0aGlzLnJlZnNbYWVdKVxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQW55U2NoZW1hICR7YWV9IGlzIGxvYWRlZCBidXQgJHtmZX0gY2Fubm90IGJlIHJlc29sdmVkYCk7XG4gICAgICB9XG4gICAgICBhc3luYyBmdW5jdGlvbiBXKGFlKSB7XG4gICAgICAgIGNvbnN0IGZlID0gYXdhaXQgcmUuY2FsbCh0aGlzLCBhZSk7XG4gICAgICAgIHRoaXMucmVmc1thZV0gfHwgYXdhaXQgdy5jYWxsKHRoaXMsIGZlLiRzY2hlbWEpLCB0aGlzLnJlZnNbYWVdIHx8IHRoaXMuYWRkU2NoZW1hKGZlLCBhZSwgRik7XG4gICAgICB9XG4gICAgICBhc3luYyBmdW5jdGlvbiByZShhZSkge1xuICAgICAgICBjb25zdCBmZSA9IHRoaXMuX2xvYWRpbmdbYWVdO1xuICAgICAgICBpZiAoZmUpXG4gICAgICAgICAgcmV0dXJuIGZlO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiBhd2FpdCAodGhpcy5fbG9hZGluZ1thZV0gPSBPKGFlKSk7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgZGVsZXRlIHRoaXMuX2xvYWRpbmdbYWVdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIC8vIEFkZHMgc2NoZW1hIHRvIHRoZSBpbnN0YW5jZVxuICAgIGFkZFNjaGVtYShrLCBGLCBPLCBsID0gdGhpcy5vcHRzLnZhbGlkYXRlU2NoZW1hKSB7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShrKSkge1xuICAgICAgICBmb3IgKGNvbnN0IEkgb2YgaylcbiAgICAgICAgICB0aGlzLmFkZFNjaGVtYShJLCB2b2lkIDAsIE8sIGwpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cbiAgICAgIGxldCB3O1xuICAgICAgaWYgKHR5cGVvZiBrID09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgY29uc3QgeyBzY2hlbWFJZDogSSB9ID0gdGhpcy5vcHRzO1xuICAgICAgICBpZiAodyA9IGtbSV0sIHcgIT09IHZvaWQgMCAmJiB0eXBlb2YgdyAhPSBcInN0cmluZ1wiKVxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgc2NoZW1hICR7SX0gbXVzdCBiZSBzdHJpbmdgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBGID0gKDAsIGIubm9ybWFsaXplSWQpKEYgfHwgdyksIHRoaXMuX2NoZWNrVW5pcXVlKEYpLCB0aGlzLnNjaGVtYXNbRl0gPSB0aGlzLl9hZGRTY2hlbWEoaywgTywgRiwgbCwgITApLCB0aGlzO1xuICAgIH1cbiAgICAvLyBBZGQgc2NoZW1hIHRoYXQgd2lsbCBiZSB1c2VkIHRvIHZhbGlkYXRlIG90aGVyIHNjaGVtYXNcbiAgICAvLyBvcHRpb25zIGluIE1FVEFfSUdOT1JFX09QVElPTlMgYXJlIGFsd2F5IHNldCB0byBmYWxzZVxuICAgIGFkZE1ldGFTY2hlbWEoaywgRiwgTyA9IHRoaXMub3B0cy52YWxpZGF0ZVNjaGVtYSkge1xuICAgICAgcmV0dXJuIHRoaXMuYWRkU2NoZW1hKGssIEYsICEwLCBPKSwgdGhpcztcbiAgICB9XG4gICAgLy8gIFZhbGlkYXRlIHNjaGVtYSBhZ2FpbnN0IGl0cyBtZXRhLXNjaGVtYVxuICAgIHZhbGlkYXRlU2NoZW1hKGssIEYpIHtcbiAgICAgIGlmICh0eXBlb2YgayA9PSBcImJvb2xlYW5cIilcbiAgICAgICAgcmV0dXJuICEwO1xuICAgICAgbGV0IE87XG4gICAgICBpZiAoTyA9IGsuJHNjaGVtYSwgTyAhPT0gdm9pZCAwICYmIHR5cGVvZiBPICE9IFwic3RyaW5nXCIpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIiRzY2hlbWEgbXVzdCBiZSBhIHN0cmluZ1wiKTtcbiAgICAgIGlmIChPID0gTyB8fCB0aGlzLm9wdHMuZGVmYXVsdE1ldGEgfHwgdGhpcy5kZWZhdWx0TWV0YSgpLCAhTylcbiAgICAgICAgcmV0dXJuIHRoaXMubG9nZ2VyLndhcm4oXCJtZXRhLXNjaGVtYSBub3QgYXZhaWxhYmxlXCIpLCB0aGlzLmVycm9ycyA9IG51bGwsICEwO1xuICAgICAgY29uc3QgbCA9IHRoaXMudmFsaWRhdGUoTywgayk7XG4gICAgICBpZiAoIWwgJiYgRikge1xuICAgICAgICBjb25zdCB3ID0gXCJzY2hlbWEgaXMgaW52YWxpZDogXCIgKyB0aGlzLmVycm9yc1RleHQoKTtcbiAgICAgICAgaWYgKHRoaXMub3B0cy52YWxpZGF0ZVNjaGVtYSA9PT0gXCJsb2dcIilcbiAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcih3KTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcih3KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBsO1xuICAgIH1cbiAgICAvLyBHZXQgY29tcGlsZWQgc2NoZW1hIGJ5IGBrZXlgIG9yIGByZWZgLlxuICAgIC8vIChga2V5YCB0aGF0IHdhcyBwYXNzZWQgdG8gYGFkZFNjaGVtYWAgb3IgZnVsbCBzY2hlbWEgcmVmZXJlbmNlIC0gYHNjaGVtYS4kaWRgIG9yIHJlc29sdmVkIGlkKVxuICAgIGdldFNjaGVtYShrKSB7XG4gICAgICBsZXQgRjtcbiAgICAgIGZvciAoOyB0eXBlb2YgKEYgPSBzLmNhbGwodGhpcywgaykpID09IFwic3RyaW5nXCI7IClcbiAgICAgICAgayA9IEY7XG4gICAgICBpZiAoRiA9PT0gdm9pZCAwKSB7XG4gICAgICAgIGNvbnN0IHsgc2NoZW1hSWQ6IE8gfSA9IHRoaXMub3B0cywgbCA9IG5ldyBwLlNjaGVtYUVudih7IHNjaGVtYToge30sIHNjaGVtYUlkOiBPIH0pO1xuICAgICAgICBpZiAoRiA9IHAucmVzb2x2ZVNjaGVtYS5jYWxsKHRoaXMsIGwsIGspLCAhRilcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIHRoaXMucmVmc1trXSA9IEY7XG4gICAgICB9XG4gICAgICByZXR1cm4gRi52YWxpZGF0ZSB8fCB0aGlzLl9jb21waWxlU2NoZW1hRW52KEYpO1xuICAgIH1cbiAgICAvLyBSZW1vdmUgY2FjaGVkIHNjaGVtYShzKS5cbiAgICAvLyBJZiBubyBwYXJhbWV0ZXIgaXMgcGFzc2VkIGFsbCBzY2hlbWFzIGJ1dCBtZXRhLXNjaGVtYXMgYXJlIHJlbW92ZWQuXG4gICAgLy8gSWYgUmVnRXhwIGlzIHBhc3NlZCBhbGwgc2NoZW1hcyB3aXRoIGtleS9pZCBtYXRjaGluZyBwYXR0ZXJuIGJ1dCBtZXRhLXNjaGVtYXMgYXJlIHJlbW92ZWQuXG4gICAgLy8gRXZlbiBpZiBzY2hlbWEgaXMgcmVmZXJlbmNlZCBieSBvdGhlciBzY2hlbWFzIGl0IHN0aWxsIGNhbiBiZSByZW1vdmVkIGFzIG90aGVyIHNjaGVtYXMgaGF2ZSBsb2NhbCByZWZlcmVuY2VzLlxuICAgIHJlbW92ZVNjaGVtYShrKSB7XG4gICAgICBpZiAoayBpbnN0YW5jZW9mIFJlZ0V4cClcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlbW92ZUFsbFNjaGVtYXModGhpcy5zY2hlbWFzLCBrKSwgdGhpcy5fcmVtb3ZlQWxsU2NoZW1hcyh0aGlzLnJlZnMsIGspLCB0aGlzO1xuICAgICAgc3dpdGNoICh0eXBlb2Ygaykge1xuICAgICAgICBjYXNlIFwidW5kZWZpbmVkXCI6XG4gICAgICAgICAgcmV0dXJuIHRoaXMuX3JlbW92ZUFsbFNjaGVtYXModGhpcy5zY2hlbWFzKSwgdGhpcy5fcmVtb3ZlQWxsU2NoZW1hcyh0aGlzLnJlZnMpLCB0aGlzLl9jYWNoZS5jbGVhcigpLCB0aGlzO1xuICAgICAgICBjYXNlIFwic3RyaW5nXCI6IHtcbiAgICAgICAgICBjb25zdCBGID0gcy5jYWxsKHRoaXMsIGspO1xuICAgICAgICAgIHJldHVybiB0eXBlb2YgRiA9PSBcIm9iamVjdFwiICYmIHRoaXMuX2NhY2hlLmRlbGV0ZShGLnNjaGVtYSksIGRlbGV0ZSB0aGlzLnNjaGVtYXNba10sIGRlbGV0ZSB0aGlzLnJlZnNba10sIHRoaXM7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBcIm9iamVjdFwiOiB7XG4gICAgICAgICAgY29uc3QgRiA9IGs7XG4gICAgICAgICAgdGhpcy5fY2FjaGUuZGVsZXRlKEYpO1xuICAgICAgICAgIGxldCBPID0ga1t0aGlzLm9wdHMuc2NoZW1hSWRdO1xuICAgICAgICAgIHJldHVybiBPICYmIChPID0gKDAsIGIubm9ybWFsaXplSWQpKE8pLCBkZWxldGUgdGhpcy5zY2hlbWFzW09dLCBkZWxldGUgdGhpcy5yZWZzW09dKSwgdGhpcztcbiAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImFqdi5yZW1vdmVTY2hlbWE6IGludmFsaWQgcGFyYW1ldGVyXCIpO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBhZGQgXCJ2b2NhYnVsYXJ5XCIgLSBhIGNvbGxlY3Rpb24gb2Yga2V5d29yZHNcbiAgICBhZGRWb2NhYnVsYXJ5KGspIHtcbiAgICAgIGZvciAoY29uc3QgRiBvZiBrKVxuICAgICAgICB0aGlzLmFkZEtleXdvcmQoRik7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgYWRkS2V5d29yZChrLCBGKSB7XG4gICAgICBsZXQgTztcbiAgICAgIGlmICh0eXBlb2YgayA9PSBcInN0cmluZ1wiKVxuICAgICAgICBPID0gaywgdHlwZW9mIEYgPT0gXCJvYmplY3RcIiAmJiAodGhpcy5sb2dnZXIud2FybihcInRoZXNlIHBhcmFtZXRlcnMgYXJlIGRlcHJlY2F0ZWQsIHNlZSBkb2NzIGZvciBhZGRLZXl3b3JkXCIpLCBGLmtleXdvcmQgPSBPKTtcbiAgICAgIGVsc2UgaWYgKHR5cGVvZiBrID09IFwib2JqZWN0XCIgJiYgRiA9PT0gdm9pZCAwKSB7XG4gICAgICAgIGlmIChGID0gaywgTyA9IEYua2V5d29yZCwgQXJyYXkuaXNBcnJheShPKSAmJiAhTy5sZW5ndGgpXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiYWRkS2V5d29yZHM6IGtleXdvcmQgbXVzdCBiZSBzdHJpbmcgb3Igbm9uLWVtcHR5IGFycmF5XCIpO1xuICAgICAgfSBlbHNlXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcImludmFsaWQgYWRkS2V5d29yZHMgcGFyYW1ldGVyc1wiKTtcbiAgICAgIGlmIChWLmNhbGwodGhpcywgTywgRiksICFGKVxuICAgICAgICByZXR1cm4gKDAsIGcuZWFjaEl0ZW0pKE8sICh3KSA9PiBHLmNhbGwodGhpcywgdykpLCB0aGlzO1xuICAgICAgcS5jYWxsKHRoaXMsIEYpO1xuICAgICAgY29uc3QgbCA9IHtcbiAgICAgICAgLi4uRixcbiAgICAgICAgdHlwZTogKDAsIHYuZ2V0SlNPTlR5cGVzKShGLnR5cGUpLFxuICAgICAgICBzY2hlbWFUeXBlOiAoMCwgdi5nZXRKU09OVHlwZXMpKEYuc2NoZW1hVHlwZSlcbiAgICAgIH07XG4gICAgICByZXR1cm4gKDAsIGcuZWFjaEl0ZW0pKE8sIGwudHlwZS5sZW5ndGggPT09IDAgPyAodykgPT4gRy5jYWxsKHRoaXMsIHcsIGwpIDogKHcpID0+IGwudHlwZS5mb3JFYWNoKChJKSA9PiBHLmNhbGwodGhpcywgdywgbCwgSSkpKSwgdGhpcztcbiAgICB9XG4gICAgZ2V0S2V5d29yZChrKSB7XG4gICAgICBjb25zdCBGID0gdGhpcy5SVUxFUy5hbGxba107XG4gICAgICByZXR1cm4gdHlwZW9mIEYgPT0gXCJvYmplY3RcIiA/IEYuZGVmaW5pdGlvbiA6ICEhRjtcbiAgICB9XG4gICAgLy8gUmVtb3ZlIGtleXdvcmRcbiAgICByZW1vdmVLZXl3b3JkKGspIHtcbiAgICAgIGNvbnN0IHsgUlVMRVM6IEYgfSA9IHRoaXM7XG4gICAgICBkZWxldGUgRi5rZXl3b3Jkc1trXSwgZGVsZXRlIEYuYWxsW2tdO1xuICAgICAgZm9yIChjb25zdCBPIG9mIEYucnVsZXMpIHtcbiAgICAgICAgY29uc3QgbCA9IE8ucnVsZXMuZmluZEluZGV4KCh3KSA9PiB3LmtleXdvcmQgPT09IGspO1xuICAgICAgICBsID49IDAgJiYgTy5ydWxlcy5zcGxpY2UobCwgMSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLy8gQWRkIGZvcm1hdFxuICAgIGFkZEZvcm1hdChrLCBGKSB7XG4gICAgICByZXR1cm4gdHlwZW9mIEYgPT0gXCJzdHJpbmdcIiAmJiAoRiA9IG5ldyBSZWdFeHAoRikpLCB0aGlzLmZvcm1hdHNba10gPSBGLCB0aGlzO1xuICAgIH1cbiAgICBlcnJvcnNUZXh0KGsgPSB0aGlzLmVycm9ycywgeyBzZXBhcmF0b3I6IEYgPSBcIiwgXCIsIGRhdGFWYXI6IE8gPSBcImRhdGFcIiB9ID0ge30pIHtcbiAgICAgIHJldHVybiAhayB8fCBrLmxlbmd0aCA9PT0gMCA/IFwiTm8gZXJyb3JzXCIgOiBrLm1hcCgobCkgPT4gYCR7T30ke2wuaW5zdGFuY2VQYXRofSAke2wubWVzc2FnZX1gKS5yZWR1Y2UoKGwsIHcpID0+IGwgKyBGICsgdyk7XG4gICAgfVxuICAgICRkYXRhTWV0YVNjaGVtYShrLCBGKSB7XG4gICAgICBjb25zdCBPID0gdGhpcy5SVUxFUy5hbGw7XG4gICAgICBrID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShrKSk7XG4gICAgICBmb3IgKGNvbnN0IGwgb2YgRikge1xuICAgICAgICBjb25zdCB3ID0gbC5zcGxpdChcIi9cIikuc2xpY2UoMSk7XG4gICAgICAgIGxldCBJID0gaztcbiAgICAgICAgZm9yIChjb25zdCBLIG9mIHcpXG4gICAgICAgICAgSSA9IElbS107XG4gICAgICAgIGZvciAoY29uc3QgSyBpbiBPKSB7XG4gICAgICAgICAgY29uc3QgVyA9IE9bS107XG4gICAgICAgICAgaWYgKHR5cGVvZiBXICE9IFwib2JqZWN0XCIpXG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICBjb25zdCB7ICRkYXRhOiByZSB9ID0gVy5kZWZpbml0aW9uLCBhZSA9IElbS107XG4gICAgICAgICAgcmUgJiYgYWUgJiYgKElbS10gPSBaKGFlKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBrO1xuICAgIH1cbiAgICBfcmVtb3ZlQWxsU2NoZW1hcyhrLCBGKSB7XG4gICAgICBmb3IgKGNvbnN0IE8gaW4gaykge1xuICAgICAgICBjb25zdCBsID0ga1tPXTtcbiAgICAgICAgKCFGIHx8IEYudGVzdChPKSkgJiYgKHR5cGVvZiBsID09IFwic3RyaW5nXCIgPyBkZWxldGUga1tPXSA6IGwgJiYgIWwubWV0YSAmJiAodGhpcy5fY2FjaGUuZGVsZXRlKGwuc2NoZW1hKSwgZGVsZXRlIGtbT10pKTtcbiAgICAgIH1cbiAgICB9XG4gICAgX2FkZFNjaGVtYShrLCBGLCBPLCBsID0gdGhpcy5vcHRzLnZhbGlkYXRlU2NoZW1hLCB3ID0gdGhpcy5vcHRzLmFkZFVzZWRTY2hlbWEpIHtcbiAgICAgIGxldCBJO1xuICAgICAgY29uc3QgeyBzY2hlbWFJZDogSyB9ID0gdGhpcy5vcHRzO1xuICAgICAgaWYgKHR5cGVvZiBrID09IFwib2JqZWN0XCIpXG4gICAgICAgIEkgPSBrW0tdO1xuICAgICAgZWxzZSB7XG4gICAgICAgIGlmICh0aGlzLm9wdHMuanRkKVxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcInNjaGVtYSBtdXN0IGJlIG9iamVjdFwiKTtcbiAgICAgICAgaWYgKHR5cGVvZiBrICE9IFwiYm9vbGVhblwiKVxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcInNjaGVtYSBtdXN0IGJlIG9iamVjdCBvciBib29sZWFuXCIpO1xuICAgICAgfVxuICAgICAgbGV0IFcgPSB0aGlzLl9jYWNoZS5nZXQoayk7XG4gICAgICBpZiAoVyAhPT0gdm9pZCAwKVxuICAgICAgICByZXR1cm4gVztcbiAgICAgIE8gPSAoMCwgYi5ub3JtYWxpemVJZCkoSSB8fCBPKTtcbiAgICAgIGNvbnN0IHJlID0gYi5nZXRTY2hlbWFSZWZzLmNhbGwodGhpcywgaywgTyk7XG4gICAgICByZXR1cm4gVyA9IG5ldyBwLlNjaGVtYUVudih7IHNjaGVtYTogaywgc2NoZW1hSWQ6IEssIG1ldGE6IEYsIGJhc2VJZDogTywgbG9jYWxSZWZzOiByZSB9KSwgdGhpcy5fY2FjaGUuc2V0KFcuc2NoZW1hLCBXKSwgdyAmJiAhTy5zdGFydHNXaXRoKFwiI1wiKSAmJiAoTyAmJiB0aGlzLl9jaGVja1VuaXF1ZShPKSwgdGhpcy5yZWZzW09dID0gVyksIGwgJiYgdGhpcy52YWxpZGF0ZVNjaGVtYShrLCAhMCksIFc7XG4gICAgfVxuICAgIF9jaGVja1VuaXF1ZShrKSB7XG4gICAgICBpZiAodGhpcy5zY2hlbWFzW2tdIHx8IHRoaXMucmVmc1trXSlcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBzY2hlbWEgd2l0aCBrZXkgb3IgaWQgXCIke2t9XCIgYWxyZWFkeSBleGlzdHNgKTtcbiAgICB9XG4gICAgX2NvbXBpbGVTY2hlbWFFbnYoaykge1xuICAgICAgaWYgKGsubWV0YSA/IHRoaXMuX2NvbXBpbGVNZXRhU2NoZW1hKGspIDogcC5jb21waWxlU2NoZW1hLmNhbGwodGhpcywgayksICFrLnZhbGlkYXRlKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJhanYgaW1wbGVtZW50YXRpb24gZXJyb3JcIik7XG4gICAgICByZXR1cm4gay52YWxpZGF0ZTtcbiAgICB9XG4gICAgX2NvbXBpbGVNZXRhU2NoZW1hKGspIHtcbiAgICAgIGNvbnN0IEYgPSB0aGlzLm9wdHM7XG4gICAgICB0aGlzLm9wdHMgPSB0aGlzLl9tZXRhT3B0cztcbiAgICAgIHRyeSB7XG4gICAgICAgIHAuY29tcGlsZVNjaGVtYS5jYWxsKHRoaXMsIGspO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgdGhpcy5vcHRzID0gRjtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgZS5kZWZhdWx0ID0gdCwgdC5WYWxpZGF0aW9uRXJyb3IgPSBhLmRlZmF1bHQsIHQuTWlzc2luZ1JlZkVycm9yID0gZC5kZWZhdWx0O1xuICBmdW5jdGlvbiB1KEIsIGssIEYsIE8gPSBcImVycm9yXCIpIHtcbiAgICBmb3IgKGNvbnN0IGwgaW4gQikge1xuICAgICAgY29uc3QgdyA9IGw7XG4gICAgICB3IGluIGsgJiYgdGhpcy5sb2dnZXJbT10oYCR7Rn06IG9wdGlvbiAke2x9LiAke0Jbd119YCk7XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIHMoQikge1xuICAgIHJldHVybiBCID0gKDAsIGIubm9ybWFsaXplSWQpKEIpLCB0aGlzLnNjaGVtYXNbQl0gfHwgdGhpcy5yZWZzW0JdO1xuICB9XG4gIGZ1bmN0aW9uIGkoKSB7XG4gICAgY29uc3QgQiA9IHRoaXMub3B0cy5zY2hlbWFzO1xuICAgIGlmIChCKVxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoQikpXG4gICAgICAgIHRoaXMuYWRkU2NoZW1hKEIpO1xuICAgICAgZWxzZVxuICAgICAgICBmb3IgKGNvbnN0IGsgaW4gQilcbiAgICAgICAgICB0aGlzLmFkZFNjaGVtYShCW2tdLCBrKTtcbiAgfVxuICBmdW5jdGlvbiBjKCkge1xuICAgIGZvciAoY29uc3QgQiBpbiB0aGlzLm9wdHMuZm9ybWF0cykge1xuICAgICAgY29uc3QgayA9IHRoaXMub3B0cy5mb3JtYXRzW0JdO1xuICAgICAgayAmJiB0aGlzLmFkZEZvcm1hdChCLCBrKTtcbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gbShCKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoQikpIHtcbiAgICAgIHRoaXMuYWRkVm9jYWJ1bGFyeShCKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5sb2dnZXIud2FybihcImtleXdvcmRzIG9wdGlvbiBhcyBtYXAgaXMgZGVwcmVjYXRlZCwgcGFzcyBhcnJheVwiKTtcbiAgICBmb3IgKGNvbnN0IGsgaW4gQikge1xuICAgICAgY29uc3QgRiA9IEJba107XG4gICAgICBGLmtleXdvcmQgfHwgKEYua2V5d29yZCA9IGspLCB0aGlzLmFkZEtleXdvcmQoRik7XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIGgoKSB7XG4gICAgY29uc3QgQiA9IHsgLi4udGhpcy5vcHRzIH07XG4gICAgZm9yIChjb25zdCBrIG9mIFIpXG4gICAgICBkZWxldGUgQltrXTtcbiAgICByZXR1cm4gQjtcbiAgfVxuICBjb25zdCBDID0geyBsb2coKSB7XG4gIH0sIHdhcm4oKSB7XG4gIH0sIGVycm9yKCkge1xuICB9IH07XG4gIGZ1bmN0aW9uIFUoQikge1xuICAgIGlmIChCID09PSAhMSlcbiAgICAgIHJldHVybiBDO1xuICAgIGlmIChCID09PSB2b2lkIDApXG4gICAgICByZXR1cm4gY29uc29sZTtcbiAgICBpZiAoQi5sb2cgJiYgQi53YXJuICYmIEIuZXJyb3IpXG4gICAgICByZXR1cm4gQjtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJsb2dnZXIgbXVzdCBpbXBsZW1lbnQgbG9nLCB3YXJuIGFuZCBlcnJvciBtZXRob2RzXCIpO1xuICB9XG4gIGNvbnN0IEggPSAvXlthLXpfJF1bYS16MC05XyQ6LV0qJC9pO1xuICBmdW5jdGlvbiBWKEIsIGspIHtcbiAgICBjb25zdCB7IFJVTEVTOiBGIH0gPSB0aGlzO1xuICAgIGlmICgoMCwgZy5lYWNoSXRlbSkoQiwgKE8pID0+IHtcbiAgICAgIGlmIChGLmtleXdvcmRzW09dKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEtleXdvcmQgJHtPfSBpcyBhbHJlYWR5IGRlZmluZWRgKTtcbiAgICAgIGlmICghSC50ZXN0KE8pKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEtleXdvcmQgJHtPfSBoYXMgaW52YWxpZCBuYW1lYCk7XG4gICAgfSksICEhayAmJiBrLiRkYXRhICYmICEoXCJjb2RlXCIgaW4gayB8fCBcInZhbGlkYXRlXCIgaW4gaykpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJyRkYXRhIGtleXdvcmQgbXVzdCBoYXZlIFwiY29kZVwiIG9yIFwidmFsaWRhdGVcIiBmdW5jdGlvbicpO1xuICB9XG4gIGZ1bmN0aW9uIEcoQiwgaywgRikge1xuICAgIHZhciBPO1xuICAgIGNvbnN0IGwgPSBrID09IG51bGwgPyB2b2lkIDAgOiBrLnBvc3Q7XG4gICAgaWYgKEYgJiYgbClcbiAgICAgIHRocm93IG5ldyBFcnJvcigna2V5d29yZCB3aXRoIFwicG9zdFwiIGZsYWcgY2Fubm90IGhhdmUgXCJ0eXBlXCInKTtcbiAgICBjb25zdCB7IFJVTEVTOiB3IH0gPSB0aGlzO1xuICAgIGxldCBJID0gbCA/IHcucG9zdCA6IHcucnVsZXMuZmluZCgoeyB0eXBlOiBXIH0pID0+IFcgPT09IEYpO1xuICAgIGlmIChJIHx8IChJID0geyB0eXBlOiBGLCBydWxlczogW10gfSwgdy5ydWxlcy5wdXNoKEkpKSwgdy5rZXl3b3Jkc1tCXSA9ICEwLCAhaylcbiAgICAgIHJldHVybjtcbiAgICBjb25zdCBLID0ge1xuICAgICAga2V5d29yZDogQixcbiAgICAgIGRlZmluaXRpb246IHtcbiAgICAgICAgLi4uayxcbiAgICAgICAgdHlwZTogKDAsIHYuZ2V0SlNPTlR5cGVzKShrLnR5cGUpLFxuICAgICAgICBzY2hlbWFUeXBlOiAoMCwgdi5nZXRKU09OVHlwZXMpKGsuc2NoZW1hVHlwZSlcbiAgICAgIH1cbiAgICB9O1xuICAgIGsuYmVmb3JlID8gXy5jYWxsKHRoaXMsIEksIEssIGsuYmVmb3JlKSA6IEkucnVsZXMucHVzaChLKSwgdy5hbGxbQl0gPSBLLCAoTyA9IGsuaW1wbGVtZW50cykgPT09IG51bGwgfHwgTyA9PT0gdm9pZCAwIHx8IE8uZm9yRWFjaCgoVykgPT4gdGhpcy5hZGRLZXl3b3JkKFcpKTtcbiAgfVxuICBmdW5jdGlvbiBfKEIsIGssIEYpIHtcbiAgICBjb25zdCBPID0gQi5ydWxlcy5maW5kSW5kZXgoKGwpID0+IGwua2V5d29yZCA9PT0gRik7XG4gICAgTyA+PSAwID8gQi5ydWxlcy5zcGxpY2UoTywgMCwgaykgOiAoQi5ydWxlcy5wdXNoKGspLCB0aGlzLmxvZ2dlci53YXJuKGBydWxlICR7Rn0gaXMgbm90IGRlZmluZWRgKSk7XG4gIH1cbiAgZnVuY3Rpb24gcShCKSB7XG4gICAgbGV0IHsgbWV0YVNjaGVtYTogayB9ID0gQjtcbiAgICBrICE9PSB2b2lkIDAgJiYgKEIuJGRhdGEgJiYgdGhpcy5vcHRzLiRkYXRhICYmIChrID0gWihrKSksIEIudmFsaWRhdGVTY2hlbWEgPSB0aGlzLmNvbXBpbGUoaywgITApKTtcbiAgfVxuICBjb25zdCBKID0ge1xuICAgICRyZWY6IFwiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2Fqdi12YWxpZGF0b3IvYWp2L21hc3Rlci9saWIvcmVmcy9kYXRhLmpzb24jXCJcbiAgfTtcbiAgZnVuY3Rpb24gWihCKSB7XG4gICAgcmV0dXJuIHsgYW55T2Y6IFtCLCBKXSB9O1xuICB9XG59KShrbik7XG52YXIgYWEgPSB7fSwgbmEgPSB7fSwgc2EgPSB7fTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShzYSwgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6ICEwIH0pO1xuY29uc3QgdWQgPSB7XG4gIGtleXdvcmQ6IFwiaWRcIixcbiAgY29kZSgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ05PVCBTVVBQT1JURUQ6IGtleXdvcmQgXCJpZFwiLCB1c2UgXCIkaWRcIiBmb3Igc2NoZW1hIElEJyk7XG4gIH1cbn07XG5zYS5kZWZhdWx0ID0gdWQ7XG52YXIgeXIgPSB7fTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eSh5ciwgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6ICEwIH0pO1xueXIuY2FsbFJlZiA9IHlyLmdldFZhbGlkYXRlID0gdm9pZCAwO1xuY29uc3QgZGQgPSBudCwgcm4gPSBuZSwgUmUgPSBzZSwgQ3IgPSBRZSwgdG4gPSBBZSwgY3QgPSBpZSwgaWQgPSB7XG4gIGtleXdvcmQ6IFwiJHJlZlwiLFxuICBzY2hlbWFUeXBlOiBcInN0cmluZ1wiLFxuICBjb2RlKGUpIHtcbiAgICBjb25zdCB7IGdlbjogciwgc2NoZW1hOiBuLCBpdDogYSB9ID0gZSwgeyBiYXNlSWQ6IGQsIHNjaGVtYUVudjogbywgdmFsaWRhdGVOYW1lOiBwLCBvcHRzOiB5LCBzZWxmOiBiIH0gPSBhLCB7IHJvb3Q6IHYgfSA9IG87XG4gICAgaWYgKChuID09PSBcIiNcIiB8fCBuID09PSBcIiMvXCIpICYmIGQgPT09IHYuYmFzZUlkKVxuICAgICAgcmV0dXJuIFMoKTtcbiAgICBjb25zdCBnID0gdG4ucmVzb2x2ZVJlZi5jYWxsKGIsIHYsIGQsIG4pO1xuICAgIGlmIChnID09PSB2b2lkIDApXG4gICAgICB0aHJvdyBuZXcgZGQuZGVmYXVsdChhLm9wdHMudXJpUmVzb2x2ZXIsIGQsIG4pO1xuICAgIGlmIChnIGluc3RhbmNlb2YgdG4uU2NoZW1hRW52KVxuICAgICAgcmV0dXJuIHooZyk7XG4gICAgcmV0dXJuIEwoZyk7XG4gICAgZnVuY3Rpb24gUygpIHtcbiAgICAgIGlmIChvID09PSB2KVxuICAgICAgICByZXR1cm4gZ3QoZSwgcCwgbywgby4kYXN5bmMpO1xuICAgICAgY29uc3QgUiA9IHIuc2NvcGVWYWx1ZShcInJvb3RcIiwgeyByZWY6IHYgfSk7XG4gICAgICByZXR1cm4gZ3QoZSwgKDAsIFJlLl8pYCR7Un0udmFsaWRhdGVgLCB2LCB2LiRhc3luYyk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHooUikge1xuICAgICAgY29uc3QgaiA9IFpuKGUsIFIpO1xuICAgICAgZ3QoZSwgaiwgUiwgUi4kYXN5bmMpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBMKFIpIHtcbiAgICAgIGNvbnN0IGogPSByLnNjb3BlVmFsdWUoXCJzY2hlbWFcIiwgeS5jb2RlLnNvdXJjZSA9PT0gITAgPyB7IHJlZjogUiwgY29kZTogKDAsIFJlLnN0cmluZ2lmeSkoUikgfSA6IHsgcmVmOiBSIH0pLCBUID0gci5uYW1lKFwidmFsaWRcIiksICQgPSBlLnN1YnNjaGVtYSh7XG4gICAgICAgIHNjaGVtYTogUixcbiAgICAgICAgZGF0YVR5cGVzOiBbXSxcbiAgICAgICAgc2NoZW1hUGF0aDogUmUubmlsLFxuICAgICAgICB0b3BTY2hlbWFSZWY6IGosXG4gICAgICAgIGVyclNjaGVtYVBhdGg6IG5cbiAgICAgIH0sIFQpO1xuICAgICAgZS5tZXJnZUV2YWx1YXRlZCgkKSwgZS5vayhUKTtcbiAgICB9XG4gIH1cbn07XG5mdW5jdGlvbiBabihlLCByKSB7XG4gIGNvbnN0IHsgZ2VuOiBuIH0gPSBlO1xuICByZXR1cm4gci52YWxpZGF0ZSA/IG4uc2NvcGVWYWx1ZShcInZhbGlkYXRlXCIsIHsgcmVmOiByLnZhbGlkYXRlIH0pIDogKDAsIFJlLl8pYCR7bi5zY29wZVZhbHVlKFwid3JhcHBlclwiLCB7IHJlZjogciB9KX0udmFsaWRhdGVgO1xufVxueXIuZ2V0VmFsaWRhdGUgPSBabjtcbmZ1bmN0aW9uIGd0KGUsIHIsIG4sIGEpIHtcbiAgY29uc3QgeyBnZW46IGQsIGl0OiBvIH0gPSBlLCB7IGFsbEVycm9yczogcCwgc2NoZW1hRW52OiB5LCBvcHRzOiBiIH0gPSBvLCB2ID0gYi5wYXNzQ29udGV4dCA/IENyLmRlZmF1bHQudGhpcyA6IFJlLm5pbDtcbiAgYSA/IGcoKSA6IFMoKTtcbiAgZnVuY3Rpb24gZygpIHtcbiAgICBpZiAoIXkuJGFzeW5jKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiYXN5bmMgc2NoZW1hIHJlZmVyZW5jZWQgYnkgc3luYyBzY2hlbWFcIik7XG4gICAgY29uc3QgUiA9IGQubGV0KFwidmFsaWRcIik7XG4gICAgZC50cnkoKCkgPT4ge1xuICAgICAgZC5jb2RlKCgwLCBSZS5fKWBhd2FpdCAkeygwLCBybi5jYWxsVmFsaWRhdGVDb2RlKShlLCByLCB2KX1gKSwgTChyKSwgcCB8fCBkLmFzc2lnbihSLCAhMCk7XG4gICAgfSwgKGopID0+IHtcbiAgICAgIGQuaWYoKDAsIFJlLl8pYCEoJHtqfSBpbnN0YW5jZW9mICR7by5WYWxpZGF0aW9uRXJyb3J9KWAsICgpID0+IGQudGhyb3coaikpLCB6KGopLCBwIHx8IGQuYXNzaWduKFIsICExKTtcbiAgICB9KSwgZS5vayhSKTtcbiAgfVxuICBmdW5jdGlvbiBTKCkge1xuICAgIGUucmVzdWx0KCgwLCBybi5jYWxsVmFsaWRhdGVDb2RlKShlLCByLCB2KSwgKCkgPT4gTChyKSwgKCkgPT4geihyKSk7XG4gIH1cbiAgZnVuY3Rpb24geihSKSB7XG4gICAgY29uc3QgaiA9ICgwLCBSZS5fKWAke1J9LmVycm9yc2A7XG4gICAgZC5hc3NpZ24oQ3IuZGVmYXVsdC52RXJyb3JzLCAoMCwgUmUuXylgJHtDci5kZWZhdWx0LnZFcnJvcnN9ID09PSBudWxsID8gJHtqfSA6ICR7Q3IuZGVmYXVsdC52RXJyb3JzfS5jb25jYXQoJHtqfSlgKSwgZC5hc3NpZ24oQ3IuZGVmYXVsdC5lcnJvcnMsICgwLCBSZS5fKWAke0NyLmRlZmF1bHQudkVycm9yc30ubGVuZ3RoYCk7XG4gIH1cbiAgZnVuY3Rpb24gTChSKSB7XG4gICAgdmFyIGo7XG4gICAgaWYgKCFvLm9wdHMudW5ldmFsdWF0ZWQpXG4gICAgICByZXR1cm47XG4gICAgY29uc3QgVCA9IChqID0gbiA9PSBudWxsID8gdm9pZCAwIDogbi52YWxpZGF0ZSkgPT09IG51bGwgfHwgaiA9PT0gdm9pZCAwID8gdm9pZCAwIDogai5ldmFsdWF0ZWQ7XG4gICAgaWYgKG8ucHJvcHMgIT09ICEwKVxuICAgICAgaWYgKFQgJiYgIVQuZHluYW1pY1Byb3BzKVxuICAgICAgICBULnByb3BzICE9PSB2b2lkIDAgJiYgKG8ucHJvcHMgPSBjdC5tZXJnZUV2YWx1YXRlZC5wcm9wcyhkLCBULnByb3BzLCBvLnByb3BzKSk7XG4gICAgICBlbHNlIHtcbiAgICAgICAgY29uc3QgJCA9IGQudmFyKFwicHJvcHNcIiwgKDAsIFJlLl8pYCR7Un0uZXZhbHVhdGVkLnByb3BzYCk7XG4gICAgICAgIG8ucHJvcHMgPSBjdC5tZXJnZUV2YWx1YXRlZC5wcm9wcyhkLCAkLCBvLnByb3BzLCBSZS5OYW1lKTtcbiAgICAgIH1cbiAgICBpZiAoby5pdGVtcyAhPT0gITApXG4gICAgICBpZiAoVCAmJiAhVC5keW5hbWljSXRlbXMpXG4gICAgICAgIFQuaXRlbXMgIT09IHZvaWQgMCAmJiAoby5pdGVtcyA9IGN0Lm1lcmdlRXZhbHVhdGVkLml0ZW1zKGQsIFQuaXRlbXMsIG8uaXRlbXMpKTtcbiAgICAgIGVsc2Uge1xuICAgICAgICBjb25zdCAkID0gZC52YXIoXCJpdGVtc1wiLCAoMCwgUmUuXylgJHtSfS5ldmFsdWF0ZWQuaXRlbXNgKTtcbiAgICAgICAgby5pdGVtcyA9IGN0Lm1lcmdlRXZhbHVhdGVkLml0ZW1zKGQsICQsIG8uaXRlbXMsIFJlLk5hbWUpO1xuICAgICAgfVxuICB9XG59XG55ci5jYWxsUmVmID0gZ3Q7XG55ci5kZWZhdWx0ID0gaWQ7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkobmEsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiAhMCB9KTtcbmNvbnN0IG9kID0gc2EsIGNkID0geXIsIGxkID0gW1xuICBcIiRzY2hlbWFcIixcbiAgXCIkaWRcIixcbiAgXCIkZGVmc1wiLFxuICBcIiR2b2NhYnVsYXJ5XCIsXG4gIHsga2V5d29yZDogXCIkY29tbWVudFwiIH0sXG4gIFwiZGVmaW5pdGlvbnNcIixcbiAgb2QuZGVmYXVsdCxcbiAgY2QuZGVmYXVsdFxuXTtcbm5hLmRlZmF1bHQgPSBsZDtcbnZhciB1YSA9IHt9LCBkYSA9IHt9O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGRhLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogITAgfSk7XG5jb25zdCBFdCA9IHNlLCBzciA9IEV0Lm9wZXJhdG9ycywga3QgPSB7XG4gIG1heGltdW06IHsgb2tTdHI6IFwiPD1cIiwgb2s6IHNyLkxURSwgZmFpbDogc3IuR1QgfSxcbiAgbWluaW11bTogeyBva1N0cjogXCI+PVwiLCBvazogc3IuR1RFLCBmYWlsOiBzci5MVCB9LFxuICBleGNsdXNpdmVNYXhpbXVtOiB7IG9rU3RyOiBcIjxcIiwgb2s6IHNyLkxULCBmYWlsOiBzci5HVEUgfSxcbiAgZXhjbHVzaXZlTWluaW11bTogeyBva1N0cjogXCI+XCIsIG9rOiBzci5HVCwgZmFpbDogc3IuTFRFIH1cbn0sIGZkID0ge1xuICBtZXNzYWdlOiAoeyBrZXl3b3JkOiBlLCBzY2hlbWFDb2RlOiByIH0pID0+ICgwLCBFdC5zdHIpYG11c3QgYmUgJHtrdFtlXS5va1N0cn0gJHtyfWAsXG4gIHBhcmFtczogKHsga2V5d29yZDogZSwgc2NoZW1hQ29kZTogciB9KSA9PiAoMCwgRXQuXylge2NvbXBhcmlzb246ICR7a3RbZV0ub2tTdHJ9LCBsaW1pdDogJHtyfX1gXG59LCBoZCA9IHtcbiAga2V5d29yZDogT2JqZWN0LmtleXMoa3QpLFxuICB0eXBlOiBcIm51bWJlclwiLFxuICBzY2hlbWFUeXBlOiBcIm51bWJlclwiLFxuICAkZGF0YTogITAsXG4gIGVycm9yOiBmZCxcbiAgY29kZShlKSB7XG4gICAgY29uc3QgeyBrZXl3b3JkOiByLCBkYXRhOiBuLCBzY2hlbWFDb2RlOiBhIH0gPSBlO1xuICAgIGUuZmFpbCRkYXRhKCgwLCBFdC5fKWAke259ICR7a3Rbcl0uZmFpbH0gJHthfSB8fCBpc05hTigke259KWApO1xuICB9XG59O1xuZGEuZGVmYXVsdCA9IGhkO1xudmFyIGlhID0ge307XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoaWEsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiAhMCB9KTtcbmNvbnN0IFlyID0gc2UsIHBkID0ge1xuICBtZXNzYWdlOiAoeyBzY2hlbWFDb2RlOiBlIH0pID0+ICgwLCBZci5zdHIpYG11c3QgYmUgbXVsdGlwbGUgb2YgJHtlfWAsXG4gIHBhcmFtczogKHsgc2NoZW1hQ29kZTogZSB9KSA9PiAoMCwgWXIuXylge211bHRpcGxlT2Y6ICR7ZX19YFxufSwgbWQgPSB7XG4gIGtleXdvcmQ6IFwibXVsdGlwbGVPZlwiLFxuICB0eXBlOiBcIm51bWJlclwiLFxuICBzY2hlbWFUeXBlOiBcIm51bWJlclwiLFxuICAkZGF0YTogITAsXG4gIGVycm9yOiBwZCxcbiAgY29kZShlKSB7XG4gICAgY29uc3QgeyBnZW46IHIsIGRhdGE6IG4sIHNjaGVtYUNvZGU6IGEsIGl0OiBkIH0gPSBlLCBvID0gZC5vcHRzLm11bHRpcGxlT2ZQcmVjaXNpb24sIHAgPSByLmxldChcInJlc1wiKSwgeSA9IG8gPyAoMCwgWXIuXylgTWF0aC5hYnMoTWF0aC5yb3VuZCgke3B9KSAtICR7cH0pID4gMWUtJHtvfWAgOiAoMCwgWXIuXylgJHtwfSAhPT0gcGFyc2VJbnQoJHtwfSlgO1xuICAgIGUuZmFpbCRkYXRhKCgwLCBZci5fKWAoJHthfSA9PT0gMCB8fCAoJHtwfSA9ICR7bn0vJHthfSwgJHt5fSkpYCk7XG4gIH1cbn07XG5pYS5kZWZhdWx0ID0gbWQ7XG52YXIgb2EgPSB7fSwgY2EgPSB7fTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShjYSwgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6ICEwIH0pO1xuZnVuY3Rpb24gWW4oZSkge1xuICBjb25zdCByID0gZS5sZW5ndGg7XG4gIGxldCBuID0gMCwgYSA9IDAsIGQ7XG4gIGZvciAoOyBhIDwgcjsgKVxuICAgIG4rKywgZCA9IGUuY2hhckNvZGVBdChhKyspLCBkID49IDU1Mjk2ICYmIGQgPD0gNTYzMTkgJiYgYSA8IHIgJiYgKGQgPSBlLmNoYXJDb2RlQXQoYSksIChkICYgNjQ1MTIpID09PSA1NjMyMCAmJiBhKyspO1xuICByZXR1cm4gbjtcbn1cbmNhLmRlZmF1bHQgPSBZbjtcblluLmNvZGUgPSAncmVxdWlyZShcImFqdi9kaXN0L3J1bnRpbWUvdWNzMmxlbmd0aFwiKS5kZWZhdWx0Jztcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYSwgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6ICEwIH0pO1xuY29uc3QgZ3IgPSBzZSwgZ2QgPSBpZSwgX2QgPSBjYSwgdmQgPSB7XG4gIG1lc3NhZ2UoeyBrZXl3b3JkOiBlLCBzY2hlbWFDb2RlOiByIH0pIHtcbiAgICBjb25zdCBuID0gZSA9PT0gXCJtYXhMZW5ndGhcIiA/IFwibW9yZVwiIDogXCJmZXdlclwiO1xuICAgIHJldHVybiAoMCwgZ3Iuc3RyKWBtdXN0IE5PVCBoYXZlICR7bn0gdGhhbiAke3J9IGNoYXJhY3RlcnNgO1xuICB9LFxuICBwYXJhbXM6ICh7IHNjaGVtYUNvZGU6IGUgfSkgPT4gKDAsIGdyLl8pYHtsaW1pdDogJHtlfX1gXG59LCB5ZCA9IHtcbiAga2V5d29yZDogW1wibWF4TGVuZ3RoXCIsIFwibWluTGVuZ3RoXCJdLFxuICB0eXBlOiBcInN0cmluZ1wiLFxuICBzY2hlbWFUeXBlOiBcIm51bWJlclwiLFxuICAkZGF0YTogITAsXG4gIGVycm9yOiB2ZCxcbiAgY29kZShlKSB7XG4gICAgY29uc3QgeyBrZXl3b3JkOiByLCBkYXRhOiBuLCBzY2hlbWFDb2RlOiBhLCBpdDogZCB9ID0gZSwgbyA9IHIgPT09IFwibWF4TGVuZ3RoXCIgPyBnci5vcGVyYXRvcnMuR1QgOiBnci5vcGVyYXRvcnMuTFQsIHAgPSBkLm9wdHMudW5pY29kZSA9PT0gITEgPyAoMCwgZ3IuXylgJHtufS5sZW5ndGhgIDogKDAsIGdyLl8pYCR7KDAsIGdkLnVzZUZ1bmMpKGUuZ2VuLCBfZC5kZWZhdWx0KX0oJHtufSlgO1xuICAgIGUuZmFpbCRkYXRhKCgwLCBnci5fKWAke3B9ICR7b30gJHthfWApO1xuICB9XG59O1xub2EuZGVmYXVsdCA9IHlkO1xudmFyIGxhID0ge307XG5PYmplY3QuZGVmaW5lUHJvcGVydHkobGEsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiAhMCB9KTtcbmNvbnN0IHdkID0gbmUsIFB0ID0gc2UsIGJkID0ge1xuICBtZXNzYWdlOiAoeyBzY2hlbWFDb2RlOiBlIH0pID0+ICgwLCBQdC5zdHIpYG11c3QgbWF0Y2ggcGF0dGVybiBcIiR7ZX1cImAsXG4gIHBhcmFtczogKHsgc2NoZW1hQ29kZTogZSB9KSA9PiAoMCwgUHQuXylge3BhdHRlcm46ICR7ZX19YFxufSwgJGQgPSB7XG4gIGtleXdvcmQ6IFwicGF0dGVyblwiLFxuICB0eXBlOiBcInN0cmluZ1wiLFxuICBzY2hlbWFUeXBlOiBcInN0cmluZ1wiLFxuICAkZGF0YTogITAsXG4gIGVycm9yOiBiZCxcbiAgY29kZShlKSB7XG4gICAgY29uc3QgeyBkYXRhOiByLCAkZGF0YTogbiwgc2NoZW1hOiBhLCBzY2hlbWFDb2RlOiBkLCBpdDogbyB9ID0gZSwgcCA9IG8ub3B0cy51bmljb2RlUmVnRXhwID8gXCJ1XCIgOiBcIlwiLCB5ID0gbiA/ICgwLCBQdC5fKWAobmV3IFJlZ0V4cCgke2R9LCAke3B9KSlgIDogKDAsIHdkLnVzZVBhdHRlcm4pKGUsIGEpO1xuICAgIGUuZmFpbCRkYXRhKCgwLCBQdC5fKWAhJHt5fS50ZXN0KCR7cn0pYCk7XG4gIH1cbn07XG5sYS5kZWZhdWx0ID0gJGQ7XG52YXIgZmEgPSB7fTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShmYSwgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6ICEwIH0pO1xuY29uc3QgWHIgPSBzZSwgRWQgPSB7XG4gIG1lc3NhZ2UoeyBrZXl3b3JkOiBlLCBzY2hlbWFDb2RlOiByIH0pIHtcbiAgICBjb25zdCBuID0gZSA9PT0gXCJtYXhQcm9wZXJ0aWVzXCIgPyBcIm1vcmVcIiA6IFwiZmV3ZXJcIjtcbiAgICByZXR1cm4gKDAsIFhyLnN0cilgbXVzdCBOT1QgaGF2ZSAke259IHRoYW4gJHtyfSBwcm9wZXJ0aWVzYDtcbiAgfSxcbiAgcGFyYW1zOiAoeyBzY2hlbWFDb2RlOiBlIH0pID0+ICgwLCBYci5fKWB7bGltaXQ6ICR7ZX19YFxufSwga2QgPSB7XG4gIGtleXdvcmQ6IFtcIm1heFByb3BlcnRpZXNcIiwgXCJtaW5Qcm9wZXJ0aWVzXCJdLFxuICB0eXBlOiBcIm9iamVjdFwiLFxuICBzY2hlbWFUeXBlOiBcIm51bWJlclwiLFxuICAkZGF0YTogITAsXG4gIGVycm9yOiBFZCxcbiAgY29kZShlKSB7XG4gICAgY29uc3QgeyBrZXl3b3JkOiByLCBkYXRhOiBuLCBzY2hlbWFDb2RlOiBhIH0gPSBlLCBkID0gciA9PT0gXCJtYXhQcm9wZXJ0aWVzXCIgPyBYci5vcGVyYXRvcnMuR1QgOiBYci5vcGVyYXRvcnMuTFQ7XG4gICAgZS5mYWlsJGRhdGEoKDAsIFhyLl8pYE9iamVjdC5rZXlzKCR7bn0pLmxlbmd0aCAke2R9ICR7YX1gKTtcbiAgfVxufTtcbmZhLmRlZmF1bHQgPSBrZDtcbnZhciBoYSA9IHt9O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGhhLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogITAgfSk7XG5jb25zdCBXciA9IG5lLCBRciA9IHNlLCBQZCA9IGllLCBTZCA9IHtcbiAgbWVzc2FnZTogKHsgcGFyYW1zOiB7IG1pc3NpbmdQcm9wZXJ0eTogZSB9IH0pID0+ICgwLCBRci5zdHIpYG11c3QgaGF2ZSByZXF1aXJlZCBwcm9wZXJ0eSAnJHtlfSdgLFxuICBwYXJhbXM6ICh7IHBhcmFtczogeyBtaXNzaW5nUHJvcGVydHk6IGUgfSB9KSA9PiAoMCwgUXIuXylge21pc3NpbmdQcm9wZXJ0eTogJHtlfX1gXG59LCBDZCA9IHtcbiAga2V5d29yZDogXCJyZXF1aXJlZFwiLFxuICB0eXBlOiBcIm9iamVjdFwiLFxuICBzY2hlbWFUeXBlOiBcImFycmF5XCIsXG4gICRkYXRhOiAhMCxcbiAgZXJyb3I6IFNkLFxuICBjb2RlKGUpIHtcbiAgICBjb25zdCB7IGdlbjogciwgc2NoZW1hOiBuLCBzY2hlbWFDb2RlOiBhLCBkYXRhOiBkLCAkZGF0YTogbywgaXQ6IHAgfSA9IGUsIHsgb3B0czogeSB9ID0gcDtcbiAgICBpZiAoIW8gJiYgbi5sZW5ndGggPT09IDApXG4gICAgICByZXR1cm47XG4gICAgY29uc3QgYiA9IG4ubGVuZ3RoID49IHkubG9vcFJlcXVpcmVkO1xuICAgIGlmIChwLmFsbEVycm9ycyA/IHYoKSA6IGcoKSwgeS5zdHJpY3RSZXF1aXJlZCkge1xuICAgICAgY29uc3QgTCA9IGUucGFyZW50U2NoZW1hLnByb3BlcnRpZXMsIHsgZGVmaW5lZFByb3BlcnRpZXM6IFIgfSA9IGUuaXQ7XG4gICAgICBmb3IgKGNvbnN0IGogb2YgbilcbiAgICAgICAgaWYgKChMID09IG51bGwgPyB2b2lkIDAgOiBMW2pdKSA9PT0gdm9pZCAwICYmICFSLmhhcyhqKSkge1xuICAgICAgICAgIGNvbnN0IFQgPSBwLnNjaGVtYUVudi5iYXNlSWQgKyBwLmVyclNjaGVtYVBhdGgsICQgPSBgcmVxdWlyZWQgcHJvcGVydHkgXCIke2p9XCIgaXMgbm90IGRlZmluZWQgYXQgXCIke1R9XCIgKHN0cmljdFJlcXVpcmVkKWA7XG4gICAgICAgICAgKDAsIFBkLmNoZWNrU3RyaWN0TW9kZSkocCwgJCwgcC5vcHRzLnN0cmljdFJlcXVpcmVkKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiB2KCkge1xuICAgICAgaWYgKGIgfHwgbylcbiAgICAgICAgZS5ibG9jayRkYXRhKFFyLm5pbCwgUyk7XG4gICAgICBlbHNlXG4gICAgICAgIGZvciAoY29uc3QgTCBvZiBuKVxuICAgICAgICAgICgwLCBXci5jaGVja1JlcG9ydE1pc3NpbmdQcm9wKShlLCBMKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZygpIHtcbiAgICAgIGNvbnN0IEwgPSByLmxldChcIm1pc3NpbmdcIik7XG4gICAgICBpZiAoYiB8fCBvKSB7XG4gICAgICAgIGNvbnN0IFIgPSByLmxldChcInZhbGlkXCIsICEwKTtcbiAgICAgICAgZS5ibG9jayRkYXRhKFIsICgpID0+IHooTCwgUikpLCBlLm9rKFIpO1xuICAgICAgfSBlbHNlXG4gICAgICAgIHIuaWYoKDAsIFdyLmNoZWNrTWlzc2luZ1Byb3ApKGUsIG4sIEwpKSwgKDAsIFdyLnJlcG9ydE1pc3NpbmdQcm9wKShlLCBMKSwgci5lbHNlKCk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIFMoKSB7XG4gICAgICByLmZvck9mKFwicHJvcFwiLCBhLCAoTCkgPT4ge1xuICAgICAgICBlLnNldFBhcmFtcyh7IG1pc3NpbmdQcm9wZXJ0eTogTCB9KSwgci5pZigoMCwgV3Iubm9Qcm9wZXJ0eUluRGF0YSkociwgZCwgTCwgeS5vd25Qcm9wZXJ0aWVzKSwgKCkgPT4gZS5lcnJvcigpKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICBmdW5jdGlvbiB6KEwsIFIpIHtcbiAgICAgIGUuc2V0UGFyYW1zKHsgbWlzc2luZ1Byb3BlcnR5OiBMIH0pLCByLmZvck9mKEwsIGEsICgpID0+IHtcbiAgICAgICAgci5hc3NpZ24oUiwgKDAsIFdyLnByb3BlcnR5SW5EYXRhKShyLCBkLCBMLCB5Lm93blByb3BlcnRpZXMpKSwgci5pZigoMCwgUXIubm90KShSKSwgKCkgPT4ge1xuICAgICAgICAgIGUuZXJyb3IoKSwgci5icmVhaygpO1xuICAgICAgICB9KTtcbiAgICAgIH0sIFFyLm5pbCk7XG4gICAgfVxuICB9XG59O1xuaGEuZGVmYXVsdCA9IENkO1xudmFyIHBhID0ge307XG5PYmplY3QuZGVmaW5lUHJvcGVydHkocGEsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiAhMCB9KTtcbmNvbnN0IHhyID0gc2UsIFRkID0ge1xuICBtZXNzYWdlKHsga2V5d29yZDogZSwgc2NoZW1hQ29kZTogciB9KSB7XG4gICAgY29uc3QgbiA9IGUgPT09IFwibWF4SXRlbXNcIiA/IFwibW9yZVwiIDogXCJmZXdlclwiO1xuICAgIHJldHVybiAoMCwgeHIuc3RyKWBtdXN0IE5PVCBoYXZlICR7bn0gdGhhbiAke3J9IGl0ZW1zYDtcbiAgfSxcbiAgcGFyYW1zOiAoeyBzY2hlbWFDb2RlOiBlIH0pID0+ICgwLCB4ci5fKWB7bGltaXQ6ICR7ZX19YFxufSwgamQgPSB7XG4gIGtleXdvcmQ6IFtcIm1heEl0ZW1zXCIsIFwibWluSXRlbXNcIl0sXG4gIHR5cGU6IFwiYXJyYXlcIixcbiAgc2NoZW1hVHlwZTogXCJudW1iZXJcIixcbiAgJGRhdGE6ICEwLFxuICBlcnJvcjogVGQsXG4gIGNvZGUoZSkge1xuICAgIGNvbnN0IHsga2V5d29yZDogciwgZGF0YTogbiwgc2NoZW1hQ29kZTogYSB9ID0gZSwgZCA9IHIgPT09IFwibWF4SXRlbXNcIiA/IHhyLm9wZXJhdG9ycy5HVCA6IHhyLm9wZXJhdG9ycy5MVDtcbiAgICBlLmZhaWwkZGF0YSgoMCwgeHIuXylgJHtufS5sZW5ndGggJHtkfSAke2F9YCk7XG4gIH1cbn07XG5wYS5kZWZhdWx0ID0gamQ7XG52YXIgbWEgPSB7fSwgc3QgPSB7fTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShzdCwgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6ICEwIH0pO1xuY29uc3QgWG4gPSBSbjtcblhuLmNvZGUgPSAncmVxdWlyZShcImFqdi9kaXN0L3J1bnRpbWUvZXF1YWxcIikuZGVmYXVsdCc7XG5zdC5kZWZhdWx0ID0gWG47XG5PYmplY3QuZGVmaW5lUHJvcGVydHkobWEsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiAhMCB9KTtcbmNvbnN0IFZ0ID0gdHQsIEVlID0gc2UsIE5kID0gaWUsIE9kID0gc3QsIFJkID0ge1xuICBtZXNzYWdlOiAoeyBwYXJhbXM6IHsgaTogZSwgajogciB9IH0pID0+ICgwLCBFZS5zdHIpYG11c3QgTk9UIGhhdmUgZHVwbGljYXRlIGl0ZW1zIChpdGVtcyAjIyAke3J9IGFuZCAke2V9IGFyZSBpZGVudGljYWwpYCxcbiAgcGFyYW1zOiAoeyBwYXJhbXM6IHsgaTogZSwgajogciB9IH0pID0+ICgwLCBFZS5fKWB7aTogJHtlfSwgajogJHtyfX1gXG59LCBBZCA9IHtcbiAga2V5d29yZDogXCJ1bmlxdWVJdGVtc1wiLFxuICB0eXBlOiBcImFycmF5XCIsXG4gIHNjaGVtYVR5cGU6IFwiYm9vbGVhblwiLFxuICAkZGF0YTogITAsXG4gIGVycm9yOiBSZCxcbiAgY29kZShlKSB7XG4gICAgY29uc3QgeyBnZW46IHIsIGRhdGE6IG4sICRkYXRhOiBhLCBzY2hlbWE6IGQsIHBhcmVudFNjaGVtYTogbywgc2NoZW1hQ29kZTogcCwgaXQ6IHkgfSA9IGU7XG4gICAgaWYgKCFhICYmICFkKVxuICAgICAgcmV0dXJuO1xuICAgIGNvbnN0IGIgPSByLmxldChcInZhbGlkXCIpLCB2ID0gby5pdGVtcyA/ICgwLCBWdC5nZXRTY2hlbWFUeXBlcykoby5pdGVtcykgOiBbXTtcbiAgICBlLmJsb2NrJGRhdGEoYiwgZywgKDAsIEVlLl8pYCR7cH0gPT09IGZhbHNlYCksIGUub2soYik7XG4gICAgZnVuY3Rpb24gZygpIHtcbiAgICAgIGNvbnN0IFIgPSByLmxldChcImlcIiwgKDAsIEVlLl8pYCR7bn0ubGVuZ3RoYCksIGogPSByLmxldChcImpcIik7XG4gICAgICBlLnNldFBhcmFtcyh7IGk6IFIsIGogfSksIHIuYXNzaWduKGIsICEwKSwgci5pZigoMCwgRWUuXylgJHtSfSA+IDFgLCAoKSA9PiAoUygpID8geiA6IEwpKFIsIGopKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gUygpIHtcbiAgICAgIHJldHVybiB2Lmxlbmd0aCA+IDAgJiYgIXYuc29tZSgoUikgPT4gUiA9PT0gXCJvYmplY3RcIiB8fCBSID09PSBcImFycmF5XCIpO1xuICAgIH1cbiAgICBmdW5jdGlvbiB6KFIsIGopIHtcbiAgICAgIGNvbnN0IFQgPSByLm5hbWUoXCJpdGVtXCIpLCAkID0gKDAsIFZ0LmNoZWNrRGF0YVR5cGVzKSh2LCBULCB5Lm9wdHMuc3RyaWN0TnVtYmVycywgVnQuRGF0YVR5cGUuV3JvbmcpLCBOID0gci5jb25zdChcImluZGljZXNcIiwgKDAsIEVlLl8pYHt9YCk7XG4gICAgICByLmZvcigoMCwgRWUuXylgOyR7Un0tLTtgLCAoKSA9PiB7XG4gICAgICAgIHIubGV0KFQsICgwLCBFZS5fKWAke259WyR7Un1dYCksIHIuaWYoJCwgKDAsIEVlLl8pYGNvbnRpbnVlYCksIHYubGVuZ3RoID4gMSAmJiByLmlmKCgwLCBFZS5fKWB0eXBlb2YgJHtUfSA9PSBcInN0cmluZ1wiYCwgKDAsIEVlLl8pYCR7VH0gKz0gXCJfXCJgKSwgci5pZigoMCwgRWUuXylgdHlwZW9mICR7Tn1bJHtUfV0gPT0gXCJudW1iZXJcImAsICgpID0+IHtcbiAgICAgICAgICByLmFzc2lnbihqLCAoMCwgRWUuXylgJHtOfVske1R9XWApLCBlLmVycm9yKCksIHIuYXNzaWduKGIsICExKS5icmVhaygpO1xuICAgICAgICB9KS5jb2RlKCgwLCBFZS5fKWAke059WyR7VH1dID0gJHtSfWApO1xuICAgICAgfSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIEwoUiwgaikge1xuICAgICAgY29uc3QgVCA9ICgwLCBOZC51c2VGdW5jKShyLCBPZC5kZWZhdWx0KSwgJCA9IHIubmFtZShcIm91dGVyXCIpO1xuICAgICAgci5sYWJlbCgkKS5mb3IoKDAsIEVlLl8pYDske1J9LS07YCwgKCkgPT4gci5mb3IoKDAsIEVlLl8pYCR7an0gPSAke1J9OyAke2p9LS07YCwgKCkgPT4gci5pZigoMCwgRWUuXylgJHtUfSgke259WyR7Un1dLCAke259WyR7an1dKWAsICgpID0+IHtcbiAgICAgICAgZS5lcnJvcigpLCByLmFzc2lnbihiLCAhMSkuYnJlYWsoJCk7XG4gICAgICB9KSkpO1xuICAgIH1cbiAgfVxufTtcbm1hLmRlZmF1bHQgPSBBZDtcbnZhciBnYSA9IHt9O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGdhLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogITAgfSk7XG5jb25zdCBHdCA9IHNlLCBJZCA9IGllLCBNZCA9IHN0LCBEZCA9IHtcbiAgbWVzc2FnZTogXCJtdXN0IGJlIGVxdWFsIHRvIGNvbnN0YW50XCIsXG4gIHBhcmFtczogKHsgc2NoZW1hQ29kZTogZSB9KSA9PiAoMCwgR3QuXylge2FsbG93ZWRWYWx1ZTogJHtlfX1gXG59LCBMZCA9IHtcbiAga2V5d29yZDogXCJjb25zdFwiLFxuICAkZGF0YTogITAsXG4gIGVycm9yOiBEZCxcbiAgY29kZShlKSB7XG4gICAgY29uc3QgeyBnZW46IHIsIGRhdGE6IG4sICRkYXRhOiBhLCBzY2hlbWFDb2RlOiBkLCBzY2hlbWE6IG8gfSA9IGU7XG4gICAgYSB8fCBvICYmIHR5cGVvZiBvID09IFwib2JqZWN0XCIgPyBlLmZhaWwkZGF0YSgoMCwgR3QuXylgISR7KDAsIElkLnVzZUZ1bmMpKHIsIE1kLmRlZmF1bHQpfSgke259LCAke2R9KWApIDogZS5mYWlsKCgwLCBHdC5fKWAke299ICE9PSAke259YCk7XG4gIH1cbn07XG5nYS5kZWZhdWx0ID0gTGQ7XG52YXIgX2EgPSB7fTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShfYSwgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6ICEwIH0pO1xuY29uc3QgSnIgPSBzZSwgemQgPSBpZSwgVmQgPSBzdCwgRmQgPSB7XG4gIG1lc3NhZ2U6IFwibXVzdCBiZSBlcXVhbCB0byBvbmUgb2YgdGhlIGFsbG93ZWQgdmFsdWVzXCIsXG4gIHBhcmFtczogKHsgc2NoZW1hQ29kZTogZSB9KSA9PiAoMCwgSnIuXylge2FsbG93ZWRWYWx1ZXM6ICR7ZX19YFxufSwgVWQgPSB7XG4gIGtleXdvcmQ6IFwiZW51bVwiLFxuICBzY2hlbWFUeXBlOiBcImFycmF5XCIsXG4gICRkYXRhOiAhMCxcbiAgZXJyb3I6IEZkLFxuICBjb2RlKGUpIHtcbiAgICBjb25zdCB7IGdlbjogciwgZGF0YTogbiwgJGRhdGE6IGEsIHNjaGVtYTogZCwgc2NoZW1hQ29kZTogbywgaXQ6IHAgfSA9IGU7XG4gICAgaWYgKCFhICYmIGQubGVuZ3RoID09PSAwKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiZW51bSBtdXN0IGhhdmUgbm9uLWVtcHR5IGFycmF5XCIpO1xuICAgIGNvbnN0IHkgPSBkLmxlbmd0aCA+PSBwLm9wdHMubG9vcEVudW07XG4gICAgbGV0IGI7XG4gICAgY29uc3QgdiA9ICgpID0+IGIgPz8gKGIgPSAoMCwgemQudXNlRnVuYykociwgVmQuZGVmYXVsdCkpO1xuICAgIGxldCBnO1xuICAgIGlmICh5IHx8IGEpXG4gICAgICBnID0gci5sZXQoXCJ2YWxpZFwiKSwgZS5ibG9jayRkYXRhKGcsIFMpO1xuICAgIGVsc2Uge1xuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGQpKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJhanYgaW1wbGVtZW50YXRpb24gZXJyb3JcIik7XG4gICAgICBjb25zdCBMID0gci5jb25zdChcInZTY2hlbWFcIiwgbyk7XG4gICAgICBnID0gKDAsIEpyLm9yKSguLi5kLm1hcCgoUiwgaikgPT4geihMLCBqKSkpO1xuICAgIH1cbiAgICBlLnBhc3MoZyk7XG4gICAgZnVuY3Rpb24gUygpIHtcbiAgICAgIHIuYXNzaWduKGcsICExKSwgci5mb3JPZihcInZcIiwgbywgKEwpID0+IHIuaWYoKDAsIEpyLl8pYCR7digpfSgke259LCAke0x9KWAsICgpID0+IHIuYXNzaWduKGcsICEwKS5icmVhaygpKSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHooTCwgUikge1xuICAgICAgY29uc3QgaiA9IGRbUl07XG4gICAgICByZXR1cm4gdHlwZW9mIGogPT0gXCJvYmplY3RcIiAmJiBqICE9PSBudWxsID8gKDAsIEpyLl8pYCR7digpfSgke259LCAke0x9WyR7Un1dKWAgOiAoMCwgSnIuXylgJHtufSA9PT0gJHtqfWA7XG4gICAgfVxuICB9XG59O1xuX2EuZGVmYXVsdCA9IFVkO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KHVhLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogITAgfSk7XG5jb25zdCBCZCA9IGRhLCBIZCA9IGlhLCBxZCA9IG9hLCBHZCA9IGxhLCBLZCA9IGZhLCBXZCA9IGhhLCBKZCA9IHBhLCBaZCA9IG1hLCBZZCA9IGdhLCBYZCA9IF9hLCBRZCA9IFtcbiAgLy8gbnVtYmVyXG4gIEJkLmRlZmF1bHQsXG4gIEhkLmRlZmF1bHQsXG4gIC8vIHN0cmluZ1xuICBxZC5kZWZhdWx0LFxuICBHZC5kZWZhdWx0LFxuICAvLyBvYmplY3RcbiAgS2QuZGVmYXVsdCxcbiAgV2QuZGVmYXVsdCxcbiAgLy8gYXJyYXlcbiAgSmQuZGVmYXVsdCxcbiAgWmQuZGVmYXVsdCxcbiAgLy8gYW55XG4gIHsga2V5d29yZDogXCJ0eXBlXCIsIHNjaGVtYVR5cGU6IFtcInN0cmluZ1wiLCBcImFycmF5XCJdIH0sXG4gIHsga2V5d29yZDogXCJudWxsYWJsZVwiLCBzY2hlbWFUeXBlOiBcImJvb2xlYW5cIiB9LFxuICBZZC5kZWZhdWx0LFxuICBYZC5kZWZhdWx0XG5dO1xudWEuZGVmYXVsdCA9IFFkO1xudmFyIHZhID0ge30sIE1yID0ge307XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoTXIsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiAhMCB9KTtcbk1yLnZhbGlkYXRlQWRkaXRpb25hbEl0ZW1zID0gdm9pZCAwO1xuY29uc3QgX3IgPSBzZSwgS3QgPSBpZSwgeGQgPSB7XG4gIG1lc3NhZ2U6ICh7IHBhcmFtczogeyBsZW46IGUgfSB9KSA9PiAoMCwgX3Iuc3RyKWBtdXN0IE5PVCBoYXZlIG1vcmUgdGhhbiAke2V9IGl0ZW1zYCxcbiAgcGFyYW1zOiAoeyBwYXJhbXM6IHsgbGVuOiBlIH0gfSkgPT4gKDAsIF9yLl8pYHtsaW1pdDogJHtlfX1gXG59LCBlaSA9IHtcbiAga2V5d29yZDogXCJhZGRpdGlvbmFsSXRlbXNcIixcbiAgdHlwZTogXCJhcnJheVwiLFxuICBzY2hlbWFUeXBlOiBbXCJib29sZWFuXCIsIFwib2JqZWN0XCJdLFxuICBiZWZvcmU6IFwidW5pcXVlSXRlbXNcIixcbiAgZXJyb3I6IHhkLFxuICBjb2RlKGUpIHtcbiAgICBjb25zdCB7IHBhcmVudFNjaGVtYTogciwgaXQ6IG4gfSA9IGUsIHsgaXRlbXM6IGEgfSA9IHI7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGEpKSB7XG4gICAgICAoMCwgS3QuY2hlY2tTdHJpY3RNb2RlKShuLCAnXCJhZGRpdGlvbmFsSXRlbXNcIiBpcyBpZ25vcmVkIHdoZW4gXCJpdGVtc1wiIGlzIG5vdCBhbiBhcnJheSBvZiBzY2hlbWFzJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIFFuKGUsIGEpO1xuICB9XG59O1xuZnVuY3Rpb24gUW4oZSwgcikge1xuICBjb25zdCB7IGdlbjogbiwgc2NoZW1hOiBhLCBkYXRhOiBkLCBrZXl3b3JkOiBvLCBpdDogcCB9ID0gZTtcbiAgcC5pdGVtcyA9ICEwO1xuICBjb25zdCB5ID0gbi5jb25zdChcImxlblwiLCAoMCwgX3IuXylgJHtkfS5sZW5ndGhgKTtcbiAgaWYgKGEgPT09ICExKVxuICAgIGUuc2V0UGFyYW1zKHsgbGVuOiByLmxlbmd0aCB9KSwgZS5wYXNzKCgwLCBfci5fKWAke3l9IDw9ICR7ci5sZW5ndGh9YCk7XG4gIGVsc2UgaWYgKHR5cGVvZiBhID09IFwib2JqZWN0XCIgJiYgISgwLCBLdC5hbHdheXNWYWxpZFNjaGVtYSkocCwgYSkpIHtcbiAgICBjb25zdCB2ID0gbi52YXIoXCJ2YWxpZFwiLCAoMCwgX3IuXylgJHt5fSA8PSAke3IubGVuZ3RofWApO1xuICAgIG4uaWYoKDAsIF9yLm5vdCkodiksICgpID0+IGIodikpLCBlLm9rKHYpO1xuICB9XG4gIGZ1bmN0aW9uIGIodikge1xuICAgIG4uZm9yUmFuZ2UoXCJpXCIsIHIubGVuZ3RoLCB5LCAoZykgPT4ge1xuICAgICAgZS5zdWJzY2hlbWEoeyBrZXl3b3JkOiBvLCBkYXRhUHJvcDogZywgZGF0YVByb3BUeXBlOiBLdC5UeXBlLk51bSB9LCB2KSwgcC5hbGxFcnJvcnMgfHwgbi5pZigoMCwgX3Iubm90KSh2KSwgKCkgPT4gbi5icmVhaygpKTtcbiAgICB9KTtcbiAgfVxufVxuTXIudmFsaWRhdGVBZGRpdGlvbmFsSXRlbXMgPSBRbjtcbk1yLmRlZmF1bHQgPSBlaTtcbnZhciB5YSA9IHt9LCBEciA9IHt9O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KERyLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogITAgfSk7XG5Eci52YWxpZGF0ZVR1cGxlID0gdm9pZCAwO1xuY29uc3QgYW4gPSBzZSwgX3QgPSBpZSwgcmkgPSBuZSwgdGkgPSB7XG4gIGtleXdvcmQ6IFwiaXRlbXNcIixcbiAgdHlwZTogXCJhcnJheVwiLFxuICBzY2hlbWFUeXBlOiBbXCJvYmplY3RcIiwgXCJhcnJheVwiLCBcImJvb2xlYW5cIl0sXG4gIGJlZm9yZTogXCJ1bmlxdWVJdGVtc1wiLFxuICBjb2RlKGUpIHtcbiAgICBjb25zdCB7IHNjaGVtYTogciwgaXQ6IG4gfSA9IGU7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkocikpXG4gICAgICByZXR1cm4geG4oZSwgXCJhZGRpdGlvbmFsSXRlbXNcIiwgcik7XG4gICAgbi5pdGVtcyA9ICEwLCAhKDAsIF90LmFsd2F5c1ZhbGlkU2NoZW1hKShuLCByKSAmJiBlLm9rKCgwLCByaS52YWxpZGF0ZUFycmF5KShlKSk7XG4gIH1cbn07XG5mdW5jdGlvbiB4bihlLCByLCBuID0gZS5zY2hlbWEpIHtcbiAgY29uc3QgeyBnZW46IGEsIHBhcmVudFNjaGVtYTogZCwgZGF0YTogbywga2V5d29yZDogcCwgaXQ6IHkgfSA9IGU7XG4gIGcoZCksIHkub3B0cy51bmV2YWx1YXRlZCAmJiBuLmxlbmd0aCAmJiB5Lml0ZW1zICE9PSAhMCAmJiAoeS5pdGVtcyA9IF90Lm1lcmdlRXZhbHVhdGVkLml0ZW1zKGEsIG4ubGVuZ3RoLCB5Lml0ZW1zKSk7XG4gIGNvbnN0IGIgPSBhLm5hbWUoXCJ2YWxpZFwiKSwgdiA9IGEuY29uc3QoXCJsZW5cIiwgKDAsIGFuLl8pYCR7b30ubGVuZ3RoYCk7XG4gIG4uZm9yRWFjaCgoUywgeikgPT4ge1xuICAgICgwLCBfdC5hbHdheXNWYWxpZFNjaGVtYSkoeSwgUykgfHwgKGEuaWYoKDAsIGFuLl8pYCR7dn0gPiAke3p9YCwgKCkgPT4gZS5zdWJzY2hlbWEoe1xuICAgICAga2V5d29yZDogcCxcbiAgICAgIHNjaGVtYVByb3A6IHosXG4gICAgICBkYXRhUHJvcDogelxuICAgIH0sIGIpKSwgZS5vayhiKSk7XG4gIH0pO1xuICBmdW5jdGlvbiBnKFMpIHtcbiAgICBjb25zdCB7IG9wdHM6IHosIGVyclNjaGVtYVBhdGg6IEwgfSA9IHksIFIgPSBuLmxlbmd0aCwgaiA9IFIgPT09IFMubWluSXRlbXMgJiYgKFIgPT09IFMubWF4SXRlbXMgfHwgU1tyXSA9PT0gITEpO1xuICAgIGlmICh6LnN0cmljdFR1cGxlcyAmJiAhaikge1xuICAgICAgY29uc3QgVCA9IGBcIiR7cH1cIiBpcyAke1J9LXR1cGxlLCBidXQgbWluSXRlbXMgb3IgbWF4SXRlbXMvJHtyfSBhcmUgbm90IHNwZWNpZmllZCBvciBkaWZmZXJlbnQgYXQgcGF0aCBcIiR7TH1cImA7XG4gICAgICAoMCwgX3QuY2hlY2tTdHJpY3RNb2RlKSh5LCBULCB6LnN0cmljdFR1cGxlcyk7XG4gICAgfVxuICB9XG59XG5Eci52YWxpZGF0ZVR1cGxlID0geG47XG5Eci5kZWZhdWx0ID0gdGk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoeWEsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiAhMCB9KTtcbmNvbnN0IGFpID0gRHIsIG5pID0ge1xuICBrZXl3b3JkOiBcInByZWZpeEl0ZW1zXCIsXG4gIHR5cGU6IFwiYXJyYXlcIixcbiAgc2NoZW1hVHlwZTogW1wiYXJyYXlcIl0sXG4gIGJlZm9yZTogXCJ1bmlxdWVJdGVtc1wiLFxuICBjb2RlOiAoZSkgPT4gKDAsIGFpLnZhbGlkYXRlVHVwbGUpKGUsIFwiaXRlbXNcIilcbn07XG55YS5kZWZhdWx0ID0gbmk7XG52YXIgd2EgPSB7fTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eSh3YSwgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6ICEwIH0pO1xuY29uc3Qgbm4gPSBzZSwgc2kgPSBpZSwgdWkgPSBuZSwgZGkgPSBNciwgaWkgPSB7XG4gIG1lc3NhZ2U6ICh7IHBhcmFtczogeyBsZW46IGUgfSB9KSA9PiAoMCwgbm4uc3RyKWBtdXN0IE5PVCBoYXZlIG1vcmUgdGhhbiAke2V9IGl0ZW1zYCxcbiAgcGFyYW1zOiAoeyBwYXJhbXM6IHsgbGVuOiBlIH0gfSkgPT4gKDAsIG5uLl8pYHtsaW1pdDogJHtlfX1gXG59LCBvaSA9IHtcbiAga2V5d29yZDogXCJpdGVtc1wiLFxuICB0eXBlOiBcImFycmF5XCIsXG4gIHNjaGVtYVR5cGU6IFtcIm9iamVjdFwiLCBcImJvb2xlYW5cIl0sXG4gIGJlZm9yZTogXCJ1bmlxdWVJdGVtc1wiLFxuICBlcnJvcjogaWksXG4gIGNvZGUoZSkge1xuICAgIGNvbnN0IHsgc2NoZW1hOiByLCBwYXJlbnRTY2hlbWE6IG4sIGl0OiBhIH0gPSBlLCB7IHByZWZpeEl0ZW1zOiBkIH0gPSBuO1xuICAgIGEuaXRlbXMgPSAhMCwgISgwLCBzaS5hbHdheXNWYWxpZFNjaGVtYSkoYSwgcikgJiYgKGQgPyAoMCwgZGkudmFsaWRhdGVBZGRpdGlvbmFsSXRlbXMpKGUsIGQpIDogZS5vaygoMCwgdWkudmFsaWRhdGVBcnJheSkoZSkpKTtcbiAgfVxufTtcbndhLmRlZmF1bHQgPSBvaTtcbnZhciBiYSA9IHt9O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGJhLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogITAgfSk7XG5jb25zdCB6ZSA9IHNlLCBsdCA9IGllLCBjaSA9IHtcbiAgbWVzc2FnZTogKHsgcGFyYW1zOiB7IG1pbjogZSwgbWF4OiByIH0gfSkgPT4gciA9PT0gdm9pZCAwID8gKDAsIHplLnN0cilgbXVzdCBjb250YWluIGF0IGxlYXN0ICR7ZX0gdmFsaWQgaXRlbShzKWAgOiAoMCwgemUuc3RyKWBtdXN0IGNvbnRhaW4gYXQgbGVhc3QgJHtlfSBhbmQgbm8gbW9yZSB0aGFuICR7cn0gdmFsaWQgaXRlbShzKWAsXG4gIHBhcmFtczogKHsgcGFyYW1zOiB7IG1pbjogZSwgbWF4OiByIH0gfSkgPT4gciA9PT0gdm9pZCAwID8gKDAsIHplLl8pYHttaW5Db250YWluczogJHtlfX1gIDogKDAsIHplLl8pYHttaW5Db250YWluczogJHtlfSwgbWF4Q29udGFpbnM6ICR7cn19YFxufSwgbGkgPSB7XG4gIGtleXdvcmQ6IFwiY29udGFpbnNcIixcbiAgdHlwZTogXCJhcnJheVwiLFxuICBzY2hlbWFUeXBlOiBbXCJvYmplY3RcIiwgXCJib29sZWFuXCJdLFxuICBiZWZvcmU6IFwidW5pcXVlSXRlbXNcIixcbiAgdHJhY2tFcnJvcnM6ICEwLFxuICBlcnJvcjogY2ksXG4gIGNvZGUoZSkge1xuICAgIGNvbnN0IHsgZ2VuOiByLCBzY2hlbWE6IG4sIHBhcmVudFNjaGVtYTogYSwgZGF0YTogZCwgaXQ6IG8gfSA9IGU7XG4gICAgbGV0IHAsIHk7XG4gICAgY29uc3QgeyBtaW5Db250YWluczogYiwgbWF4Q29udGFpbnM6IHYgfSA9IGE7XG4gICAgby5vcHRzLm5leHQgPyAocCA9IGIgPT09IHZvaWQgMCA/IDEgOiBiLCB5ID0gdikgOiBwID0gMTtcbiAgICBjb25zdCBnID0gci5jb25zdChcImxlblwiLCAoMCwgemUuXylgJHtkfS5sZW5ndGhgKTtcbiAgICBpZiAoZS5zZXRQYXJhbXMoeyBtaW46IHAsIG1heDogeSB9KSwgeSA9PT0gdm9pZCAwICYmIHAgPT09IDApIHtcbiAgICAgICgwLCBsdC5jaGVja1N0cmljdE1vZGUpKG8sICdcIm1pbkNvbnRhaW5zXCIgPT0gMCB3aXRob3V0IFwibWF4Q29udGFpbnNcIjogXCJjb250YWluc1wiIGtleXdvcmQgaWdub3JlZCcpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoeSAhPT0gdm9pZCAwICYmIHAgPiB5KSB7XG4gICAgICAoMCwgbHQuY2hlY2tTdHJpY3RNb2RlKShvLCAnXCJtaW5Db250YWluc1wiID4gXCJtYXhDb250YWluc1wiIGlzIGFsd2F5cyBpbnZhbGlkJyksIGUuZmFpbCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoKDAsIGx0LmFsd2F5c1ZhbGlkU2NoZW1hKShvLCBuKSkge1xuICAgICAgbGV0IGogPSAoMCwgemUuXylgJHtnfSA+PSAke3B9YDtcbiAgICAgIHkgIT09IHZvaWQgMCAmJiAoaiA9ICgwLCB6ZS5fKWAke2p9ICYmICR7Z30gPD0gJHt5fWApLCBlLnBhc3Moaik7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIG8uaXRlbXMgPSAhMDtcbiAgICBjb25zdCBTID0gci5uYW1lKFwidmFsaWRcIik7XG4gICAgeSA9PT0gdm9pZCAwICYmIHAgPT09IDEgPyBMKFMsICgpID0+IHIuaWYoUywgKCkgPT4gci5icmVhaygpKSkgOiBwID09PSAwID8gKHIubGV0KFMsICEwKSwgeSAhPT0gdm9pZCAwICYmIHIuaWYoKDAsIHplLl8pYCR7ZH0ubGVuZ3RoID4gMGAsIHopKSA6IChyLmxldChTLCAhMSksIHooKSksIGUucmVzdWx0KFMsICgpID0+IGUucmVzZXQoKSk7XG4gICAgZnVuY3Rpb24geigpIHtcbiAgICAgIGNvbnN0IGogPSByLm5hbWUoXCJfdmFsaWRcIiksIFQgPSByLmxldChcImNvdW50XCIsIDApO1xuICAgICAgTChqLCAoKSA9PiByLmlmKGosICgpID0+IFIoVCkpKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gTChqLCBUKSB7XG4gICAgICByLmZvclJhbmdlKFwiaVwiLCAwLCBnLCAoJCkgPT4ge1xuICAgICAgICBlLnN1YnNjaGVtYSh7XG4gICAgICAgICAga2V5d29yZDogXCJjb250YWluc1wiLFxuICAgICAgICAgIGRhdGFQcm9wOiAkLFxuICAgICAgICAgIGRhdGFQcm9wVHlwZTogbHQuVHlwZS5OdW0sXG4gICAgICAgICAgY29tcG9zaXRlUnVsZTogITBcbiAgICAgICAgfSwgaiksIFQoKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICBmdW5jdGlvbiBSKGopIHtcbiAgICAgIHIuY29kZSgoMCwgemUuXylgJHtqfSsrYCksIHkgPT09IHZvaWQgMCA/IHIuaWYoKDAsIHplLl8pYCR7an0gPj0gJHtwfWAsICgpID0+IHIuYXNzaWduKFMsICEwKS5icmVhaygpKSA6IChyLmlmKCgwLCB6ZS5fKWAke2p9ID4gJHt5fWAsICgpID0+IHIuYXNzaWduKFMsICExKS5icmVhaygpKSwgcCA9PT0gMSA/IHIuYXNzaWduKFMsICEwKSA6IHIuaWYoKDAsIHplLl8pYCR7an0gPj0gJHtwfWAsICgpID0+IHIuYXNzaWduKFMsICEwKSkpO1xuICAgIH1cbiAgfVxufTtcbmJhLmRlZmF1bHQgPSBsaTtcbnZhciBlcyA9IHt9O1xuKGZ1bmN0aW9uKGUpIHtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiAhMCB9KSwgZS52YWxpZGF0ZVNjaGVtYURlcHMgPSBlLnZhbGlkYXRlUHJvcGVydHlEZXBzID0gZS5lcnJvciA9IHZvaWQgMDtcbiAgY29uc3QgciA9IHNlLCBuID0gaWUsIGEgPSBuZTtcbiAgZS5lcnJvciA9IHtcbiAgICBtZXNzYWdlOiAoeyBwYXJhbXM6IHsgcHJvcGVydHk6IGIsIGRlcHNDb3VudDogdiwgZGVwczogZyB9IH0pID0+IHtcbiAgICAgIGNvbnN0IFMgPSB2ID09PSAxID8gXCJwcm9wZXJ0eVwiIDogXCJwcm9wZXJ0aWVzXCI7XG4gICAgICByZXR1cm4gKDAsIHIuc3RyKWBtdXN0IGhhdmUgJHtTfSAke2d9IHdoZW4gcHJvcGVydHkgJHtifSBpcyBwcmVzZW50YDtcbiAgICB9LFxuICAgIHBhcmFtczogKHsgcGFyYW1zOiB7IHByb3BlcnR5OiBiLCBkZXBzQ291bnQ6IHYsIGRlcHM6IGcsIG1pc3NpbmdQcm9wZXJ0eTogUyB9IH0pID0+ICgwLCByLl8pYHtwcm9wZXJ0eTogJHtifSxcbiAgICBtaXNzaW5nUHJvcGVydHk6ICR7U30sXG4gICAgZGVwc0NvdW50OiAke3Z9LFxuICAgIGRlcHM6ICR7Z319YFxuICAgIC8vIFRPRE8gY2hhbmdlIHRvIHJlZmVyZW5jZVxuICB9O1xuICBjb25zdCBkID0ge1xuICAgIGtleXdvcmQ6IFwiZGVwZW5kZW5jaWVzXCIsXG4gICAgdHlwZTogXCJvYmplY3RcIixcbiAgICBzY2hlbWFUeXBlOiBcIm9iamVjdFwiLFxuICAgIGVycm9yOiBlLmVycm9yLFxuICAgIGNvZGUoYikge1xuICAgICAgY29uc3QgW3YsIGddID0gbyhiKTtcbiAgICAgIHAoYiwgdiksIHkoYiwgZyk7XG4gICAgfVxuICB9O1xuICBmdW5jdGlvbiBvKHsgc2NoZW1hOiBiIH0pIHtcbiAgICBjb25zdCB2ID0ge30sIGcgPSB7fTtcbiAgICBmb3IgKGNvbnN0IFMgaW4gYikge1xuICAgICAgaWYgKFMgPT09IFwiX19wcm90b19fXCIpXG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgY29uc3QgeiA9IEFycmF5LmlzQXJyYXkoYltTXSkgPyB2IDogZztcbiAgICAgIHpbU10gPSBiW1NdO1xuICAgIH1cbiAgICByZXR1cm4gW3YsIGddO1xuICB9XG4gIGZ1bmN0aW9uIHAoYiwgdiA9IGIuc2NoZW1hKSB7XG4gICAgY29uc3QgeyBnZW46IGcsIGRhdGE6IFMsIGl0OiB6IH0gPSBiO1xuICAgIGlmIChPYmplY3Qua2V5cyh2KS5sZW5ndGggPT09IDApXG4gICAgICByZXR1cm47XG4gICAgY29uc3QgTCA9IGcubGV0KFwibWlzc2luZ1wiKTtcbiAgICBmb3IgKGNvbnN0IFIgaW4gdikge1xuICAgICAgY29uc3QgaiA9IHZbUl07XG4gICAgICBpZiAoai5sZW5ndGggPT09IDApXG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgY29uc3QgVCA9ICgwLCBhLnByb3BlcnR5SW5EYXRhKShnLCBTLCBSLCB6Lm9wdHMub3duUHJvcGVydGllcyk7XG4gICAgICBiLnNldFBhcmFtcyh7XG4gICAgICAgIHByb3BlcnR5OiBSLFxuICAgICAgICBkZXBzQ291bnQ6IGoubGVuZ3RoLFxuICAgICAgICBkZXBzOiBqLmpvaW4oXCIsIFwiKVxuICAgICAgfSksIHouYWxsRXJyb3JzID8gZy5pZihULCAoKSA9PiB7XG4gICAgICAgIGZvciAoY29uc3QgJCBvZiBqKVxuICAgICAgICAgICgwLCBhLmNoZWNrUmVwb3J0TWlzc2luZ1Byb3ApKGIsICQpO1xuICAgICAgfSkgOiAoZy5pZigoMCwgci5fKWAke1R9ICYmICgkeygwLCBhLmNoZWNrTWlzc2luZ1Byb3ApKGIsIGosIEwpfSlgKSwgKDAsIGEucmVwb3J0TWlzc2luZ1Byb3ApKGIsIEwpLCBnLmVsc2UoKSk7XG4gICAgfVxuICB9XG4gIGUudmFsaWRhdGVQcm9wZXJ0eURlcHMgPSBwO1xuICBmdW5jdGlvbiB5KGIsIHYgPSBiLnNjaGVtYSkge1xuICAgIGNvbnN0IHsgZ2VuOiBnLCBkYXRhOiBTLCBrZXl3b3JkOiB6LCBpdDogTCB9ID0gYiwgUiA9IGcubmFtZShcInZhbGlkXCIpO1xuICAgIGZvciAoY29uc3QgaiBpbiB2KVxuICAgICAgKDAsIG4uYWx3YXlzVmFsaWRTY2hlbWEpKEwsIHZbal0pIHx8IChnLmlmKFxuICAgICAgICAoMCwgYS5wcm9wZXJ0eUluRGF0YSkoZywgUywgaiwgTC5vcHRzLm93blByb3BlcnRpZXMpLFxuICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgVCA9IGIuc3Vic2NoZW1hKHsga2V5d29yZDogeiwgc2NoZW1hUHJvcDogaiB9LCBSKTtcbiAgICAgICAgICBiLm1lcmdlVmFsaWRFdmFsdWF0ZWQoVCwgUik7XG4gICAgICAgIH0sXG4gICAgICAgICgpID0+IGcudmFyKFIsICEwKVxuICAgICAgICAvLyBUT0RPIHZhclxuICAgICAgKSwgYi5vayhSKSk7XG4gIH1cbiAgZS52YWxpZGF0ZVNjaGVtYURlcHMgPSB5LCBlLmRlZmF1bHQgPSBkO1xufSkoZXMpO1xudmFyICRhID0ge307XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoJGEsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiAhMCB9KTtcbmNvbnN0IHJzID0gc2UsIGZpID0gaWUsIGhpID0ge1xuICBtZXNzYWdlOiBcInByb3BlcnR5IG5hbWUgbXVzdCBiZSB2YWxpZFwiLFxuICBwYXJhbXM6ICh7IHBhcmFtczogZSB9KSA9PiAoMCwgcnMuXylge3Byb3BlcnR5TmFtZTogJHtlLnByb3BlcnR5TmFtZX19YFxufSwgcGkgPSB7XG4gIGtleXdvcmQ6IFwicHJvcGVydHlOYW1lc1wiLFxuICB0eXBlOiBcIm9iamVjdFwiLFxuICBzY2hlbWFUeXBlOiBbXCJvYmplY3RcIiwgXCJib29sZWFuXCJdLFxuICBlcnJvcjogaGksXG4gIGNvZGUoZSkge1xuICAgIGNvbnN0IHsgZ2VuOiByLCBzY2hlbWE6IG4sIGRhdGE6IGEsIGl0OiBkIH0gPSBlO1xuICAgIGlmICgoMCwgZmkuYWx3YXlzVmFsaWRTY2hlbWEpKGQsIG4pKVxuICAgICAgcmV0dXJuO1xuICAgIGNvbnN0IG8gPSByLm5hbWUoXCJ2YWxpZFwiKTtcbiAgICByLmZvckluKFwia2V5XCIsIGEsIChwKSA9PiB7XG4gICAgICBlLnNldFBhcmFtcyh7IHByb3BlcnR5TmFtZTogcCB9KSwgZS5zdWJzY2hlbWEoe1xuICAgICAgICBrZXl3b3JkOiBcInByb3BlcnR5TmFtZXNcIixcbiAgICAgICAgZGF0YTogcCxcbiAgICAgICAgZGF0YVR5cGVzOiBbXCJzdHJpbmdcIl0sXG4gICAgICAgIHByb3BlcnR5TmFtZTogcCxcbiAgICAgICAgY29tcG9zaXRlUnVsZTogITBcbiAgICAgIH0sIG8pLCByLmlmKCgwLCBycy5ub3QpKG8pLCAoKSA9PiB7XG4gICAgICAgIGUuZXJyb3IoITApLCBkLmFsbEVycm9ycyB8fCByLmJyZWFrKCk7XG4gICAgICB9KTtcbiAgICB9KSwgZS5vayhvKTtcbiAgfVxufTtcbiRhLmRlZmF1bHQgPSBwaTtcbnZhciBJdCA9IHt9O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KEl0LCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogITAgfSk7XG5jb25zdCBmdCA9IG5lLCBGZSA9IHNlLCBtaSA9IFFlLCBodCA9IGllLCBnaSA9IHtcbiAgbWVzc2FnZTogXCJtdXN0IE5PVCBoYXZlIGFkZGl0aW9uYWwgcHJvcGVydGllc1wiLFxuICBwYXJhbXM6ICh7IHBhcmFtczogZSB9KSA9PiAoMCwgRmUuXylge2FkZGl0aW9uYWxQcm9wZXJ0eTogJHtlLmFkZGl0aW9uYWxQcm9wZXJ0eX19YFxufSwgX2kgPSB7XG4gIGtleXdvcmQ6IFwiYWRkaXRpb25hbFByb3BlcnRpZXNcIixcbiAgdHlwZTogW1wib2JqZWN0XCJdLFxuICBzY2hlbWFUeXBlOiBbXCJib29sZWFuXCIsIFwib2JqZWN0XCJdLFxuICBhbGxvd1VuZGVmaW5lZDogITAsXG4gIHRyYWNrRXJyb3JzOiAhMCxcbiAgZXJyb3I6IGdpLFxuICBjb2RlKGUpIHtcbiAgICBjb25zdCB7IGdlbjogciwgc2NoZW1hOiBuLCBwYXJlbnRTY2hlbWE6IGEsIGRhdGE6IGQsIGVycnNDb3VudDogbywgaXQ6IHAgfSA9IGU7XG4gICAgaWYgKCFvKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiYWp2IGltcGxlbWVudGF0aW9uIGVycm9yXCIpO1xuICAgIGNvbnN0IHsgYWxsRXJyb3JzOiB5LCBvcHRzOiBiIH0gPSBwO1xuICAgIGlmIChwLnByb3BzID0gITAsIGIucmVtb3ZlQWRkaXRpb25hbCAhPT0gXCJhbGxcIiAmJiAoMCwgaHQuYWx3YXlzVmFsaWRTY2hlbWEpKHAsIG4pKVxuICAgICAgcmV0dXJuO1xuICAgIGNvbnN0IHYgPSAoMCwgZnQuYWxsU2NoZW1hUHJvcGVydGllcykoYS5wcm9wZXJ0aWVzKSwgZyA9ICgwLCBmdC5hbGxTY2hlbWFQcm9wZXJ0aWVzKShhLnBhdHRlcm5Qcm9wZXJ0aWVzKTtcbiAgICBTKCksIGUub2soKDAsIEZlLl8pYCR7b30gPT09ICR7bWkuZGVmYXVsdC5lcnJvcnN9YCk7XG4gICAgZnVuY3Rpb24gUygpIHtcbiAgICAgIHIuZm9ySW4oXCJrZXlcIiwgZCwgKFQpID0+IHtcbiAgICAgICAgIXYubGVuZ3RoICYmICFnLmxlbmd0aCA/IFIoVCkgOiByLmlmKHooVCksICgpID0+IFIoVCkpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHooVCkge1xuICAgICAgbGV0ICQ7XG4gICAgICBpZiAodi5sZW5ndGggPiA4KSB7XG4gICAgICAgIGNvbnN0IE4gPSAoMCwgaHQuc2NoZW1hUmVmT3JWYWwpKHAsIGEucHJvcGVydGllcywgXCJwcm9wZXJ0aWVzXCIpO1xuICAgICAgICAkID0gKDAsIGZ0LmlzT3duUHJvcGVydHkpKHIsIE4sIFQpO1xuICAgICAgfSBlbHNlXG4gICAgICAgIHYubGVuZ3RoID8gJCA9ICgwLCBGZS5vcikoLi4udi5tYXAoKE4pID0+ICgwLCBGZS5fKWAke1R9ID09PSAke059YCkpIDogJCA9IEZlLm5pbDtcbiAgICAgIHJldHVybiBnLmxlbmd0aCAmJiAoJCA9ICgwLCBGZS5vcikoJCwgLi4uZy5tYXAoKE4pID0+ICgwLCBGZS5fKWAkeygwLCBmdC51c2VQYXR0ZXJuKShlLCBOKX0udGVzdCgke1R9KWApKSksICgwLCBGZS5ub3QpKCQpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBMKFQpIHtcbiAgICAgIHIuY29kZSgoMCwgRmUuXylgZGVsZXRlICR7ZH1bJHtUfV1gKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gUihUKSB7XG4gICAgICBpZiAoYi5yZW1vdmVBZGRpdGlvbmFsID09PSBcImFsbFwiIHx8IGIucmVtb3ZlQWRkaXRpb25hbCAmJiBuID09PSAhMSkge1xuICAgICAgICBMKFQpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAobiA9PT0gITEpIHtcbiAgICAgICAgZS5zZXRQYXJhbXMoeyBhZGRpdGlvbmFsUHJvcGVydHk6IFQgfSksIGUuZXJyb3IoKSwgeSB8fCByLmJyZWFrKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgbiA9PSBcIm9iamVjdFwiICYmICEoMCwgaHQuYWx3YXlzVmFsaWRTY2hlbWEpKHAsIG4pKSB7XG4gICAgICAgIGNvbnN0ICQgPSByLm5hbWUoXCJ2YWxpZFwiKTtcbiAgICAgICAgYi5yZW1vdmVBZGRpdGlvbmFsID09PSBcImZhaWxpbmdcIiA/IChqKFQsICQsICExKSwgci5pZigoMCwgRmUubm90KSgkKSwgKCkgPT4ge1xuICAgICAgICAgIGUucmVzZXQoKSwgTChUKTtcbiAgICAgICAgfSkpIDogKGooVCwgJCksIHkgfHwgci5pZigoMCwgRmUubm90KSgkKSwgKCkgPT4gci5icmVhaygpKSk7XG4gICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGooVCwgJCwgTikge1xuICAgICAgY29uc3QgRCA9IHtcbiAgICAgICAga2V5d29yZDogXCJhZGRpdGlvbmFsUHJvcGVydGllc1wiLFxuICAgICAgICBkYXRhUHJvcDogVCxcbiAgICAgICAgZGF0YVByb3BUeXBlOiBodC5UeXBlLlN0clxuICAgICAgfTtcbiAgICAgIE4gPT09ICExICYmIE9iamVjdC5hc3NpZ24oRCwge1xuICAgICAgICBjb21wb3NpdGVSdWxlOiAhMCxcbiAgICAgICAgY3JlYXRlRXJyb3JzOiAhMSxcbiAgICAgICAgYWxsRXJyb3JzOiAhMVxuICAgICAgfSksIGUuc3Vic2NoZW1hKEQsICQpO1xuICAgIH1cbiAgfVxufTtcbkl0LmRlZmF1bHQgPSBfaTtcbnZhciBFYSA9IHt9O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KEVhLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogITAgfSk7XG5jb25zdCB2aSA9IEhlLCBzbiA9IG5lLCBGdCA9IGllLCB1biA9IEl0LCB5aSA9IHtcbiAga2V5d29yZDogXCJwcm9wZXJ0aWVzXCIsXG4gIHR5cGU6IFwib2JqZWN0XCIsXG4gIHNjaGVtYVR5cGU6IFwib2JqZWN0XCIsXG4gIGNvZGUoZSkge1xuICAgIGNvbnN0IHsgZ2VuOiByLCBzY2hlbWE6IG4sIHBhcmVudFNjaGVtYTogYSwgZGF0YTogZCwgaXQ6IG8gfSA9IGU7XG4gICAgby5vcHRzLnJlbW92ZUFkZGl0aW9uYWwgPT09IFwiYWxsXCIgJiYgYS5hZGRpdGlvbmFsUHJvcGVydGllcyA9PT0gdm9pZCAwICYmIHVuLmRlZmF1bHQuY29kZShuZXcgdmkuS2V5d29yZEN4dChvLCB1bi5kZWZhdWx0LCBcImFkZGl0aW9uYWxQcm9wZXJ0aWVzXCIpKTtcbiAgICBjb25zdCBwID0gKDAsIHNuLmFsbFNjaGVtYVByb3BlcnRpZXMpKG4pO1xuICAgIGZvciAoY29uc3QgUyBvZiBwKVxuICAgICAgby5kZWZpbmVkUHJvcGVydGllcy5hZGQoUyk7XG4gICAgby5vcHRzLnVuZXZhbHVhdGVkICYmIHAubGVuZ3RoICYmIG8ucHJvcHMgIT09ICEwICYmIChvLnByb3BzID0gRnQubWVyZ2VFdmFsdWF0ZWQucHJvcHMociwgKDAsIEZ0LnRvSGFzaCkocCksIG8ucHJvcHMpKTtcbiAgICBjb25zdCB5ID0gcC5maWx0ZXIoKFMpID0+ICEoMCwgRnQuYWx3YXlzVmFsaWRTY2hlbWEpKG8sIG5bU10pKTtcbiAgICBpZiAoeS5sZW5ndGggPT09IDApXG4gICAgICByZXR1cm47XG4gICAgY29uc3QgYiA9IHIubmFtZShcInZhbGlkXCIpO1xuICAgIGZvciAoY29uc3QgUyBvZiB5KVxuICAgICAgdihTKSA/IGcoUykgOiAoci5pZigoMCwgc24ucHJvcGVydHlJbkRhdGEpKHIsIGQsIFMsIG8ub3B0cy5vd25Qcm9wZXJ0aWVzKSksIGcoUyksIG8uYWxsRXJyb3JzIHx8IHIuZWxzZSgpLnZhcihiLCAhMCksIHIuZW5kSWYoKSksIGUuaXQuZGVmaW5lZFByb3BlcnRpZXMuYWRkKFMpLCBlLm9rKGIpO1xuICAgIGZ1bmN0aW9uIHYoUykge1xuICAgICAgcmV0dXJuIG8ub3B0cy51c2VEZWZhdWx0cyAmJiAhby5jb21wb3NpdGVSdWxlICYmIG5bU10uZGVmYXVsdCAhPT0gdm9pZCAwO1xuICAgIH1cbiAgICBmdW5jdGlvbiBnKFMpIHtcbiAgICAgIGUuc3Vic2NoZW1hKHtcbiAgICAgICAga2V5d29yZDogXCJwcm9wZXJ0aWVzXCIsXG4gICAgICAgIHNjaGVtYVByb3A6IFMsXG4gICAgICAgIGRhdGFQcm9wOiBTXG4gICAgICB9LCBiKTtcbiAgICB9XG4gIH1cbn07XG5FYS5kZWZhdWx0ID0geWk7XG52YXIga2EgPSB7fTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShrYSwgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6ICEwIH0pO1xuY29uc3QgZG4gPSBuZSwgcHQgPSBzZSwgb24gPSBpZSwgY24gPSBpZSwgd2kgPSB7XG4gIGtleXdvcmQ6IFwicGF0dGVyblByb3BlcnRpZXNcIixcbiAgdHlwZTogXCJvYmplY3RcIixcbiAgc2NoZW1hVHlwZTogXCJvYmplY3RcIixcbiAgY29kZShlKSB7XG4gICAgY29uc3QgeyBnZW46IHIsIHNjaGVtYTogbiwgZGF0YTogYSwgcGFyZW50U2NoZW1hOiBkLCBpdDogbyB9ID0gZSwgeyBvcHRzOiBwIH0gPSBvLCB5ID0gKDAsIGRuLmFsbFNjaGVtYVByb3BlcnRpZXMpKG4pLCBiID0geS5maWx0ZXIoKGopID0+ICgwLCBvbi5hbHdheXNWYWxpZFNjaGVtYSkobywgbltqXSkpO1xuICAgIGlmICh5Lmxlbmd0aCA9PT0gMCB8fCBiLmxlbmd0aCA9PT0geS5sZW5ndGggJiYgKCFvLm9wdHMudW5ldmFsdWF0ZWQgfHwgby5wcm9wcyA9PT0gITApKVxuICAgICAgcmV0dXJuO1xuICAgIGNvbnN0IHYgPSBwLnN0cmljdFNjaGVtYSAmJiAhcC5hbGxvd01hdGNoaW5nUHJvcGVydGllcyAmJiBkLnByb3BlcnRpZXMsIGcgPSByLm5hbWUoXCJ2YWxpZFwiKTtcbiAgICBvLnByb3BzICE9PSAhMCAmJiAhKG8ucHJvcHMgaW5zdGFuY2VvZiBwdC5OYW1lKSAmJiAoby5wcm9wcyA9ICgwLCBjbi5ldmFsdWF0ZWRQcm9wc1RvTmFtZSkociwgby5wcm9wcykpO1xuICAgIGNvbnN0IHsgcHJvcHM6IFMgfSA9IG87XG4gICAgeigpO1xuICAgIGZ1bmN0aW9uIHooKSB7XG4gICAgICBmb3IgKGNvbnN0IGogb2YgeSlcbiAgICAgICAgdiAmJiBMKGopLCBvLmFsbEVycm9ycyA/IFIoaikgOiAoci52YXIoZywgITApLCBSKGopLCByLmlmKGcpKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gTChqKSB7XG4gICAgICBmb3IgKGNvbnN0IFQgaW4gdilcbiAgICAgICAgbmV3IFJlZ0V4cChqKS50ZXN0KFQpICYmICgwLCBvbi5jaGVja1N0cmljdE1vZGUpKG8sIGBwcm9wZXJ0eSAke1R9IG1hdGNoZXMgcGF0dGVybiAke2p9ICh1c2UgYWxsb3dNYXRjaGluZ1Byb3BlcnRpZXMpYCk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIFIoaikge1xuICAgICAgci5mb3JJbihcImtleVwiLCBhLCAoVCkgPT4ge1xuICAgICAgICByLmlmKCgwLCBwdC5fKWAkeygwLCBkbi51c2VQYXR0ZXJuKShlLCBqKX0udGVzdCgke1R9KWAsICgpID0+IHtcbiAgICAgICAgICBjb25zdCAkID0gYi5pbmNsdWRlcyhqKTtcbiAgICAgICAgICAkIHx8IGUuc3Vic2NoZW1hKHtcbiAgICAgICAgICAgIGtleXdvcmQ6IFwicGF0dGVyblByb3BlcnRpZXNcIixcbiAgICAgICAgICAgIHNjaGVtYVByb3A6IGosXG4gICAgICAgICAgICBkYXRhUHJvcDogVCxcbiAgICAgICAgICAgIGRhdGFQcm9wVHlwZTogY24uVHlwZS5TdHJcbiAgICAgICAgICB9LCBnKSwgby5vcHRzLnVuZXZhbHVhdGVkICYmIFMgIT09ICEwID8gci5hc3NpZ24oKDAsIHB0Ll8pYCR7U31bJHtUfV1gLCAhMCkgOiAhJCAmJiAhby5hbGxFcnJvcnMgJiYgci5pZigoMCwgcHQubm90KShnKSwgKCkgPT4gci5icmVhaygpKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbn07XG5rYS5kZWZhdWx0ID0gd2k7XG52YXIgUGEgPSB7fTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShQYSwgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6ICEwIH0pO1xuY29uc3QgYmkgPSBpZSwgJGkgPSB7XG4gIGtleXdvcmQ6IFwibm90XCIsXG4gIHNjaGVtYVR5cGU6IFtcIm9iamVjdFwiLCBcImJvb2xlYW5cIl0sXG4gIHRyYWNrRXJyb3JzOiAhMCxcbiAgY29kZShlKSB7XG4gICAgY29uc3QgeyBnZW46IHIsIHNjaGVtYTogbiwgaXQ6IGEgfSA9IGU7XG4gICAgaWYgKCgwLCBiaS5hbHdheXNWYWxpZFNjaGVtYSkoYSwgbikpIHtcbiAgICAgIGUuZmFpbCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBkID0gci5uYW1lKFwidmFsaWRcIik7XG4gICAgZS5zdWJzY2hlbWEoe1xuICAgICAga2V5d29yZDogXCJub3RcIixcbiAgICAgIGNvbXBvc2l0ZVJ1bGU6ICEwLFxuICAgICAgY3JlYXRlRXJyb3JzOiAhMSxcbiAgICAgIGFsbEVycm9yczogITFcbiAgICB9LCBkKSwgZS5mYWlsUmVzdWx0KGQsICgpID0+IGUucmVzZXQoKSwgKCkgPT4gZS5lcnJvcigpKTtcbiAgfSxcbiAgZXJyb3I6IHsgbWVzc2FnZTogXCJtdXN0IE5PVCBiZSB2YWxpZFwiIH1cbn07XG5QYS5kZWZhdWx0ID0gJGk7XG52YXIgU2EgPSB7fTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShTYSwgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6ICEwIH0pO1xuY29uc3QgRWkgPSBuZSwga2kgPSB7XG4gIGtleXdvcmQ6IFwiYW55T2ZcIixcbiAgc2NoZW1hVHlwZTogXCJhcnJheVwiLFxuICB0cmFja0Vycm9yczogITAsXG4gIGNvZGU6IEVpLnZhbGlkYXRlVW5pb24sXG4gIGVycm9yOiB7IG1lc3NhZ2U6IFwibXVzdCBtYXRjaCBhIHNjaGVtYSBpbiBhbnlPZlwiIH1cbn07XG5TYS5kZWZhdWx0ID0ga2k7XG52YXIgQ2EgPSB7fTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShDYSwgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6ICEwIH0pO1xuY29uc3QgdnQgPSBzZSwgUGkgPSBpZSwgU2kgPSB7XG4gIG1lc3NhZ2U6IFwibXVzdCBtYXRjaCBleGFjdGx5IG9uZSBzY2hlbWEgaW4gb25lT2ZcIixcbiAgcGFyYW1zOiAoeyBwYXJhbXM6IGUgfSkgPT4gKDAsIHZ0Ll8pYHtwYXNzaW5nU2NoZW1hczogJHtlLnBhc3Npbmd9fWBcbn0sIENpID0ge1xuICBrZXl3b3JkOiBcIm9uZU9mXCIsXG4gIHNjaGVtYVR5cGU6IFwiYXJyYXlcIixcbiAgdHJhY2tFcnJvcnM6ICEwLFxuICBlcnJvcjogU2ksXG4gIGNvZGUoZSkge1xuICAgIGNvbnN0IHsgZ2VuOiByLCBzY2hlbWE6IG4sIHBhcmVudFNjaGVtYTogYSwgaXQ6IGQgfSA9IGU7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KG4pKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiYWp2IGltcGxlbWVudGF0aW9uIGVycm9yXCIpO1xuICAgIGlmIChkLm9wdHMuZGlzY3JpbWluYXRvciAmJiBhLmRpc2NyaW1pbmF0b3IpXG4gICAgICByZXR1cm47XG4gICAgY29uc3QgbyA9IG4sIHAgPSByLmxldChcInZhbGlkXCIsICExKSwgeSA9IHIubGV0KFwicGFzc2luZ1wiLCBudWxsKSwgYiA9IHIubmFtZShcIl92YWxpZFwiKTtcbiAgICBlLnNldFBhcmFtcyh7IHBhc3Npbmc6IHkgfSksIHIuYmxvY2sodiksIGUucmVzdWx0KHAsICgpID0+IGUucmVzZXQoKSwgKCkgPT4gZS5lcnJvcighMCkpO1xuICAgIGZ1bmN0aW9uIHYoKSB7XG4gICAgICBvLmZvckVhY2goKGcsIFMpID0+IHtcbiAgICAgICAgbGV0IHo7XG4gICAgICAgICgwLCBQaS5hbHdheXNWYWxpZFNjaGVtYSkoZCwgZykgPyByLnZhcihiLCAhMCkgOiB6ID0gZS5zdWJzY2hlbWEoe1xuICAgICAgICAgIGtleXdvcmQ6IFwib25lT2ZcIixcbiAgICAgICAgICBzY2hlbWFQcm9wOiBTLFxuICAgICAgICAgIGNvbXBvc2l0ZVJ1bGU6ICEwXG4gICAgICAgIH0sIGIpLCBTID4gMCAmJiByLmlmKCgwLCB2dC5fKWAke2J9ICYmICR7cH1gKS5hc3NpZ24ocCwgITEpLmFzc2lnbih5LCAoMCwgdnQuXylgWyR7eX0sICR7U31dYCkuZWxzZSgpLCByLmlmKGIsICgpID0+IHtcbiAgICAgICAgICByLmFzc2lnbihwLCAhMCksIHIuYXNzaWduKHksIFMpLCB6ICYmIGUubWVyZ2VFdmFsdWF0ZWQoeiwgdnQuTmFtZSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG59O1xuQ2EuZGVmYXVsdCA9IENpO1xudmFyIFRhID0ge307XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoVGEsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiAhMCB9KTtcbmNvbnN0IFRpID0gaWUsIGppID0ge1xuICBrZXl3b3JkOiBcImFsbE9mXCIsXG4gIHNjaGVtYVR5cGU6IFwiYXJyYXlcIixcbiAgY29kZShlKSB7XG4gICAgY29uc3QgeyBnZW46IHIsIHNjaGVtYTogbiwgaXQ6IGEgfSA9IGU7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KG4pKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiYWp2IGltcGxlbWVudGF0aW9uIGVycm9yXCIpO1xuICAgIGNvbnN0IGQgPSByLm5hbWUoXCJ2YWxpZFwiKTtcbiAgICBuLmZvckVhY2goKG8sIHApID0+IHtcbiAgICAgIGlmICgoMCwgVGkuYWx3YXlzVmFsaWRTY2hlbWEpKGEsIG8pKVxuICAgICAgICByZXR1cm47XG4gICAgICBjb25zdCB5ID0gZS5zdWJzY2hlbWEoeyBrZXl3b3JkOiBcImFsbE9mXCIsIHNjaGVtYVByb3A6IHAgfSwgZCk7XG4gICAgICBlLm9rKGQpLCBlLm1lcmdlRXZhbHVhdGVkKHkpO1xuICAgIH0pO1xuICB9XG59O1xuVGEuZGVmYXVsdCA9IGppO1xudmFyIGphID0ge307XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoamEsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiAhMCB9KTtcbmNvbnN0IFN0ID0gc2UsIHRzID0gaWUsIE5pID0ge1xuICBtZXNzYWdlOiAoeyBwYXJhbXM6IGUgfSkgPT4gKDAsIFN0LnN0cilgbXVzdCBtYXRjaCBcIiR7ZS5pZkNsYXVzZX1cIiBzY2hlbWFgLFxuICBwYXJhbXM6ICh7IHBhcmFtczogZSB9KSA9PiAoMCwgU3QuXylge2ZhaWxpbmdLZXl3b3JkOiAke2UuaWZDbGF1c2V9fWBcbn0sIE9pID0ge1xuICBrZXl3b3JkOiBcImlmXCIsXG4gIHNjaGVtYVR5cGU6IFtcIm9iamVjdFwiLCBcImJvb2xlYW5cIl0sXG4gIHRyYWNrRXJyb3JzOiAhMCxcbiAgZXJyb3I6IE5pLFxuICBjb2RlKGUpIHtcbiAgICBjb25zdCB7IGdlbjogciwgcGFyZW50U2NoZW1hOiBuLCBpdDogYSB9ID0gZTtcbiAgICBuLnRoZW4gPT09IHZvaWQgMCAmJiBuLmVsc2UgPT09IHZvaWQgMCAmJiAoMCwgdHMuY2hlY2tTdHJpY3RNb2RlKShhLCAnXCJpZlwiIHdpdGhvdXQgXCJ0aGVuXCIgYW5kIFwiZWxzZVwiIGlzIGlnbm9yZWQnKTtcbiAgICBjb25zdCBkID0gbG4oYSwgXCJ0aGVuXCIpLCBvID0gbG4oYSwgXCJlbHNlXCIpO1xuICAgIGlmICghZCAmJiAhbylcbiAgICAgIHJldHVybjtcbiAgICBjb25zdCBwID0gci5sZXQoXCJ2YWxpZFwiLCAhMCksIHkgPSByLm5hbWUoXCJfdmFsaWRcIik7XG4gICAgaWYgKGIoKSwgZS5yZXNldCgpLCBkICYmIG8pIHtcbiAgICAgIGNvbnN0IGcgPSByLmxldChcImlmQ2xhdXNlXCIpO1xuICAgICAgZS5zZXRQYXJhbXMoeyBpZkNsYXVzZTogZyB9KSwgci5pZih5LCB2KFwidGhlblwiLCBnKSwgdihcImVsc2VcIiwgZykpO1xuICAgIH0gZWxzZVxuICAgICAgZCA/IHIuaWYoeSwgdihcInRoZW5cIikpIDogci5pZigoMCwgU3Qubm90KSh5KSwgdihcImVsc2VcIikpO1xuICAgIGUucGFzcyhwLCAoKSA9PiBlLmVycm9yKCEwKSk7XG4gICAgZnVuY3Rpb24gYigpIHtcbiAgICAgIGNvbnN0IGcgPSBlLnN1YnNjaGVtYSh7XG4gICAgICAgIGtleXdvcmQ6IFwiaWZcIixcbiAgICAgICAgY29tcG9zaXRlUnVsZTogITAsXG4gICAgICAgIGNyZWF0ZUVycm9yczogITEsXG4gICAgICAgIGFsbEVycm9yczogITFcbiAgICAgIH0sIHkpO1xuICAgICAgZS5tZXJnZUV2YWx1YXRlZChnKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gdihnLCBTKSB7XG4gICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICBjb25zdCB6ID0gZS5zdWJzY2hlbWEoeyBrZXl3b3JkOiBnIH0sIHkpO1xuICAgICAgICByLmFzc2lnbihwLCB5KSwgZS5tZXJnZVZhbGlkRXZhbHVhdGVkKHosIHApLCBTID8gci5hc3NpZ24oUywgKDAsIFN0Ll8pYCR7Z31gKSA6IGUuc2V0UGFyYW1zKHsgaWZDbGF1c2U6IGcgfSk7XG4gICAgICB9O1xuICAgIH1cbiAgfVxufTtcbmZ1bmN0aW9uIGxuKGUsIHIpIHtcbiAgY29uc3QgbiA9IGUuc2NoZW1hW3JdO1xuICByZXR1cm4gbiAhPT0gdm9pZCAwICYmICEoMCwgdHMuYWx3YXlzVmFsaWRTY2hlbWEpKGUsIG4pO1xufVxuamEuZGVmYXVsdCA9IE9pO1xudmFyIE5hID0ge307XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoTmEsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiAhMCB9KTtcbmNvbnN0IFJpID0gaWUsIEFpID0ge1xuICBrZXl3b3JkOiBbXCJ0aGVuXCIsIFwiZWxzZVwiXSxcbiAgc2NoZW1hVHlwZTogW1wib2JqZWN0XCIsIFwiYm9vbGVhblwiXSxcbiAgY29kZSh7IGtleXdvcmQ6IGUsIHBhcmVudFNjaGVtYTogciwgaXQ6IG4gfSkge1xuICAgIHIuaWYgPT09IHZvaWQgMCAmJiAoMCwgUmkuY2hlY2tTdHJpY3RNb2RlKShuLCBgXCIke2V9XCIgd2l0aG91dCBcImlmXCIgaXMgaWdub3JlZGApO1xuICB9XG59O1xuTmEuZGVmYXVsdCA9IEFpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KHZhLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogITAgfSk7XG5jb25zdCBJaSA9IE1yLCBNaSA9IHlhLCBEaSA9IERyLCBMaSA9IHdhLCB6aSA9IGJhLCBWaSA9IGVzLCBGaSA9ICRhLCBVaSA9IEl0LCBCaSA9IEVhLCBIaSA9IGthLCBxaSA9IFBhLCBHaSA9IFNhLCBLaSA9IENhLCBXaSA9IFRhLCBKaSA9IGphLCBaaSA9IE5hO1xuZnVuY3Rpb24gWWkoZSA9ICExKSB7XG4gIGNvbnN0IHIgPSBbXG4gICAgLy8gYW55XG4gICAgcWkuZGVmYXVsdCxcbiAgICBHaS5kZWZhdWx0LFxuICAgIEtpLmRlZmF1bHQsXG4gICAgV2kuZGVmYXVsdCxcbiAgICBKaS5kZWZhdWx0LFxuICAgIFppLmRlZmF1bHQsXG4gICAgLy8gb2JqZWN0XG4gICAgRmkuZGVmYXVsdCxcbiAgICBVaS5kZWZhdWx0LFxuICAgIFZpLmRlZmF1bHQsXG4gICAgQmkuZGVmYXVsdCxcbiAgICBIaS5kZWZhdWx0XG4gIF07XG4gIHJldHVybiBlID8gci5wdXNoKE1pLmRlZmF1bHQsIExpLmRlZmF1bHQpIDogci5wdXNoKElpLmRlZmF1bHQsIERpLmRlZmF1bHQpLCByLnB1c2goemkuZGVmYXVsdCksIHI7XG59XG52YS5kZWZhdWx0ID0gWWk7XG52YXIgT2EgPSB7fSwgUmEgPSB7fTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShSYSwgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6ICEwIH0pO1xuY29uc3QgeWUgPSBzZSwgWGkgPSB7XG4gIG1lc3NhZ2U6ICh7IHNjaGVtYUNvZGU6IGUgfSkgPT4gKDAsIHllLnN0cilgbXVzdCBtYXRjaCBmb3JtYXQgXCIke2V9XCJgLFxuICBwYXJhbXM6ICh7IHNjaGVtYUNvZGU6IGUgfSkgPT4gKDAsIHllLl8pYHtmb3JtYXQ6ICR7ZX19YFxufSwgUWkgPSB7XG4gIGtleXdvcmQ6IFwiZm9ybWF0XCIsXG4gIHR5cGU6IFtcIm51bWJlclwiLCBcInN0cmluZ1wiXSxcbiAgc2NoZW1hVHlwZTogXCJzdHJpbmdcIixcbiAgJGRhdGE6ICEwLFxuICBlcnJvcjogWGksXG4gIGNvZGUoZSwgcikge1xuICAgIGNvbnN0IHsgZ2VuOiBuLCBkYXRhOiBhLCAkZGF0YTogZCwgc2NoZW1hOiBvLCBzY2hlbWFDb2RlOiBwLCBpdDogeSB9ID0gZSwgeyBvcHRzOiBiLCBlcnJTY2hlbWFQYXRoOiB2LCBzY2hlbWFFbnY6IGcsIHNlbGY6IFMgfSA9IHk7XG4gICAgaWYgKCFiLnZhbGlkYXRlRm9ybWF0cylcbiAgICAgIHJldHVybjtcbiAgICBkID8geigpIDogTCgpO1xuICAgIGZ1bmN0aW9uIHooKSB7XG4gICAgICBjb25zdCBSID0gbi5zY29wZVZhbHVlKFwiZm9ybWF0c1wiLCB7XG4gICAgICAgIHJlZjogUy5mb3JtYXRzLFxuICAgICAgICBjb2RlOiBiLmNvZGUuZm9ybWF0c1xuICAgICAgfSksIGogPSBuLmNvbnN0KFwiZkRlZlwiLCAoMCwgeWUuXylgJHtSfVske3B9XWApLCBUID0gbi5sZXQoXCJmVHlwZVwiKSwgJCA9IG4ubGV0KFwiZm9ybWF0XCIpO1xuICAgICAgbi5pZigoMCwgeWUuXylgdHlwZW9mICR7an0gPT0gXCJvYmplY3RcIiAmJiAhKCR7an0gaW5zdGFuY2VvZiBSZWdFeHApYCwgKCkgPT4gbi5hc3NpZ24oVCwgKDAsIHllLl8pYCR7an0udHlwZSB8fCBcInN0cmluZ1wiYCkuYXNzaWduKCQsICgwLCB5ZS5fKWAke2p9LnZhbGlkYXRlYCksICgpID0+IG4uYXNzaWduKFQsICgwLCB5ZS5fKWBcInN0cmluZ1wiYCkuYXNzaWduKCQsIGopKSwgZS5mYWlsJGRhdGEoKDAsIHllLm9yKShOKCksIEQoKSkpO1xuICAgICAgZnVuY3Rpb24gTigpIHtcbiAgICAgICAgcmV0dXJuIGIuc3RyaWN0U2NoZW1hID09PSAhMSA/IHllLm5pbCA6ICgwLCB5ZS5fKWAke3B9ICYmICEkeyR9YDtcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIEQoKSB7XG4gICAgICAgIGNvbnN0IHQgPSBnLiRhc3luYyA/ICgwLCB5ZS5fKWAoJHtqfS5hc3luYyA/IGF3YWl0ICR7JH0oJHthfSkgOiAkeyR9KCR7YX0pKWAgOiAoMCwgeWUuXylgJHskfSgke2F9KWAsIHUgPSAoMCwgeWUuXylgKHR5cGVvZiAkeyR9ID09IFwiZnVuY3Rpb25cIiA/ICR7dH0gOiAkeyR9LnRlc3QoJHthfSkpYDtcbiAgICAgICAgcmV0dXJuICgwLCB5ZS5fKWAkeyR9ICYmICR7JH0gIT09IHRydWUgJiYgJHtUfSA9PT0gJHtyfSAmJiAhJHt1fWA7XG4gICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIEwoKSB7XG4gICAgICBjb25zdCBSID0gUy5mb3JtYXRzW29dO1xuICAgICAgaWYgKCFSKSB7XG4gICAgICAgIE4oKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKFIgPT09ICEwKVxuICAgICAgICByZXR1cm47XG4gICAgICBjb25zdCBbaiwgVCwgJF0gPSBEKFIpO1xuICAgICAgaiA9PT0gciAmJiBlLnBhc3ModCgpKTtcbiAgICAgIGZ1bmN0aW9uIE4oKSB7XG4gICAgICAgIGlmIChiLnN0cmljdFNjaGVtYSA9PT0gITEpIHtcbiAgICAgICAgICBTLmxvZ2dlci53YXJuKHUoKSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IG5ldyBFcnJvcih1KCkpO1xuICAgICAgICBmdW5jdGlvbiB1KCkge1xuICAgICAgICAgIHJldHVybiBgdW5rbm93biBmb3JtYXQgXCIke299XCIgaWdub3JlZCBpbiBzY2hlbWEgYXQgcGF0aCBcIiR7dn1cImA7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIEQodSkge1xuICAgICAgICBjb25zdCBzID0gdSBpbnN0YW5jZW9mIFJlZ0V4cCA/ICgwLCB5ZS5yZWdleHBDb2RlKSh1KSA6IGIuY29kZS5mb3JtYXRzID8gKDAsIHllLl8pYCR7Yi5jb2RlLmZvcm1hdHN9JHsoMCwgeWUuZ2V0UHJvcGVydHkpKG8pfWAgOiB2b2lkIDAsIGkgPSBuLnNjb3BlVmFsdWUoXCJmb3JtYXRzXCIsIHsga2V5OiBvLCByZWY6IHUsIGNvZGU6IHMgfSk7XG4gICAgICAgIHJldHVybiB0eXBlb2YgdSA9PSBcIm9iamVjdFwiICYmICEodSBpbnN0YW5jZW9mIFJlZ0V4cCkgPyBbdS50eXBlIHx8IFwic3RyaW5nXCIsIHUudmFsaWRhdGUsICgwLCB5ZS5fKWAke2l9LnZhbGlkYXRlYF0gOiBbXCJzdHJpbmdcIiwgdSwgaV07XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiB0KCkge1xuICAgICAgICBpZiAodHlwZW9mIFIgPT0gXCJvYmplY3RcIiAmJiAhKFIgaW5zdGFuY2VvZiBSZWdFeHApICYmIFIuYXN5bmMpIHtcbiAgICAgICAgICBpZiAoIWcuJGFzeW5jKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiYXN5bmMgZm9ybWF0IGluIHN5bmMgc2NoZW1hXCIpO1xuICAgICAgICAgIHJldHVybiAoMCwgeWUuXylgYXdhaXQgJHskfSgke2F9KWA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHR5cGVvZiBUID09IFwiZnVuY3Rpb25cIiA/ICgwLCB5ZS5fKWAkeyR9KCR7YX0pYCA6ICgwLCB5ZS5fKWAkeyR9LnRlc3QoJHthfSlgO1xuICAgICAgfVxuICAgIH1cbiAgfVxufTtcblJhLmRlZmF1bHQgPSBRaTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShPYSwgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6ICEwIH0pO1xuY29uc3QgeGkgPSBSYSwgZW8gPSBbeGkuZGVmYXVsdF07XG5PYS5kZWZhdWx0ID0gZW87XG52YXIgSXIgPSB7fTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShJciwgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6ICEwIH0pO1xuSXIuY29udGVudFZvY2FidWxhcnkgPSBJci5tZXRhZGF0YVZvY2FidWxhcnkgPSB2b2lkIDA7XG5Jci5tZXRhZGF0YVZvY2FidWxhcnkgPSBbXG4gIFwidGl0bGVcIixcbiAgXCJkZXNjcmlwdGlvblwiLFxuICBcImRlZmF1bHRcIixcbiAgXCJkZXByZWNhdGVkXCIsXG4gIFwicmVhZE9ubHlcIixcbiAgXCJ3cml0ZU9ubHlcIixcbiAgXCJleGFtcGxlc1wiXG5dO1xuSXIuY29udGVudFZvY2FidWxhcnkgPSBbXG4gIFwiY29udGVudE1lZGlhVHlwZVwiLFxuICBcImNvbnRlbnRFbmNvZGluZ1wiLFxuICBcImNvbnRlbnRTY2hlbWFcIlxuXTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShhYSwgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6ICEwIH0pO1xuY29uc3Qgcm8gPSBuYSwgdG8gPSB1YSwgYW8gPSB2YSwgbm8gPSBPYSwgZm4gPSBJciwgc28gPSBbXG4gIHJvLmRlZmF1bHQsXG4gIHRvLmRlZmF1bHQsXG4gICgwLCBhby5kZWZhdWx0KSgpLFxuICBuby5kZWZhdWx0LFxuICBmbi5tZXRhZGF0YVZvY2FidWxhcnksXG4gIGZuLmNvbnRlbnRWb2NhYnVsYXJ5XG5dO1xuYWEuZGVmYXVsdCA9IHNvO1xudmFyIEFhID0ge30sIGFzID0ge307XG4oZnVuY3Rpb24oZSkge1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6ICEwIH0pLCBlLkRpc2NyRXJyb3IgPSB2b2lkIDAsIGZ1bmN0aW9uKHIpIHtcbiAgICByLlRhZyA9IFwidGFnXCIsIHIuTWFwcGluZyA9IFwibWFwcGluZ1wiO1xuICB9KGUuRGlzY3JFcnJvciB8fCAoZS5EaXNjckVycm9yID0ge30pKTtcbn0pKGFzKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShBYSwgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6ICEwIH0pO1xuY29uc3QgVHIgPSBzZSwgV3QgPSBhcywgaG4gPSBBZSwgdW8gPSBpZSwgaW8gPSB7XG4gIG1lc3NhZ2U6ICh7IHBhcmFtczogeyBkaXNjckVycm9yOiBlLCB0YWdOYW1lOiByIH0gfSkgPT4gZSA9PT0gV3QuRGlzY3JFcnJvci5UYWcgPyBgdGFnIFwiJHtyfVwiIG11c3QgYmUgc3RyaW5nYCA6IGB2YWx1ZSBvZiB0YWcgXCIke3J9XCIgbXVzdCBiZSBpbiBvbmVPZmAsXG4gIHBhcmFtczogKHsgcGFyYW1zOiB7IGRpc2NyRXJyb3I6IGUsIHRhZzogciwgdGFnTmFtZTogbiB9IH0pID0+ICgwLCBUci5fKWB7ZXJyb3I6ICR7ZX0sIHRhZzogJHtufSwgdGFnVmFsdWU6ICR7cn19YFxufSwgb28gPSB7XG4gIGtleXdvcmQ6IFwiZGlzY3JpbWluYXRvclwiLFxuICB0eXBlOiBcIm9iamVjdFwiLFxuICBzY2hlbWFUeXBlOiBcIm9iamVjdFwiLFxuICBlcnJvcjogaW8sXG4gIGNvZGUoZSkge1xuICAgIGNvbnN0IHsgZ2VuOiByLCBkYXRhOiBuLCBzY2hlbWE6IGEsIHBhcmVudFNjaGVtYTogZCwgaXQ6IG8gfSA9IGUsIHsgb25lT2Y6IHAgfSA9IGQ7XG4gICAgaWYgKCFvLm9wdHMuZGlzY3JpbWluYXRvcilcbiAgICAgIHRocm93IG5ldyBFcnJvcihcImRpc2NyaW1pbmF0b3I6IHJlcXVpcmVzIGRpc2NyaW1pbmF0b3Igb3B0aW9uXCIpO1xuICAgIGNvbnN0IHkgPSBhLnByb3BlcnR5TmFtZTtcbiAgICBpZiAodHlwZW9mIHkgIT0gXCJzdHJpbmdcIilcbiAgICAgIHRocm93IG5ldyBFcnJvcihcImRpc2NyaW1pbmF0b3I6IHJlcXVpcmVzIHByb3BlcnR5TmFtZVwiKTtcbiAgICBpZiAoYS5tYXBwaW5nKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiZGlzY3JpbWluYXRvcjogbWFwcGluZyBpcyBub3Qgc3VwcG9ydGVkXCIpO1xuICAgIGlmICghcClcbiAgICAgIHRocm93IG5ldyBFcnJvcihcImRpc2NyaW1pbmF0b3I6IHJlcXVpcmVzIG9uZU9mIGtleXdvcmRcIik7XG4gICAgY29uc3QgYiA9IHIubGV0KFwidmFsaWRcIiwgITEpLCB2ID0gci5jb25zdChcInRhZ1wiLCAoMCwgVHIuXylgJHtufSR7KDAsIFRyLmdldFByb3BlcnR5KSh5KX1gKTtcbiAgICByLmlmKCgwLCBUci5fKWB0eXBlb2YgJHt2fSA9PSBcInN0cmluZ1wiYCwgKCkgPT4gZygpLCAoKSA9PiBlLmVycm9yKCExLCB7IGRpc2NyRXJyb3I6IFd0LkRpc2NyRXJyb3IuVGFnLCB0YWc6IHYsIHRhZ05hbWU6IHkgfSkpLCBlLm9rKGIpO1xuICAgIGZ1bmN0aW9uIGcoKSB7XG4gICAgICBjb25zdCBMID0geigpO1xuICAgICAgci5pZighMSk7XG4gICAgICBmb3IgKGNvbnN0IFIgaW4gTClcbiAgICAgICAgci5lbHNlSWYoKDAsIFRyLl8pYCR7dn0gPT09ICR7Un1gKSwgci5hc3NpZ24oYiwgUyhMW1JdKSk7XG4gICAgICByLmVsc2UoKSwgZS5lcnJvcighMSwgeyBkaXNjckVycm9yOiBXdC5EaXNjckVycm9yLk1hcHBpbmcsIHRhZzogdiwgdGFnTmFtZTogeSB9KSwgci5lbmRJZigpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBTKEwpIHtcbiAgICAgIGNvbnN0IFIgPSByLm5hbWUoXCJ2YWxpZFwiKSwgaiA9IGUuc3Vic2NoZW1hKHsga2V5d29yZDogXCJvbmVPZlwiLCBzY2hlbWFQcm9wOiBMIH0sIFIpO1xuICAgICAgcmV0dXJuIGUubWVyZ2VFdmFsdWF0ZWQoaiwgVHIuTmFtZSksIFI7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHooKSB7XG4gICAgICB2YXIgTDtcbiAgICAgIGNvbnN0IFIgPSB7fSwgaiA9ICQoZCk7XG4gICAgICBsZXQgVCA9ICEwO1xuICAgICAgZm9yIChsZXQgdCA9IDA7IHQgPCBwLmxlbmd0aDsgdCsrKSB7XG4gICAgICAgIGxldCB1ID0gcFt0XTtcbiAgICAgICAgdSAhPSBudWxsICYmIHUuJHJlZiAmJiAhKDAsIHVvLnNjaGVtYUhhc1J1bGVzQnV0UmVmKSh1LCBvLnNlbGYuUlVMRVMpICYmICh1ID0gaG4ucmVzb2x2ZVJlZi5jYWxsKG8uc2VsZiwgby5zY2hlbWFFbnYucm9vdCwgby5iYXNlSWQsIHUgPT0gbnVsbCA/IHZvaWQgMCA6IHUuJHJlZiksIHUgaW5zdGFuY2VvZiBobi5TY2hlbWFFbnYgJiYgKHUgPSB1LnNjaGVtYSkpO1xuICAgICAgICBjb25zdCBzID0gKEwgPSB1ID09IG51bGwgPyB2b2lkIDAgOiB1LnByb3BlcnRpZXMpID09PSBudWxsIHx8IEwgPT09IHZvaWQgMCA/IHZvaWQgMCA6IExbeV07XG4gICAgICAgIGlmICh0eXBlb2YgcyAhPSBcIm9iamVjdFwiKVxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgZGlzY3JpbWluYXRvcjogb25lT2Ygc3Vic2NoZW1hcyAob3IgcmVmZXJlbmNlZCBzY2hlbWFzKSBtdXN0IGhhdmUgXCJwcm9wZXJ0aWVzLyR7eX1cImApO1xuICAgICAgICBUID0gVCAmJiAoaiB8fCAkKHUpKSwgTihzLCB0KTtcbiAgICAgIH1cbiAgICAgIGlmICghVClcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBkaXNjcmltaW5hdG9yOiBcIiR7eX1cIiBtdXN0IGJlIHJlcXVpcmVkYCk7XG4gICAgICByZXR1cm4gUjtcbiAgICAgIGZ1bmN0aW9uICQoeyByZXF1aXJlZDogdCB9KSB7XG4gICAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KHQpICYmIHQuaW5jbHVkZXMoeSk7XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBOKHQsIHUpIHtcbiAgICAgICAgaWYgKHQuY29uc3QpXG4gICAgICAgICAgRCh0LmNvbnN0LCB1KTtcbiAgICAgICAgZWxzZSBpZiAodC5lbnVtKVxuICAgICAgICAgIGZvciAoY29uc3QgcyBvZiB0LmVudW0pXG4gICAgICAgICAgICBEKHMsIHUpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBkaXNjcmltaW5hdG9yOiBcInByb3BlcnRpZXMvJHt5fVwiIG11c3QgaGF2ZSBcImNvbnN0XCIgb3IgXCJlbnVtXCJgKTtcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIEQodCwgdSkge1xuICAgICAgICBpZiAodHlwZW9mIHQgIT0gXCJzdHJpbmdcIiB8fCB0IGluIFIpXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBkaXNjcmltaW5hdG9yOiBcIiR7eX1cIiB2YWx1ZXMgbXVzdCBiZSB1bmlxdWUgc3RyaW5nc2ApO1xuICAgICAgICBSW3RdID0gdTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn07XG5BYS5kZWZhdWx0ID0gb287XG5jb25zdCBjbyA9IFwiaHR0cDovL2pzb24tc2NoZW1hLm9yZy9kcmFmdC0wNy9zY2hlbWEjXCIsIGxvID0gXCJodHRwOi8vanNvbi1zY2hlbWEub3JnL2RyYWZ0LTA3L3NjaGVtYSNcIiwgZm8gPSBcIkNvcmUgc2NoZW1hIG1ldGEtc2NoZW1hXCIsIGhvID0ge1xuICBzY2hlbWFBcnJheToge1xuICAgIHR5cGU6IFwiYXJyYXlcIixcbiAgICBtaW5JdGVtczogMSxcbiAgICBpdGVtczoge1xuICAgICAgJHJlZjogXCIjXCJcbiAgICB9XG4gIH0sXG4gIG5vbk5lZ2F0aXZlSW50ZWdlcjoge1xuICAgIHR5cGU6IFwiaW50ZWdlclwiLFxuICAgIG1pbmltdW06IDBcbiAgfSxcbiAgbm9uTmVnYXRpdmVJbnRlZ2VyRGVmYXVsdDA6IHtcbiAgICBhbGxPZjogW1xuICAgICAge1xuICAgICAgICAkcmVmOiBcIiMvZGVmaW5pdGlvbnMvbm9uTmVnYXRpdmVJbnRlZ2VyXCJcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGRlZmF1bHQ6IDBcbiAgICAgIH1cbiAgICBdXG4gIH0sXG4gIHNpbXBsZVR5cGVzOiB7XG4gICAgZW51bTogW1xuICAgICAgXCJhcnJheVwiLFxuICAgICAgXCJib29sZWFuXCIsXG4gICAgICBcImludGVnZXJcIixcbiAgICAgIFwibnVsbFwiLFxuICAgICAgXCJudW1iZXJcIixcbiAgICAgIFwib2JqZWN0XCIsXG4gICAgICBcInN0cmluZ1wiXG4gICAgXVxuICB9LFxuICBzdHJpbmdBcnJheToge1xuICAgIHR5cGU6IFwiYXJyYXlcIixcbiAgICBpdGVtczoge1xuICAgICAgdHlwZTogXCJzdHJpbmdcIlxuICAgIH0sXG4gICAgdW5pcXVlSXRlbXM6ICEwLFxuICAgIGRlZmF1bHQ6IFtdXG4gIH1cbn0sIHBvID0gW1xuICBcIm9iamVjdFwiLFxuICBcImJvb2xlYW5cIlxuXSwgbW8gPSB7XG4gICRpZDoge1xuICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgZm9ybWF0OiBcInVyaS1yZWZlcmVuY2VcIlxuICB9LFxuICAkc2NoZW1hOiB7XG4gICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICBmb3JtYXQ6IFwidXJpXCJcbiAgfSxcbiAgJHJlZjoge1xuICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgZm9ybWF0OiBcInVyaS1yZWZlcmVuY2VcIlxuICB9LFxuICAkY29tbWVudDoge1xuICAgIHR5cGU6IFwic3RyaW5nXCJcbiAgfSxcbiAgdGl0bGU6IHtcbiAgICB0eXBlOiBcInN0cmluZ1wiXG4gIH0sXG4gIGRlc2NyaXB0aW9uOiB7XG4gICAgdHlwZTogXCJzdHJpbmdcIlxuICB9LFxuICBkZWZhdWx0OiAhMCxcbiAgcmVhZE9ubHk6IHtcbiAgICB0eXBlOiBcImJvb2xlYW5cIixcbiAgICBkZWZhdWx0OiAhMVxuICB9LFxuICBleGFtcGxlczoge1xuICAgIHR5cGU6IFwiYXJyYXlcIixcbiAgICBpdGVtczogITBcbiAgfSxcbiAgbXVsdGlwbGVPZjoge1xuICAgIHR5cGU6IFwibnVtYmVyXCIsXG4gICAgZXhjbHVzaXZlTWluaW11bTogMFxuICB9LFxuICBtYXhpbXVtOiB7XG4gICAgdHlwZTogXCJudW1iZXJcIlxuICB9LFxuICBleGNsdXNpdmVNYXhpbXVtOiB7XG4gICAgdHlwZTogXCJudW1iZXJcIlxuICB9LFxuICBtaW5pbXVtOiB7XG4gICAgdHlwZTogXCJudW1iZXJcIlxuICB9LFxuICBleGNsdXNpdmVNaW5pbXVtOiB7XG4gICAgdHlwZTogXCJudW1iZXJcIlxuICB9LFxuICBtYXhMZW5ndGg6IHtcbiAgICAkcmVmOiBcIiMvZGVmaW5pdGlvbnMvbm9uTmVnYXRpdmVJbnRlZ2VyXCJcbiAgfSxcbiAgbWluTGVuZ3RoOiB7XG4gICAgJHJlZjogXCIjL2RlZmluaXRpb25zL25vbk5lZ2F0aXZlSW50ZWdlckRlZmF1bHQwXCJcbiAgfSxcbiAgcGF0dGVybjoge1xuICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgZm9ybWF0OiBcInJlZ2V4XCJcbiAgfSxcbiAgYWRkaXRpb25hbEl0ZW1zOiB7XG4gICAgJHJlZjogXCIjXCJcbiAgfSxcbiAgaXRlbXM6IHtcbiAgICBhbnlPZjogW1xuICAgICAge1xuICAgICAgICAkcmVmOiBcIiNcIlxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJHJlZjogXCIjL2RlZmluaXRpb25zL3NjaGVtYUFycmF5XCJcbiAgICAgIH1cbiAgICBdLFxuICAgIGRlZmF1bHQ6ICEwXG4gIH0sXG4gIG1heEl0ZW1zOiB7XG4gICAgJHJlZjogXCIjL2RlZmluaXRpb25zL25vbk5lZ2F0aXZlSW50ZWdlclwiXG4gIH0sXG4gIG1pbkl0ZW1zOiB7XG4gICAgJHJlZjogXCIjL2RlZmluaXRpb25zL25vbk5lZ2F0aXZlSW50ZWdlckRlZmF1bHQwXCJcbiAgfSxcbiAgdW5pcXVlSXRlbXM6IHtcbiAgICB0eXBlOiBcImJvb2xlYW5cIixcbiAgICBkZWZhdWx0OiAhMVxuICB9LFxuICBjb250YWluczoge1xuICAgICRyZWY6IFwiI1wiXG4gIH0sXG4gIG1heFByb3BlcnRpZXM6IHtcbiAgICAkcmVmOiBcIiMvZGVmaW5pdGlvbnMvbm9uTmVnYXRpdmVJbnRlZ2VyXCJcbiAgfSxcbiAgbWluUHJvcGVydGllczoge1xuICAgICRyZWY6IFwiIy9kZWZpbml0aW9ucy9ub25OZWdhdGl2ZUludGVnZXJEZWZhdWx0MFwiXG4gIH0sXG4gIHJlcXVpcmVkOiB7XG4gICAgJHJlZjogXCIjL2RlZmluaXRpb25zL3N0cmluZ0FycmF5XCJcbiAgfSxcbiAgYWRkaXRpb25hbFByb3BlcnRpZXM6IHtcbiAgICAkcmVmOiBcIiNcIlxuICB9LFxuICBkZWZpbml0aW9uczoge1xuICAgIHR5cGU6IFwib2JqZWN0XCIsXG4gICAgYWRkaXRpb25hbFByb3BlcnRpZXM6IHtcbiAgICAgICRyZWY6IFwiI1wiXG4gICAgfSxcbiAgICBkZWZhdWx0OiB7fVxuICB9LFxuICBwcm9wZXJ0aWVzOiB7XG4gICAgdHlwZTogXCJvYmplY3RcIixcbiAgICBhZGRpdGlvbmFsUHJvcGVydGllczoge1xuICAgICAgJHJlZjogXCIjXCJcbiAgICB9LFxuICAgIGRlZmF1bHQ6IHt9XG4gIH0sXG4gIHBhdHRlcm5Qcm9wZXJ0aWVzOiB7XG4gICAgdHlwZTogXCJvYmplY3RcIixcbiAgICBhZGRpdGlvbmFsUHJvcGVydGllczoge1xuICAgICAgJHJlZjogXCIjXCJcbiAgICB9LFxuICAgIHByb3BlcnR5TmFtZXM6IHtcbiAgICAgIGZvcm1hdDogXCJyZWdleFwiXG4gICAgfSxcbiAgICBkZWZhdWx0OiB7fVxuICB9LFxuICBkZXBlbmRlbmNpZXM6IHtcbiAgICB0eXBlOiBcIm9iamVjdFwiLFxuICAgIGFkZGl0aW9uYWxQcm9wZXJ0aWVzOiB7XG4gICAgICBhbnlPZjogW1xuICAgICAgICB7XG4gICAgICAgICAgJHJlZjogXCIjXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICRyZWY6IFwiIy9kZWZpbml0aW9ucy9zdHJpbmdBcnJheVwiXG4gICAgICAgIH1cbiAgICAgIF1cbiAgICB9XG4gIH0sXG4gIHByb3BlcnR5TmFtZXM6IHtcbiAgICAkcmVmOiBcIiNcIlxuICB9LFxuICBjb25zdDogITAsXG4gIGVudW06IHtcbiAgICB0eXBlOiBcImFycmF5XCIsXG4gICAgaXRlbXM6ICEwLFxuICAgIG1pbkl0ZW1zOiAxLFxuICAgIHVuaXF1ZUl0ZW1zOiAhMFxuICB9LFxuICB0eXBlOiB7XG4gICAgYW55T2Y6IFtcbiAgICAgIHtcbiAgICAgICAgJHJlZjogXCIjL2RlZmluaXRpb25zL3NpbXBsZVR5cGVzXCJcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHR5cGU6IFwiYXJyYXlcIixcbiAgICAgICAgaXRlbXM6IHtcbiAgICAgICAgICAkcmVmOiBcIiMvZGVmaW5pdGlvbnMvc2ltcGxlVHlwZXNcIlxuICAgICAgICB9LFxuICAgICAgICBtaW5JdGVtczogMSxcbiAgICAgICAgdW5pcXVlSXRlbXM6ICEwXG4gICAgICB9XG4gICAgXVxuICB9LFxuICBmb3JtYXQ6IHtcbiAgICB0eXBlOiBcInN0cmluZ1wiXG4gIH0sXG4gIGNvbnRlbnRNZWRpYVR5cGU6IHtcbiAgICB0eXBlOiBcInN0cmluZ1wiXG4gIH0sXG4gIGNvbnRlbnRFbmNvZGluZzoge1xuICAgIHR5cGU6IFwic3RyaW5nXCJcbiAgfSxcbiAgaWY6IHtcbiAgICAkcmVmOiBcIiNcIlxuICB9LFxuICB0aGVuOiB7XG4gICAgJHJlZjogXCIjXCJcbiAgfSxcbiAgZWxzZToge1xuICAgICRyZWY6IFwiI1wiXG4gIH0sXG4gIGFsbE9mOiB7XG4gICAgJHJlZjogXCIjL2RlZmluaXRpb25zL3NjaGVtYUFycmF5XCJcbiAgfSxcbiAgYW55T2Y6IHtcbiAgICAkcmVmOiBcIiMvZGVmaW5pdGlvbnMvc2NoZW1hQXJyYXlcIlxuICB9LFxuICBvbmVPZjoge1xuICAgICRyZWY6IFwiIy9kZWZpbml0aW9ucy9zY2hlbWFBcnJheVwiXG4gIH0sXG4gIG5vdDoge1xuICAgICRyZWY6IFwiI1wiXG4gIH1cbn0sIGdvID0ge1xuICAkc2NoZW1hOiBjbyxcbiAgJGlkOiBsbyxcbiAgdGl0bGU6IGZvLFxuICBkZWZpbml0aW9uczogaG8sXG4gIHR5cGU6IHBvLFxuICBwcm9wZXJ0aWVzOiBtbyxcbiAgZGVmYXVsdDogITBcbn07XG4oZnVuY3Rpb24oZSwgcikge1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkociwgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6ICEwIH0pLCByLk1pc3NpbmdSZWZFcnJvciA9IHIuVmFsaWRhdGlvbkVycm9yID0gci5Db2RlR2VuID0gci5OYW1lID0gci5uaWwgPSByLnN0cmluZ2lmeSA9IHIuc3RyID0gci5fID0gci5LZXl3b3JkQ3h0ID0gdm9pZCAwO1xuICBjb25zdCBuID0ga24sIGEgPSBhYSwgZCA9IEFhLCBvID0gZ28sIHAgPSBbXCIvcHJvcGVydGllc1wiXSwgeSA9IFwiaHR0cDovL2pzb24tc2NoZW1hLm9yZy9kcmFmdC0wNy9zY2hlbWFcIjtcbiAgY2xhc3MgYiBleHRlbmRzIG4uZGVmYXVsdCB7XG4gICAgX2FkZFZvY2FidWxhcmllcygpIHtcbiAgICAgIHN1cGVyLl9hZGRWb2NhYnVsYXJpZXMoKSwgYS5kZWZhdWx0LmZvckVhY2goKFIpID0+IHRoaXMuYWRkVm9jYWJ1bGFyeShSKSksIHRoaXMub3B0cy5kaXNjcmltaW5hdG9yICYmIHRoaXMuYWRkS2V5d29yZChkLmRlZmF1bHQpO1xuICAgIH1cbiAgICBfYWRkRGVmYXVsdE1ldGFTY2hlbWEoKSB7XG4gICAgICBpZiAoc3VwZXIuX2FkZERlZmF1bHRNZXRhU2NoZW1hKCksICF0aGlzLm9wdHMubWV0YSlcbiAgICAgICAgcmV0dXJuO1xuICAgICAgY29uc3QgUiA9IHRoaXMub3B0cy4kZGF0YSA/IHRoaXMuJGRhdGFNZXRhU2NoZW1hKG8sIHApIDogbztcbiAgICAgIHRoaXMuYWRkTWV0YVNjaGVtYShSLCB5LCAhMSksIHRoaXMucmVmc1tcImh0dHA6Ly9qc29uLXNjaGVtYS5vcmcvc2NoZW1hXCJdID0geTtcbiAgICB9XG4gICAgZGVmYXVsdE1ldGEoKSB7XG4gICAgICByZXR1cm4gdGhpcy5vcHRzLmRlZmF1bHRNZXRhID0gc3VwZXIuZGVmYXVsdE1ldGEoKSB8fCAodGhpcy5nZXRTY2hlbWEoeSkgPyB5IDogdm9pZCAwKTtcbiAgICB9XG4gIH1cbiAgZS5leHBvcnRzID0gciA9IGIsIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogITAgfSksIHIuZGVmYXVsdCA9IGI7XG4gIHZhciB2ID0gSGU7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyLCBcIktleXdvcmRDeHRcIiwgeyBlbnVtZXJhYmxlOiAhMCwgZ2V0OiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdi5LZXl3b3JkQ3h0O1xuICB9IH0pO1xuICB2YXIgZyA9IHNlO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkociwgXCJfXCIsIHsgZW51bWVyYWJsZTogITAsIGdldDogZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIGcuXztcbiAgfSB9KSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHIsIFwic3RyXCIsIHsgZW51bWVyYWJsZTogITAsIGdldDogZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIGcuc3RyO1xuICB9IH0pLCBPYmplY3QuZGVmaW5lUHJvcGVydHkociwgXCJzdHJpbmdpZnlcIiwgeyBlbnVtZXJhYmxlOiAhMCwgZ2V0OiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gZy5zdHJpbmdpZnk7XG4gIH0gfSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyLCBcIm5pbFwiLCB7IGVudW1lcmFibGU6ICEwLCBnZXQ6IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBnLm5pbDtcbiAgfSB9KSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHIsIFwiTmFtZVwiLCB7IGVudW1lcmFibGU6ICEwLCBnZXQ6IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBnLk5hbWU7XG4gIH0gfSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyLCBcIkNvZGVHZW5cIiwgeyBlbnVtZXJhYmxlOiAhMCwgZ2V0OiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gZy5Db2RlR2VuO1xuICB9IH0pO1xuICB2YXIgUyA9IGF0O1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkociwgXCJWYWxpZGF0aW9uRXJyb3JcIiwgeyBlbnVtZXJhYmxlOiAhMCwgZ2V0OiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gUy5kZWZhdWx0O1xuICB9IH0pO1xuICB2YXIgeiA9IG50O1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkociwgXCJNaXNzaW5nUmVmRXJyb3JcIiwgeyBlbnVtZXJhYmxlOiAhMCwgZ2V0OiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gei5kZWZhdWx0O1xuICB9IH0pO1xufSkoUHMsIHd0KTtcbmNvbnN0IF9vID0gLyogQF9fUFVSRV9fICovIGtzKHd0KTtcbmNsYXNzIHZvIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgYmUodGhpcywgXCJhanZcIik7XG4gICAgdGhpcy5hanYgPSBuZXcgX28oKTtcbiAgfVxuICB2YWxpZGF0ZUpzb24ociwgbikge1xuICAgIGNvbnN0IGEgPSB0aGlzLmFqdi52YWxpZGF0ZShyLCBuKTtcbiAgICByZXR1cm4gYSA/IHsgdmFsaWQ6IGEgfSA6IHsgdmFsaWQ6IGEsIGVycm9yOiB0aGlzLmFqdi5lcnJvcnNUZXh0KCkgfTtcbiAgfVxuICB2YWxpZGF0ZU9iamVjdFNjaGVtYShyLCBuKSB7XG4gICAgY29uc3QgYSA9IHRoaXMuYWp2LnZhbGlkYXRlKHIsIG4pO1xuICAgIHJldHVybiBhID8geyB2YWxpZDogYSB9IDogeyB2YWxpZDogYSwgZXJyb3I6IHRoaXMuYWp2LmVycm9yc1RleHQoKSB9O1xuICB9XG59XG5jbGFzcyB5byB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIGJlKHRoaXMsIFwiVElNRV9TUExJVFwiLCBcIiBcIik7XG4gIH1cbiAgLyoqXG4gICAqIFx1N0VEOVx1NjVFNVx1NjcxRlx1NkRGQlx1NTJBMFx1NUMwRlx1NjVGNlxuICAgKlxuICAgKiBAcGFyYW0gZGF0ZSAtIERhdGVcbiAgICogQHBhcmFtIG51bU9mSG91cnMgLSBcdTY1NzBcdTVCNTdcbiAgICogQGF1dGhvciB0ZXJ3ZXJcbiAgICogQHNpbmNlIDEuMC4wXG4gICAqL1xuICBhZGRIb3Vyc1RvRGF0ZShyLCBuKSB7XG4gICAgcmV0dXJuIHIuc2V0VGltZShyLmdldFRpbWUoKSArIG4gKiA2MCAqIDYwICogMWUzKSwgcjtcbiAgfVxuICAvKipcbiAgICogXHU4RjZDXHU2MzYySVNPXHU2NUU1XHU2NzFGXHU0RTNBXHU0RTJEXHU2NTg3XHU2NUU1XHU2NzFGXHU3Njg0XHU5MDFBXHU3NTI4XHU4RjZDXHU2MzYyXHU2NUI5XHU2Q0Q1XG4gICAqXG4gICAqIEBwYXJhbSBzdHIgLSAnMjAyMi0wNy0xOFQwNjoyNTo0OC4wMDBaXG4gICAqIEBwYXJhbSBpc0FkZFRpbWVab25lIC0gXHU2NjJGXHU1NDI2XHU1ODlFXHU1MkEwXHU2NUY2XHU1MzNBXHVGRjA4XHU5RUQ4XHU4QkE0XHU0RTBEXHU1ODlFXHU1MkEwXHVGRjA5XG4gICAqIEBwYXJhbSBpc1Nob3J0IC0gXHU2NjJGXHU1NDI2XHU1M0VBXHU4RkQ0XHU1NkRFXHU2NUU1XHU2NzFGXG4gICAqIEBhdXRob3IgdGVyd2VyXG4gICAqIEBzaW5jZSAxLjAuMFxuICAgKi9cbiAgZm9ybWF0SXNvVG9aaERhdGVGb3JtYXQociwgbiwgYSkge1xuICAgIGlmICghcilcbiAgICAgIHJldHVybiBcIlwiO1xuICAgIGxldCBkID0gcjtcbiAgICBjb25zdCBvID0gLyhcXGR7NH0pLShcXGR7Mn0pLShcXGR7Mn0pVChcXGR7Mn0pOihcXGR7Mn0pOihcXGR7Mn0pKC5cXGR7M30pWiQvZ20sIHAgPSBkLm1hdGNoKG8pO1xuICAgIGlmIChwID09IG51bGwpXG4gICAgICByZXR1cm4gcjtcbiAgICBmb3IgKGxldCB5ID0gMDsgeSA8IHAubGVuZ3RoOyB5KyspIHtcbiAgICAgIGNvbnN0IGIgPSBwW3ldO1xuICAgICAgbGV0IHYgPSBiO1xuICAgICAgbiAmJiAodiA9IHRoaXMuYWRkSG91cnNUb0RhdGUobmV3IERhdGUoYiksIDgpLnRvSVNPU3RyaW5nKCkpO1xuICAgICAgY29uc3QgZyA9IHYuc3BsaXQoXCJUXCIpLCBTID0gZ1swXSwgeiA9IGdbMV0uc3BsaXQoXCIuXCIpWzBdO1xuICAgICAgbGV0IEwgPSBTICsgdGhpcy5USU1FX1NQTElUICsgejtcbiAgICAgIGEgJiYgKEwgPSBTKSwgZCA9IGQucmVwbGFjZShiLCBMKTtcbiAgICB9XG4gICAgcmV0dXJuIGQ7XG4gIH1cbiAgLyoqXG4gICAqIFx1OEY2Q1x1NjM2MklTT1x1NjVFNVx1NjcxRlx1NEUzQVx1NEUyRFx1NjU4N1x1NUI4Q1x1NjU3NFx1NjVGNlx1OTVGNFxuICAgKlxuICAgKiBAcGFyYW0gc3RyIC0gJzIwMjItMDctMThUMDY6MjU6NDguMDAwWlxuICAgKi9cbiAgZm9ybWF0SXNvVG9aaChyKSB7XG4gICAgcmV0dXJuIHRoaXMuZm9ybWF0SXNvVG9aaERhdGVGb3JtYXQociwgITEsICExKTtcbiAgfVxuICAvKipcbiAgICogXHU4RjZDXHU2MzYySVNPXHU2NUU1XHU2NzFGXHU0RTNBXHU0RTJEXHU2NTg3XHU2NUU1XHU2NzFGXG4gICAqXG4gICAqIEBwYXJhbSBzdHIgLSAnMjAyMi0wNy0xOFQwNjoyNTo0OC4wMDBaXG4gICAqL1xuICBmb3JtYXRJc29Ub1poRGF0ZShyKSB7XG4gICAgcmV0dXJuIHRoaXMuZm9ybWF0SXNvVG9aaERhdGVGb3JtYXQociwgITEsICEwKTtcbiAgfVxuICAvKipcbiAgICogXHU4RjZDXHU2MzYySVNPXHU2NUU1XHU2NzFGXHU0RTNBXHU0RTJEXHU2NTg3XHU2NUY2XHU5NUY0XG4gICAqXG4gICAqIEBwYXJhbSBzdHIgLSAnMjAyMi0wNy0xOFQwNjoyNTo0OC4wMDBaXG4gICAqL1xuICBmb3JtYXRJc29Ub1poVGltZShyKSB7XG4gICAgcmV0dXJuIHRoaXMuZm9ybWF0SXNvVG9aaERhdGVGb3JtYXQociwgITEpLnNwbGl0KHRoaXMuVElNRV9TUExJVClbMV07XG4gIH1cbiAgLyoqXG4gICAqIFx1NUY1M1x1NTI0RFx1NjVFNVx1NjcxRlx1NjVGNlx1OTVGNFx1NUI4Q1x1NjU3NFx1NjgzQ1x1NUYwRlx1RkYwQ1x1NjgzQ1x1NUYwRlx1RkYxQTIwMjMtMDMtMTAgMDI6MDM6NDNcbiAgICovXG4gIG5vd1poKCkge1xuICAgIHJldHVybiB0aGlzLmZvcm1hdElzb1RvWmhEYXRlRm9ybWF0KCgvKiBAX19QVVJFX18gKi8gbmV3IERhdGUoKSkudG9JU09TdHJpbmcoKSwgITApO1xuICB9XG4gIC8qKlxuICAgKiBcdTVGNTNcdTUyNERcdTY1RTVcdTY3MUZcdUZGMENcdTY4M0NcdTVGMEZcdUZGMUEyMDIzLTAzLTEwXG4gICAqL1xuICBub3dEYXRlWmgoKSB7XG4gICAgcmV0dXJuIHRoaXMuZm9ybWF0SXNvVG9aaERhdGVGb3JtYXQoKC8qIEBfX1BVUkVfXyAqLyBuZXcgRGF0ZSgpKS50b0lTT1N0cmluZygpLCAhMCwgITApO1xuICB9XG4gIC8qKlxuICAgKiBcdTVGNTNcdTUyNERcdTY1RjZcdTk1RjRcdUZGMENcdTY4M0NcdTVGMEZcdUZGMUEwMjowMzo0M1xuICAgKi9cbiAgbm93VGltZVpoKCkge1xuICAgIHJldHVybiB0aGlzLmZvcm1hdElzb1RvWmhEYXRlRm9ybWF0KCgvKiBAX19QVVJFX18gKi8gbmV3IERhdGUoKSkudG9JU09TdHJpbmcoKSwgITApLnNwbGl0KHRoaXMuVElNRV9TUExJVClbMV07XG4gIH1cbn1cbmNsYXNzIHdvIHtcbiAgLyoqXG4gICAqIFx1NjgzQ1x1NUYwRlx1NTMxNlx1NUI1N1x1N0IyNlx1NEUzMlxuICAgKlxuICAgKiBAcGFyYW0gc3RyIC0gXHU1QjU3XHU3QjI2XHU0RTMyXHVGRjBDXHU1M0VGXHU3NTI4XHU1MzYwXHU0RjREXHU3QjI2XHVGRjBDXHU0RjhCXHU1OTgyXHVGRjFBdGVzdCBcXHswXFx9IHN0clxuICAgKiBAcGFyYW0gYXJncyAtIFx1NjMwOVx1NTM2MFx1NEY0RFx1N0IyNlx1OTg3QVx1NUU4Rlx1NjM5Mlx1NTIxN1x1NzY4NFx1NTNDMlx1NjU3MFxuICAgKiBAYXV0aG9yIHRlcndlclxuICAgKiBAc2luY2UgMC4wLjFcbiAgICovXG4gIGYociwgLi4ubikge1xuICAgIGxldCBhID0gcjtcbiAgICBmb3IgKGxldCBkID0gMDsgZCA8IG4ubGVuZ3RoOyBkKyspIHtcbiAgICAgIGNvbnN0IG8gPSBuW2RdO1xuICAgICAgdHlwZW9mIG8gPT0gXCJzdHJpbmdcIiA/IGEgPSBhLnJlcGxhY2UoYHske2R9fWAsIG8pIDogYSA9IGEucmVwbGFjZShgeyR7ZH19YCwgby50b1N0cmluZygpKTtcbiAgICB9XG4gICAgcmV0dXJuIGE7XG4gIH1cbiAgLyoqXG4gICAqIFx1NUI1N1x1N0IyNlx1NEUzMlx1NjJGQ1x1NjNBNVxuICAgKlxuICAgKiBAcGFyYW0gc3RyIC0gXHU1QjU3XHU3QjI2XHU0RTMyXHU2NTcwXHU3RUM0XG4gICAqL1xuICBhcHBlbmRTdHIoLi4ucikge1xuICAgIHJldHVybiByLmpvaW4oXCJcIik7XG4gIH1cbiAgLyoqXG4gICAqIFx1NTIyNFx1NjVBRFx1NUI1N1x1N0IyNlx1NEUzMlx1NEUyRFx1RkYwQ1x1NjYyRlx1NTQyNlx1NTMwNVx1NTQyQlx1NjU3MFx1N0VDNFx1NEUyRFx1NEVGQlx1NEY1NVx1NEUwMFx1NEUyQVx1NTE0M1x1N0QyMFxuICAgKlxuICAgKiBAcGFyYW0gc3RyIC0gXHU1QjU3XHU3QjI2XHU0RTMyXG4gICAqIEBwYXJhbSBhcnIgLSBcdTVCNTdcdTdCMjZcdTRFMzJcdTY1NzBcdTdFQzRcbiAgICovXG4gIGluY2x1ZGVJbkFycmF5KHIsIG4pIHtcbiAgICBsZXQgYSA9ICExO1xuICAgIGZvciAobGV0IGQgPSAwOyBkIDwgbi5sZW5ndGg7IGQrKykge1xuICAgICAgY29uc3QgbyA9IG5bZF07XG4gICAgICByLmluY2x1ZGVzKG8pICYmIChhID0gITApO1xuICAgIH1cbiAgICByZXR1cm4gYTtcbiAgfVxuICAvKipcbiAgICogXHU2MjJBXHU1M0Q2XHU2MzA3XHU1QjlBXHU5NTdGXHU1RUE2XHU3Njg0XHU1QjU3XHU3QjI2XHU0RTMyXG4gICAqXG4gICAqIEBwYXJhbSBzdHIgLSBzdHJcbiAgICogQHBhcmFtIGxlbmd0aCAtIFx1OTU3Rlx1NUVBNlxuICAgKiBAcGFyYW0gaWdub3JlIC0gXHU0RTBEXHU4OTgxXHU3RUQzXHU1QzNFXHU3NzAxXHU3NTY1XHU1M0Y3XG4gICAqL1xuICBnZXRCeUxlbmd0aChyLCBuLCBhKSB7XG4gICAgY29uc3QgZCA9IHI7XG4gICAgcmV0dXJuIGQubGVuZ3RoIDwgbiA/IGQgOiBhID8gZC5zdWJzdHJpbmcoMCwgbikgOiBkLnN1YnN0cmluZygwLCBuKSArIFwiLi4uXCI7XG4gIH1cbiAgLyoqXG4gICAqIFx1NUI1N1x1N0IyNlx1NEUzMlx1N0E3QVx1NTAzQ1x1NjhDMFx1NkQ0QlxuICAgKlxuICAgKiBAcGFyYW0gc3RyIC0gXHU1Rjg1XHU2OEMwXHU2RDRCXHU3Njg0XHU1QjU3XHU3QjI2XHU0RTMyXG4gICAqL1xuICBpc0VtcHR5U3RyaW5nKHIpIHtcbiAgICByZXR1cm4gIXIgfHwgdHlwZW9mIHIgIT0gXCJzdHJpbmdcIiA/ICEwIDogci50cmltKCkubGVuZ3RoID09PSAwO1xuICB9XG4gIC8qKlxuICAgKiBcdThERUZcdTVGODRcdTdFQzRcdTU0MDhcdUZGMENcdTg5RTNcdTUxQjNcdTU5MUFcdTUxRkFcdTY3NjUvXHU3Njg0XHU5NUVFXHU5ODk4XG4gICAqXG4gICAqIEBwYXJhbSBwYXRoMSAtIFx1OERFRlx1NUY4NDFcbiAgICogQHBhcmFtIHBhdGgyIC0gXHU4REVGXHU1Rjg0MlxuICAgKi9cbiAgcGF0aEpvaW4ociwgbikge1xuICAgIGxldCBhID0gcjtcbiAgICBjb25zdCBkID0gci5sYXN0SW5kZXhPZihcIi9cIik7XG4gICAgcmV0dXJuIGQgKyAxID09PSByLmxlbmd0aCAmJiAoYSA9IHIuc3Vic3RyaW5nKDAsIGQpKSwgbi5pbmRleE9mKFwiL1wiKSA+IDAgPyBhID0gYSArIFwiL1wiICsgbiA6IGEgPSBhICsgbiwgYTtcbiAgfVxuICAvKipcbiAgICogXHU1RjNBXHU4RjZDYm9vbGVhblxuICAgKlxuICAgKiBAcGFyYW0gdmFsIC0gdmFsXG4gICAqL1xuICBwYXJzZUJvb2xlYW4ocikge1xuICAgIHJldHVybiByIHx8IChyID0gXCJmYWxzZVwiKSwgci50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkgPT09IFwidHJ1ZVwiO1xuICB9XG59XG5jb25zdCBVdCA9IChlLCByKSA9PiB7XG4gIGNvbnN0IG4gPSBwbihlKSwgYSA9IHBuKHIpLCBkID0gbi5wb3AoKSwgbyA9IGEucG9wKCksIHAgPSBfbihuLCBhKTtcbiAgcmV0dXJuIHAgIT09IDAgPyBwIDogZCAmJiBvID8gX24oZC5zcGxpdChcIi5cIiksIG8uc3BsaXQoXCIuXCIpKSA6IGQgfHwgbyA/IGQgPyAtMSA6IDEgOiAwO1xufSwgYm8gPSAvXlt2Xn48Pj1dKj8oXFxkKykoPzpcXC4oW3gqXXxcXGQrKSg/OlxcLihbeCpdfFxcZCspKD86XFwuKFt4Kl18XFxkKykpPyg/Oi0oW1xcZGEtelxcLV0rKD86XFwuW1xcZGEtelxcLV0rKSopKT8oPzpcXCtbXFxkYS16XFwtXSsoPzpcXC5bXFxkYS16XFwtXSspKik/KT8pPyQvaSwgcG4gPSAoZSkgPT4ge1xuICBpZiAodHlwZW9mIGUgIT0gXCJzdHJpbmdcIilcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhcmd1bWVudCBleHBlY3RlZCBzdHJpbmdcIik7XG4gIGNvbnN0IHIgPSBlLm1hdGNoKGJvKTtcbiAgaWYgKCFyKVxuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBhcmd1bWVudCBub3QgdmFsaWQgc2VtdmVyICgnJHtlfScgcmVjZWl2ZWQpYCk7XG4gIHJldHVybiByLnNoaWZ0KCksIHI7XG59LCBtbiA9IChlKSA9PiBlID09PSBcIipcIiB8fCBlID09PSBcInhcIiB8fCBlID09PSBcIlhcIiwgZ24gPSAoZSkgPT4ge1xuICBjb25zdCByID0gcGFyc2VJbnQoZSwgMTApO1xuICByZXR1cm4gaXNOYU4ocikgPyBlIDogcjtcbn0sICRvID0gKGUsIHIpID0+IHR5cGVvZiBlICE9IHR5cGVvZiByID8gW1N0cmluZyhlKSwgU3RyaW5nKHIpXSA6IFtlLCByXSwgRW8gPSAoZSwgcikgPT4ge1xuICBpZiAobW4oZSkgfHwgbW4ocikpXG4gICAgcmV0dXJuIDA7XG4gIGNvbnN0IFtuLCBhXSA9ICRvKGduKGUpLCBnbihyKSk7XG4gIHJldHVybiBuID4gYSA/IDEgOiBuIDwgYSA/IC0xIDogMDtcbn0sIF9uID0gKGUsIHIpID0+IHtcbiAgZm9yIChsZXQgbiA9IDA7IG4gPCBNYXRoLm1heChlLmxlbmd0aCwgci5sZW5ndGgpOyBuKyspIHtcbiAgICBjb25zdCBhID0gRW8oZVtuXSB8fCBcIjBcIiwgcltuXSB8fCBcIjBcIik7XG4gICAgaWYgKGEgIT09IDApXG4gICAgICByZXR1cm4gYTtcbiAgfVxuICByZXR1cm4gMDtcbn07XG5jbGFzcyBrbyB7XG4gIC8qKlxuICAgKiBDb21wYXJlIFtzZW12ZXJdKGh0dHBzOi8vc2VtdmVyLm9yZy8pIHZlcnNpb24gc3RyaW5nc1xuICAgKiBUaGlzIGxpYnJhcnkgc3VwcG9ydHMgdGhlIGZ1bGwgc2VtdmVyIHNwZWNpZmljYXRpb24sIGluY2x1ZGluZyBjb21wYXJpbmcgdmVyc2lvbnMgd2l0aCBkaWZmZXJlbnQgbnVtYmVyIG9mIGRpZ2l0cyBsaWtlIGAxLjAuMGAsIGAxLjBgLCBgMWAsIGFuZCBwcmUtcmVsZWFzZSB2ZXJzaW9ucyBsaWtlIGAxLjAuMC1hbHBoYWAuXG4gICAqXG4gICAqIEBwYXJhbSB2MSAtIEZpcnN0IHZlcnNpb24gdG8gY29tcGFyZVxuICAgKiBAcGFyYW0gdjIgLSBTZWNvbmQgdmVyc2lvbiB0byBjb21wYXJlXG4gICAqIEByZXR1cm5zIGJvb2xlYW4gdHJ1ZSBpZiB2MSBpcyBoaWdoZXIgdGhhbiB2MlxuICAgKi9cbiAgZ3JlYXRlcihyLCBuKSB7XG4gICAgcmV0dXJuIFV0KHIsIG4pID4gMDtcbiAgfVxuICAvKipcbiAgICogQ29tcGFyZSBbc2VtdmVyXShodHRwczovL3NlbXZlci5vcmcvKSB2ZXJzaW9uIHN0cmluZ3NcbiAgICogVGhpcyBsaWJyYXJ5IHN1cHBvcnRzIHRoZSBmdWxsIHNlbXZlciBzcGVjaWZpY2F0aW9uLCBpbmNsdWRpbmcgY29tcGFyaW5nIHZlcnNpb25zIHdpdGggZGlmZmVyZW50IG51bWJlciBvZiBkaWdpdHMgbGlrZSBgMS4wLjBgLCBgMS4wYCwgYDFgLCBhbmQgcHJlLXJlbGVhc2UgdmVyc2lvbnMgbGlrZSBgMS4wLjAtYWxwaGFgLlxuICAgKlxuICAgKiBAcGFyYW0gdjEgLSBGaXJzdCB2ZXJzaW9uIHRvIGNvbXBhcmVcbiAgICogQHBhcmFtIHYyIC0gU2Vjb25kIHZlcnNpb24gdG8gY29tcGFyZVxuICAgKiBAcmV0dXJucyBib29sZWFuIHRydWUgaWYgdjEgaXMgZXF1YWwgdG8gdjJcbiAgICovXG4gIGVxdWFsKHIsIG4pIHtcbiAgICByZXR1cm4gVXQociwgbikgPT09IDA7XG4gIH1cbiAgLyoqXG4gICAqIENvbXBhcmUgW3NlbXZlcl0oaHR0cHM6Ly9zZW12ZXIub3JnLykgdmVyc2lvbiBzdHJpbmdzXG4gICAqIFRoaXMgbGlicmFyeSBzdXBwb3J0cyB0aGUgZnVsbCBzZW12ZXIgc3BlY2lmaWNhdGlvbiwgaW5jbHVkaW5nIGNvbXBhcmluZyB2ZXJzaW9ucyB3aXRoIGRpZmZlcmVudCBudW1iZXIgb2YgZGlnaXRzIGxpa2UgYDEuMC4wYCwgYDEuMGAsIGAxYCwgYW5kIHByZS1yZWxlYXNlIHZlcnNpb25zIGxpa2UgYDEuMC4wLWFscGhhYC5cbiAgICpcbiAgICogQHBhcmFtIHYxIC0gRmlyc3QgdmVyc2lvbiB0byBjb21wYXJlXG4gICAqIEBwYXJhbSB2MiAtIFNlY29uZCB2ZXJzaW9uIHRvIGNvbXBhcmVcbiAgICogQHJldHVybnMgYm9vbGVhbiB0cnVlIGlmIHYxIGlzIGxlc3NlciB0aGFuIHYyXG4gICAqL1xuICBsZXNzZXIociwgbikge1xuICAgIHJldHVybiBVdChyLCBuKSA8IDA7XG4gIH1cbn1cbnZhciBQbyA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSwgU28gPSAoZSwgciwgbikgPT4gciBpbiBlID8gUG8oZSwgciwgeyBlbnVtZXJhYmxlOiAhMCwgY29uZmlndXJhYmxlOiAhMCwgd3JpdGFibGU6ICEwLCB2YWx1ZTogbiB9KSA6IGVbcl0gPSBuLCBqciA9IChlLCByLCBuKSA9PiAoU28oZSwgdHlwZW9mIHIgIT0gXCJzeW1ib2xcIiA/IHIgKyBcIlwiIDogciwgbiksIG4pO1xubGV0IHVyID0gY2xhc3Mge1xufTtcbmpyKHVyLCBcIk5PREVfRU5WX0tFWVwiLCBcIk5PREVfRU5WXCIpLCAvKipcbiogXHU1RjAwXHU1M0QxXHU3M0FGXHU1ODgzXG4qL1xuanIodXIsIFwiTk9ERV9FTlZfREVWRUxPUE1FTlRcIiwgXCJkZXZlbG9wbWVudFwiKSwgLyoqXG4qIFx1NzUxRlx1NEVBN1x1NzNBRlx1NTg4M1xuKi9cbmpyKHVyLCBcIk5PREVfRU5WX1BST0RVQ1RJT05cIiwgXCJwcm9kdWN0aW9uXCIpLCAvKipcbiogXHU2RDRCXHU4QkQ1XHU3M0FGXHU1ODgzXG4qL1xuanIodXIsIFwiTk9ERV9FTlZfVEVTVFwiLCBcInRlc3RcIiksIC8qKlxuKiBcdTY2MkZcdTU0MjZcdTU5MDRcdTRFOEVcdThDMDNcdThCRDVcdTZBMjFcdTVGMEZcbiovXG5qcih1ciwgXCJWSVRFX0RFQlVHX01PREVfS0VZXCIsIFwiVklURV9ERUJVR19NT0RFXCIpO1xubGV0IENvID0gY2xhc3Mge1xuICAvKipcbiAgICogXHU3M0FGXHU1ODgzXHU1MjFEXHU1OUNCXHU1MzE2XG4gICAqXG4gICAqIEBwYXJhbSBlbnZNZXRhIC0gXHU5NzAwXHU4OTgxXHU0RjIwXHU1MTY1IHtcIkJBU0VfVVJMXCI6XCIvXCIsXCJNT0RFXCI6XCJwcm9kdWN0aW9uXCIsXCJERVZcIjpmYWxzZSxcIlBST0RcIjp0cnVlLFwiU1NSXCI6ZmFsc2V9IFx1MzAwMlx1NzI3OVx1NTIyQlx1NjNEMFx1OTE5Mlx1RkYxQVx1NkI2NFx1NTNDMlx1NjU3MFx1NjYyRlx1OTc1OVx1NjAwMVx1NTE0M1x1NjU3MFx1NjM2RVx1RkYwQ1x1NTNENlx1NTFCM1x1NEU4RVx1NjcwMFx1N0VDOFx1NEY3Rlx1NzUyOFx1NzY4NFx1OTg3OVx1NzZFRVx1MzAwMlx1NTZFMFx1NkI2NFx1NEVDNVx1NEVDNVx1NTcyOFx1NjcwMFx1N0VDOFx1NEY3Rlx1NzUyOFx1NzY4NFx1NTczMFx1NjVCOVx1NjYzRVx1NzkzQVx1NEYyMFx1OTAxMlx1NkI2NFx1NTAzQ1x1RkYwQ1x1NEUyRFx1OTVGNFx1OTg3OVx1NzZFRVx1OEJGN1x1NEZERFx1NjMwMVx1NTNDMlx1NjU3MFx1NEYyMFx1OTAxMlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL3ZpdGVqcy5kZXYvZ3VpZGUvZW52LWFuZC1tb2RlLmh0bWwjcHJvZHVjdGlvbi1yZXBsYWNlbWVudH1cbiAgICovXG4gIGNvbnN0cnVjdG9yKHIpIHtcbiAgICBqcih0aGlzLCBcImVudk1ldGFcIiksIHRoaXMuZW52TWV0YSA9IHI7XG4gIH1cbiAgLyoqXG4gICAqIFx1NjYyRlx1NTQyNlx1NjYyRlx1NUYwMFx1NTNEMVx1OTYzNlx1NkJCNVx1OEMwM1x1OEJENVxuICAgKi9cbiAgaXNOb2RlRGV2KCkge1xuICAgIHJldHVybiB0aGlzLmdldEVudih1ci5OT0RFX0VOVl9LRVkpID09PSB1ci5OT0RFX0VOVl9ERVZFTE9QTUVOVDtcbiAgfVxuICAvKipcbiAgICogXHU2NjJGXHU1NDI2XHU2NjJGXHU4QzAzXHU4QkQ1XHU5NjM2XHU2QkI1XG4gICAqL1xuICBpc0RldigpIHtcbiAgICByZXR1cm4gdGhpcy5pc05vZGVEZXYoKSB8fCB0aGlzLmdldEJvb2xlYW5FbnYodXIuVklURV9ERUJVR19NT0RFX0tFWSk7XG4gIH1cbiAgLyoqXG4gICAqIFx1ODNCN1x1NTNENlx1NzNBRlx1NTg4M1x1NTNEOFx1OTFDRlx1RkYwQ2tleVx1NEUwRFx1NUI1OFx1NTcyOFx1OEZENFx1NTZERXVuZGVmaW5lZFxuICAgKiBAcGFyYW0ga2V5IC0ga2V5XG4gICAqL1xuICBnZXRFbnYocikge1xuICAgIGxldCBuO1xuICAgIHRyeSB7XG4gICAgICB0aGlzLmVudk1ldGFbcl0gJiYgKG4gPSB0aGlzLmVudk1ldGFbcl0pO1xuICAgIH0gY2F0Y2gge1xuICAgIH1cbiAgICByZXR1cm4gbjtcbiAgfVxuICAvKipcbiAgICogXHU4M0I3XHU1M0Q2U3RyaW5nXHU3QzdCXHU1NzhCXHU3Njg0XHU3M0FGXHU1ODgzXHU1M0Q4XHU5MUNGXHVGRjBDa2V5XHU0RTBEXHU1QjU4XHU1NzI4XHU3NkY0XHU2M0E1XHU4RkQ0XHU1NkRFXHU3QTdBXHU1MDNDXG4gICAqIEBwYXJhbSBrZXkgLSBrZXlcbiAgICovXG4gIGdldFN0cmluZ0VudihyKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0RW52KHIpID8/IFwiXCI7XG4gIH1cbiAgLyoqXG4gICAqIFx1ODNCN1x1NTNENkJvb2xlYW5cdTdDN0JcdTU3OEJcdTc2ODRcdTczQUZcdTU4ODNcdTUzRDhcdTkxQ0ZcdUZGMENrZXlcdTRFMERcdTVCNThcdTU3MjhcdThGRDRcdTU2REVmYWxzZVxuICAgKiBAcGFyYW0ga2V5IC0ga2V5XG4gICAqL1xuICBnZXRCb29sZWFuRW52KHIpIHtcbiAgICBsZXQgbiA9ICExO1xuICAgIHJldHVybiB0aGlzLmdldEVudihyKSAmJiAobiA9IHRoaXMuZ2V0U3RyaW5nRW52KHIpLnRvTG93ZXJDYXNlKCkgPT09IFwidHJ1ZVwiKSwgbjtcbiAgfVxuICAvKipcbiAgICogXHU4M0I3XHU1M0Q2XHU3M0FGXHU1ODgzXHU1M0Q4XHU5MUNGXHVGRjBDXHU1OTgyXHU2NzlDXHU2NzJBXHU1QjlBXHU0RTQ5XHU2MjE2XHU4MDA1XHU0RTNBXHU3QTdBXHU1MDNDXHVGRjBDXHU3NTI4XHU2MzA3XHU1QjlBXHU3Njg0XHU5RUQ4XHU4QkE0XHU1MDNDXHU0RUUzXHU2NkZGXG4gICAqXG4gICAqIEBwYXJhbSBrZXkgLSBrZXlcbiAgICogQHBhcmFtIGRlZmF1bHRWYWx1ZSAtIFx1OUVEOFx1OEJBNFx1NTAzQ1xuICAgKiBAc2luY2UgMC4xLjBcbiAgICogQGF1dGhvciB0ZXJ3ZXJcbiAgICovXG4gIGdldEVudk9yRGVmYXVsdChyLCBuKSB7XG4gICAgY29uc3QgYSA9IHRoaXMuZ2V0U3RyaW5nRW52KHIpO1xuICAgIHJldHVybiBhLnRyaW0oKS5sZW5ndGggPT0gMCA/IG4gOiBhO1xuICB9XG59O1xudmFyIFRvID0gT2JqZWN0LmRlZmluZVByb3BlcnR5LCBqbyA9IChlLCByLCBuKSA9PiByIGluIGUgPyBUbyhlLCByLCB7IGVudW1lcmFibGU6ICEwLCBjb25maWd1cmFibGU6ICEwLCB3cml0YWJsZTogITAsIHZhbHVlOiBuIH0pIDogZVtyXSA9IG4sIFJyID0gKGUsIHIsIG4pID0+IChqbyhlLCB0eXBlb2YgciAhPSBcInN5bWJvbFwiID8gciArIFwiXCIgOiByLCBuKSwgbik7XG5jbGFzcyBDdCB7XG59XG5ScihDdCwgXCJMT0dfTEVWRUxfS0VZXCIsIFwiVklURV9MT0dfTEVWRUxcIiksIFJyKEN0LCBcIkxPR19QUkVGSVhfS0VZXCIsIFwiVklURV9MT0dfUFJFRklYXCIpO1xudmFyIFplID0gLyogQF9fUFVSRV9fICovICgoZSkgPT4gKGUuTE9HX0xFVkVMX1RSQUNFID0gXCJUUkFDRVwiLCBlLkxPR19MRVZFTF9ERUJVRyA9IFwiREVCVUdcIiwgZS5MT0dfTEVWRUxfSU5GTyA9IFwiSU5GT1wiLCBlLkxPR19MRVZFTF9XQVJOID0gXCJXQVJOXCIsIGUuTE9HX0xFVkVMX0VSUk9SID0gXCJFUlJPUlwiLCBlKSkoWmUgfHwge30pLCBucyA9IHR5cGVvZiBnbG9iYWxUaGlzIDwgXCJ1XCIgPyBnbG9iYWxUaGlzIDogdHlwZW9mIHdpbmRvdyA8IFwidVwiID8gd2luZG93IDogdHlwZW9mIGdsb2JhbCA8IFwidVwiID8gZ2xvYmFsIDogdHlwZW9mIHNlbGYgPCBcInVcIiA/IHNlbGYgOiB7fSwgTnIgPSB7fSwgTm8gPSB7XG4gIGdldCBleHBvcnRzKCkge1xuICAgIHJldHVybiBOcjtcbiAgfSxcbiAgc2V0IGV4cG9ydHMoZSkge1xuICAgIE5yID0gZTtcbiAgfVxufTtcbihmdW5jdGlvbihlKSB7XG4gIChmdW5jdGlvbihyLCBuKSB7XG4gICAgZS5leHBvcnRzID8gZS5leHBvcnRzID0gbigpIDogci5sb2cgPSBuKCk7XG4gIH0pKG5zLCBmdW5jdGlvbigpIHtcbiAgICB2YXIgciA9IGZ1bmN0aW9uKCkge1xuICAgIH0sIG4gPSBcInVuZGVmaW5lZFwiLCBhID0gdHlwZW9mIHdpbmRvdyAhPT0gbiAmJiB0eXBlb2Ygd2luZG93Lm5hdmlnYXRvciAhPT0gbiAmJiAvVHJpZGVudFxcL3xNU0lFIC8udGVzdCh3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudCksIGQgPSBbXG4gICAgICBcInRyYWNlXCIsXG4gICAgICBcImRlYnVnXCIsXG4gICAgICBcImluZm9cIixcbiAgICAgIFwid2FyblwiLFxuICAgICAgXCJlcnJvclwiXG4gICAgXTtcbiAgICBmdW5jdGlvbiBvKGosIFQpIHtcbiAgICAgIHZhciAkID0galtUXTtcbiAgICAgIGlmICh0eXBlb2YgJC5iaW5kID09IFwiZnVuY3Rpb25cIilcbiAgICAgICAgcmV0dXJuICQuYmluZChqKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBGdW5jdGlvbi5wcm90b3R5cGUuYmluZC5jYWxsKCQsIGopO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgICByZXR1cm4gRnVuY3Rpb24ucHJvdG90eXBlLmFwcGx5LmFwcGx5KCQsIFtqLCBhcmd1bWVudHNdKTtcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gcCgpIHtcbiAgICAgIGNvbnNvbGUubG9nICYmIChjb25zb2xlLmxvZy5hcHBseSA/IGNvbnNvbGUubG9nLmFwcGx5KGNvbnNvbGUsIGFyZ3VtZW50cykgOiBGdW5jdGlvbi5wcm90b3R5cGUuYXBwbHkuYXBwbHkoY29uc29sZS5sb2csIFtjb25zb2xlLCBhcmd1bWVudHNdKSksIGNvbnNvbGUudHJhY2UgJiYgY29uc29sZS50cmFjZSgpO1xuICAgIH1cbiAgICBmdW5jdGlvbiB5KGopIHtcbiAgICAgIHJldHVybiBqID09PSBcImRlYnVnXCIgJiYgKGogPSBcImxvZ1wiKSwgdHlwZW9mIGNvbnNvbGUgPT09IG4gPyAhMSA6IGogPT09IFwidHJhY2VcIiAmJiBhID8gcCA6IGNvbnNvbGVbal0gIT09IHZvaWQgMCA/IG8oY29uc29sZSwgaikgOiBjb25zb2xlLmxvZyAhPT0gdm9pZCAwID8gbyhjb25zb2xlLCBcImxvZ1wiKSA6IHI7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGIoaiwgVCkge1xuICAgICAgZm9yICh2YXIgJCA9IDA7ICQgPCBkLmxlbmd0aDsgJCsrKSB7XG4gICAgICAgIHZhciBOID0gZFskXTtcbiAgICAgICAgdGhpc1tOXSA9ICQgPCBqID8gciA6IHRoaXMubWV0aG9kRmFjdG9yeShOLCBqLCBUKTtcbiAgICAgIH1cbiAgICAgIHRoaXMubG9nID0gdGhpcy5kZWJ1ZztcbiAgICB9XG4gICAgZnVuY3Rpb24gdihqLCBULCAkKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgIHR5cGVvZiBjb25zb2xlICE9PSBuICYmIChiLmNhbGwodGhpcywgVCwgJCksIHRoaXNbal0uYXBwbHkodGhpcywgYXJndW1lbnRzKSk7XG4gICAgICB9O1xuICAgIH1cbiAgICBmdW5jdGlvbiBnKGosIFQsICQpIHtcbiAgICAgIHJldHVybiB5KGopIHx8IHYuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gUyhqLCBULCAkKSB7XG4gICAgICB2YXIgTiA9IHRoaXMsIEQ7XG4gICAgICBUID0gVCA/PyBcIldBUk5cIjtcbiAgICAgIHZhciB0ID0gXCJsb2dsZXZlbFwiO1xuICAgICAgdHlwZW9mIGogPT0gXCJzdHJpbmdcIiA/IHQgKz0gXCI6XCIgKyBqIDogdHlwZW9mIGogPT0gXCJzeW1ib2xcIiAmJiAodCA9IHZvaWQgMCk7XG4gICAgICBmdW5jdGlvbiB1KG0pIHtcbiAgICAgICAgdmFyIGggPSAoZFttXSB8fCBcInNpbGVudFwiKS50b1VwcGVyQ2FzZSgpO1xuICAgICAgICBpZiAoISh0eXBlb2Ygd2luZG93ID09PSBuIHx8ICF0KSkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICB3aW5kb3cubG9jYWxTdG9yYWdlW3RdID0gaDtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICB9XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHdpbmRvdy5kb2N1bWVudC5jb29raWUgPSBlbmNvZGVVUklDb21wb25lbnQodCkgKyBcIj1cIiArIGggKyBcIjtcIjtcbiAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIHMoKSB7XG4gICAgICAgIHZhciBtO1xuICAgICAgICBpZiAoISh0eXBlb2Ygd2luZG93ID09PSBuIHx8ICF0KSkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBtID0gd2luZG93LmxvY2FsU3RvcmFnZVt0XTtcbiAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHR5cGVvZiBtID09PSBuKVxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgdmFyIGggPSB3aW5kb3cuZG9jdW1lbnQuY29va2llLCBDID0gaC5pbmRleE9mKFxuICAgICAgICAgICAgICAgIGVuY29kZVVSSUNvbXBvbmVudCh0KSArIFwiPVwiXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIEMgIT09IC0xICYmIChtID0gL14oW147XSspLy5leGVjKGguc2xpY2UoQykpWzFdKTtcbiAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBOLmxldmVsc1ttXSA9PT0gdm9pZCAwICYmIChtID0gdm9pZCAwKSwgbTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZnVuY3Rpb24gaSgpIHtcbiAgICAgICAgaWYgKCEodHlwZW9mIHdpbmRvdyA9PT0gbiB8fCAhdCkpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgd2luZG93LmxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKHQpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIH1cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgd2luZG93LmRvY3VtZW50LmNvb2tpZSA9IGVuY29kZVVSSUNvbXBvbmVudCh0KSArIFwiPTsgZXhwaXJlcz1UaHUsIDAxIEphbiAxOTcwIDAwOjAwOjAwIFVUQ1wiO1xuICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgTi5uYW1lID0gaiwgTi5sZXZlbHMgPSB7XG4gICAgICAgIFRSQUNFOiAwLFxuICAgICAgICBERUJVRzogMSxcbiAgICAgICAgSU5GTzogMixcbiAgICAgICAgV0FSTjogMyxcbiAgICAgICAgRVJST1I6IDQsXG4gICAgICAgIFNJTEVOVDogNVxuICAgICAgfSwgTi5tZXRob2RGYWN0b3J5ID0gJCB8fCBnLCBOLmdldExldmVsID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBEO1xuICAgICAgfSwgTi5zZXRMZXZlbCA9IGZ1bmN0aW9uKG0sIGgpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBtID09IFwic3RyaW5nXCIgJiYgTi5sZXZlbHNbbS50b1VwcGVyQ2FzZSgpXSAhPT0gdm9pZCAwICYmIChtID0gTi5sZXZlbHNbbS50b1VwcGVyQ2FzZSgpXSksIHR5cGVvZiBtID09IFwibnVtYmVyXCIgJiYgbSA+PSAwICYmIG0gPD0gTi5sZXZlbHMuU0lMRU5UKSB7XG4gICAgICAgICAgaWYgKEQgPSBtLCBoICE9PSAhMSAmJiB1KG0pLCBiLmNhbGwoTiwgbSwgaiksIHR5cGVvZiBjb25zb2xlID09PSBuICYmIG0gPCBOLmxldmVscy5TSUxFTlQpXG4gICAgICAgICAgICByZXR1cm4gXCJObyBjb25zb2xlIGF2YWlsYWJsZSBmb3IgbG9nZ2luZ1wiO1xuICAgICAgICB9IGVsc2VcbiAgICAgICAgICB0aHJvdyBcImxvZy5zZXRMZXZlbCgpIGNhbGxlZCB3aXRoIGludmFsaWQgbGV2ZWw6IFwiICsgbTtcbiAgICAgIH0sIE4uc2V0RGVmYXVsdExldmVsID0gZnVuY3Rpb24obSkge1xuICAgICAgICBUID0gbSwgcygpIHx8IE4uc2V0TGV2ZWwobSwgITEpO1xuICAgICAgfSwgTi5yZXNldExldmVsID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIE4uc2V0TGV2ZWwoVCwgITEpLCBpKCk7XG4gICAgICB9LCBOLmVuYWJsZUFsbCA9IGZ1bmN0aW9uKG0pIHtcbiAgICAgICAgTi5zZXRMZXZlbChOLmxldmVscy5UUkFDRSwgbSk7XG4gICAgICB9LCBOLmRpc2FibGVBbGwgPSBmdW5jdGlvbihtKSB7XG4gICAgICAgIE4uc2V0TGV2ZWwoTi5sZXZlbHMuU0lMRU5ULCBtKTtcbiAgICAgIH07XG4gICAgICB2YXIgYyA9IHMoKTtcbiAgICAgIGMgPT0gbnVsbCAmJiAoYyA9IFQpLCBOLnNldExldmVsKGMsICExKTtcbiAgICB9XG4gICAgdmFyIHogPSBuZXcgUygpLCBMID0ge307XG4gICAgei5nZXRMb2dnZXIgPSBmdW5jdGlvbihqKSB7XG4gICAgICBpZiAodHlwZW9mIGogIT0gXCJzeW1ib2xcIiAmJiB0eXBlb2YgaiAhPSBcInN0cmluZ1wiIHx8IGogPT09IFwiXCIpXG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJZb3UgbXVzdCBzdXBwbHkgYSBuYW1lIHdoZW4gY3JlYXRpbmcgYSBsb2dnZXIuXCIpO1xuICAgICAgdmFyIFQgPSBMW2pdO1xuICAgICAgcmV0dXJuIFQgfHwgKFQgPSBMW2pdID0gbmV3IFMoXG4gICAgICAgIGosXG4gICAgICAgIHouZ2V0TGV2ZWwoKSxcbiAgICAgICAgei5tZXRob2RGYWN0b3J5XG4gICAgICApKSwgVDtcbiAgICB9O1xuICAgIHZhciBSID0gdHlwZW9mIHdpbmRvdyAhPT0gbiA/IHdpbmRvdy5sb2cgOiB2b2lkIDA7XG4gICAgcmV0dXJuIHoubm9Db25mbGljdCA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHR5cGVvZiB3aW5kb3cgIT09IG4gJiYgd2luZG93LmxvZyA9PT0geiAmJiAod2luZG93LmxvZyA9IFIpLCB6O1xuICAgIH0sIHouZ2V0TG9nZ2VycyA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIEw7XG4gICAgfSwgei5kZWZhdWx0ID0geiwgejtcbiAgfSk7XG59KShObyk7XG52YXIgVHQgPSB7fSwgT28gPSB7XG4gIGdldCBleHBvcnRzKCkge1xuICAgIHJldHVybiBUdDtcbiAgfSxcbiAgc2V0IGV4cG9ydHMoZSkge1xuICAgIFR0ID0gZTtcbiAgfVxufTtcbihmdW5jdGlvbihlKSB7XG4gIChmdW5jdGlvbihyLCBuKSB7XG4gICAgZS5leHBvcnRzID8gZS5leHBvcnRzID0gbigpIDogci5wcmVmaXggPSBuKHIpO1xuICB9KShucywgZnVuY3Rpb24ocikge1xuICAgIHZhciBuID0gZnVuY3Rpb24oZykge1xuICAgICAgZm9yICh2YXIgUyA9IDEsIHogPSBhcmd1bWVudHMubGVuZ3RoLCBMOyBTIDwgejsgUysrKVxuICAgICAgICBmb3IgKEwgaW4gYXJndW1lbnRzW1NdKVxuICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChhcmd1bWVudHNbU10sIEwpICYmIChnW0xdID0gYXJndW1lbnRzW1NdW0xdKTtcbiAgICAgIHJldHVybiBnO1xuICAgIH0sIGEgPSB7XG4gICAgICB0ZW1wbGF0ZTogXCJbJXRdICVsOlwiLFxuICAgICAgbGV2ZWxGb3JtYXR0ZXI6IGZ1bmN0aW9uKGcpIHtcbiAgICAgICAgcmV0dXJuIGcudG9VcHBlckNhc2UoKTtcbiAgICAgIH0sXG4gICAgICBuYW1lRm9ybWF0dGVyOiBmdW5jdGlvbihnKSB7XG4gICAgICAgIHJldHVybiBnIHx8IFwicm9vdFwiO1xuICAgICAgfSxcbiAgICAgIHRpbWVzdGFtcEZvcm1hdHRlcjogZnVuY3Rpb24oZykge1xuICAgICAgICByZXR1cm4gZy50b1RpbWVTdHJpbmcoKS5yZXBsYWNlKC8uKihcXGR7Mn06XFxkezJ9OlxcZHsyfSkuKi8sIFwiJDFcIik7XG4gICAgICB9LFxuICAgICAgZm9ybWF0OiB2b2lkIDBcbiAgICB9LCBkLCBvID0ge30sIHAgPSBmdW5jdGlvbihnKSB7XG4gICAgICBpZiAoIWcgfHwgIWcuZ2V0TG9nZ2VyKVxuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQXJndW1lbnQgaXMgbm90IGEgcm9vdCBsb2dnZXJcIik7XG4gICAgICBkID0gZztcbiAgICB9LCB5ID0gZnVuY3Rpb24oZywgUykge1xuICAgICAgaWYgKCFnIHx8ICFnLnNldExldmVsKVxuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQXJndW1lbnQgaXMgbm90IGEgbG9nZ2VyXCIpO1xuICAgICAgdmFyIHogPSBnLm1ldGhvZEZhY3RvcnksIEwgPSBnLm5hbWUgfHwgXCJcIiwgUiA9IG9bTF0gfHwgb1tcIlwiXSB8fCBhO1xuICAgICAgZnVuY3Rpb24gaihULCAkLCBOKSB7XG4gICAgICAgIHZhciBEID0geihULCAkLCBOKSwgdCA9IG9bTl0gfHwgb1tcIlwiXSwgdSA9IHQudGVtcGxhdGUuaW5kZXhPZihcIiV0XCIpICE9PSAtMSwgcyA9IHQudGVtcGxhdGUuaW5kZXhPZihcIiVsXCIpICE9PSAtMSwgaSA9IHQudGVtcGxhdGUuaW5kZXhPZihcIiVuXCIpICE9PSAtMTtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICAgIGZvciAodmFyIGMgPSBcIlwiLCBtID0gYXJndW1lbnRzLmxlbmd0aCwgaCA9IEFycmF5KG0pLCBDID0gMDsgQyA8IG07IEMrKylcbiAgICAgICAgICAgIGhbQ10gPSBhcmd1bWVudHNbQ107XG4gICAgICAgICAgaWYgKEwgfHwgIW9bTl0pIHtcbiAgICAgICAgICAgIHZhciBVID0gdC50aW1lc3RhbXBGb3JtYXR0ZXIoLyogQF9fUFVSRV9fICovIG5ldyBEYXRlKCkpLCBIID0gdC5sZXZlbEZvcm1hdHRlcihUKSwgViA9IHQubmFtZUZvcm1hdHRlcihOKTtcbiAgICAgICAgICAgIHQuZm9ybWF0ID8gYyArPSB0LmZvcm1hdChILCBWLCBVKSA6IChjICs9IHQudGVtcGxhdGUsIHUgJiYgKGMgPSBjLnJlcGxhY2UoLyV0LywgVSkpLCBzICYmIChjID0gYy5yZXBsYWNlKC8lbC8sIEgpKSwgaSAmJiAoYyA9IGMucmVwbGFjZSgvJW4vLCBWKSkpLCBoLmxlbmd0aCAmJiB0eXBlb2YgaFswXSA9PSBcInN0cmluZ1wiID8gaFswXSA9IGMgKyBcIiBcIiArIGhbMF0gOiBoLnVuc2hpZnQoYyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIEQuYXBwbHkodm9pZCAwLCBoKTtcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBvW0xdIHx8IChnLm1ldGhvZEZhY3RvcnkgPSBqKSwgUyA9IFMgfHwge30sIFMudGVtcGxhdGUgJiYgKFMuZm9ybWF0ID0gdm9pZCAwKSwgb1tMXSA9IG4oe30sIFIsIFMpLCBnLnNldExldmVsKGcuZ2V0TGV2ZWwoKSksIGQgfHwgZy53YXJuKFxuICAgICAgICBcIkl0IGlzIG5lY2Vzc2FyeSB0byBjYWxsIHRoZSBmdW5jdGlvbiByZWcoKSBvZiBsb2dsZXZlbC1wbHVnaW4tcHJlZml4IGJlZm9yZSBjYWxsaW5nIGFwcGx5LiBGcm9tIHRoZSBuZXh0IHJlbGVhc2UsIGl0IHdpbGwgdGhyb3cgYW4gZXJyb3IuIFNlZSBtb3JlOiBodHRwczovL2dpdGh1Yi5jb20va3V0dWx1ay9sb2dsZXZlbC1wbHVnaW4tcHJlZml4L2Jsb2IvbWFzdGVyL1JFQURNRS5tZFwiXG4gICAgICApLCBnO1xuICAgIH0sIGIgPSB7XG4gICAgICByZWc6IHAsXG4gICAgICBhcHBseTogeVxuICAgIH0sIHY7XG4gICAgcmV0dXJuIHIgJiYgKHYgPSByLnByZWZpeCwgYi5ub0NvbmZsaWN0ID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gci5wcmVmaXggPT09IGIgJiYgKHIucHJlZml4ID0gdiksIGI7XG4gICAgfSksIGI7XG4gIH0pO1xufSkoT28pO1xuZnVuY3Rpb24gUm8oKSB7XG4gIGNvbnN0IGUgPSBFcnJvci5wcmVwYXJlU3RhY2tUcmFjZTtcbiAgRXJyb3IucHJlcGFyZVN0YWNrVHJhY2UgPSAobiwgYSkgPT4gYTtcbiAgY29uc3QgciA9IG5ldyBFcnJvcigpLnN0YWNrLnNsaWNlKDEpO1xuICByZXR1cm4gRXJyb3IucHJlcGFyZVN0YWNrVHJhY2UgPSBlLCByO1xufVxuY2xhc3MganQge1xuICAvKipcbiAgICogXHU4OUUzXHU2NzkwXHU2NUU1XHU1RkQ3XHU3RUE3XHU1MjJCXHU0RTNBXHU2NzlBXHU0RTNFXG4gICAqXG4gICAqIEBwYXJhbSBlbnVtT2JqIC0gXHU2NzlBXHU0RTNFXHU1QkY5XHU4QzYxXG4gICAqIEBwYXJhbSB2YWx1ZSAtIFx1OTE0RFx1N0Y2RVx1NzY4NFx1NTAzQ1xuICAgKi9cbiAgc3RhdGljIHN0cmluZ1RvRW51bVZhbHVlKHIsIG4pIHtcbiAgICByZXR1cm4gcltPYmplY3Qua2V5cyhyKS5maWx0ZXIoKGEpID0+IHJbYV0udG9TdHJpbmcoKSA9PT0gbilbMF1dO1xuICB9XG4gIC8qKlxuICAgKiBcdTgzQjdcdTUzRDZcdTkxNERcdTdGNkVcdTc2ODRcdTY1RTVcdTVGRDdcdTdFQTdcdTUyMkJcbiAgICovXG4gIHN0YXRpYyBnZXRFbnZMZXZlbChyKSB7XG4gICAgaWYgKCFyKVxuICAgICAgcmV0dXJuO1xuICAgIGNvbnN0IG4gPSByLmdldEVudk9yRGVmYXVsdChDdC5MT0dfTEVWRUxfS0VZLCBaZS5MT0dfTEVWRUxfSU5GTyksIGEgPSBqdC5zdHJpbmdUb0VudW1WYWx1ZShaZSwgbi50b1VwcGVyQ2FzZSgpKTtcbiAgICByZXR1cm4gYSB8fCBjb25zb2xlLndhcm4oXG4gICAgICBcIlt6aGktbG9nXSBMT0dfTEVWRUwgaXMgaW52YWxpZCBpbiB5b3UgLmVudiBmaWxlLkl0IG11c3QgYmUgZWl0aGVyIGRlYnVnLCBpbmZvLCB3YXJuIG9yIGVycm9yLCBmYWxsYmFjayB0byBkZWZhdWx0IGluZm8gbGV2ZWxcIlxuICAgICksIGE7XG4gIH1cbiAgLyoqXG4gICAqIFx1ODNCN1x1NTNENlx1OUVEOFx1OEJBNFx1NjVFNVx1NUZEN1xuICAgKi9cbiAgc3RhdGljIGdldEVudkxvZ2dlcihyKSB7XG4gICAgcmV0dXJuIHIgPyByLmdldEVudihDdC5MT0dfUFJFRklYX0tFWSkgOiB2b2lkIDA7XG4gIH1cbn1cbnZhciBTZSA9IHt9LCBBbyA9IHtcbiAgZ2V0IGV4cG9ydHMoKSB7XG4gICAgcmV0dXJuIFNlO1xuICB9LFxuICBzZXQgZXhwb3J0cyhlKSB7XG4gICAgU2UgPSBlO1xuICB9XG59LCBKdCA9IHt9LCBJbyA9IHtcbiAgZ2V0IGV4cG9ydHMoKSB7XG4gICAgcmV0dXJuIEp0O1xuICB9LFxuICBzZXQgZXhwb3J0cyhlKSB7XG4gICAgSnQgPSBlO1xuICB9XG59LCB2bjtcbmZ1bmN0aW9uIE1vKCkge1xuICByZXR1cm4gdm4gfHwgKHZuID0gMSwgZnVuY3Rpb24oZSkge1xuICAgIGNvbnN0IHIgPSB0eXBlb2YgcHJvY2VzcyA8IFwidVwiICYmIHByb2Nlc3MuZW52LlRFUk1fUFJPR1JBTSA9PT0gXCJIeXBlclwiLCBuID0gdHlwZW9mIHByb2Nlc3MgPCBcInVcIiAmJiBwcm9jZXNzLnBsYXRmb3JtID09PSBcIndpbjMyXCIsIGEgPSB0eXBlb2YgcHJvY2VzcyA8IFwidVwiICYmIHByb2Nlc3MucGxhdGZvcm0gPT09IFwibGludXhcIiwgZCA9IHtcbiAgICAgIGJhbGxvdERpc2FibGVkOiBcIlx1MjYxMlwiLFxuICAgICAgYmFsbG90T2ZmOiBcIlx1MjYxMFwiLFxuICAgICAgYmFsbG90T246IFwiXHUyNjExXCIsXG4gICAgICBidWxsZXQ6IFwiXHUyMDIyXCIsXG4gICAgICBidWxsZXRXaGl0ZTogXCJcdTI1RTZcIixcbiAgICAgIGZ1bGxCbG9jazogXCJcdTI1ODhcIixcbiAgICAgIGhlYXJ0OiBcIlx1Mjc2NFwiLFxuICAgICAgaWRlbnRpY2FsVG86IFwiXHUyMjYxXCIsXG4gICAgICBsaW5lOiBcIlx1MjUwMFwiLFxuICAgICAgbWFyazogXCJcdTIwM0JcIixcbiAgICAgIG1pZGRvdDogXCJcdTAwQjdcIixcbiAgICAgIG1pbnVzOiBcIlx1RkYwRFwiLFxuICAgICAgbXVsdGlwbGljYXRpb246IFwiXHUwMEQ3XCIsXG4gICAgICBvYmVsdXM6IFwiXHUwMEY3XCIsXG4gICAgICBwZW5jaWxEb3duUmlnaHQ6IFwiXHUyNzBFXCIsXG4gICAgICBwZW5jaWxSaWdodDogXCJcdTI3MEZcIixcbiAgICAgIHBlbmNpbFVwUmlnaHQ6IFwiXHUyNzEwXCIsXG4gICAgICBwZXJjZW50OiBcIiVcIixcbiAgICAgIHBpbGNyb3cyOiBcIlx1Mjc2MVwiLFxuICAgICAgcGlsY3JvdzogXCJcdTAwQjZcIixcbiAgICAgIHBsdXNNaW51czogXCJcdTAwQjFcIixcbiAgICAgIHF1ZXN0aW9uOiBcIj9cIixcbiAgICAgIHNlY3Rpb246IFwiXHUwMEE3XCIsXG4gICAgICBzdGFyc09mZjogXCJcdTI2MDZcIixcbiAgICAgIHN0YXJzT246IFwiXHUyNjA1XCIsXG4gICAgICB1cERvd25BcnJvdzogXCJcdTIxOTVcIlxuICAgIH0sIG8gPSBPYmplY3QuYXNzaWduKHt9LCBkLCB7XG4gICAgICBjaGVjazogXCJcdTIyMUFcIixcbiAgICAgIGNyb3NzOiBcIlx1MDBEN1wiLFxuICAgICAgZWxsaXBzaXNMYXJnZTogXCIuLi5cIixcbiAgICAgIGVsbGlwc2lzOiBcIi4uLlwiLFxuICAgICAgaW5mbzogXCJpXCIsXG4gICAgICBxdWVzdGlvblNtYWxsOiBcIj9cIixcbiAgICAgIHBvaW50ZXI6IFwiPlwiLFxuICAgICAgcG9pbnRlclNtYWxsOiBcIlx1MDBCQlwiLFxuICAgICAgcmFkaW9PZmY6IFwiKCApXCIsXG4gICAgICByYWRpb09uOiBcIigqKVwiLFxuICAgICAgd2FybmluZzogXCJcdTIwM0NcIlxuICAgIH0pLCBwID0gT2JqZWN0LmFzc2lnbih7fSwgZCwge1xuICAgICAgYmFsbG90Q3Jvc3M6IFwiXHUyNzE4XCIsXG4gICAgICBjaGVjazogXCJcdTI3MTRcIixcbiAgICAgIGNyb3NzOiBcIlx1MjcxNlwiLFxuICAgICAgZWxsaXBzaXNMYXJnZTogXCJcdTIyRUZcIixcbiAgICAgIGVsbGlwc2lzOiBcIlx1MjAyNlwiLFxuICAgICAgaW5mbzogXCJcdTIxMzlcIixcbiAgICAgIHF1ZXN0aW9uRnVsbDogXCJcdUZGMUZcIixcbiAgICAgIHF1ZXN0aW9uU21hbGw6IFwiXHVGRTU2XCIsXG4gICAgICBwb2ludGVyOiBhID8gXCJcdTI1QjhcIiA6IFwiXHUyNzZGXCIsXG4gICAgICBwb2ludGVyU21hbGw6IGEgPyBcIlx1MjAyM1wiIDogXCJcdTIwM0FcIixcbiAgICAgIHJhZGlvT2ZmOiBcIlx1MjVFRlwiLFxuICAgICAgcmFkaW9PbjogXCJcdTI1QzlcIixcbiAgICAgIHdhcm5pbmc6IFwiXHUyNkEwXCJcbiAgICB9KTtcbiAgICBlLmV4cG9ydHMgPSBuICYmICFyID8gbyA6IHAsIFJlZmxlY3QuZGVmaW5lUHJvcGVydHkoZS5leHBvcnRzLCBcImNvbW1vblwiLCB7IGVudW1lcmFibGU6ICExLCB2YWx1ZTogZCB9KSwgUmVmbGVjdC5kZWZpbmVQcm9wZXJ0eShlLmV4cG9ydHMsIFwid2luZG93c1wiLCB7IGVudW1lcmFibGU6ICExLCB2YWx1ZTogbyB9KSwgUmVmbGVjdC5kZWZpbmVQcm9wZXJ0eShlLmV4cG9ydHMsIFwib3RoZXJcIiwgeyBlbnVtZXJhYmxlOiAhMSwgdmFsdWU6IHAgfSk7XG4gIH0oSW8pKSwgSnQ7XG59XG5jb25zdCBEbyA9IChlKSA9PiBlICE9PSBudWxsICYmIHR5cGVvZiBlID09IFwib2JqZWN0XCIgJiYgIUFycmF5LmlzQXJyYXkoZSksIExvID0gL1tcXHUwMDFiXFx1MDA5Yl1bW1xcXSM7PygpXSooPzooPzooPzpbXlxcV19dKjs/W15cXFdfXSopXFx1MDAwNyl8KD86KD86WzAtOV17MSw0fSg7WzAtOV17MCw0fSkqKT9bfjAtOT08PmNmLW5xcnR5QS1QUlpdKSkvZywgem8gPSAoKSA9PiB0eXBlb2YgcHJvY2VzcyA8IFwidVwiID8gcHJvY2Vzcy5lbnYuRk9SQ0VfQ09MT1IgIT09IFwiMFwiIDogITEsIHNzID0gKCkgPT4ge1xuICBjb25zdCBlID0ge1xuICAgIGVuYWJsZWQ6IHpvKCksXG4gICAgdmlzaWJsZTogITAsXG4gICAgc3R5bGVzOiB7fSxcbiAgICBrZXlzOiB7fVxuICB9LCByID0gKG8pID0+IHtcbiAgICBsZXQgcCA9IG8ub3BlbiA9IGBcXHgxQlske28uY29kZXNbMF19bWAsIHkgPSBvLmNsb3NlID0gYFxceDFCWyR7by5jb2Rlc1sxXX1tYCwgYiA9IG8ucmVnZXggPSBuZXcgUmVnRXhwKGBcXFxcdTAwMWJcXFxcWyR7by5jb2Rlc1sxXX1tYCwgXCJnXCIpO1xuICAgIHJldHVybiBvLndyYXAgPSAodiwgZykgPT4ge1xuICAgICAgdi5pbmNsdWRlcyh5KSAmJiAodiA9IHYucmVwbGFjZShiLCB5ICsgcCkpO1xuICAgICAgbGV0IFMgPSBwICsgdiArIHk7XG4gICAgICByZXR1cm4gZyA/IFMucmVwbGFjZSgvXFxyKlxcbi9nLCBgJHt5fSQmJHtwfWApIDogUztcbiAgICB9LCBvO1xuICB9LCBuID0gKG8sIHAsIHkpID0+IHR5cGVvZiBvID09IFwiZnVuY3Rpb25cIiA/IG8ocCkgOiBvLndyYXAocCwgeSksIGEgPSAobywgcCkgPT4ge1xuICAgIGlmIChvID09PSBcIlwiIHx8IG8gPT0gbnVsbClcbiAgICAgIHJldHVybiBcIlwiO1xuICAgIGlmIChlLmVuYWJsZWQgPT09ICExKVxuICAgICAgcmV0dXJuIG87XG4gICAgaWYgKGUudmlzaWJsZSA9PT0gITEpXG4gICAgICByZXR1cm4gXCJcIjtcbiAgICBsZXQgeSA9IFwiXCIgKyBvLCBiID0geS5pbmNsdWRlcyhgXG5gKSwgdiA9IHAubGVuZ3RoO1xuICAgIGZvciAodiA+IDAgJiYgcC5pbmNsdWRlcyhcInVuc3R5bGVcIikgJiYgKHAgPSBbLi4uLyogQF9fUFVSRV9fICovIG5ldyBTZXQoW1widW5zdHlsZVwiLCAuLi5wXSldLnJldmVyc2UoKSk7IHYtLSA+IDA7IClcbiAgICAgIHkgPSBuKGUuc3R5bGVzW3Bbdl1dLCB5LCBiKTtcbiAgICByZXR1cm4geTtcbiAgfSwgZCA9IChvLCBwLCB5KSA9PiB7XG4gICAgZS5zdHlsZXNbb10gPSByKHsgbmFtZTogbywgY29kZXM6IHAgfSksIChlLmtleXNbeV0gfHwgKGUua2V5c1t5XSA9IFtdKSkucHVzaChvKSwgUmVmbGVjdC5kZWZpbmVQcm9wZXJ0eShlLCBvLCB7XG4gICAgICBjb25maWd1cmFibGU6ICEwLFxuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBzZXQoYikge1xuICAgICAgICBlLmFsaWFzKG8sIGIpO1xuICAgICAgfSxcbiAgICAgIGdldCgpIHtcbiAgICAgICAgbGV0IGIgPSAodikgPT4gYSh2LCBiLnN0YWNrKTtcbiAgICAgICAgcmV0dXJuIFJlZmxlY3Quc2V0UHJvdG90eXBlT2YoYiwgZSksIGIuc3RhY2sgPSB0aGlzLnN0YWNrID8gdGhpcy5zdGFjay5jb25jYXQobykgOiBbb10sIGI7XG4gICAgICB9XG4gICAgfSk7XG4gIH07XG4gIHJldHVybiBkKFwicmVzZXRcIiwgWzAsIDBdLCBcIm1vZGlmaWVyXCIpLCBkKFwiYm9sZFwiLCBbMSwgMjJdLCBcIm1vZGlmaWVyXCIpLCBkKFwiZGltXCIsIFsyLCAyMl0sIFwibW9kaWZpZXJcIiksIGQoXCJpdGFsaWNcIiwgWzMsIDIzXSwgXCJtb2RpZmllclwiKSwgZChcInVuZGVybGluZVwiLCBbNCwgMjRdLCBcIm1vZGlmaWVyXCIpLCBkKFwiaW52ZXJzZVwiLCBbNywgMjddLCBcIm1vZGlmaWVyXCIpLCBkKFwiaGlkZGVuXCIsIFs4LCAyOF0sIFwibW9kaWZpZXJcIiksIGQoXCJzdHJpa2V0aHJvdWdoXCIsIFs5LCAyOV0sIFwibW9kaWZpZXJcIiksIGQoXCJibGFja1wiLCBbMzAsIDM5XSwgXCJjb2xvclwiKSwgZChcInJlZFwiLCBbMzEsIDM5XSwgXCJjb2xvclwiKSwgZChcImdyZWVuXCIsIFszMiwgMzldLCBcImNvbG9yXCIpLCBkKFwieWVsbG93XCIsIFszMywgMzldLCBcImNvbG9yXCIpLCBkKFwiYmx1ZVwiLCBbMzQsIDM5XSwgXCJjb2xvclwiKSwgZChcIm1hZ2VudGFcIiwgWzM1LCAzOV0sIFwiY29sb3JcIiksIGQoXCJjeWFuXCIsIFszNiwgMzldLCBcImNvbG9yXCIpLCBkKFwid2hpdGVcIiwgWzM3LCAzOV0sIFwiY29sb3JcIiksIGQoXCJncmF5XCIsIFs5MCwgMzldLCBcImNvbG9yXCIpLCBkKFwiZ3JleVwiLCBbOTAsIDM5XSwgXCJjb2xvclwiKSwgZChcImJnQmxhY2tcIiwgWzQwLCA0OV0sIFwiYmdcIiksIGQoXCJiZ1JlZFwiLCBbNDEsIDQ5XSwgXCJiZ1wiKSwgZChcImJnR3JlZW5cIiwgWzQyLCA0OV0sIFwiYmdcIiksIGQoXCJiZ1llbGxvd1wiLCBbNDMsIDQ5XSwgXCJiZ1wiKSwgZChcImJnQmx1ZVwiLCBbNDQsIDQ5XSwgXCJiZ1wiKSwgZChcImJnTWFnZW50YVwiLCBbNDUsIDQ5XSwgXCJiZ1wiKSwgZChcImJnQ3lhblwiLCBbNDYsIDQ5XSwgXCJiZ1wiKSwgZChcImJnV2hpdGVcIiwgWzQ3LCA0OV0sIFwiYmdcIiksIGQoXCJibGFja0JyaWdodFwiLCBbOTAsIDM5XSwgXCJicmlnaHRcIiksIGQoXCJyZWRCcmlnaHRcIiwgWzkxLCAzOV0sIFwiYnJpZ2h0XCIpLCBkKFwiZ3JlZW5CcmlnaHRcIiwgWzkyLCAzOV0sIFwiYnJpZ2h0XCIpLCBkKFwieWVsbG93QnJpZ2h0XCIsIFs5MywgMzldLCBcImJyaWdodFwiKSwgZChcImJsdWVCcmlnaHRcIiwgWzk0LCAzOV0sIFwiYnJpZ2h0XCIpLCBkKFwibWFnZW50YUJyaWdodFwiLCBbOTUsIDM5XSwgXCJicmlnaHRcIiksIGQoXCJjeWFuQnJpZ2h0XCIsIFs5NiwgMzldLCBcImJyaWdodFwiKSwgZChcIndoaXRlQnJpZ2h0XCIsIFs5NywgMzldLCBcImJyaWdodFwiKSwgZChcImJnQmxhY2tCcmlnaHRcIiwgWzEwMCwgNDldLCBcImJnQnJpZ2h0XCIpLCBkKFwiYmdSZWRCcmlnaHRcIiwgWzEwMSwgNDldLCBcImJnQnJpZ2h0XCIpLCBkKFwiYmdHcmVlbkJyaWdodFwiLCBbMTAyLCA0OV0sIFwiYmdCcmlnaHRcIiksIGQoXCJiZ1llbGxvd0JyaWdodFwiLCBbMTAzLCA0OV0sIFwiYmdCcmlnaHRcIiksIGQoXCJiZ0JsdWVCcmlnaHRcIiwgWzEwNCwgNDldLCBcImJnQnJpZ2h0XCIpLCBkKFwiYmdNYWdlbnRhQnJpZ2h0XCIsIFsxMDUsIDQ5XSwgXCJiZ0JyaWdodFwiKSwgZChcImJnQ3lhbkJyaWdodFwiLCBbMTA2LCA0OV0sIFwiYmdCcmlnaHRcIiksIGQoXCJiZ1doaXRlQnJpZ2h0XCIsIFsxMDcsIDQ5XSwgXCJiZ0JyaWdodFwiKSwgZS5hbnNpUmVnZXggPSBMbywgZS5oYXNDb2xvciA9IGUuaGFzQW5zaSA9IChvKSA9PiAoZS5hbnNpUmVnZXgubGFzdEluZGV4ID0gMCwgdHlwZW9mIG8gPT0gXCJzdHJpbmdcIiAmJiBvICE9PSBcIlwiICYmIGUuYW5zaVJlZ2V4LnRlc3QobykpLCBlLmFsaWFzID0gKG8sIHApID0+IHtcbiAgICBsZXQgeSA9IHR5cGVvZiBwID09IFwic3RyaW5nXCIgPyBlW3BdIDogcDtcbiAgICBpZiAodHlwZW9mIHkgIT0gXCJmdW5jdGlvblwiKVxuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkV4cGVjdGVkIGFsaWFzIHRvIGJlIHRoZSBuYW1lIG9mIGFuIGV4aXN0aW5nIGNvbG9yIChzdHJpbmcpIG9yIGEgZnVuY3Rpb25cIik7XG4gICAgeS5zdGFjayB8fCAoUmVmbGVjdC5kZWZpbmVQcm9wZXJ0eSh5LCBcIm5hbWVcIiwgeyB2YWx1ZTogbyB9KSwgZS5zdHlsZXNbb10gPSB5LCB5LnN0YWNrID0gW29dKSwgUmVmbGVjdC5kZWZpbmVQcm9wZXJ0eShlLCBvLCB7XG4gICAgICBjb25maWd1cmFibGU6ICEwLFxuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBzZXQoYikge1xuICAgICAgICBlLmFsaWFzKG8sIGIpO1xuICAgICAgfSxcbiAgICAgIGdldCgpIHtcbiAgICAgICAgbGV0IGIgPSAodikgPT4gYSh2LCBiLnN0YWNrKTtcbiAgICAgICAgcmV0dXJuIFJlZmxlY3Quc2V0UHJvdG90eXBlT2YoYiwgZSksIGIuc3RhY2sgPSB0aGlzLnN0YWNrID8gdGhpcy5zdGFjay5jb25jYXQoeS5zdGFjaykgOiB5LnN0YWNrLCBiO1xuICAgICAgfVxuICAgIH0pO1xuICB9LCBlLnRoZW1lID0gKG8pID0+IHtcbiAgICBpZiAoIURvKG8pKVxuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkV4cGVjdGVkIHRoZW1lIHRvIGJlIGFuIG9iamVjdFwiKTtcbiAgICBmb3IgKGxldCBwIG9mIE9iamVjdC5rZXlzKG8pKVxuICAgICAgZS5hbGlhcyhwLCBvW3BdKTtcbiAgICByZXR1cm4gZTtcbiAgfSwgZS5hbGlhcyhcInVuc3R5bGVcIiwgKG8pID0+IHR5cGVvZiBvID09IFwic3RyaW5nXCIgJiYgbyAhPT0gXCJcIiA/IChlLmFuc2lSZWdleC5sYXN0SW5kZXggPSAwLCBvLnJlcGxhY2UoZS5hbnNpUmVnZXgsIFwiXCIpKSA6IFwiXCIpLCBlLmFsaWFzKFwibm9vcFwiLCAobykgPT4gbyksIGUubm9uZSA9IGUuY2xlYXIgPSBlLm5vb3AsIGUuc3RyaXBDb2xvciA9IGUudW5zdHlsZSwgZS5zeW1ib2xzID0gTW8oKSwgZS5kZWZpbmUgPSBkLCBlO1xufTtcbkFvLmV4cG9ydHMgPSBzcygpO1xuU2UuY3JlYXRlID0gc3M7XG5sZXQgWnQsIHVzLCBkcywgaXMsIG9zID0gITA7XG50eXBlb2YgcHJvY2VzcyA8IFwidVwiICYmICh7IEZPUkNFX0NPTE9SOiBadCwgTk9ERV9ESVNBQkxFX0NPTE9SUzogdXMsIE5PX0NPTE9SOiBkcywgVEVSTTogaXMgfSA9IHByb2Nlc3MuZW52IHx8IHt9LCBvcyA9IHByb2Nlc3Muc3Rkb3V0ICYmIHByb2Nlc3Muc3Rkb3V0LmlzVFRZKTtcbmNvbnN0IHRlID0ge1xuICBlbmFibGVkOiAhdXMgJiYgZHMgPT0gbnVsbCAmJiBpcyAhPT0gXCJkdW1iXCIgJiYgKFp0ICE9IG51bGwgJiYgWnQgIT09IFwiMFwiIHx8IG9zKSxcbiAgLy8gbW9kaWZpZXJzXG4gIHJlc2V0OiBsZSgwLCAwKSxcbiAgYm9sZDogbGUoMSwgMjIpLFxuICBkaW06IGxlKDIsIDIyKSxcbiAgaXRhbGljOiBsZSgzLCAyMyksXG4gIHVuZGVybGluZTogbGUoNCwgMjQpLFxuICBpbnZlcnNlOiBsZSg3LCAyNyksXG4gIGhpZGRlbjogbGUoOCwgMjgpLFxuICBzdHJpa2V0aHJvdWdoOiBsZSg5LCAyOSksXG4gIC8vIGNvbG9yc1xuICBibGFjazogbGUoMzAsIDM5KSxcbiAgcmVkOiBsZSgzMSwgMzkpLFxuICBncmVlbjogbGUoMzIsIDM5KSxcbiAgeWVsbG93OiBsZSgzMywgMzkpLFxuICBibHVlOiBsZSgzNCwgMzkpLFxuICBtYWdlbnRhOiBsZSgzNSwgMzkpLFxuICBjeWFuOiBsZSgzNiwgMzkpLFxuICB3aGl0ZTogbGUoMzcsIDM5KSxcbiAgZ3JheTogbGUoOTAsIDM5KSxcbiAgZ3JleTogbGUoOTAsIDM5KSxcbiAgLy8gYmFja2dyb3VuZCBjb2xvcnNcbiAgYmdCbGFjazogbGUoNDAsIDQ5KSxcbiAgYmdSZWQ6IGxlKDQxLCA0OSksXG4gIGJnR3JlZW46IGxlKDQyLCA0OSksXG4gIGJnWWVsbG93OiBsZSg0MywgNDkpLFxuICBiZ0JsdWU6IGxlKDQ0LCA0OSksXG4gIGJnTWFnZW50YTogbGUoNDUsIDQ5KSxcbiAgYmdDeWFuOiBsZSg0NiwgNDkpLFxuICBiZ1doaXRlOiBsZSg0NywgNDkpXG59O1xuZnVuY3Rpb24geW4oZSwgcikge1xuICBsZXQgbiA9IDAsIGEsIGQgPSBcIlwiLCBvID0gXCJcIjtcbiAgZm9yICg7IG4gPCBlLmxlbmd0aDsgbisrKVxuICAgIGEgPSBlW25dLCBkICs9IGEub3BlbiwgbyArPSBhLmNsb3NlLCB+ci5pbmRleE9mKGEuY2xvc2UpICYmIChyID0gci5yZXBsYWNlKGEucmd4LCBhLmNsb3NlICsgYS5vcGVuKSk7XG4gIHJldHVybiBkICsgciArIG87XG59XG5mdW5jdGlvbiBWbyhlLCByKSB7XG4gIGxldCBuID0geyBoYXM6IGUsIGtleXM6IHIgfTtcbiAgcmV0dXJuIG4ucmVzZXQgPSB0ZS5yZXNldC5iaW5kKG4pLCBuLmJvbGQgPSB0ZS5ib2xkLmJpbmQobiksIG4uZGltID0gdGUuZGltLmJpbmQobiksIG4uaXRhbGljID0gdGUuaXRhbGljLmJpbmQobiksIG4udW5kZXJsaW5lID0gdGUudW5kZXJsaW5lLmJpbmQobiksIG4uaW52ZXJzZSA9IHRlLmludmVyc2UuYmluZChuKSwgbi5oaWRkZW4gPSB0ZS5oaWRkZW4uYmluZChuKSwgbi5zdHJpa2V0aHJvdWdoID0gdGUuc3RyaWtldGhyb3VnaC5iaW5kKG4pLCBuLmJsYWNrID0gdGUuYmxhY2suYmluZChuKSwgbi5yZWQgPSB0ZS5yZWQuYmluZChuKSwgbi5ncmVlbiA9IHRlLmdyZWVuLmJpbmQobiksIG4ueWVsbG93ID0gdGUueWVsbG93LmJpbmQobiksIG4uYmx1ZSA9IHRlLmJsdWUuYmluZChuKSwgbi5tYWdlbnRhID0gdGUubWFnZW50YS5iaW5kKG4pLCBuLmN5YW4gPSB0ZS5jeWFuLmJpbmQobiksIG4ud2hpdGUgPSB0ZS53aGl0ZS5iaW5kKG4pLCBuLmdyYXkgPSB0ZS5ncmF5LmJpbmQobiksIG4uZ3JleSA9IHRlLmdyZXkuYmluZChuKSwgbi5iZ0JsYWNrID0gdGUuYmdCbGFjay5iaW5kKG4pLCBuLmJnUmVkID0gdGUuYmdSZWQuYmluZChuKSwgbi5iZ0dyZWVuID0gdGUuYmdHcmVlbi5iaW5kKG4pLCBuLmJnWWVsbG93ID0gdGUuYmdZZWxsb3cuYmluZChuKSwgbi5iZ0JsdWUgPSB0ZS5iZ0JsdWUuYmluZChuKSwgbi5iZ01hZ2VudGEgPSB0ZS5iZ01hZ2VudGEuYmluZChuKSwgbi5iZ0N5YW4gPSB0ZS5iZ0N5YW4uYmluZChuKSwgbi5iZ1doaXRlID0gdGUuYmdXaGl0ZS5iaW5kKG4pLCBuO1xufVxuZnVuY3Rpb24gbGUoZSwgcikge1xuICBsZXQgbiA9IHtcbiAgICBvcGVuOiBgXFx4MUJbJHtlfW1gLFxuICAgIGNsb3NlOiBgXFx4MUJbJHtyfW1gLFxuICAgIHJneDogbmV3IFJlZ0V4cChgXFxcXHgxYlxcXFxbJHtyfW1gLCBcImdcIilcbiAgfTtcbiAgcmV0dXJuIGZ1bmN0aW9uKGEpIHtcbiAgICByZXR1cm4gdGhpcyAhPT0gdm9pZCAwICYmIHRoaXMuaGFzICE9PSB2b2lkIDAgPyAofnRoaXMuaGFzLmluZGV4T2YoZSkgfHwgKHRoaXMuaGFzLnB1c2goZSksIHRoaXMua2V5cy5wdXNoKG4pKSwgYSA9PT0gdm9pZCAwID8gdGhpcyA6IHRlLmVuYWJsZWQgPyB5bih0aGlzLmtleXMsIGEgKyBcIlwiKSA6IGEgKyBcIlwiKSA6IGEgPT09IHZvaWQgMCA/IFZvKFtlXSwgW25dKSA6IHRlLmVuYWJsZWQgPyB5bihbbl0sIGEgKyBcIlwiKSA6IGEgKyBcIlwiO1xuICB9O1xufVxudmFyIEZvID0gT2JqZWN0LmRlZmluZVByb3BlcnR5LCBVbyA9IChlLCByLCBuKSA9PiByIGluIGUgPyBGbyhlLCByLCB7IGVudW1lcmFibGU6ICEwLCBjb25maWd1cmFibGU6ICEwLCB3cml0YWJsZTogITAsIHZhbHVlOiBuIH0pIDogZVtyXSA9IG4sICRlID0gKGUsIHIsIG4pID0+IChVbyhlLCB0eXBlb2YgciAhPSBcInN5bWJvbFwiID8gciArIFwiXCIgOiByLCBuKSwgbik7XG5jb25zdCBVZSA9IGNsYXNzIHtcbiAgLyoqXG4gICAqIFx1NjhDMFx1NkQ0Qlx1NjYyRlx1NTQyNlx1OEZEMFx1ODg0Q1x1NTcyOENocm9tZVx1NjNEMlx1NEVGNlx1NEUyRFxuICAgKi9cbiAgc3RhdGljIGlzSW5DaHJvbWVFeHRlbnNpb24oKSB7XG4gICAgcmV0dXJuIFVlLmlzSW5Ccm93c2VyID8gd2luZG93LmxvY2F0aW9uLmhyZWYuaW5kZXhPZihcImNocm9tZS1leHRlbnNpb246Ly9cIikgPiAtMSA6ICExO1xuICB9XG59O1xubGV0IG9lID0gVWU7XG4kZShvZSwgXCJpc05vZGVcIiwgdHlwZW9mIHByb2Nlc3MgPCBcInVcIiksIC8qKlxuKiBcdTY2MkZcdTU0MjZcdTU3MjhcdTZENEZcdTg5QzhcdTU2NjhcdTczQUZcdTU4ODNcbiovXG4kZShvZSwgXCJpc0luQnJvd3NlclwiLCB0eXBlb2Ygd2luZG93IDwgXCJ1XCIpLCAvKipcbiogXHU2RDRGXHU4OUM4XHU1NjY4XHU4REVGXHU1Rjg0XHU1MjA2XHU5Njk0XHU3QjI2XG4qL1xuJGUob2UsIFwiQnJvd3NlclNlcGVyYXRvclwiLCBcIi9cIiksIC8qKlxuKiBcdTY2MkZcdTU0MjZcdTY2MkZFbGVjdHJvblx1NzNBRlx1NTg4M1xuKi9cbiRlKG9lLCBcImlzRWxlY3Ryb25cIiwgKCkgPT4gIVVlLmlzSW5Ccm93c2VyIHx8ICF3aW5kb3cubmF2aWdhdG9yIHx8ICF3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudCA/ICExIDogL0VsZWN0cm9uLy50ZXN0KHdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50KSksIC8qKlxuKiBcdTY2MkZcdTU0MjZcdTY3MDlOb2RlXHU3M0FGXHU1ODgzXHVGRjBDXHU3NkVFXHU1MjREXHU1MzA1XHU2MkVDIEVsZWN0cm9uIFx1NTQ4QyBOb2RlXG4qL1xuJGUob2UsIFwiaGFzTm9kZUVudlwiLCAoKSA9PiBVZS5pc0VsZWN0cm9uKCkgfHwgVWUuaXNOb2RlKSwgLyoqXG4qIFx1ODNCN1x1NTNENnVybFx1NTNDMlx1NjU3MFxuKlxuKiBAcGFyYW0gc1BhcmFtIC0gXHU1M0MyXHU2NTcwXG4qL1xuJGUob2UsIFwiZ2V0UXVlcnlTdHJpbmdcIiwgKGUpID0+IHtcbiAgaWYgKCFVZS5pc0luQnJvd3NlcilcbiAgICByZXR1cm4gXCJcIjtcbiAgY29uc3QgciA9IHdpbmRvdy5sb2NhdGlvbi5zZWFyY2guc3Vic3RyaW5nKDEpLnNwbGl0KFwiJlwiKTtcbiAgZm9yIChsZXQgbiA9IDA7IG4gPCByLmxlbmd0aDsgbisrKSB7XG4gICAgY29uc3QgYSA9IHJbbl0uc3BsaXQoXCI9XCIpO1xuICAgIGlmIChhWzBdID09PSBlKVxuICAgICAgcmV0dXJuIGFbMV07XG4gIH1cbiAgcmV0dXJuIFwiXCI7XG59KSwgLyoqXG4qIFx1NjZGRlx1NjM2MiBVUkwgXHU3Njg0XHU1M0MyXHU2NTcwXG4qIFx1NjAxRFx1OERFRlx1RkYxQVxuKiAxLiBcdTRGN0ZcdTc1MjhcdTRFODYgVVJMU2VhcmNoUGFyYW1zIFx1NUJGOVx1OEM2MVx1Njc2NVx1ODlFM1x1Njc5MFx1NTQ4Q1x1Njc4NFx1NUVGQSBVUkwgXHU2N0U1XHU4QkUyXHU1M0MyXHU2NTcwXHUzMDAyXG4qXG4qIDIuIFx1NTcyOFx1NTkwNFx1NzQwNlx1NTMwNVx1NTQyQiBoYXNoIFx1NzI0N1x1NkJCNVx1NzY4NCBVUkwgXHU2NUY2XHU0RjdGXHU3NTI4XHU0RTg2IHNwbGl0IFx1NTFGRFx1NjU3MFx1NUMwNiBVUkwgXHU1MjA2XHU2MjEwXHU0RTI0XHU5MEU4XHU1MjA2XHVGRjFBXHU1N0ZBXHU2NzJDIFVSTCBcdTU0OEMgaGFzaCBcdTcyNDdcdTZCQjVcdTMwMDJcbipcbiogMy4gXHU3MTM2XHU1NDBFXHVGRjBDXHU1MThEXHU2QjIxXHU0RjdGXHU3NTI4IHNwbGl0IFx1NTFGRFx1NjU3MFx1NUMwNlx1NTdGQVx1NjcyQyBVUkwgXHU1MjA2XHU2MjEwXHU0RTI0XHU5MEU4XHU1MjA2XHVGRjFBXHU4REVGXHU1Rjg0XHU1NDhDXHU2N0U1XHU4QkUyXHU1M0MyXHU2NTcwXHUzMDAyXG4qXG4qIDQuIFx1NUMwNlx1NjdFNVx1OEJFMlx1NTNDMlx1NjU3MFx1OEY2Q1x1NjM2Mlx1NEUzQSBVUkxTZWFyY2hQYXJhbXMgXHU1QkY5XHU4QzYxXHVGRjBDXHU3MTM2XHU1NDBFXHU4QkJFXHU3RjZFXHU2MzA3XHU1QjlBXHU3Njg0XHU1M0MyXHU2NTcwXHU1NDBEXHU1NDhDXHU1MDNDXHUzMDAyXG4qXG4qIDUuIFx1NjcwMFx1NTQwRVx1RkYwQ1x1NEY3Rlx1NzUyOCB0b1N0cmluZyBcdTUxRkRcdTY1NzBcdTVDMDZcdTY3RTVcdThCRTJcdTUzQzJcdTY1NzBcdThGNkNcdTYzNjJcdTRFM0FcdTVCNTdcdTdCMjZcdTRFMzJcdUZGMENcdTVFNzZcdTVDMDZcdTUxNzZcdTRFMEVcdThERUZcdTVGODRcdTdFQzRcdTU0MDhcdTYyMTBcdTY1QjBcdTc2ODRcdTU3RkFcdTY3MkMgVVJMXHUzMDAyXHU1OTgyXHU2NzlDIFVSTCBcdTUzMDVcdTU0MkIgaGFzaCBcdTcyNDdcdTZCQjVcdUZGMENcdTUyMTlcdTVDMDZcdTUxNzZcdTZERkJcdTUyQTBcdTUyMzBcdTY1QjBcdTc2ODRcdTU3RkFcdTY3MkMgVVJMIFx1NEUyRFx1MzAwMlxuKlxuKiBAcGFyYW0gdXJsIC0gXHU5NEZFXHU2M0E1XHU1NzMwXHU1NzQwXG4qIEBwYXJhbSBwYXJhbU5hbWUgLSBcdTUzQzJcdTY1NzBcdTU0MERcbiogQHBhcmFtIHBhcmFtVmFsdWUgLSBcdTUzQzJcdTY1NzBcdTUwM0NcbiovXG4kZShvZSwgXCJyZXBsYWNlVXJsUGFyYW1cIiwgKGUsIHIsIG4pID0+IHtcbiAgbiA9PSBudWxsICYmIChuID0gXCJcIik7XG4gIGNvbnN0IGEgPSBuZXcgUmVnRXhwKFwiXFxcXGIoXCIgKyByICsgXCI9KS4qPygmfCN8JClcIik7XG4gIGlmIChlLnNlYXJjaChhKSA+PSAwKVxuICAgIHJldHVybiBlLnJlcGxhY2UoYSwgXCIkMVwiICsgbiArIFwiJDJcIik7XG4gIGNvbnN0IFtkLCBvXSA9IGUuc3BsaXQoXCIjXCIpLCBbcCwgeV0gPSBkLnNwbGl0KFwiP1wiKSwgYiA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoeSk7XG4gIGIuc2V0KHIsIG4pO1xuICBjb25zdCB2ID0gYi50b1N0cmluZygpLCBnID0gcCArICh2ID8gXCI/XCIgKyB2IDogXCJcIik7XG4gIHJldHVybiBvID8gZyArIFwiI1wiICsgbyA6IGc7XG59KSwgLyoqXG4qIFx1OEJCRVx1N0Y2RXVybFx1NTNDMlx1NjU3MFxuKlxuKiBAcGFyYW0gdXJsc3RyaW5nIC0gdXJsXG4qIEBwYXJhbSBrZXkgLSBrZXlcbiogQHBhcmFtIHZhbHVlIC0gdmFsdWVcbiovXG4kZShvZSwgXCJzZXRVcmxQYXJhbWV0ZXJcIiwgKGUsIHIsIG4pID0+IHtcbiAgaWYgKGUuaW5jbHVkZXMocikpXG4gICAgcmV0dXJuIFVlLnJlcGxhY2VVcmxQYXJhbShlLCByLCBuKTtcbiAgY29uc3QgYSA9IGUuc3BsaXQoXCIjXCIpO1xuICBsZXQgZCA9IGFbMF07XG4gIGNvbnN0IG8gPSBhWzFdO1xuICByZXR1cm4gZC5pbmNsdWRlcyhcIj9cIikgPyBkICs9IGAmJHtyfT0ke259YCA6IGQgKz0gYD8ke3J9PSR7bn1gLCBvICYmIChkICs9IFwiI1wiICsgbyksIGQ7XG59KSwgLyoqXG4qIFx1OTFDRFx1NjVCMFx1NTJBMFx1OEY3RFx1NjMwN1x1NUI5QXRhYlxuKlxuKiBAcGFyYW0gdGFibmFtZSAtIHRhYm5hbWVcbiogQHBhcmFtIHQgLSBcdTVFRjZcdThGREZcdTY1RjZcdTk1RjRcbiovXG4kZShvZSwgXCJyZWxvYWRUYWJQYWdlXCIsIChlLCByID0gMjAwKSA9PiB7XG4gIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgaWYgKFVlLmlzSW5Ccm93c2VyKSB7XG4gICAgICBjb25zdCBuID0gd2luZG93LmxvY2F0aW9uLmhyZWY7XG4gICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IFVlLnNldFVybFBhcmFtZXRlcihuLCBcInRhYlwiLCBlKTtcbiAgICB9XG4gIH0sIHIpO1xufSksIC8qKlxuKiBcdTUyMzdcdTY1QjBcdTVGNTNcdTUyNER0YWJcdTk4NzVcdTk3NjJcbiovXG4kZShvZSwgXCJyZWxvYWRQYWdlXCIsICgpID0+IHtcbiAgc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICBVZS5pc0luQnJvd3NlciAmJiB3aW5kb3cubG9jYXRpb24ucmVsb2FkKCk7XG4gIH0sIDIwMCk7XG59KSwgLyoqXG4qIFx1NTIzN1x1NjVCMFx1NUY1M1x1NTI0RHRhYlx1OTg3NVx1OTc2MlxuKlxuKiBAcGFyYW0gbXNnIC0gXHU2RDg4XHU2MDZGXHU2M0QwXHU3OTNBXG4qIEBwYXJhbSBjYiAtIFx1NTZERVx1OEMwM1xuKi9cbiRlKG9lLCBcInJlbG9hZFBhZ2VXaXRoTWVzc2FnZUNhbGxiYWNrXCIsIChlLCByKSA9PiB7XG4gIHIgJiYgcihlKSwgc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICBVZS5pc0luQnJvd3NlciAmJiB3aW5kb3cubG9jYXRpb24ucmVsb2FkKCk7XG4gIH0sIDIwMCk7XG59KTtcbnZhciBUZSA9IC8qIEBfX1BVUkVfXyAqLyAoKGUpID0+IChlLkJhc2VQYXRoVHlwZV9BcHBlYXJhbmNlID0gXCJBcHBlYXJhbmNlXCIsIGUuQmFzZVBhdGhUeXBlX0RhdGEgPSBcIkRhdGFcIiwgZS5CYXNlUGF0aFR5cGVfVGhlbWVzID0gXCJUaGVtZXNcIiwgZS5CYXNlUGF0aFR5cGVfWmhpVGhlbWUgPSBcIlpoaVRoZW1lXCIsIGUuQmFzZVBhdGhUeXBlX05vbmUgPSBcIk5vbmVcIiwgZSkpKFRlIHx8IHt9KTtcbmNvbnN0IE9lID0gY2xhc3Mge1xuICAvKipcbiAgICogXHU2OEMwXHU2RDRCXHU2NjJGXHU1NDI2XHU4RkQwXHU4ODRDXHU1NzI4XHU2MDFEXHU2RTkwXHU2MjUzXHU1RjAwXHU3Njg0XHU2RDRGXHU4OUM4XHU1NjY4XHU0RTJEXG4gICAqL1xuICBzdGF0aWMgaXNJblNpeXVhbkJyb3dzZXIoKSB7XG4gICAgcmV0dXJuIG9lLmlzSW5Ccm93c2VyID8gdHlwZW9mIHdpbmRvdy5zaXl1YW4gPCBcInVcIiAmJiB0eXBlb2Ygd2luZG93Lkx1dGUgPCBcInVcIiA6ICExO1xuICB9XG4gIC8qKlxuICAgKiBcdTYwMURcdTZFOTBcdTdCMTRcdThCQjAgd2luZG93IFx1NUJGOVx1OEM2MVxuICAgKi9cbiAgc3RhdGljIHNpeXVhbldpbmRvdygpIHtcbiAgICBsZXQgZTtcbiAgICByZXR1cm4gdGhpcy5pc0luU2l5dWFuV2lkZ2V0KCkgPyBlID0gcGFyZW50LndpbmRvdyA6IHRoaXMuaXNJblNpeXVhbk5ld1dpbigpIHx8IHRoaXMuaXNJblNpeXVhbkJyb3dzZXIoKSB8fCB0eXBlb2Ygd2luZG93IDwgXCJ1XCIgPyBlID0gd2luZG93IDogZSA9IHZvaWQgMCwgZTtcbiAgfVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIHJlcXVpcmUgZW5kXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBpbXBvcnQgc3RhcnRcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvKipcbiAgICogXHU1RjE1XHU1MTY1anNvblxuICAgKlxuICAgKiBAcGFyYW0ganNQYXRoIC0ganNcdTc2RjhcdTVCRjlcdThERUZcdTVGODRcdTUxNjhcdThERUZcdTVGODRcbiAgICogQHBhcmFtIHR5cGUgLSBcdTdDN0JcdTU3OEJcbiAgICovXG4gIHN0YXRpYyBhc3luYyBpbXBvcnRKcyhlLCByKSB7XG4gICAgbGV0IG4gPSBlO1xuICAgIHN3aXRjaCAocikge1xuICAgICAgY2FzZSBUZS5CYXNlUGF0aFR5cGVfQXBwZWFyYW5jZTpcbiAgICAgICAgbiA9IHRoaXMuYnJvd3NlckpvaW5QYXRoKHRoaXMuc2l5dWFuQXBwZWFyYW5jZVJlbGF0aXZlUGF0aCgpLCBlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFRlLkJhc2VQYXRoVHlwZV9EYXRhOlxuICAgICAgICBuID0gdGhpcy5icm93c2VySm9pblBhdGgodGhpcy5zaXl1YW5EYXRhUmVsYXRpdmVQYXRoKCksIGUpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgVGUuQmFzZVBhdGhUeXBlX1RoZW1lczpcbiAgICAgICAgbiA9IHRoaXMuYnJvd3NlckpvaW5QYXRoKHRoaXMuc2l5dWFuVGhlbWVSZWxhdGl2ZVBhdGgoKSwgZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBUZS5CYXNlUGF0aFR5cGVfWmhpVGhlbWU6XG4gICAgICAgIG4gPSB0aGlzLmJyb3dzZXJKb2luUGF0aCh0aGlzLnpoaVRoZW1lUmVsYXRpdmVQYXRoKCksIGUpO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcInR5cGUgbXVzdCBiZSBwcm92aWRlZFwiKTtcbiAgICB9XG4gICAgY29uc3QgeyBkZWZhdWx0OiBhIH0gPSBhd2FpdCBpbXBvcnQoXG4gICAgICAvKiBAdml0ZS1pZ25vcmUgKi9cbiAgICAgIG5cbiAgICApO1xuICAgIHJldHVybiBhO1xuICB9XG4gIC8qKlxuICAgKiBcdTVGMTVcdTUxNjVqc29uXG4gICAqXG4gICAqIEBwYXJhbSBqc29uUGF0aCAtIGpzb25cdTc2RjhcdTVCRjlcdThERUZcdTVGODRcdTUxNjhcdThERUZcdTVGODRcbiAgICogQHBhcmFtIHR5cGUgLSBcdTdDN0JcdTU3OEJcbiAgICovXG4gIC8vIHB1YmxpYyBzdGF0aWMgYXN5bmMgaW1wb3J0SnNvbihqc29uUGF0aDogc3RyaW5nLCB0eXBlOiBCYXNlUGF0aFR5cGVFbnVtKSB7XG4gIC8vICAgbGV0IGZ1bGxKc29uUGF0aCA9IGpzb25QYXRoXG4gIC8vICAgc3dpdGNoICh0eXBlKSB7XG4gIC8vICAgICBjYXNlIEJhc2VQYXRoVHlwZUVudW0uQmFzZVBhdGhUeXBlX0FwcGVhcmFuY2U6XG4gIC8vICAgICAgIGZ1bGxKc29uUGF0aCA9IHRoaXMuYnJvd3NlckpvaW5QYXRoKHRoaXMuc2l5dWFuQXBwZWFyYW5jZVJlbGF0aXZlUGF0aCgpLCBqc29uUGF0aClcbiAgLy8gICAgICAgYnJlYWtcbiAgLy8gICAgIGNhc2UgQmFzZVBhdGhUeXBlRW51bS5CYXNlUGF0aFR5cGVfRGF0YTpcbiAgLy8gICAgICAgZnVsbEpzb25QYXRoID0gdGhpcy5icm93c2VySm9pblBhdGgodGhpcy5zaXl1YW5EYXRhUmVsYXRpdmVQYXRoKCksIGpzb25QYXRoKVxuICAvLyAgICAgICBicmVha1xuICAvLyAgICAgY2FzZSBCYXNlUGF0aFR5cGVFbnVtLkJhc2VQYXRoVHlwZV9UaGVtZXM6XG4gIC8vICAgICAgIGZ1bGxKc29uUGF0aCA9IHRoaXMuYnJvd3NlckpvaW5QYXRoKHRoaXMuc2l5dWFuVGhlbWVSZWxhdGl2ZVBhdGgoKSwganNvblBhdGgpXG4gIC8vICAgICAgIGJyZWFrXG4gIC8vICAgICBjYXNlIEJhc2VQYXRoVHlwZUVudW0uQmFzZVBhdGhUeXBlX1poaVRoZW1lOlxuICAvLyAgICAgICBmdWxsSnNvblBhdGggPSB0aGlzLmJyb3dzZXJKb2luUGF0aCh0aGlzLnpoaVRoZW1lUmVsYXRpdmVQYXRoKCksIGpzb25QYXRoKVxuICAvLyAgICAgICBicmVha1xuICAvLyAgICAgZGVmYXVsdDpcbiAgLy8gICAgICAgdGhyb3cgbmV3IEVycm9yKFwidHlwZSBtdXN0IGJlIHByb3ZpZGVkXCIpXG4gIC8vICAgfVxuICAvL1xuICAvLyAgIGNvbnN0IHsgZGVmYXVsdDogZGF0YSB9ID0gYXdhaXQgaW1wb3J0KC8qIEB2aXRlLWlnbm9yZSAqLyBmdWxsSnNvblBhdGgsIHsgYXNzZXJ0OiB7IHR5cGU6IFwianNvblwiIH0gfSlcbiAgLy8gICByZXR1cm4gZGF0YVxuICAvLyB9XG4gIC8qKlxuICAgKiBcdTVGMTVcdTUxNjUganNvbiAtIFx1NEVFNSBkYXRhIFx1NEUzQVx1NTdGQVx1NjcyQ1x1OERFRlx1NUY4NFxuICAgKlxuICAgKiBAcGFyYW0ganNvblBhdGggLSBcdTc2RjhcdTVCRjlcdTRFOEUgZGF0YSBcdTc2ODRcdTc2RjhcdTVCRjlcdThERUZcdTVGODRcbiAgICovXG4gIC8vIHB1YmxpYyBzdGF0aWMgYXN5bmMgaW1wb3J0RGF0YUpzb24oanNvblBhdGg6IHN0cmluZykge1xuICAvLyAgIHJldHVybiBhd2FpdCB0aGlzLmltcG9ydEpzb24oanNvblBhdGgsIEJhc2VQYXRoVHlwZUVudW0uQmFzZVBhdGhUeXBlX0RhdGEpXG4gIC8vIH1cbiAgLyoqXG4gICAqIFx1NUYxNVx1NTE2NSBqc29uIC0gXHU0RUU1IGFwcGVhcmFuY2UgXHU0RTNBXHU1N0ZBXHU2NzJDXHU4REVGXHU1Rjg0XG4gICAqXG4gICAqIEBwYXJhbSBqc29uUGF0aCAtIFx1NzZGOFx1NUJGOVx1NEU4RSBhcHBlYXJhbmNlIFx1NzY4NFx1NzZGOFx1NUJGOVx1OERFRlx1NUY4NFxuICAgKi9cbiAgLy8gcHVibGljIHN0YXRpYyBhc3luYyBpbXBvcnRBcHBlYXJhbmNlSnNvbihqc29uUGF0aDogc3RyaW5nKSB7XG4gIC8vICAgcmV0dXJuIGF3YWl0IHRoaXMuaW1wb3J0SnNvbihqc29uUGF0aCwgQmFzZVBhdGhUeXBlRW51bS5CYXNlUGF0aFR5cGVfQXBwZWFyYW5jZSlcbiAgLy8gfVxuICAvKipcbiAgICogXHU1RjE1XHU1MTY1IGpzb24gLSBcdTRFRTUgdGhlbWVzIFx1NEUzQVx1NTdGQVx1NjcyQ1x1OERFRlx1NUY4NFxuICAgKlxuICAgKiBAcGFyYW0ganNvblBhdGggLSBcdTc2RjhcdTVCRjlcdTRFOEUgdGhlbWVzIFx1NzY4NFx1NzZGOFx1NUJGOVx1OERFRlx1NUY4NFxuICAgKi9cbiAgLy8gcHVibGljIHN0YXRpYyBhc3luYyBpbXBvcnRUaGVtZXNKc29uKGpzb25QYXRoOiBzdHJpbmcpIHtcbiAgLy8gICByZXR1cm4gYXdhaXQgdGhpcy5pbXBvcnRKc29uKGpzb25QYXRoLCBCYXNlUGF0aFR5cGVFbnVtLkJhc2VQYXRoVHlwZV9UaGVtZXMpXG4gIC8vIH1cbiAgLyoqXG4gICAqIFx1NUYxNVx1NTE2NSB6aGkgXHU0RTNCXHU5ODk4XHU3Njg0IGpzb24gLSBcdTRFRTUgemhpIFx1NEUzQlx1OTg5OCBcdTc2ODRcdTY4MzlcdThERUZcdTVGODRcdTRFM0FcdTU3RkFcdTY3MkNcdThERUZcdTVGODRcbiAgICpcbiAgICogQHBhcmFtIGpzb25QYXRoIC0gXHU3NkY4XHU1QkY5XHU0RThFIHpoaSBcdTRFM0JcdTk4OThcdTY4MzlcdThERUZcdTVGODRcdTc2ODRcdTc2RjhcdTVCRjlcdThERUZcdTVGODRcbiAgICovXG4gIC8vIHB1YmxpYyBzdGF0aWMgYXN5bmMgaW1wb3J0WmhpVGhlbWVKc29uKGpzb25QYXRoOiBzdHJpbmcpIHtcbiAgLy8gICByZXR1cm4gYXdhaXQgdGhpcy5pbXBvcnRKc29uKGpzb25QYXRoLCBCYXNlUGF0aFR5cGVFbnVtLkJhc2VQYXRoVHlwZV9aaGlUaGVtZSlcbiAgLy8gfVxuICAvKipcbiAgICogXHU1RjE1XHU1MTY1IHpoaSBcdTRFM0JcdTk4OThcdTc2ODQganMgLSBcdTRFRTUgemhpIFx1NEUzQlx1OTg5OCBcdTc2ODRcdTY4MzlcdThERUZcdTVGODRcdTRFM0FcdTU3RkFcdTY3MkNcdThERUZcdTVGODRcbiAgICpcbiAgICogQHBhcmFtIGpzUGF0aCAtIFx1NzZGOFx1NUJGOVx1NEU4RSB6aGkgXHU0RTNCXHU5ODk4XHU2ODM5XHU4REVGXHU1Rjg0XHU3Njg0XHU3NkY4XHU1QkY5XHU4REVGXHU1Rjg0XG4gICAqL1xuICBzdGF0aWMgYXN5bmMgaW1wb3J0WmhpVGhlbWVKcyhlKSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuaW1wb3J0SnMoZSwgVGUuQmFzZVBhdGhUeXBlX1poaVRoZW1lKTtcbiAgfVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIGltcG9ydCBzdGFydFxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8qKlxuICAgKiBcdThERUZcdTVGODRcdTYyRkNcdTYzQTVcbiAgICpcbiAgICogQHBhcmFtIHBhdGhzIC0gXHU4REVGXHU1Rjg0XHU2NTcwXHU3RUM0XG4gICAqL1xuICBzdGF0aWMgam9pblBhdGgoLi4uZSkge1xuICAgIGlmIChvZS5oYXNOb2RlRW52KCkpIHtcbiAgICAgIGNvbnN0IHIgPSB0aGlzLnJlcXVpcmVMaWIoXCJwYXRoXCIpO1xuICAgICAgaWYgKHIpXG4gICAgICAgIHJldHVybiByLmpvaW4oLi4uZSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmJyb3dzZXJKb2luUGF0aCguLi5lKTtcbiAgfVxuICBzdGF0aWMgYnJvd3NlckpvaW5QYXRoKC4uLmUpIHtcbiAgICByZXR1cm4gZS5qb2luKG9lLkJyb3dzZXJTZXBlcmF0b3IpO1xuICB9XG4gIC8qKlxuICAgKiBcdTYwMURcdTZFOTBcdTdCMTRcdThCQjAgY29uZiBcdTc2RUVcdTVGNTVcbiAgICovXG4gIHN0YXRpYyBzaXl1YW5Db25mUGF0aCgpIHtcbiAgICBjb25zdCBlID0gdGhpcy5zaXl1YW5XaW5kb3coKTtcbiAgICBpZiAoIWUpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJOb3QgaW4gc2l5dWFuIGVudlwiKTtcbiAgICByZXR1cm4gZS5zaXl1YW4uY29uZmlnLnN5c3RlbS5jb25mRGlyO1xuICB9XG4gIC8qKlxuICAgKiBcdTYwMURcdTZFOTBcdTdCMTRcdThCQjAgZGF0YSBcdTc2RUVcdTVGNTVcbiAgICovXG4gIHN0YXRpYyBzaXl1YW5EYXRhUGF0aCgpIHtcbiAgICBjb25zdCBlID0gdGhpcy5zaXl1YW5XaW5kb3coKTtcbiAgICBpZiAoIWUpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJOb3QgaW4gc2l5dWFuIGVudlwiKTtcbiAgICByZXR1cm4gZS5zaXl1YW4uY29uZmlnLnN5c3RlbS5kYXRhRGlyO1xuICB9XG4gIC8qKlxuICAgKiBcdTYwMURcdTZFOTBcdTdCMTRcdThCQjAgZGF0YSBcdTc2RUVcdTVGNTUtXHU3NkY4XHU1QkY5XHU4REVGXHU1Rjg0XG4gICAqL1xuICBzdGF0aWMgc2l5dWFuRGF0YVJlbGF0aXZlUGF0aCgpIHtcbiAgICBpZiAoIXRoaXMuc2l5dWFuV2luZG93KCkpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJOb3QgaW4gc2l5dWFuIGVudlwiKTtcbiAgICByZXR1cm4gXCJcIjtcbiAgfVxuICAvKipcbiAgICogXHU2MDFEXHU2RTkwXHU3QjE0XHU4QkIwIGFwcGVhcmFuY2UgXHU3NkVFXHU1RjU1XG4gICAqL1xuICBzdGF0aWMgc2l5dWFuQXBwZWFyYW5jZVBhdGgoKSB7XG4gICAgcmV0dXJuIHRoaXMuam9pblBhdGgodGhpcy5zaXl1YW5Db25mUGF0aCgpLCBcImFwcGVhcmFuY2VcIik7XG4gIH1cbiAgLyoqXG4gICAqIFx1NjAxRFx1NkU5MFx1N0IxNFx1OEJCMCBhcHBlYXJhbmNlIFx1NzZFRVx1NUY1NS1cdTc2RjhcdTVCRjlcdThERUZcdTVGODRcbiAgICovXG4gIHN0YXRpYyBzaXl1YW5BcHBlYXJhbmNlUmVsYXRpdmVQYXRoKCkge1xuICAgIGlmICghdGhpcy5zaXl1YW5XaW5kb3coKSlcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vdCBpbiBzaXl1YW4gZW52XCIpO1xuICAgIHJldHVybiB0aGlzLmJyb3dzZXJKb2luUGF0aChcIlwiLCBcImFwcGVhcmFuY2VcIik7XG4gIH1cbiAgLyoqXG4gICAqIFx1NjAxRFx1NkU5MFx1N0IxNFx1OEJCMCB0aGVtZXMgXHU3NkVFXHU1RjU1LVx1N0VERFx1NUJGOVx1OERFRlx1NUY4NFxuICAgKlxuICAgKiBcdTZDRThcdTYxMEY6IFx1NTk4Mlx1Njc5Q1x1NjYyRlx1OTc1RSBlbGVjdHJvbiBcdTU0OEMgTm9kZSBcdTczQUZcdTU4ODNcdUZGMENcdThGRDlcdTkxQ0NcdThGRDRcdTU2REVcdTc2ODRcdTY2MkZcdTZENEZcdTg5QzhcdTU2NjhcdTc2ODRcdThERUZcdTVGODRcdUZGMENcdTRFMERcdTY2MkZcdTcyNjlcdTc0MDZcdThERUZcdTVGODRcbiAgICogXHU1OTgyXHU2NzlDXHU0RjdGXHU3NTI4XHU3MjY5XHU3NDA2XHU4REVGXHU1Rjg0XHVGRjBDXHU4QkY3XHU4QzAzXHU3NTI4IHNpeXVhbkFwcGVhcmFuY2VQYXRoIFx1NjIxNlx1ODAwNSBzaXl1YW5EYXRhUGF0aFxuICAgKlxuICAgKiBAYXV0aG9yIHRlcndlclxuICAgKiBAc2luY2UgMC4xLjBcbiAgICovXG4gIHN0YXRpYyBzaXl1YW5UaGVtZVBhdGgoKSB7XG4gICAgaWYgKG9lLmhhc05vZGVFbnYoKSlcbiAgICAgIHJldHVybiB0aGlzLmpvaW5QYXRoKHRoaXMuc2l5dWFuQXBwZWFyYW5jZVBhdGgoKSwgXCJ0aGVtZXNcIik7XG4gICAge1xuICAgICAgY29uc3QgZSA9IHRoaXMuc2l5dWFuV2luZG93KCk7XG4gICAgICBpZiAoIWUpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vdCBpbiBzaXl1YW4gZW52XCIpO1xuICAgICAgcmV0dXJuIHRoaXMuam9pblBhdGgoZS5sb2NhdGlvbi5vcmlnaW4sIFwiYXBwZWFyYW5jZVwiLCBcInRoZW1lc1wiKTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIFx1NjAxRFx1NkU5MFx1N0IxNFx1OEJCMCB0aGVtZXMgXHU3NkVFXHU1RjU1LVx1NzZGOFx1NUJGOVx1OERFRlx1NUY4NFxuICAgKi9cbiAgc3RhdGljIHNpeXVhblRoZW1lUmVsYXRpdmVQYXRoKCkge1xuICAgIGlmICghdGhpcy5zaXl1YW5XaW5kb3coKSlcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vdCBpbiBzaXl1YW4gZW52XCIpO1xuICAgIHJldHVybiB0aGlzLmJyb3dzZXJKb2luUGF0aChcIlwiLCBcImFwcGVhcmFuY2VcIiwgXCJ0aGVtZXNcIik7XG4gIH1cbiAgLyoqXG4gICAqIHpoaSBcdTRFM0JcdTk4OThcdTc2RUVcdTVGNTUgLSBcdTdFRERcdTVCRjlcdThERUZcdTVGODRcbiAgICovXG4gIHN0YXRpYyB6aGlUaGVtZVBhdGgoKSB7XG4gICAgcmV0dXJuIHRoaXMuam9pblBhdGgodGhpcy5zaXl1YW5UaGVtZVBhdGgoKSwgXCJ6aGlcIik7XG4gIH1cbiAgLyoqXG4gICAqIHpoaSBcdTRFM0JcdTk4OThcdTc2RUVcdTVGNTUgLSBcdTc2RjhcdTVCRjlcdThERUZcdTVGODRcbiAgICovXG4gIHN0YXRpYyB6aGlUaGVtZVJlbGF0aXZlUGF0aCgpIHtcbiAgICByZXR1cm4gdGhpcy5icm93c2VySm9pblBhdGgodGhpcy5zaXl1YW5UaGVtZVJlbGF0aXZlUGF0aCgpLCBcInpoaVwiKTtcbiAgfVxufTtcbmxldCBwciA9IE9lO1xuJGUocHIsIFwiaXNJblNpeXVhbldpZGdldFwiLCAoKSA9PiBvZS5pc0luQnJvd3NlciA/IHdpbmRvdy5mcmFtZUVsZW1lbnQgIT0gbnVsbCAmJiB3aW5kb3cuZnJhbWVFbGVtZW50LnBhcmVudEVsZW1lbnQgIT0gbnVsbCAmJiB3aW5kb3cuZnJhbWVFbGVtZW50LnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudCAhPSBudWxsICYmIHdpbmRvdy5mcmFtZUVsZW1lbnQucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmdldEF0dHJpYnV0ZShcImRhdGEtbm9kZS1pZFwiKSAhPT0gXCJcIiA6ICExKSwgLyoqXG4qIFx1NjAxRFx1NkU5MFx1N0IxNFx1OEJCMFx1NjVCMFx1N0E5N1x1NTNFM1xuKlxuKiBAZGVwcmVjYXRlZCB3aW5kb3cudGVyd2VyIFx1NTIyNFx1NjVBRFx1NjVCOVx1NUYwRlx1NURGMlx1NUU5Rlx1NUYwM1x1RkYwQ1x1NUVGQVx1OEJBRVx1NEVFNVx1NTQwRVx1NjI1M1x1NUYwMFx1NjVCMFx1N0E5N1x1NTNFM1x1NkNFOFx1NTE2NSB3aW5kb3cuc2l5dWFuTmV3V2luIFx1RkYwQ1x1OEZEOVx1NjgzN1x1OEJFRFx1NEU0OVx1NEYxQVx1NjZGNFx1NUJCOVx1NjYxM1x1NzQwNlx1ODlFM1xuKiBAYXV0aG9yIHRlcndlclxuKiBAdmVyc2lvbiAwLjEuMFxuKiBAc2luY2UgMC4wLjFcbiovXG4kZShwciwgXCJpc0luU2l5dWFuTmV3V2luXCIsICgpID0+ICFvZS5pc0luQnJvd3NlciB8fCAhb2UuaXNFbGVjdHJvbigpID8gITEgOiB0eXBlb2Ygd2luZG93LnRlcndlciA8IFwidVwiIHx8IHR5cGVvZiB3aW5kb3cuc2l5dWFuTmV3V2luIDwgXCJ1XCIpLCAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyByZXF1aXJlIHN0YXJ0XG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09XG4vKipcbiAqIFx1NUYxNVx1NTE2NVx1NEY5RFx1OEQ1NlxuICpcbiAqIEBwYXJhbSBsaWJwYXRoIC0gXHU0RjlEXHU4RDU2XHU1MTY4XHU4REVGXHU1Rjg0XG4gKiBAcGFyYW0gYWJzIC0gXHU1M0VGXHU5MDA5XHVGRjBDXHU2NjJGXHU1NDI2XHU0RjdGXHU3NTI4XHU4OUM5XHU1Rjk3XHU4REVGXHU1Rjg0XHVGRjBDXHU5RUQ4XHU4QkE0XHU2NjJGIHRydWUgXHVGRjBDIFx1NTQyRlx1NzUyOFx1NEU0Qlx1NTQwRSB0eXBlXHU1M0MyXHU2NTcwXHU2NUUwXHU2NTQ4XG4gKiBAcGFyYW0gdHlwZSAtIFx1NTNFRlx1OTAwOVx1RkYwQ1x1NEVFNVx1OEMwMVx1NzY4NFx1NTdGQVx1NjcyQ1x1OERFRlx1NUY4NFx1NEUzQVx1NTFDNlxuICovXG4kZShwciwgXCJyZXF1aXJlTGliXCIsIChlLCByID0gITAsIG4gPSBUZS5CYXNlUGF0aFR5cGVfTm9uZSkgPT4ge1xuICBpZiAoIW9lLmhhc05vZGVFbnYoKSlcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJyZXF1aXJlIG9ueSB3b3JrcyBvbiBub2RlIGVudlwiKTtcbiAgbGV0IGEgPSBlO1xuICBpZiAoIXIpXG4gICAgc3dpdGNoIChuKSB7XG4gICAgICBjYXNlIFRlLkJhc2VQYXRoVHlwZV9BcHBlYXJhbmNlOlxuICAgICAgICBhID0gT2Uuam9pblBhdGgoT2Uuc2l5dWFuQXBwZWFyYW5jZVBhdGgoKSwgZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBUZS5CYXNlUGF0aFR5cGVfRGF0YTpcbiAgICAgICAgYSA9IE9lLmpvaW5QYXRoKE9lLnNpeXVhbkRhdGFQYXRoKCksIGUpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgVGUuQmFzZVBhdGhUeXBlX1RoZW1lczpcbiAgICAgICAgYSA9IE9lLmpvaW5QYXRoKE9lLnNpeXVhbkFwcGVhcmFuY2VQYXRoKCksIFwidGhlbWVzXCIsIGUpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgVGUuQmFzZVBhdGhUeXBlX1poaVRoZW1lOlxuICAgICAgICBhID0gT2Uuam9pblBhdGgoT2Uuc2l5dWFuQXBwZWFyYW5jZVBhdGgoKSwgXCJ0aGVtZXNcIiwgXCJ6aGlcIiwgZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwidHlwZSBtdXN0IGJlIHByb3ZpZGVkIHdoZW4gbm90IHVzZSBhYnNvbHV0ZSBwYXRoXCIpO1xuICAgIH1cbiAgY29uc3QgZCA9IE9lLnNpeXVhbldpbmRvdygpO1xuICBpZiAoIWQpXG4gICAgcmV0dXJuIHJlcXVpcmUoYSk7XG4gIGlmICh0eXBlb2YgZC5yZXF1aXJlIDwgXCJ1XCIpXG4gICAgcmV0dXJuIGQucmVxdWlyZShhKTtcbn0pLCAvKipcbiogXHU1RjE1XHU1MTY1XHU0RjlEXHU4RDU2XHVGRjBDXHU0RUU1IGRhdGEgXHU3Njg0XHU1N0ZBXHU2NzJDXHU4REVGXHU1Rjg0XHU0RTNBXHU1MUM2XG4qXG4qIEBwYXJhbSBsaWJwYXRoIC0gXHU3NkY4XHU1QkY5XHU0RThFIGFwcGVhcmFuY2UgXHU3Njg0XHU3NkY4XHU1QkY5XHU4REVGXHU1Rjg0XG4qL1xuJGUocHIsIFwicmVxdWlyZUFwcGVhcmFuY2VMaWJcIiwgKGUpID0+IE9lLnJlcXVpcmVMaWIoZSwgITEsIFRlLkJhc2VQYXRoVHlwZV9BcHBlYXJhbmNlKSksIC8qKlxuKiBcdTVGMTVcdTUxNjVcdTRGOURcdThENTZcdUZGMENcdTRFRTUgZGF0YSBcdTc2ODRcdTU3RkFcdTY3MkNcdThERUZcdTVGODRcdTRFM0FcdTUxQzZcbipcbiogQHBhcmFtIGxpYnBhdGggLSBcdTc2RjhcdTVCRjlcdTRFOEUgZGF0YSBcdTc2ODRcdTc2RjhcdTVCRjlcdThERUZcdTVGODRcbiovXG4kZShwciwgXCJyZXF1aXJlRGF0YUxpYlwiLCAoZSkgPT4gT2UucmVxdWlyZUxpYihlLCAhMSwgVGUuQmFzZVBhdGhUeXBlX0RhdGEpKSwgLyoqXG4qIFx1NUYxNVx1NTE2NVx1NEY5RFx1OEQ1Nlx1RkYwQ1x1NEVFNSB0aGVtZSBcdTc2ODRcdTU3RkFcdTY3MkNcdThERUZcdTVGODRcdTRFM0FcdTUxQzZcbipcbiogQHBhcmFtIGxpYnBhdGggLSBcdTc2RjhcdTVCRjlcdTRFOEUgdGhlbWUgXHU3Njg0XHU3NkY4XHU1QkY5XHU4REVGXHU1Rjg0XG4qL1xuJGUocHIsIFwicmVxdWlyZVRoZW1lc0xpYlwiLCAoZSkgPT4gT2UucmVxdWlyZUxpYihlLCAhMSwgVGUuQmFzZVBhdGhUeXBlX1RoZW1lcykpLCAvKipcbiogXHU1RjE1XHU1MTY1XHU0RjlEXHU4RDU2XHVGRjBDXHU0RUU1IFpoaVRoZW1lIFx1NzY4NFx1NTdGQVx1NjcyQ1x1OERFRlx1NUY4NFx1NEUzQVx1NTFDNlxuKlxuKiBAcGFyYW0gbGlicGF0aCAtIFx1NzZGOFx1NUJGOVx1NEU4RSBaaGlUaGVtZSBcdTc2ODRcdTc2RjhcdTVCRjlcdThERUZcdTVGODRcbiovXG4kZShwciwgXCJyZXF1aXJlWmhpVGhlbWVMaWJcIiwgKGUpID0+IE9lLnJlcXVpcmVMaWIoZSwgITEsIFRlLkJhc2VQYXRoVHlwZV9aaGlUaGVtZSkpO1xuY29uc3QgTGUgPSB7XG4gIHdoaXRlOiAoZSkgPT4gb2UuaXNFbGVjdHJvbigpID8gU2Uud2hpdGVCcmlnaHQoZSkgOiB0ZS53aGl0ZShlKSxcbiAgZ3JheTogKGUpID0+IG9lLmlzRWxlY3Ryb24oKSA/IFNlLmdyYXkoZSkgOiB0ZS5ncmF5KGUpLFxuICBibHVlOiAoZSkgPT4gb2UuaXNFbGVjdHJvbigpID8gU2UuYmx1ZShlKSA6IHRlLmJsdWUoZSksXG4gIGdyZWVuOiAoZSkgPT4gb2UuaXNFbGVjdHJvbigpID8gU2UuZ3JlZW4oZSkgOiB0ZS5ncmVlbihlKSxcbiAgeWVsbG93OiAoZSkgPT4gb2UuaXNFbGVjdHJvbigpID8gU2UueWVsbG93KGUpIDogdGUueWVsbG93KGUpLFxuICByZWQ6IChlKSA9PiBvZS5pc0VsZWN0cm9uKCkgPyBTZS5yZWQoZSkgOiB0ZS5yZWQoZSksXG4gIGJnV2hpdGU6IChlKSA9PiBvZS5pc0VsZWN0cm9uKCkgPyBTZS5iZ1doaXRlQnJpZ2h0KGUpIDogdGUuYmdXaGl0ZShlKSxcbiAgYmdHcmV5OiAoZSkgPT4gb2UuaXNFbGVjdHJvbigpID8gU2UuYmdDeWFuQnJpZ2h0KGUpIDogdGUuYmdDeWFuKGUpLFxuICBiZ0JsdWU6IChlKSA9PiBvZS5pc0VsZWN0cm9uKCkgPyBTZS5iZ0JsdWVCcmlnaHQoZSkgOiB0ZS5iZ0JsdWUoZSksXG4gIGJnR3JlZW46IChlKSA9PiBvZS5pc0VsZWN0cm9uKCkgPyBTZS5iZ0dyZWVuQnJpZ2h0KGUpIDogdGUuYmdHcmVlbihlKSxcbiAgYmdZZWxsb3c6IChlKSA9PiBvZS5pc0VsZWN0cm9uKCkgPyBTZS5iZ1llbGxvd0JyaWdodChlKSA6IHRlLmJnWWVsbG93KGUpLFxuICBiZ1JlZDogKGUpID0+IG9lLmlzRWxlY3Ryb24oKSA/IFNlLmJnUmVkQnJpZ2h0KGUpIDogdGUuYmdSZWQoZSlcbn07XG5jbGFzcyBCbyB7XG4gIGNvbnN0cnVjdG9yKHIsIG4sIGEpIHtcbiAgICBScih0aGlzLCBcImNvbnNvbGVMb2dnZXJcIiwgXCJjb25zb2xlXCIpLCBScih0aGlzLCBcInN0YWNrU2l6ZVwiLCAxKSwgUnIodGhpcywgXCJnZXRMb2dnZXJcIiwgKHApID0+IHtcbiAgICAgIGxldCB5O1xuICAgICAgaWYgKHApXG4gICAgICAgIHkgPSBwO1xuICAgICAgZWxzZSB7XG4gICAgICAgIGNvbnN0IGIgPSB0aGlzLmdldENhbGxTdGFjaygpLCB2ID0gW10sIGcgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgUyA9IDA7IFMgPCBiLmxlbmd0aDsgUysrKSB7XG4gICAgICAgICAgY29uc3QgeiA9IGJbU10sIEwgPSB6LmdldEZpbGVOYW1lKCkgPz8gXCJub25lXCI7XG4gICAgICAgICAgaWYgKFMgPiB0aGlzLnN0YWNrU2l6ZSAtIDEpXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjb25zdCBSID0gTCArIFwiLVwiICsgei5nZXRMaW5lTnVtYmVyKCkgKyBcIjpcIiArIHouZ2V0Q29sdW1uTnVtYmVyKCk7XG4gICAgICAgICAgdi5wdXNoKFIpO1xuICAgICAgICB9XG4gICAgICAgIGcubGVuZ3RoID4gMCAmJiAoeSA9IHYuam9pbihcIiAtPiBcIikpO1xuICAgICAgfVxuICAgICAgcmV0dXJuICgheSB8fCB5LnRyaW0oKS5sZW5ndGggPT09IDApICYmICh5ID0gdGhpcy5jb25zb2xlTG9nZ2VyKSwgTnIuZ2V0TG9nZ2VyKHkpO1xuICAgIH0pLCB0aGlzLnN0YWNrU2l6ZSA9IDE7XG4gICAgbGV0IGQ7XG4gICAgciA/IGQgPSByIDogZCA9IGp0LmdldEVudkxldmVsKGEpLCBkID0gZCA/PyBaZS5MT0dfTEVWRUxfSU5GTywgTnIuc2V0TGV2ZWwoZCk7XG4gICAgY29uc3QgbyA9IChwLCB5LCBiLCB2KSA9PiB7XG4gICAgICBjb25zdCBnID0gW10sIFMgPSBuID8/IGp0LmdldEVudkxvZ2dlcihhKSA/PyBcInpoaVwiO1xuICAgICAgcmV0dXJuIGcucHVzaChMZS5ncmF5KFwiW1wiKSArIHYoUykgKyBMZS5ncmF5KFwiXVwiKSksIGcucHVzaChMZS5ncmF5KFwiW1wiKSArIExlLmdyYXkoYi50b1N0cmluZygpKSArIExlLmdyYXkoXCJdXCIpKSwgZy5wdXNoKHYocC50b1VwcGVyQ2FzZSgpLnRvU3RyaW5nKCkpKSwgZy5wdXNoKHYoeSkpLCBnLnB1c2goTGUuZ3JheShcIjpcIikpLCBnO1xuICAgIH07XG4gICAgVHQucmVnKE5yKSwgVHQuYXBwbHkoTnIsIHtcbiAgICAgIGZvcm1hdChwLCB5LCBiKSB7XG4gICAgICAgIGxldCB2ID0gW107XG4gICAgICAgIGNvbnN0IGcgPSB5ID8/IFwiXCI7XG4gICAgICAgIHN3aXRjaCAocCkge1xuICAgICAgICAgIGNhc2UgWmUuTE9HX0xFVkVMX1RSQUNFOlxuICAgICAgICAgICAgdiA9IG8ocCwgZywgYiwgTGUuZ3JheSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIFplLkxPR19MRVZFTF9ERUJVRzpcbiAgICAgICAgICAgIHYgPSBvKHAsIGcsIGIsIExlLmJsdWUpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBaZS5MT0dfTEVWRUxfSU5GTzpcbiAgICAgICAgICAgIHYgPSBvKHAsIGcsIGIsIExlLmdyZWVuKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgWmUuTE9HX0xFVkVMX1dBUk46XG4gICAgICAgICAgICB2ID0gbyhwLCBnLCBiLCBMZS55ZWxsb3cpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBaZS5MT0dfTEVWRUxfRVJST1I6XG4gICAgICAgICAgICB2ID0gbyhwLCBnLCBiLCBMZS5yZWQpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHYgPSBvKFplLkxPR19MRVZFTF9JTkZPLCBnLCBiLCBMZS5ncmVlbik7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdi5qb2luKFwiIFwiKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICAvKipcbiAgICogXHU4QkJFXHU3RjZFXHU4RjkzXHU1MUZBXHU2ODA4XHU3Njg0XHU2REYxXHU1RUE2XHVGRjBDXHU5RUQ4XHU4QkE0MVxuICAgKlxuICAgKiBAcGFyYW0gc3RhY2tTaXplIC0gXHU2ODA4XHU3Njg0XHU2REYxXHU1RUE2XG4gICAqL1xuICBzZXRTdGFja1NpemUocikge1xuICAgIHRoaXMuc3RhY2tTaXplID0gciA/PyAxO1xuICB9XG4gIC8qKlxuICAgKiBcdTgzQjdcdTUzRDZcdThDMDNcdTc1MjhcdTU4MDZcdTY4MDhcdUZGMENcdTgyRTVcdTY3MkFcdTgzQjdcdTUzRDZcdTUyMzBcdTc2RjRcdTYzQTVcdThGRDRcdTU2REVcdTdBN0FcdTY1NzBcdTdFQzRcbiAgICpcbiAgICogQGF1dGhvciB0ZXJ3ZXJcbiAgICogQHNpbmNlIDEuNi4wXG4gICAqL1xuICBnZXRDYWxsU3RhY2soKSB7XG4gICAgbGV0IHI7XG4gICAgdHJ5IHtcbiAgICAgIHIgPSBSbygpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgciA9IFtdO1xuICAgIH1cbiAgICByZXR1cm4gcjtcbiAgfVxufVxuY2xhc3MgSG8ge1xuICAvKipcbiAgICogXHU5RUQ4XHU4QkE0XHU2NUU1XHU1RkQ3XHU3RUE3XHU1MjJCXG4gICAqXG4gICAqIEBwYXJhbSBsZXZlbCAtIFx1NTNFRlx1OTAwOVx1RkYwQ1x1NjcyQVx1OEJCRVx1N0Y2RVx1OUVEOFx1OEJBNElORk9cbiAgICogQHBhcmFtIHNpZ24gLSBcdTUzRUZcdTkwMDlcdTUyNERcdTdGMDBcdUZGMENcdTlFRDhcdThCQTR6aGlcbiAgICogQHBhcmFtIGVudiAtIFx1NTNFRlx1OTAwOVx1NzNBRlx1NTg4M1x1NTNEOFx1OTFDRlx1NUI5RVx1NEY4QlxuICAgKi9cbiAgY29uc3RydWN0b3IociwgbiwgYSkge1xuICAgIFJyKHRoaXMsIFwibG9nZ2VyXCIpLCB0aGlzLmxvZ2dlciA9IG5ldyBCbyhyLCBuLCBhKTtcbiAgfVxuICAvKipcbiAgICogXHU4M0I3XHU1M0Q2XHU2NUU1XHU1RkQ3XHU4QkIwXHU1RjU1XHU1NjY4XG4gICAqXG4gICAqIEBwYXJhbSBsb2dnZXJOYW1lIC0gXHU2NUU1XHU1RkQ3XHU4QkIwXHU1RjU1XHU1NjY4XHU1NDBEXHU3OUYwXG4gICAqIEBwYXJhbSBzdGFja1NpemUgLSBcdTYyNTNcdTUzNzBcdTY4MDhcdTc2ODRcdTZERjFcdTVFQTZcbiAgICogQHByb3RlY3RlZFxuICAgKi9cbiAgZ2V0TG9nZ2VyKHIsIG4pIHtcbiAgICByZXR1cm4gdGhpcy5sb2dnZXIuc2V0U3RhY2tTaXplKG4pLCB0aGlzLmxvZ2dlci5nZXRMb2dnZXIocik7XG4gIH1cbn1cbmNsYXNzIHduIGV4dGVuZHMgSG8ge1xuICBjb25zdHJ1Y3RvcihyLCBuLCBhKSB7XG4gICAgc3VwZXIociwgbiwgYSk7XG4gIH1cbiAgLyoqXG4gICAqIFx1ODNCN1x1NTNENlx1OUVEOFx1OEJBNFx1NzY4NFx1NjVFNVx1NUZEN1x1OEJCMFx1NUY1NVx1NTY2OFxuICAgKlxuICAgKiBAcGFyYW0gbG9nZ2VyTmFtZSAtIFx1NjVFNVx1NUZEN1x1OEJCMFx1NUY1NVx1NTY2OFx1NTQwRFx1NzlGMFxuICAgKiBAcGFyYW0gc3RhY2tTaXplIC0gXHU2MjUzXHU1MzcwXHU2ODA4XHU3Njg0XHU2REYxXHU1RUE2XG4gICAqL1xuICBnZXRMb2dnZXIociwgbikge1xuICAgIHJldHVybiBzdXBlci5nZXRMb2dnZXIociwgbik7XG4gIH1cbn1cbmNsYXNzIElhIHtcbiAgLyoqXG4gICAqIFx1OUVEOFx1OEJBNFx1NjVFNVx1NUZEN1x1OEJCMFx1NUY1NVx1NTY2OFxuICAgKlxuICAgKiBAcGFyYW0gc3RhY2tTaXplIC0gXHU2ODA4XHU3Njg0XHU2REYxXHU1RUE2XG4gICAqIEBwYXJhbSBlbnYgLSBcdTczQUZcdTU4ODNcdTUzRDhcdTkxQ0ZcdTVCOUVcdTRGOEJcbiAgICovXG4gIHN0YXRpYyBkZWZhdWx0TG9nZ2VyKHIsIG4pIHtcbiAgICByZXR1cm4gSWEuY3VzdG9tTG9nRmFjdG9yeSh2b2lkIDAsIHZvaWQgMCwgcikuZ2V0TG9nZ2VyKHZvaWQgMCwgbik7XG4gIH1cbiAgLyoqXG4gICAqIFx1ODFFQVx1NUI5QVx1NEU0OVx1NjVFNVx1NUZEN1x1NURFNVx1NTM4MlxuICAgKlxuICAgKiBAcGFyYW0gbGV2ZWwgLSBcdTdFQTdcdTUyMkJcbiAgICogQHBhcmFtIHNpZ24gLSBcdTY4MDdcdTVGRDdcbiAgICogQHBhcmFtIGVudiAtIFx1NzNBRlx1NTg4M1x1NTNEOFx1OTFDRlxuICAgKi9cbiAgc3RhdGljIGN1c3RvbUxvZ0ZhY3RvcnkociwgbiwgYSkge1xuICAgIHJldHVybiBuZXcgd24ociwgbiwgYSk7XG4gIH1cbiAgLyoqXG4gICAqIFx1ODFFQVx1NUI5QVx1NEU0OVx1NjVFNVx1NUZEN1x1NURFNVx1NTM4Mlx1RkYwQ1x1ODFFQVx1NUI5QVx1NEU0OVx1NTI0RFx1N0YwMFxuICAgKlxuICAgKiBAcGFyYW0gc2lnbiAtIFx1NjgwN1x1NUZEN1xuICAgKiBAcGFyYW0gZW52IC0gXHU3M0FGXHU1ODgzXHU1M0Q4XHU5MUNGXG4gICAqL1xuICBzdGF0aWMgY3VzdG9tU2lnbkxvZ0ZhY3Rvcnkociwgbikge1xuICAgIHJldHVybiBuZXcgd24odm9pZCAwLCByLCBuKTtcbiAgfVxufVxuY29uc3QgcW8gPSBcInpoaVwiO1xuY2xhc3MgeXQge1xuICAvKipcbiAgICogXHU2N0QwXHU0RTlCXHU2MEM1XHU1MUI1XHU0RTBCXHVGRjBDXHU1M0VGXHU4MEZEXHU5NzAwXHU4OTgxXHU2MjRCXHU1MkE4IGluaXQgXHU0RTRCXHU1NDBFXHU2MjREXHU4MEZEXHU3NTI4XG4gICAqL1xuICBzdGF0aWMgaW5pdEVudihyKSB7XG4gICAgdGhpcy5lbnYgPSByO1xuICB9XG4gIC8qKlxuICAgKiBcdTgzQjdcdTUzRDYgemhpLWVudiBcdTVCOUVcdTRGOEIgLSBcdTVGQzVcdTk4N0JcdTU3MjhcdTRGN0ZcdTc1MjhcdTc2ODRcdTY1RjZcdTUwMTlcdTkxQ0RcdTUxOTlcdTZCNjRcdTY1QjlcdTZDRDVcbiAgICpcbiAgICogYGBgXG4gICAqIGlmICghdGhpcy5lbnYpIHtcbiAgICogICB0aGlzLmVudiA9IG5ldyBFbnYoe1wiQkFTRV9VUkxcIjpcIi9cIixcIk1PREVcIjpcInByb2R1Y3Rpb25cIixcIkRFVlwiOmZhbHNlLFwiUFJPRFwiOnRydWUsXCJTU1JcIjpmYWxzZX0pXG4gICAqIH1cbiAgICogcmV0dXJuIHRoaXMuZW52XG4gICAqIGBgYFxuICAgKlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vdGVyd2VyL3poaS90cmVlL21haW4vYXBwcy96aGktZW52I3VzYWdlIGRvY3MgZm9yIHpoaS1lbnYgdXNhZ2V9XG4gICAqL1xuICBzdGF0aWMgemhpRW52KCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIk1ldGhvZCAnemhpRW52JyBtdXN0IGJlIGltcGxlbWVudGVkXCIpO1xuICB9XG4gIC8qKlxuICAgKiBcdTgzQjdcdTUzRDYgemhpLWxvZyBcdTVCOUVcdTRGOEJcbiAgICpcbiAgICogQHBhcmFtIHNpZ24gLSBcdTY4MDdcdTVGRDdcbiAgICogQHBhcmFtIGxvZ2dlck5hbWUgLSBcdTY1RTVcdTVGRDdcdTU0MERcdTc5RjBcbiAgICovXG4gIHN0YXRpYyB6aGlMb2dXaXRoU2lnbihyLCBuKSB7XG4gICAgaWYgKHRoaXMubG9nZ2VyTWFwW25dKVxuICAgICAgcmV0dXJuIHRoaXMubG9nZ2VyTWFwW25dLmRlYnVnKFwiWmhpLWxvZyB1c2UgY2FjaGVcIiksIHRoaXMubG9nZ2VyTWFwW25dO1xuICAgIGNvbnN0IGEgPSB0aGlzLmVudiwgZCA9IElhLmN1c3RvbVNpZ25Mb2dGYWN0b3J5KHIsIGEpLmdldExvZ2dlcihuKTtcbiAgICByZXR1cm4gdGhpcy5sb2dnZXJNYXBbbl0gPSBkLCBkLmRlYnVnKFwiWmhpLWxvZyBhZGQgbmV3IGxvZ2dlclwiKSwgZDtcbiAgfVxuICAvKipcbiAgICogXHU4M0I3XHU1M0Q2IHpoaS1sb2cgXHU1QjlFXHU0RjhCXG4gICAqXG4gICAqIEBwYXJhbSBsb2dnZXJOYW1lIC0gXHU2NUU1XHU1RkQ3XHU1NDBEXHU3OUYwXG4gICAqL1xuICBzdGF0aWMgemhpTG9nKHIpIHtcbiAgICByZXR1cm4gdGhpcy56aGlMb2dXaXRoU2lnbihxbywgcik7XG4gIH1cbiAgLyoqXG4gICAqIFx1ODNCN1x1NTNENiB6aGktY29tbW9uIFx1NUI5RVx1NEY4QlxuICAgKi9cbiAgc3RhdGljIHpoaUNvbW1vbigpIHtcbiAgICByZXR1cm4gdGhpcy5jb21tb24gfHwgKHRoaXMuY29tbW9uID0gbmV3IFpvKCkpLCB0aGlzLmNvbW1vbjtcbiAgfVxufVxuLyoqXG4gKiB6aGktdXRpbCBcdTc2ODRcdThGRDBcdTg4NENcdTY1RjZcdTczQUZcdTU4ODNcbiAqL1xuYmUoeXQsIFwiZW52XCIpLCAvKipcbiAqIHpoaS11dGlsIFx1NzY4NFx1NjVFNVx1NUZEN1x1NTY2OFx1N0YxM1x1NUI1OFxuICovXG5iZSh5dCwgXCJsb2dnZXJNYXBcIiwge30pLCAvKipcbiAqIHpoaS11dGlsIFx1NzY4NFx1OTAxQVx1NzUyOFx1NURFNVx1NTE3N1x1N0M3QlxuICovXG5iZSh5dCwgXCJjb21tb25cIik7XG5jbGFzcyBNYSBleHRlbmRzIHl0IHtcbiAgc3RhdGljIHpoaUVudigpIHtcbiAgICByZXR1cm4gdGhpcy5lbnYgfHwgKHRoaXMuZW52ID0gbmV3IENvKHsgQkFTRV9VUkw6IFwiL1wiLCBNT0RFOiBcInByb2R1Y3Rpb25cIiwgREVWOiAhMSwgUFJPRDogITAsIFNTUjogITEgfSkpLCB0aGlzLmVudjtcbiAgfVxufVxuY2xhc3MgYm4ge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBiZSh0aGlzLCBcImxvZ2dlclwiKTtcbiAgICB0aGlzLmxvZ2dlciA9IE1hLnpoaUxvZyhcImx1dGUtYWRhcHRvclwiKSwgTHV0ZSA/IHRoaXMubG9nZ2VyLmRlYnVnKFwiRGV0ZWN0ZWQgTHV0ZSBpcyBidW5kbGVkLCB3aWxsIHVzZSFcIikgOiB0aGlzLmxvZ2dlci5kZWJ1ZyhcIkx1dGUgaXMgbm90IGF2YWlsYWJsZSFcIik7XG4gIH1cbiAgaXNBdmFpbGFibGUoKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBMdXRlIDwgXCJ1XCI7XG4gIH1cbiAgLyoqXG4gICAqIFx1OUFEOFx1NEVBRVx1NTE3M1x1OTUyRVx1NUI1N1xuICAgKlxuICAgKiBAcGFyYW0gc3RyIC0gXHU1QjU3XHU3QjI2XHU0RTMyXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBoaWdobGlnaHRXb3JkcyhyKSB7XG4gICAgY29uc3QgbiA9IG5ldyBSZWdFeHAoXCIoPzw9XnxbXFxcXHNcXFxcU10pPT0oW15cXFxcbl0rPyk9PSg/PSgkfFtcXFxcc1xcXFxTXSkpXCIsIFwiZ1wiKTtcbiAgICByZXR1cm4gci5yZXBsYWNlKG4sICc8c3BhbiBjbGFzcz1cIm1hcmtcIj4kMTwvc3Bhbj4nKTtcbiAgfVxuICAvKipcbiAgICogXHU2RTMyXHU2N0QzTWFya2Rvd25cbiAgICpcbiAgICogQHBhcmFtIG1kIC0gTWFya2Rvd25cbiAgICovXG4gIGFzeW5jIHJlbmRlck1hcmtkb3duU3RyKHIpIHtcbiAgICBpZiAoIXRoaXMuaXNBdmFpbGFibGUoKSlcbiAgICAgIHJldHVybiB0aGlzLmxvZ2dlci5lcnJvcihcIkx1dGUgaXMgbm90IGF2YWlsYWJsZSwgd2lsbCByZXR1cm4gb3JpZ2luYWwgbWRcIiksIHI7XG4gICAgY29uc3QgbiA9IEx1dGUsIGEgPSBuLk5ldygpLCBkID0ge1xuICAgICAgcmVuZGVyVGV4dDogKG8sIHApID0+IHAgPyBbdGhpcy5oaWdobGlnaHRXb3JkcyhvLlRleHQoKSksIG4uV2Fsa0NvbnRpbnVlXSA6IFtcIlwiLCBuLldhbGtDb250aW51ZV1cbiAgICAgIC8vIHJlbmRlclN0cm9uZzogKG5vZGU6IGFueSwgZW50ZXJpbmc6IGFueSkgPT4ge1xuICAgICAgLy8gICAgIHJldHVybiBbXCJcIiwgbHV0ZU9iai5XYWxrQ29udGludWVdXG4gICAgICAvLyB9LFxuICAgICAgLy8gcmVuZGVyUGFyYWdyYXBoOiAobm9kZTogYW55LCBlbnRlcmluZzogYW55KSA9PiB7XG4gICAgICAvLyAgICAgcmV0dXJuIFtcIlwiLCBsdXRlT2JqLldhbGtDb250aW51ZV1cbiAgICAgIC8vIH1cbiAgICB9O1xuICAgIHJldHVybiBhLlNldEpTUmVuZGVyZXJzKHtcbiAgICAgIHJlbmRlcmVyczoge1xuICAgICAgICBNZDJIVE1MOiBkXG4gICAgICB9XG4gICAgfSksIHRoaXMubG9nZ2VyLmluZm8oXCJMdXRlIGlzIHJlbmRlcmluZyBtZCB0byBIVE1MLi4uXCIpLCBhLk1hcmtkb3duU3RyKFwiXCIsIHIpO1xuICB9XG59XG52YXIgTnQgPSB7fSwgR28gPSB7XG4gIGdldCBleHBvcnRzKCkge1xuICAgIHJldHVybiBOdDtcbiAgfSxcbiAgc2V0IGV4cG9ydHMoZSkge1xuICAgIE50ID0gZTtcbiAgfVxufTtcbihmdW5jdGlvbihlKSB7XG4gIChmdW5jdGlvbigpIHtcbiAgICBmdW5jdGlvbiByKHQpIHtcbiAgICAgIHZhciB1ID0ge1xuICAgICAgICBvbWl0RXh0cmFXTEluQ29kZUJsb2Nrczoge1xuICAgICAgICAgIGRlZmF1bHRWYWx1ZTogITEsXG4gICAgICAgICAgZGVzY3JpYmU6IFwiT21pdCB0aGUgZGVmYXVsdCBleHRyYSB3aGl0ZWxpbmUgYWRkZWQgdG8gY29kZSBibG9ja3NcIixcbiAgICAgICAgICB0eXBlOiBcImJvb2xlYW5cIlxuICAgICAgICB9LFxuICAgICAgICBub0hlYWRlcklkOiB7XG4gICAgICAgICAgZGVmYXVsdFZhbHVlOiAhMSxcbiAgICAgICAgICBkZXNjcmliZTogXCJUdXJuIG9uL29mZiBnZW5lcmF0ZWQgaGVhZGVyIGlkXCIsXG4gICAgICAgICAgdHlwZTogXCJib29sZWFuXCJcbiAgICAgICAgfSxcbiAgICAgICAgcHJlZml4SGVhZGVySWQ6IHtcbiAgICAgICAgICBkZWZhdWx0VmFsdWU6ICExLFxuICAgICAgICAgIGRlc2NyaWJlOiBcIkFkZCBhIHByZWZpeCB0byB0aGUgZ2VuZXJhdGVkIGhlYWRlciBpZHMuIFBhc3NpbmcgYSBzdHJpbmcgd2lsbCBwcmVmaXggdGhhdCBzdHJpbmcgdG8gdGhlIGhlYWRlciBpZC4gU2V0dGluZyB0byB0cnVlIHdpbGwgYWRkIGEgZ2VuZXJpYyAnc2VjdGlvbi0nIHByZWZpeFwiLFxuICAgICAgICAgIHR5cGU6IFwic3RyaW5nXCJcbiAgICAgICAgfSxcbiAgICAgICAgcmF3UHJlZml4SGVhZGVySWQ6IHtcbiAgICAgICAgICBkZWZhdWx0VmFsdWU6ICExLFxuICAgICAgICAgIGRlc2NyaWJlOiAnU2V0dGluZyB0aGlzIG9wdGlvbiB0byB0cnVlIHdpbGwgcHJldmVudCBzaG93ZG93biBmcm9tIG1vZGlmeWluZyB0aGUgcHJlZml4LiBUaGlzIG1pZ2h0IHJlc3VsdCBpbiBtYWxmb3JtZWQgSURzIChpZiwgZm9yIGluc3RhbmNlLCB0aGUgXCIgY2hhciBpcyB1c2VkIGluIHRoZSBwcmVmaXgpJyxcbiAgICAgICAgICB0eXBlOiBcImJvb2xlYW5cIlxuICAgICAgICB9LFxuICAgICAgICBnaENvbXBhdGlibGVIZWFkZXJJZDoge1xuICAgICAgICAgIGRlZmF1bHRWYWx1ZTogITEsXG4gICAgICAgICAgZGVzY3JpYmU6IFwiR2VuZXJhdGUgaGVhZGVyIGlkcyBjb21wYXRpYmxlIHdpdGggZ2l0aHViIHN0eWxlIChzcGFjZXMgYXJlIHJlcGxhY2VkIHdpdGggZGFzaGVzLCBhIGJ1bmNoIG9mIG5vbiBhbHBoYW51bWVyaWMgY2hhcnMgYXJlIHJlbW92ZWQpXCIsXG4gICAgICAgICAgdHlwZTogXCJib29sZWFuXCJcbiAgICAgICAgfSxcbiAgICAgICAgcmF3SGVhZGVySWQ6IHtcbiAgICAgICAgICBkZWZhdWx0VmFsdWU6ICExLFxuICAgICAgICAgIGRlc2NyaWJlOiBgUmVtb3ZlIG9ubHkgc3BhY2VzLCAnIGFuZCBcIiBmcm9tIGdlbmVyYXRlZCBoZWFkZXIgaWRzIChpbmNsdWRpbmcgcHJlZml4ZXMpLCByZXBsYWNpbmcgdGhlbSB3aXRoIGRhc2hlcyAoLSkuIFdBUk5JTkc6IFRoaXMgbWlnaHQgcmVzdWx0IGluIG1hbGZvcm1lZCBpZHNgLFxuICAgICAgICAgIHR5cGU6IFwiYm9vbGVhblwiXG4gICAgICAgIH0sXG4gICAgICAgIGhlYWRlckxldmVsU3RhcnQ6IHtcbiAgICAgICAgICBkZWZhdWx0VmFsdWU6ICExLFxuICAgICAgICAgIGRlc2NyaWJlOiBcIlRoZSBoZWFkZXIgYmxvY2tzIGxldmVsIHN0YXJ0XCIsXG4gICAgICAgICAgdHlwZTogXCJpbnRlZ2VyXCJcbiAgICAgICAgfSxcbiAgICAgICAgcGFyc2VJbWdEaW1lbnNpb25zOiB7XG4gICAgICAgICAgZGVmYXVsdFZhbHVlOiAhMSxcbiAgICAgICAgICBkZXNjcmliZTogXCJUdXJuIG9uL29mZiBpbWFnZSBkaW1lbnNpb24gcGFyc2luZ1wiLFxuICAgICAgICAgIHR5cGU6IFwiYm9vbGVhblwiXG4gICAgICAgIH0sXG4gICAgICAgIHNpbXBsaWZpZWRBdXRvTGluazoge1xuICAgICAgICAgIGRlZmF1bHRWYWx1ZTogITEsXG4gICAgICAgICAgZGVzY3JpYmU6IFwiVHVybiBvbi9vZmYgR0ZNIGF1dG9saW5rIHN0eWxlXCIsXG4gICAgICAgICAgdHlwZTogXCJib29sZWFuXCJcbiAgICAgICAgfSxcbiAgICAgICAgZXhjbHVkZVRyYWlsaW5nUHVuY3R1YXRpb25Gcm9tVVJMczoge1xuICAgICAgICAgIGRlZmF1bHRWYWx1ZTogITEsXG4gICAgICAgICAgZGVzY3JpYmU6IFwiRXhjbHVkZXMgdHJhaWxpbmcgcHVuY3R1YXRpb24gZnJvbSBsaW5rcyBnZW5lcmF0ZWQgd2l0aCBhdXRvTGlua2luZ1wiLFxuICAgICAgICAgIHR5cGU6IFwiYm9vbGVhblwiXG4gICAgICAgIH0sXG4gICAgICAgIGxpdGVyYWxNaWRXb3JkVW5kZXJzY29yZXM6IHtcbiAgICAgICAgICBkZWZhdWx0VmFsdWU6ICExLFxuICAgICAgICAgIGRlc2NyaWJlOiBcIlBhcnNlIG1pZHdvcmQgdW5kZXJzY29yZXMgYXMgbGl0ZXJhbCB1bmRlcnNjb3Jlc1wiLFxuICAgICAgICAgIHR5cGU6IFwiYm9vbGVhblwiXG4gICAgICAgIH0sXG4gICAgICAgIGxpdGVyYWxNaWRXb3JkQXN0ZXJpc2tzOiB7XG4gICAgICAgICAgZGVmYXVsdFZhbHVlOiAhMSxcbiAgICAgICAgICBkZXNjcmliZTogXCJQYXJzZSBtaWR3b3JkIGFzdGVyaXNrcyBhcyBsaXRlcmFsIGFzdGVyaXNrc1wiLFxuICAgICAgICAgIHR5cGU6IFwiYm9vbGVhblwiXG4gICAgICAgIH0sXG4gICAgICAgIHN0cmlrZXRocm91Z2g6IHtcbiAgICAgICAgICBkZWZhdWx0VmFsdWU6ICExLFxuICAgICAgICAgIGRlc2NyaWJlOiBcIlR1cm4gb24vb2ZmIHN0cmlrZXRocm91Z2ggc3VwcG9ydFwiLFxuICAgICAgICAgIHR5cGU6IFwiYm9vbGVhblwiXG4gICAgICAgIH0sXG4gICAgICAgIHRhYmxlczoge1xuICAgICAgICAgIGRlZmF1bHRWYWx1ZTogITEsXG4gICAgICAgICAgZGVzY3JpYmU6IFwiVHVybiBvbi9vZmYgdGFibGVzIHN1cHBvcnRcIixcbiAgICAgICAgICB0eXBlOiBcImJvb2xlYW5cIlxuICAgICAgICB9LFxuICAgICAgICB0YWJsZXNIZWFkZXJJZDoge1xuICAgICAgICAgIGRlZmF1bHRWYWx1ZTogITEsXG4gICAgICAgICAgZGVzY3JpYmU6IFwiQWRkIGFuIGlkIHRvIHRhYmxlIGhlYWRlcnNcIixcbiAgICAgICAgICB0eXBlOiBcImJvb2xlYW5cIlxuICAgICAgICB9LFxuICAgICAgICBnaENvZGVCbG9ja3M6IHtcbiAgICAgICAgICBkZWZhdWx0VmFsdWU6ICEwLFxuICAgICAgICAgIGRlc2NyaWJlOiBcIlR1cm4gb24vb2ZmIEdGTSBmZW5jZWQgY29kZSBibG9ja3Mgc3VwcG9ydFwiLFxuICAgICAgICAgIHR5cGU6IFwiYm9vbGVhblwiXG4gICAgICAgIH0sXG4gICAgICAgIHRhc2tsaXN0czoge1xuICAgICAgICAgIGRlZmF1bHRWYWx1ZTogITEsXG4gICAgICAgICAgZGVzY3JpYmU6IFwiVHVybiBvbi9vZmYgR0ZNIHRhc2tsaXN0IHN1cHBvcnRcIixcbiAgICAgICAgICB0eXBlOiBcImJvb2xlYW5cIlxuICAgICAgICB9LFxuICAgICAgICBzbW9vdGhMaXZlUHJldmlldzoge1xuICAgICAgICAgIGRlZmF1bHRWYWx1ZTogITEsXG4gICAgICAgICAgZGVzY3JpYmU6IFwiUHJldmVudHMgd2VpcmQgZWZmZWN0cyBpbiBsaXZlIHByZXZpZXdzIGR1ZSB0byBpbmNvbXBsZXRlIGlucHV0XCIsXG4gICAgICAgICAgdHlwZTogXCJib29sZWFuXCJcbiAgICAgICAgfSxcbiAgICAgICAgc21hcnRJbmRlbnRhdGlvbkZpeDoge1xuICAgICAgICAgIGRlZmF1bHRWYWx1ZTogITEsXG4gICAgICAgICAgZGVzY3JpYmU6IFwiVHJpZXMgdG8gc21hcnRseSBmaXggaW5kZW50YXRpb24gaW4gZXM2IHN0cmluZ3NcIixcbiAgICAgICAgICB0eXBlOiBcImJvb2xlYW5cIlxuICAgICAgICB9LFxuICAgICAgICBkaXNhYmxlRm9yY2VkNFNwYWNlc0luZGVudGVkU3VibGlzdHM6IHtcbiAgICAgICAgICBkZWZhdWx0VmFsdWU6ICExLFxuICAgICAgICAgIGRlc2NyaWJlOiBcIkRpc2FibGVzIHRoZSByZXF1aXJlbWVudCBvZiBpbmRlbnRpbmcgbmVzdGVkIHN1Ymxpc3RzIGJ5IDQgc3BhY2VzXCIsXG4gICAgICAgICAgdHlwZTogXCJib29sZWFuXCJcbiAgICAgICAgfSxcbiAgICAgICAgc2ltcGxlTGluZUJyZWFrczoge1xuICAgICAgICAgIGRlZmF1bHRWYWx1ZTogITEsXG4gICAgICAgICAgZGVzY3JpYmU6IFwiUGFyc2VzIHNpbXBsZSBsaW5lIGJyZWFrcyBhcyA8YnI+IChHRk0gU3R5bGUpXCIsXG4gICAgICAgICAgdHlwZTogXCJib29sZWFuXCJcbiAgICAgICAgfSxcbiAgICAgICAgcmVxdWlyZVNwYWNlQmVmb3JlSGVhZGluZ1RleHQ6IHtcbiAgICAgICAgICBkZWZhdWx0VmFsdWU6ICExLFxuICAgICAgICAgIGRlc2NyaWJlOiBcIk1ha2VzIGFkZGluZyBhIHNwYWNlIGJldHdlZW4gYCNgIGFuZCB0aGUgaGVhZGVyIHRleHQgbWFuZGF0b3J5IChHRk0gU3R5bGUpXCIsXG4gICAgICAgICAgdHlwZTogXCJib29sZWFuXCJcbiAgICAgICAgfSxcbiAgICAgICAgZ2hNZW50aW9uczoge1xuICAgICAgICAgIGRlZmF1bHRWYWx1ZTogITEsXG4gICAgICAgICAgZGVzY3JpYmU6IFwiRW5hYmxlcyBnaXRodWIgQG1lbnRpb25zXCIsXG4gICAgICAgICAgdHlwZTogXCJib29sZWFuXCJcbiAgICAgICAgfSxcbiAgICAgICAgZ2hNZW50aW9uc0xpbms6IHtcbiAgICAgICAgICBkZWZhdWx0VmFsdWU6IFwiaHR0cHM6Ly9naXRodWIuY29tL3t1fVwiLFxuICAgICAgICAgIGRlc2NyaWJlOiBcIkNoYW5nZXMgdGhlIGxpbmsgZ2VuZXJhdGVkIGJ5IEBtZW50aW9ucy4gT25seSBhcHBsaWVzIGlmIGdoTWVudGlvbnMgb3B0aW9uIGlzIGVuYWJsZWQuXCIsXG4gICAgICAgICAgdHlwZTogXCJzdHJpbmdcIlxuICAgICAgICB9LFxuICAgICAgICBlbmNvZGVFbWFpbHM6IHtcbiAgICAgICAgICBkZWZhdWx0VmFsdWU6ICEwLFxuICAgICAgICAgIGRlc2NyaWJlOiBcIkVuY29kZSBlLW1haWwgYWRkcmVzc2VzIHRocm91Z2ggdGhlIHVzZSBvZiBDaGFyYWN0ZXIgRW50aXRpZXMsIHRyYW5zZm9ybWluZyBBU0NJSSBlLW1haWwgYWRkcmVzc2VzIGludG8gaXRzIGVxdWl2YWxlbnQgZGVjaW1hbCBlbnRpdGllc1wiLFxuICAgICAgICAgIHR5cGU6IFwiYm9vbGVhblwiXG4gICAgICAgIH0sXG4gICAgICAgIG9wZW5MaW5rc0luTmV3V2luZG93OiB7XG4gICAgICAgICAgZGVmYXVsdFZhbHVlOiAhMSxcbiAgICAgICAgICBkZXNjcmliZTogXCJPcGVuIGFsbCBsaW5rcyBpbiBuZXcgd2luZG93c1wiLFxuICAgICAgICAgIHR5cGU6IFwiYm9vbGVhblwiXG4gICAgICAgIH0sXG4gICAgICAgIGJhY2tzbGFzaEVzY2FwZXNIVE1MVGFnczoge1xuICAgICAgICAgIGRlZmF1bHRWYWx1ZTogITEsXG4gICAgICAgICAgZGVzY3JpYmU6IFwiU3VwcG9ydCBmb3IgSFRNTCBUYWcgZXNjYXBpbmcuIGV4OiA8ZGl2PmZvbzwvZGl2PlwiLFxuICAgICAgICAgIHR5cGU6IFwiYm9vbGVhblwiXG4gICAgICAgIH0sXG4gICAgICAgIGVtb2ppOiB7XG4gICAgICAgICAgZGVmYXVsdFZhbHVlOiAhMSxcbiAgICAgICAgICBkZXNjcmliZTogXCJFbmFibGUgZW1vamkgc3VwcG9ydC4gRXg6IGB0aGlzIGlzIGEgOnNtaWxlOiBlbW9qaWBcIixcbiAgICAgICAgICB0eXBlOiBcImJvb2xlYW5cIlxuICAgICAgICB9LFxuICAgICAgICB1bmRlcmxpbmU6IHtcbiAgICAgICAgICBkZWZhdWx0VmFsdWU6ICExLFxuICAgICAgICAgIGRlc2NyaWJlOiBcIkVuYWJsZSBzdXBwb3J0IGZvciB1bmRlcmxpbmUuIFN5bnRheCBpcyBkb3VibGUgb3IgdHJpcGxlIHVuZGVyc2NvcmVzOiBgX191bmRlcmxpbmUgd29yZF9fYC4gV2l0aCB0aGlzIG9wdGlvbiBlbmFibGVkLCB1bmRlcnNjb3JlcyBubyBsb25nZXIgcGFyc2VzIGludG8gYDxlbT5gIGFuZCBgPHN0cm9uZz5gXCIsXG4gICAgICAgICAgdHlwZTogXCJib29sZWFuXCJcbiAgICAgICAgfSxcbiAgICAgICAgZWxsaXBzaXM6IHtcbiAgICAgICAgICBkZWZhdWx0VmFsdWU6ICEwLFxuICAgICAgICAgIGRlc2NyaWJlOiBcIlJlcGxhY2VzIHRocmVlIGRvdHMgd2l0aCB0aGUgZWxsaXBzaXMgdW5pY29kZSBjaGFyYWN0ZXJcIixcbiAgICAgICAgICB0eXBlOiBcImJvb2xlYW5cIlxuICAgICAgICB9LFxuICAgICAgICBjb21wbGV0ZUhUTUxEb2N1bWVudDoge1xuICAgICAgICAgIGRlZmF1bHRWYWx1ZTogITEsXG4gICAgICAgICAgZGVzY3JpYmU6IFwiT3V0cHV0cyBhIGNvbXBsZXRlIGh0bWwgZG9jdW1lbnQsIGluY2x1ZGluZyBgPGh0bWw+YCwgYDxoZWFkPmAgYW5kIGA8Ym9keT5gIHRhZ3NcIixcbiAgICAgICAgICB0eXBlOiBcImJvb2xlYW5cIlxuICAgICAgICB9LFxuICAgICAgICBtZXRhZGF0YToge1xuICAgICAgICAgIGRlZmF1bHRWYWx1ZTogITEsXG4gICAgICAgICAgZGVzY3JpYmU6IFwiRW5hYmxlIHN1cHBvcnQgZm9yIGRvY3VtZW50IG1ldGFkYXRhIChkZWZpbmVkIGF0IHRoZSB0b3Agb2YgdGhlIGRvY3VtZW50IGJldHdlZW4gYFx1MDBBQlx1MDBBQlx1MDBBQmAgYW5kIGBcdTAwQkJcdTAwQkJcdTAwQkJgIG9yIGJldHdlZW4gYC0tLWAgYW5kIGAtLS1gKS5cIixcbiAgICAgICAgICB0eXBlOiBcImJvb2xlYW5cIlxuICAgICAgICB9LFxuICAgICAgICBzcGxpdEFkamFjZW50QmxvY2txdW90ZXM6IHtcbiAgICAgICAgICBkZWZhdWx0VmFsdWU6ICExLFxuICAgICAgICAgIGRlc2NyaWJlOiBcIlNwbGl0IGFkamFjZW50IGJsb2NrcXVvdGUgYmxvY2tzXCIsXG4gICAgICAgICAgdHlwZTogXCJib29sZWFuXCJcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIGlmICh0ID09PSAhMSlcbiAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodSkpO1xuICAgICAgdmFyIHMgPSB7fTtcbiAgICAgIGZvciAodmFyIGkgaW4gdSlcbiAgICAgICAgdS5oYXNPd25Qcm9wZXJ0eShpKSAmJiAoc1tpXSA9IHVbaV0uZGVmYXVsdFZhbHVlKTtcbiAgICAgIHJldHVybiBzO1xuICAgIH1cbiAgICBmdW5jdGlvbiBuKCkge1xuICAgICAgdmFyIHQgPSByKCEwKSwgdSA9IHt9O1xuICAgICAgZm9yICh2YXIgcyBpbiB0KVxuICAgICAgICB0Lmhhc093blByb3BlcnR5KHMpICYmICh1W3NdID0gITApO1xuICAgICAgcmV0dXJuIHU7XG4gICAgfVxuICAgIHZhciBhID0ge30sIGQgPSB7fSwgbyA9IHt9LCBwID0gcighMCksIHkgPSBcInZhbmlsbGFcIiwgYiA9IHtcbiAgICAgIGdpdGh1Yjoge1xuICAgICAgICBvbWl0RXh0cmFXTEluQ29kZUJsb2NrczogITAsXG4gICAgICAgIHNpbXBsaWZpZWRBdXRvTGluazogITAsXG4gICAgICAgIGV4Y2x1ZGVUcmFpbGluZ1B1bmN0dWF0aW9uRnJvbVVSTHM6ICEwLFxuICAgICAgICBsaXRlcmFsTWlkV29yZFVuZGVyc2NvcmVzOiAhMCxcbiAgICAgICAgc3RyaWtldGhyb3VnaDogITAsXG4gICAgICAgIHRhYmxlczogITAsXG4gICAgICAgIHRhYmxlc0hlYWRlcklkOiAhMCxcbiAgICAgICAgZ2hDb2RlQmxvY2tzOiAhMCxcbiAgICAgICAgdGFza2xpc3RzOiAhMCxcbiAgICAgICAgZGlzYWJsZUZvcmNlZDRTcGFjZXNJbmRlbnRlZFN1Ymxpc3RzOiAhMCxcbiAgICAgICAgc2ltcGxlTGluZUJyZWFrczogITAsXG4gICAgICAgIHJlcXVpcmVTcGFjZUJlZm9yZUhlYWRpbmdUZXh0OiAhMCxcbiAgICAgICAgZ2hDb21wYXRpYmxlSGVhZGVySWQ6ICEwLFxuICAgICAgICBnaE1lbnRpb25zOiAhMCxcbiAgICAgICAgYmFja3NsYXNoRXNjYXBlc0hUTUxUYWdzOiAhMCxcbiAgICAgICAgZW1vamk6ICEwLFxuICAgICAgICBzcGxpdEFkamFjZW50QmxvY2txdW90ZXM6ICEwXG4gICAgICB9LFxuICAgICAgb3JpZ2luYWw6IHtcbiAgICAgICAgbm9IZWFkZXJJZDogITAsXG4gICAgICAgIGdoQ29kZUJsb2NrczogITFcbiAgICAgIH0sXG4gICAgICBnaG9zdDoge1xuICAgICAgICBvbWl0RXh0cmFXTEluQ29kZUJsb2NrczogITAsXG4gICAgICAgIHBhcnNlSW1nRGltZW5zaW9uczogITAsXG4gICAgICAgIHNpbXBsaWZpZWRBdXRvTGluazogITAsXG4gICAgICAgIGV4Y2x1ZGVUcmFpbGluZ1B1bmN0dWF0aW9uRnJvbVVSTHM6ICEwLFxuICAgICAgICBsaXRlcmFsTWlkV29yZFVuZGVyc2NvcmVzOiAhMCxcbiAgICAgICAgc3RyaWtldGhyb3VnaDogITAsXG4gICAgICAgIHRhYmxlczogITAsXG4gICAgICAgIHRhYmxlc0hlYWRlcklkOiAhMCxcbiAgICAgICAgZ2hDb2RlQmxvY2tzOiAhMCxcbiAgICAgICAgdGFza2xpc3RzOiAhMCxcbiAgICAgICAgc21vb3RoTGl2ZVByZXZpZXc6ICEwLFxuICAgICAgICBzaW1wbGVMaW5lQnJlYWtzOiAhMCxcbiAgICAgICAgcmVxdWlyZVNwYWNlQmVmb3JlSGVhZGluZ1RleHQ6ICEwLFxuICAgICAgICBnaE1lbnRpb25zOiAhMSxcbiAgICAgICAgZW5jb2RlRW1haWxzOiAhMFxuICAgICAgfSxcbiAgICAgIHZhbmlsbGE6IHIoITApLFxuICAgICAgYWxsT246IG4oKVxuICAgIH07XG4gICAgYS5oZWxwZXIgPSB7fSwgYS5leHRlbnNpb25zID0ge30sIGEuc2V0T3B0aW9uID0gZnVuY3Rpb24odCwgdSkge1xuICAgICAgcmV0dXJuIHBbdF0gPSB1LCB0aGlzO1xuICAgIH0sIGEuZ2V0T3B0aW9uID0gZnVuY3Rpb24odCkge1xuICAgICAgcmV0dXJuIHBbdF07XG4gICAgfSwgYS5nZXRPcHRpb25zID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gcDtcbiAgICB9LCBhLnJlc2V0T3B0aW9ucyA9IGZ1bmN0aW9uKCkge1xuICAgICAgcCA9IHIoITApO1xuICAgIH0sIGEuc2V0Rmxhdm9yID0gZnVuY3Rpb24odCkge1xuICAgICAgaWYgKCFiLmhhc093blByb3BlcnR5KHQpKVxuICAgICAgICB0aHJvdyBFcnJvcih0ICsgXCIgZmxhdm9yIHdhcyBub3QgZm91bmRcIik7XG4gICAgICBhLnJlc2V0T3B0aW9ucygpO1xuICAgICAgdmFyIHUgPSBiW3RdO1xuICAgICAgeSA9IHQ7XG4gICAgICBmb3IgKHZhciBzIGluIHUpXG4gICAgICAgIHUuaGFzT3duUHJvcGVydHkocykgJiYgKHBbc10gPSB1W3NdKTtcbiAgICB9LCBhLmdldEZsYXZvciA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHk7XG4gICAgfSwgYS5nZXRGbGF2b3JPcHRpb25zID0gZnVuY3Rpb24odCkge1xuICAgICAgaWYgKGIuaGFzT3duUHJvcGVydHkodCkpXG4gICAgICAgIHJldHVybiBiW3RdO1xuICAgIH0sIGEuZ2V0RGVmYXVsdE9wdGlvbnMgPSBmdW5jdGlvbih0KSB7XG4gICAgICByZXR1cm4gcih0KTtcbiAgICB9LCBhLnN1YlBhcnNlciA9IGZ1bmN0aW9uKHQsIHUpIHtcbiAgICAgIGlmIChhLmhlbHBlci5pc1N0cmluZyh0KSlcbiAgICAgICAgaWYgKHR5cGVvZiB1IDwgXCJ1XCIpXG4gICAgICAgICAgZFt0XSA9IHU7XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIGlmIChkLmhhc093blByb3BlcnR5KHQpKVxuICAgICAgICAgICAgcmV0dXJuIGRbdF07XG4gICAgICAgICAgdGhyb3cgRXJyb3IoXCJTdWJQYXJzZXIgbmFtZWQgXCIgKyB0ICsgXCIgbm90IHJlZ2lzdGVyZWQhXCIpO1xuICAgICAgICB9XG4gICAgfSwgYS5leHRlbnNpb24gPSBmdW5jdGlvbih0LCB1KSB7XG4gICAgICBpZiAoIWEuaGVscGVyLmlzU3RyaW5nKHQpKVxuICAgICAgICB0aHJvdyBFcnJvcihcIkV4dGVuc2lvbiAnbmFtZScgbXVzdCBiZSBhIHN0cmluZ1wiKTtcbiAgICAgIGlmICh0ID0gYS5oZWxwZXIuc3RkRXh0TmFtZSh0KSwgYS5oZWxwZXIuaXNVbmRlZmluZWQodSkpIHtcbiAgICAgICAgaWYgKCFvLmhhc093blByb3BlcnR5KHQpKVxuICAgICAgICAgIHRocm93IEVycm9yKFwiRXh0ZW5zaW9uIG5hbWVkIFwiICsgdCArIFwiIGlzIG5vdCByZWdpc3RlcmVkIVwiKTtcbiAgICAgICAgcmV0dXJuIG9bdF07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0eXBlb2YgdSA9PSBcImZ1bmN0aW9uXCIgJiYgKHUgPSB1KCkpLCBhLmhlbHBlci5pc0FycmF5KHUpIHx8ICh1ID0gW3VdKTtcbiAgICAgICAgdmFyIHMgPSB2KHUsIHQpO1xuICAgICAgICBpZiAocy52YWxpZClcbiAgICAgICAgICBvW3RdID0gdTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgIHRocm93IEVycm9yKHMuZXJyb3IpO1xuICAgICAgfVxuICAgIH0sIGEuZ2V0QWxsRXh0ZW5zaW9ucyA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIG87XG4gICAgfSwgYS5yZW1vdmVFeHRlbnNpb24gPSBmdW5jdGlvbih0KSB7XG4gICAgICBkZWxldGUgb1t0XTtcbiAgICB9LCBhLnJlc2V0RXh0ZW5zaW9ucyA9IGZ1bmN0aW9uKCkge1xuICAgICAgbyA9IHt9O1xuICAgIH07XG4gICAgZnVuY3Rpb24gdih0LCB1KSB7XG4gICAgICB2YXIgcyA9IHUgPyBcIkVycm9yIGluIFwiICsgdSArIFwiIGV4dGVuc2lvbi0+XCIgOiBcIkVycm9yIGluIHVubmFtZWQgZXh0ZW5zaW9uXCIsIGkgPSB7XG4gICAgICAgIHZhbGlkOiAhMCxcbiAgICAgICAgZXJyb3I6IFwiXCJcbiAgICAgIH07XG4gICAgICBhLmhlbHBlci5pc0FycmF5KHQpIHx8ICh0ID0gW3RdKTtcbiAgICAgIGZvciAodmFyIGMgPSAwOyBjIDwgdC5sZW5ndGg7ICsrYykge1xuICAgICAgICB2YXIgbSA9IHMgKyBcIiBzdWItZXh0ZW5zaW9uIFwiICsgYyArIFwiOiBcIiwgaCA9IHRbY107XG4gICAgICAgIGlmICh0eXBlb2YgaCAhPSBcIm9iamVjdFwiKVxuICAgICAgICAgIHJldHVybiBpLnZhbGlkID0gITEsIGkuZXJyb3IgPSBtICsgXCJtdXN0IGJlIGFuIG9iamVjdCwgYnV0IFwiICsgdHlwZW9mIGggKyBcIiBnaXZlblwiLCBpO1xuICAgICAgICBpZiAoIWEuaGVscGVyLmlzU3RyaW5nKGgudHlwZSkpXG4gICAgICAgICAgcmV0dXJuIGkudmFsaWQgPSAhMSwgaS5lcnJvciA9IG0gKyAncHJvcGVydHkgXCJ0eXBlXCIgbXVzdCBiZSBhIHN0cmluZywgYnV0ICcgKyB0eXBlb2YgaC50eXBlICsgXCIgZ2l2ZW5cIiwgaTtcbiAgICAgICAgdmFyIEMgPSBoLnR5cGUgPSBoLnR5cGUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgaWYgKEMgPT09IFwibGFuZ3VhZ2VcIiAmJiAoQyA9IGgudHlwZSA9IFwibGFuZ1wiKSwgQyA9PT0gXCJodG1sXCIgJiYgKEMgPSBoLnR5cGUgPSBcIm91dHB1dFwiKSwgQyAhPT0gXCJsYW5nXCIgJiYgQyAhPT0gXCJvdXRwdXRcIiAmJiBDICE9PSBcImxpc3RlbmVyXCIpXG4gICAgICAgICAgcmV0dXJuIGkudmFsaWQgPSAhMSwgaS5lcnJvciA9IG0gKyBcInR5cGUgXCIgKyBDICsgJyBpcyBub3QgcmVjb2duaXplZC4gVmFsaWQgdmFsdWVzOiBcImxhbmcvbGFuZ3VhZ2VcIiwgXCJvdXRwdXQvaHRtbFwiIG9yIFwibGlzdGVuZXJcIicsIGk7XG4gICAgICAgIGlmIChDID09PSBcImxpc3RlbmVyXCIpIHtcbiAgICAgICAgICBpZiAoYS5oZWxwZXIuaXNVbmRlZmluZWQoaC5saXN0ZW5lcnMpKVxuICAgICAgICAgICAgcmV0dXJuIGkudmFsaWQgPSAhMSwgaS5lcnJvciA9IG0gKyAnLiBFeHRlbnNpb25zIG9mIHR5cGUgXCJsaXN0ZW5lclwiIG11c3QgaGF2ZSBhIHByb3BlcnR5IGNhbGxlZCBcImxpc3RlbmVyc1wiJywgaTtcbiAgICAgICAgfSBlbHNlIGlmIChhLmhlbHBlci5pc1VuZGVmaW5lZChoLmZpbHRlcikgJiYgYS5oZWxwZXIuaXNVbmRlZmluZWQoaC5yZWdleCkpXG4gICAgICAgICAgcmV0dXJuIGkudmFsaWQgPSAhMSwgaS5lcnJvciA9IG0gKyBDICsgJyBleHRlbnNpb25zIG11c3QgZGVmaW5lIGVpdGhlciBhIFwicmVnZXhcIiBwcm9wZXJ0eSBvciBhIFwiZmlsdGVyXCIgbWV0aG9kJywgaTtcbiAgICAgICAgaWYgKGgubGlzdGVuZXJzKSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBoLmxpc3RlbmVycyAhPSBcIm9iamVjdFwiKVxuICAgICAgICAgICAgcmV0dXJuIGkudmFsaWQgPSAhMSwgaS5lcnJvciA9IG0gKyAnXCJsaXN0ZW5lcnNcIiBwcm9wZXJ0eSBtdXN0IGJlIGFuIG9iamVjdCBidXQgJyArIHR5cGVvZiBoLmxpc3RlbmVycyArIFwiIGdpdmVuXCIsIGk7XG4gICAgICAgICAgZm9yICh2YXIgVSBpbiBoLmxpc3RlbmVycylcbiAgICAgICAgICAgIGlmIChoLmxpc3RlbmVycy5oYXNPd25Qcm9wZXJ0eShVKSAmJiB0eXBlb2YgaC5saXN0ZW5lcnNbVV0gIT0gXCJmdW5jdGlvblwiKVxuICAgICAgICAgICAgICByZXR1cm4gaS52YWxpZCA9ICExLCBpLmVycm9yID0gbSArICdcImxpc3RlbmVyc1wiIHByb3BlcnR5IG11c3QgYmUgYW4gaGFzaCBvZiBbZXZlbnQgbmFtZV06IFtjYWxsYmFja10uIGxpc3RlbmVycy4nICsgVSArIFwiIG11c3QgYmUgYSBmdW5jdGlvbiBidXQgXCIgKyB0eXBlb2YgaC5saXN0ZW5lcnNbVV0gKyBcIiBnaXZlblwiLCBpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChoLmZpbHRlcikge1xuICAgICAgICAgIGlmICh0eXBlb2YgaC5maWx0ZXIgIT0gXCJmdW5jdGlvblwiKVxuICAgICAgICAgICAgcmV0dXJuIGkudmFsaWQgPSAhMSwgaS5lcnJvciA9IG0gKyAnXCJmaWx0ZXJcIiBtdXN0IGJlIGEgZnVuY3Rpb24sIGJ1dCAnICsgdHlwZW9mIGguZmlsdGVyICsgXCIgZ2l2ZW5cIiwgaTtcbiAgICAgICAgfSBlbHNlIGlmIChoLnJlZ2V4KSB7XG4gICAgICAgICAgaWYgKGEuaGVscGVyLmlzU3RyaW5nKGgucmVnZXgpICYmIChoLnJlZ2V4ID0gbmV3IFJlZ0V4cChoLnJlZ2V4LCBcImdcIikpLCAhKGgucmVnZXggaW5zdGFuY2VvZiBSZWdFeHApKVxuICAgICAgICAgICAgcmV0dXJuIGkudmFsaWQgPSAhMSwgaS5lcnJvciA9IG0gKyAnXCJyZWdleFwiIHByb3BlcnR5IG11c3QgZWl0aGVyIGJlIGEgc3RyaW5nIG9yIGEgUmVnRXhwIG9iamVjdCwgYnV0ICcgKyB0eXBlb2YgaC5yZWdleCArIFwiIGdpdmVuXCIsIGk7XG4gICAgICAgICAgaWYgKGEuaGVscGVyLmlzVW5kZWZpbmVkKGgucmVwbGFjZSkpXG4gICAgICAgICAgICByZXR1cm4gaS52YWxpZCA9ICExLCBpLmVycm9yID0gbSArICdcInJlZ2V4XCIgZXh0ZW5zaW9ucyBtdXN0IGltcGxlbWVudCBhIHJlcGxhY2Ugc3RyaW5nIG9yIGZ1bmN0aW9uJywgaTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGk7XG4gICAgfVxuICAgIGEudmFsaWRhdGVFeHRlbnNpb24gPSBmdW5jdGlvbih0KSB7XG4gICAgICB2YXIgdSA9IHYodCwgbnVsbCk7XG4gICAgICByZXR1cm4gdS52YWxpZCA/ICEwIDogKGNvbnNvbGUud2Fybih1LmVycm9yKSwgITEpO1xuICAgIH0sIGEuaGFzT3duUHJvcGVydHkoXCJoZWxwZXJcIikgfHwgKGEuaGVscGVyID0ge30pLCBhLmhlbHBlci5pc1N0cmluZyA9IGZ1bmN0aW9uKHQpIHtcbiAgICAgIHJldHVybiB0eXBlb2YgdCA9PSBcInN0cmluZ1wiIHx8IHQgaW5zdGFuY2VvZiBTdHJpbmc7XG4gICAgfSwgYS5oZWxwZXIuaXNGdW5jdGlvbiA9IGZ1bmN0aW9uKHQpIHtcbiAgICAgIHZhciB1ID0ge307XG4gICAgICByZXR1cm4gdCAmJiB1LnRvU3RyaW5nLmNhbGwodCkgPT09IFwiW29iamVjdCBGdW5jdGlvbl1cIjtcbiAgICB9LCBhLmhlbHBlci5pc0FycmF5ID0gZnVuY3Rpb24odCkge1xuICAgICAgcmV0dXJuIEFycmF5LmlzQXJyYXkodCk7XG4gICAgfSwgYS5oZWxwZXIuaXNVbmRlZmluZWQgPSBmdW5jdGlvbih0KSB7XG4gICAgICByZXR1cm4gdHlwZW9mIHQgPiBcInVcIjtcbiAgICB9LCBhLmhlbHBlci5mb3JFYWNoID0gZnVuY3Rpb24odCwgdSkge1xuICAgICAgaWYgKGEuaGVscGVyLmlzVW5kZWZpbmVkKHQpKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJvYmogcGFyYW0gaXMgcmVxdWlyZWRcIik7XG4gICAgICBpZiAoYS5oZWxwZXIuaXNVbmRlZmluZWQodSkpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcImNhbGxiYWNrIHBhcmFtIGlzIHJlcXVpcmVkXCIpO1xuICAgICAgaWYgKCFhLmhlbHBlci5pc0Z1bmN0aW9uKHUpKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJjYWxsYmFjayBwYXJhbSBtdXN0IGJlIGEgZnVuY3Rpb24vY2xvc3VyZVwiKTtcbiAgICAgIGlmICh0eXBlb2YgdC5mb3JFYWNoID09IFwiZnVuY3Rpb25cIilcbiAgICAgICAgdC5mb3JFYWNoKHUpO1xuICAgICAgZWxzZSBpZiAoYS5oZWxwZXIuaXNBcnJheSh0KSlcbiAgICAgICAgZm9yICh2YXIgcyA9IDA7IHMgPCB0Lmxlbmd0aDsgcysrKVxuICAgICAgICAgIHUodFtzXSwgcywgdCk7XG4gICAgICBlbHNlIGlmICh0eXBlb2YgdCA9PSBcIm9iamVjdFwiKVxuICAgICAgICBmb3IgKHZhciBpIGluIHQpXG4gICAgICAgICAgdC5oYXNPd25Qcm9wZXJ0eShpKSAmJiB1KHRbaV0sIGksIHQpO1xuICAgICAgZWxzZVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJvYmogZG9lcyBub3Qgc2VlbSB0byBiZSBhbiBhcnJheSBvciBhbiBpdGVyYWJsZSBvYmplY3RcIik7XG4gICAgfSwgYS5oZWxwZXIuc3RkRXh0TmFtZSA9IGZ1bmN0aW9uKHQpIHtcbiAgICAgIHJldHVybiB0LnJlcGxhY2UoL1tfPyorXFwvXFxcXC5eLV0vZywgXCJcIikucmVwbGFjZSgvXFxzL2csIFwiXCIpLnRvTG93ZXJDYXNlKCk7XG4gICAgfTtcbiAgICBmdW5jdGlvbiBnKHQsIHUpIHtcbiAgICAgIHZhciBzID0gdS5jaGFyQ29kZUF0KDApO1xuICAgICAgcmV0dXJuIFwiXHUwMEE4RVwiICsgcyArIFwiRVwiO1xuICAgIH1cbiAgICBhLmhlbHBlci5lc2NhcGVDaGFyYWN0ZXJzQ2FsbGJhY2sgPSBnLCBhLmhlbHBlci5lc2NhcGVDaGFyYWN0ZXJzID0gZnVuY3Rpb24odCwgdSwgcykge1xuICAgICAgdmFyIGkgPSBcIihbXCIgKyB1LnJlcGxhY2UoLyhbXFxbXFxdXFxcXF0pL2csIFwiXFxcXCQxXCIpICsgXCJdKVwiO1xuICAgICAgcyAmJiAoaSA9IFwiXFxcXFxcXFxcIiArIGkpO1xuICAgICAgdmFyIGMgPSBuZXcgUmVnRXhwKGksIFwiZ1wiKTtcbiAgICAgIHJldHVybiB0ID0gdC5yZXBsYWNlKGMsIGcpLCB0O1xuICAgIH0sIGEuaGVscGVyLnVuZXNjYXBlSFRNTEVudGl0aWVzID0gZnVuY3Rpb24odCkge1xuICAgICAgcmV0dXJuIHQucmVwbGFjZSgvJnF1b3Q7L2csICdcIicpLnJlcGxhY2UoLyZsdDsvZywgXCI8XCIpLnJlcGxhY2UoLyZndDsvZywgXCI+XCIpLnJlcGxhY2UoLyZhbXA7L2csIFwiJlwiKTtcbiAgICB9O1xuICAgIHZhciBTID0gZnVuY3Rpb24odCwgdSwgcywgaSkge1xuICAgICAgdmFyIGMgPSBpIHx8IFwiXCIsIG0gPSBjLmluZGV4T2YoXCJnXCIpID4gLTEsIGggPSBuZXcgUmVnRXhwKHUgKyBcInxcIiArIHMsIFwiZ1wiICsgYy5yZXBsYWNlKC9nL2csIFwiXCIpKSwgQyA9IG5ldyBSZWdFeHAodSwgYy5yZXBsYWNlKC9nL2csIFwiXCIpKSwgVSA9IFtdLCBILCBWLCBHLCBfLCBxO1xuICAgICAgZG9cbiAgICAgICAgZm9yIChIID0gMDsgRyA9IGguZXhlYyh0KTsgKVxuICAgICAgICAgIGlmIChDLnRlc3QoR1swXSkpXG4gICAgICAgICAgICBIKysgfHwgKFYgPSBoLmxhc3RJbmRleCwgXyA9IFYgLSBHWzBdLmxlbmd0aCk7XG4gICAgICAgICAgZWxzZSBpZiAoSCAmJiAhLS1IKSB7XG4gICAgICAgICAgICBxID0gRy5pbmRleCArIEdbMF0ubGVuZ3RoO1xuICAgICAgICAgICAgdmFyIEogPSB7XG4gICAgICAgICAgICAgIGxlZnQ6IHsgc3RhcnQ6IF8sIGVuZDogViB9LFxuICAgICAgICAgICAgICBtYXRjaDogeyBzdGFydDogViwgZW5kOiBHLmluZGV4IH0sXG4gICAgICAgICAgICAgIHJpZ2h0OiB7IHN0YXJ0OiBHLmluZGV4LCBlbmQ6IHEgfSxcbiAgICAgICAgICAgICAgd2hvbGVNYXRjaDogeyBzdGFydDogXywgZW5kOiBxIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpZiAoVS5wdXNoKEopLCAhbSlcbiAgICAgICAgICAgICAgcmV0dXJuIFU7XG4gICAgICAgICAgfVxuICAgICAgd2hpbGUgKEggJiYgKGgubGFzdEluZGV4ID0gVikpO1xuICAgICAgcmV0dXJuIFU7XG4gICAgfTtcbiAgICBhLmhlbHBlci5tYXRjaFJlY3Vyc2l2ZVJlZ0V4cCA9IGZ1bmN0aW9uKHQsIHUsIHMsIGkpIHtcbiAgICAgIGZvciAodmFyIGMgPSBTKHQsIHUsIHMsIGkpLCBtID0gW10sIGggPSAwOyBoIDwgYy5sZW5ndGg7ICsraClcbiAgICAgICAgbS5wdXNoKFtcbiAgICAgICAgICB0LnNsaWNlKGNbaF0ud2hvbGVNYXRjaC5zdGFydCwgY1toXS53aG9sZU1hdGNoLmVuZCksXG4gICAgICAgICAgdC5zbGljZShjW2hdLm1hdGNoLnN0YXJ0LCBjW2hdLm1hdGNoLmVuZCksXG4gICAgICAgICAgdC5zbGljZShjW2hdLmxlZnQuc3RhcnQsIGNbaF0ubGVmdC5lbmQpLFxuICAgICAgICAgIHQuc2xpY2UoY1toXS5yaWdodC5zdGFydCwgY1toXS5yaWdodC5lbmQpXG4gICAgICAgIF0pO1xuICAgICAgcmV0dXJuIG07XG4gICAgfSwgYS5oZWxwZXIucmVwbGFjZVJlY3Vyc2l2ZVJlZ0V4cCA9IGZ1bmN0aW9uKHQsIHUsIHMsIGksIGMpIHtcbiAgICAgIGlmICghYS5oZWxwZXIuaXNGdW5jdGlvbih1KSkge1xuICAgICAgICB2YXIgbSA9IHU7XG4gICAgICAgIHUgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICByZXR1cm4gbTtcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIHZhciBoID0gUyh0LCBzLCBpLCBjKSwgQyA9IHQsIFUgPSBoLmxlbmd0aDtcbiAgICAgIGlmIChVID4gMCkge1xuICAgICAgICB2YXIgSCA9IFtdO1xuICAgICAgICBoWzBdLndob2xlTWF0Y2guc3RhcnQgIT09IDAgJiYgSC5wdXNoKHQuc2xpY2UoMCwgaFswXS53aG9sZU1hdGNoLnN0YXJ0KSk7XG4gICAgICAgIGZvciAodmFyIFYgPSAwOyBWIDwgVTsgKytWKVxuICAgICAgICAgIEgucHVzaChcbiAgICAgICAgICAgIHUoXG4gICAgICAgICAgICAgIHQuc2xpY2UoaFtWXS53aG9sZU1hdGNoLnN0YXJ0LCBoW1ZdLndob2xlTWF0Y2guZW5kKSxcbiAgICAgICAgICAgICAgdC5zbGljZShoW1ZdLm1hdGNoLnN0YXJ0LCBoW1ZdLm1hdGNoLmVuZCksXG4gICAgICAgICAgICAgIHQuc2xpY2UoaFtWXS5sZWZ0LnN0YXJ0LCBoW1ZdLmxlZnQuZW5kKSxcbiAgICAgICAgICAgICAgdC5zbGljZShoW1ZdLnJpZ2h0LnN0YXJ0LCBoW1ZdLnJpZ2h0LmVuZClcbiAgICAgICAgICAgIClcbiAgICAgICAgICApLCBWIDwgVSAtIDEgJiYgSC5wdXNoKHQuc2xpY2UoaFtWXS53aG9sZU1hdGNoLmVuZCwgaFtWICsgMV0ud2hvbGVNYXRjaC5zdGFydCkpO1xuICAgICAgICBoW1UgLSAxXS53aG9sZU1hdGNoLmVuZCA8IHQubGVuZ3RoICYmIEgucHVzaCh0LnNsaWNlKGhbVSAtIDFdLndob2xlTWF0Y2guZW5kKSksIEMgPSBILmpvaW4oXCJcIik7XG4gICAgICB9XG4gICAgICByZXR1cm4gQztcbiAgICB9LCBhLmhlbHBlci5yZWdleEluZGV4T2YgPSBmdW5jdGlvbih0LCB1LCBzKSB7XG4gICAgICBpZiAoIWEuaGVscGVyLmlzU3RyaW5nKHQpKVxuICAgICAgICB0aHJvdyBcIkludmFsaWRBcmd1bWVudEVycm9yOiBmaXJzdCBwYXJhbWV0ZXIgb2Ygc2hvd2Rvd24uaGVscGVyLnJlZ2V4SW5kZXhPZiBmdW5jdGlvbiBtdXN0IGJlIGEgc3RyaW5nXCI7XG4gICAgICBpZiAoISh1IGluc3RhbmNlb2YgUmVnRXhwKSlcbiAgICAgICAgdGhyb3cgXCJJbnZhbGlkQXJndW1lbnRFcnJvcjogc2Vjb25kIHBhcmFtZXRlciBvZiBzaG93ZG93bi5oZWxwZXIucmVnZXhJbmRleE9mIGZ1bmN0aW9uIG11c3QgYmUgYW4gaW5zdGFuY2Ugb2YgUmVnRXhwXCI7XG4gICAgICB2YXIgaSA9IHQuc3Vic3RyaW5nKHMgfHwgMCkuc2VhcmNoKHUpO1xuICAgICAgcmV0dXJuIGkgPj0gMCA/IGkgKyAocyB8fCAwKSA6IGk7XG4gICAgfSwgYS5oZWxwZXIuc3BsaXRBdEluZGV4ID0gZnVuY3Rpb24odCwgdSkge1xuICAgICAgaWYgKCFhLmhlbHBlci5pc1N0cmluZyh0KSlcbiAgICAgICAgdGhyb3cgXCJJbnZhbGlkQXJndW1lbnRFcnJvcjogZmlyc3QgcGFyYW1ldGVyIG9mIHNob3dkb3duLmhlbHBlci5yZWdleEluZGV4T2YgZnVuY3Rpb24gbXVzdCBiZSBhIHN0cmluZ1wiO1xuICAgICAgcmV0dXJuIFt0LnN1YnN0cmluZygwLCB1KSwgdC5zdWJzdHJpbmcodSldO1xuICAgIH0sIGEuaGVscGVyLmVuY29kZUVtYWlsQWRkcmVzcyA9IGZ1bmN0aW9uKHQpIHtcbiAgICAgIHZhciB1ID0gW1xuICAgICAgICBmdW5jdGlvbihzKSB7XG4gICAgICAgICAgcmV0dXJuIFwiJiNcIiArIHMuY2hhckNvZGVBdCgwKSArIFwiO1wiO1xuICAgICAgICB9LFxuICAgICAgICBmdW5jdGlvbihzKSB7XG4gICAgICAgICAgcmV0dXJuIFwiJiN4XCIgKyBzLmNoYXJDb2RlQXQoMCkudG9TdHJpbmcoMTYpICsgXCI7XCI7XG4gICAgICAgIH0sXG4gICAgICAgIGZ1bmN0aW9uKHMpIHtcbiAgICAgICAgICByZXR1cm4gcztcbiAgICAgICAgfVxuICAgICAgXTtcbiAgICAgIHJldHVybiB0ID0gdC5yZXBsYWNlKC8uL2csIGZ1bmN0aW9uKHMpIHtcbiAgICAgICAgaWYgKHMgPT09IFwiQFwiKVxuICAgICAgICAgIHMgPSB1W01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDIpXShzKTtcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgdmFyIGkgPSBNYXRoLnJhbmRvbSgpO1xuICAgICAgICAgIHMgPSBpID4gMC45ID8gdVsyXShzKSA6IGkgPiAwLjQ1ID8gdVsxXShzKSA6IHVbMF0ocyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHM7XG4gICAgICB9KSwgdDtcbiAgICB9LCBhLmhlbHBlci5wYWRFbmQgPSBmdW5jdGlvbih1LCBzLCBpKSB7XG4gICAgICByZXR1cm4gcyA9IHMgPj4gMCwgaSA9IFN0cmluZyhpIHx8IFwiIFwiKSwgdS5sZW5ndGggPiBzID8gU3RyaW5nKHUpIDogKHMgPSBzIC0gdS5sZW5ndGgsIHMgPiBpLmxlbmd0aCAmJiAoaSArPSBpLnJlcGVhdChzIC8gaS5sZW5ndGgpKSwgU3RyaW5nKHUpICsgaS5zbGljZSgwLCBzKSk7XG4gICAgfSwgdHlwZW9mIGNvbnNvbGUgPiBcInVcIiAmJiAoY29uc29sZSA9IHtcbiAgICAgIHdhcm46IGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgYWxlcnQodCk7XG4gICAgICB9LFxuICAgICAgbG9nOiBmdW5jdGlvbih0KSB7XG4gICAgICAgIGFsZXJ0KHQpO1xuICAgICAgfSxcbiAgICAgIGVycm9yOiBmdW5jdGlvbih0KSB7XG4gICAgICAgIHRocm93IHQ7XG4gICAgICB9XG4gICAgfSksIGEuaGVscGVyLnJlZ2V4ZXMgPSB7XG4gICAgICBhc3Rlcmlza0Rhc2hBbmRDb2xvbjogLyhbKl86fl0pL2dcbiAgICB9LCBhLmhlbHBlci5lbW9qaXMgPSB7XG4gICAgICBcIisxXCI6IFwiXHVEODNEXHVEQzREXCIsXG4gICAgICBcIi0xXCI6IFwiXHVEODNEXHVEQzRFXCIsXG4gICAgICAxMDA6IFwiXHVEODNEXHVEQ0FGXCIsXG4gICAgICAxMjM0OiBcIlx1RDgzRFx1REQyMlwiLFxuICAgICAgXCIxc3RfcGxhY2VfbWVkYWxcIjogXCJcdUQ4M0VcdURENDdcIixcbiAgICAgIFwiMm5kX3BsYWNlX21lZGFsXCI6IFwiXHVEODNFXHVERDQ4XCIsXG4gICAgICBcIjNyZF9wbGFjZV9tZWRhbFwiOiBcIlx1RDgzRVx1REQ0OVwiLFxuICAgICAgXCI4YmFsbFwiOiBcIlx1RDgzQ1x1REZCMVwiLFxuICAgICAgYTogXCJcdUQ4M0NcdURENzBcdUZFMEZcIixcbiAgICAgIGFiOiBcIlx1RDgzQ1x1REQ4RVwiLFxuICAgICAgYWJjOiBcIlx1RDgzRFx1REQyNFwiLFxuICAgICAgYWJjZDogXCJcdUQ4M0RcdUREMjFcIixcbiAgICAgIGFjY2VwdDogXCJcdUQ4M0NcdURFNTFcIixcbiAgICAgIGFlcmlhbF90cmFtd2F5OiBcIlx1RDgzRFx1REVBMVwiLFxuICAgICAgYWlycGxhbmU6IFwiXHUyNzA4XHVGRTBGXCIsXG4gICAgICBhbGFybV9jbG9jazogXCJcdTIzRjBcIixcbiAgICAgIGFsZW1iaWM6IFwiXHUyNjk3XHVGRTBGXCIsXG4gICAgICBhbGllbjogXCJcdUQ4M0RcdURDN0RcIixcbiAgICAgIGFtYnVsYW5jZTogXCJcdUQ4M0RcdURFOTFcIixcbiAgICAgIGFtcGhvcmE6IFwiXHVEODNDXHVERkZBXCIsXG4gICAgICBhbmNob3I6IFwiXHUyNjkzXHVGRTBGXCIsXG4gICAgICBhbmdlbDogXCJcdUQ4M0RcdURDN0NcIixcbiAgICAgIGFuZ2VyOiBcIlx1RDgzRFx1RENBMlwiLFxuICAgICAgYW5ncnk6IFwiXHVEODNEXHVERTIwXCIsXG4gICAgICBhbmd1aXNoZWQ6IFwiXHVEODNEXHVERTI3XCIsXG4gICAgICBhbnQ6IFwiXHVEODNEXHVEQzFDXCIsXG4gICAgICBhcHBsZTogXCJcdUQ4M0NcdURGNEVcIixcbiAgICAgIGFxdWFyaXVzOiBcIlx1MjY1Mlx1RkUwRlwiLFxuICAgICAgYXJpZXM6IFwiXHUyNjQ4XHVGRTBGXCIsXG4gICAgICBhcnJvd19iYWNrd2FyZDogXCJcdTI1QzBcdUZFMEZcIixcbiAgICAgIGFycm93X2RvdWJsZV9kb3duOiBcIlx1MjNFQ1wiLFxuICAgICAgYXJyb3dfZG91YmxlX3VwOiBcIlx1MjNFQlwiLFxuICAgICAgYXJyb3dfZG93bjogXCJcdTJCMDdcdUZFMEZcIixcbiAgICAgIGFycm93X2Rvd25fc21hbGw6IFwiXHVEODNEXHVERDNEXCIsXG4gICAgICBhcnJvd19mb3J3YXJkOiBcIlx1MjVCNlx1RkUwRlwiLFxuICAgICAgYXJyb3dfaGVhZGluZ19kb3duOiBcIlx1MjkzNVx1RkUwRlwiLFxuICAgICAgYXJyb3dfaGVhZGluZ191cDogXCJcdTI5MzRcdUZFMEZcIixcbiAgICAgIGFycm93X2xlZnQ6IFwiXHUyQjA1XHVGRTBGXCIsXG4gICAgICBhcnJvd19sb3dlcl9sZWZ0OiBcIlx1MjE5OVx1RkUwRlwiLFxuICAgICAgYXJyb3dfbG93ZXJfcmlnaHQ6IFwiXHUyMTk4XHVGRTBGXCIsXG4gICAgICBhcnJvd19yaWdodDogXCJcdTI3QTFcdUZFMEZcIixcbiAgICAgIGFycm93X3JpZ2h0X2hvb2s6IFwiXHUyMUFBXHVGRTBGXCIsXG4gICAgICBhcnJvd191cDogXCJcdTJCMDZcdUZFMEZcIixcbiAgICAgIGFycm93X3VwX2Rvd246IFwiXHUyMTk1XHVGRTBGXCIsXG4gICAgICBhcnJvd191cF9zbWFsbDogXCJcdUQ4M0RcdUREM0NcIixcbiAgICAgIGFycm93X3VwcGVyX2xlZnQ6IFwiXHUyMTk2XHVGRTBGXCIsXG4gICAgICBhcnJvd191cHBlcl9yaWdodDogXCJcdTIxOTdcdUZFMEZcIixcbiAgICAgIGFycm93c19jbG9ja3dpc2U6IFwiXHVEODNEXHVERDAzXCIsXG4gICAgICBhcnJvd3NfY291bnRlcmNsb2Nrd2lzZTogXCJcdUQ4M0RcdUREMDRcIixcbiAgICAgIGFydDogXCJcdUQ4M0NcdURGQThcIixcbiAgICAgIGFydGljdWxhdGVkX2xvcnJ5OiBcIlx1RDgzRFx1REU5QlwiLFxuICAgICAgYXJ0aWZpY2lhbF9zYXRlbGxpdGU6IFwiXHVEODNEXHVERUYwXCIsXG4gICAgICBhc3RvbmlzaGVkOiBcIlx1RDgzRFx1REUzMlwiLFxuICAgICAgYXRobGV0aWNfc2hvZTogXCJcdUQ4M0RcdURDNUZcIixcbiAgICAgIGF0bTogXCJcdUQ4M0NcdURGRTdcIixcbiAgICAgIGF0b21fc3ltYm9sOiBcIlx1MjY5Qlx1RkUwRlwiLFxuICAgICAgYXZvY2FkbzogXCJcdUQ4M0VcdURENTFcIixcbiAgICAgIGI6IFwiXHVEODNDXHVERDcxXHVGRTBGXCIsXG4gICAgICBiYWJ5OiBcIlx1RDgzRFx1REM3NlwiLFxuICAgICAgYmFieV9ib3R0bGU6IFwiXHVEODNDXHVERjdDXCIsXG4gICAgICBiYWJ5X2NoaWNrOiBcIlx1RDgzRFx1REMyNFwiLFxuICAgICAgYmFieV9zeW1ib2w6IFwiXHVEODNEXHVERUJDXCIsXG4gICAgICBiYWNrOiBcIlx1RDgzRFx1REQxOVwiLFxuICAgICAgYmFjb246IFwiXHVEODNFXHVERDUzXCIsXG4gICAgICBiYWRtaW50b246IFwiXHVEODNDXHVERkY4XCIsXG4gICAgICBiYWdnYWdlX2NsYWltOiBcIlx1RDgzRFx1REVDNFwiLFxuICAgICAgYmFndWV0dGVfYnJlYWQ6IFwiXHVEODNFXHVERDU2XCIsXG4gICAgICBiYWxhbmNlX3NjYWxlOiBcIlx1MjY5Nlx1RkUwRlwiLFxuICAgICAgYmFsbG9vbjogXCJcdUQ4M0NcdURGODhcIixcbiAgICAgIGJhbGxvdF9ib3g6IFwiXHVEODNEXHVEREYzXCIsXG4gICAgICBiYWxsb3RfYm94X3dpdGhfY2hlY2s6IFwiXHUyNjExXHVGRTBGXCIsXG4gICAgICBiYW1ib286IFwiXHVEODNDXHVERjhEXCIsXG4gICAgICBiYW5hbmE6IFwiXHVEODNDXHVERjRDXCIsXG4gICAgICBiYW5nYmFuZzogXCJcdTIwM0NcdUZFMEZcIixcbiAgICAgIGJhbms6IFwiXHVEODNDXHVERkU2XCIsXG4gICAgICBiYXJfY2hhcnQ6IFwiXHVEODNEXHVEQ0NBXCIsXG4gICAgICBiYXJiZXI6IFwiXHVEODNEXHVEQzg4XCIsXG4gICAgICBiYXNlYmFsbDogXCJcdTI2QkVcdUZFMEZcIixcbiAgICAgIGJhc2tldGJhbGw6IFwiXHVEODNDXHVERkMwXCIsXG4gICAgICBiYXNrZXRiYWxsX21hbjogXCJcdTI2RjlcdUZFMEZcIixcbiAgICAgIGJhc2tldGJhbGxfd29tYW46IFwiXHUyNkY5XHVGRTBGJnp3ajtcdTI2NDBcdUZFMEZcIixcbiAgICAgIGJhdDogXCJcdUQ4M0VcdUREODdcIixcbiAgICAgIGJhdGg6IFwiXHVEODNEXHVERUMwXCIsXG4gICAgICBiYXRodHViOiBcIlx1RDgzRFx1REVDMVwiLFxuICAgICAgYmF0dGVyeTogXCJcdUQ4M0RcdUREMEJcIixcbiAgICAgIGJlYWNoX3VtYnJlbGxhOiBcIlx1RDgzQ1x1REZENlwiLFxuICAgICAgYmVhcjogXCJcdUQ4M0RcdURDM0JcIixcbiAgICAgIGJlZDogXCJcdUQ4M0RcdURFQ0ZcIixcbiAgICAgIGJlZTogXCJcdUQ4M0RcdURDMURcIixcbiAgICAgIGJlZXI6IFwiXHVEODNDXHVERjdBXCIsXG4gICAgICBiZWVyczogXCJcdUQ4M0NcdURGN0JcIixcbiAgICAgIGJlZXRsZTogXCJcdUQ4M0RcdURDMUVcIixcbiAgICAgIGJlZ2lubmVyOiBcIlx1RDgzRFx1REQzMFwiLFxuICAgICAgYmVsbDogXCJcdUQ4M0RcdUREMTRcIixcbiAgICAgIGJlbGxob3BfYmVsbDogXCJcdUQ4M0RcdURFQ0VcIixcbiAgICAgIGJlbnRvOiBcIlx1RDgzQ1x1REY3MVwiLFxuICAgICAgYmlraW5nX21hbjogXCJcdUQ4M0RcdURFQjRcIixcbiAgICAgIGJpa2U6IFwiXHVEODNEXHVERUIyXCIsXG4gICAgICBiaWtpbmdfd29tYW46IFwiXHVEODNEXHVERUI0Jnp3ajtcdTI2NDBcdUZFMEZcIixcbiAgICAgIGJpa2luaTogXCJcdUQ4M0RcdURDNTlcIixcbiAgICAgIGJpb2hhemFyZDogXCJcdTI2MjNcdUZFMEZcIixcbiAgICAgIGJpcmQ6IFwiXHVEODNEXHVEQzI2XCIsXG4gICAgICBiaXJ0aGRheTogXCJcdUQ4M0NcdURGODJcIixcbiAgICAgIGJsYWNrX2NpcmNsZTogXCJcdTI2QUJcdUZFMEZcIixcbiAgICAgIGJsYWNrX2ZsYWc6IFwiXHVEODNDXHVERkY0XCIsXG4gICAgICBibGFja19oZWFydDogXCJcdUQ4M0RcdUREQTRcIixcbiAgICAgIGJsYWNrX2pva2VyOiBcIlx1RDgzQ1x1RENDRlwiLFxuICAgICAgYmxhY2tfbGFyZ2Vfc3F1YXJlOiBcIlx1MkIxQlx1RkUwRlwiLFxuICAgICAgYmxhY2tfbWVkaXVtX3NtYWxsX3NxdWFyZTogXCJcdTI1RkVcdUZFMEZcIixcbiAgICAgIGJsYWNrX21lZGl1bV9zcXVhcmU6IFwiXHUyNUZDXHVGRTBGXCIsXG4gICAgICBibGFja19uaWI6IFwiXHUyNzEyXHVGRTBGXCIsXG4gICAgICBibGFja19zbWFsbF9zcXVhcmU6IFwiXHUyNUFBXHVGRTBGXCIsXG4gICAgICBibGFja19zcXVhcmVfYnV0dG9uOiBcIlx1RDgzRFx1REQzMlwiLFxuICAgICAgYmxvbmRlX21hbjogXCJcdUQ4M0RcdURDNzFcIixcbiAgICAgIGJsb25kZV93b21hbjogXCJcdUQ4M0RcdURDNzEmendqO1x1MjY0MFx1RkUwRlwiLFxuICAgICAgYmxvc3NvbTogXCJcdUQ4M0NcdURGM0NcIixcbiAgICAgIGJsb3dmaXNoOiBcIlx1RDgzRFx1REMyMVwiLFxuICAgICAgYmx1ZV9ib29rOiBcIlx1RDgzRFx1RENEOFwiLFxuICAgICAgYmx1ZV9jYXI6IFwiXHVEODNEXHVERTk5XCIsXG4gICAgICBibHVlX2hlYXJ0OiBcIlx1RDgzRFx1REM5OVwiLFxuICAgICAgYmx1c2g6IFwiXHVEODNEXHVERTBBXCIsXG4gICAgICBib2FyOiBcIlx1RDgzRFx1REMxN1wiLFxuICAgICAgYm9hdDogXCJcdTI2RjVcdUZFMEZcIixcbiAgICAgIGJvbWI6IFwiXHVEODNEXHVEQ0EzXCIsXG4gICAgICBib29rOiBcIlx1RDgzRFx1RENENlwiLFxuICAgICAgYm9va21hcms6IFwiXHVEODNEXHVERDE2XCIsXG4gICAgICBib29rbWFya190YWJzOiBcIlx1RDgzRFx1RENEMVwiLFxuICAgICAgYm9va3M6IFwiXHVEODNEXHVEQ0RBXCIsXG4gICAgICBib29tOiBcIlx1RDgzRFx1RENBNVwiLFxuICAgICAgYm9vdDogXCJcdUQ4M0RcdURDNjJcIixcbiAgICAgIGJvdXF1ZXQ6IFwiXHVEODNEXHVEQzkwXCIsXG4gICAgICBib3dpbmdfbWFuOiBcIlx1RDgzRFx1REU0N1wiLFxuICAgICAgYm93X2FuZF9hcnJvdzogXCJcdUQ4M0NcdURGRjlcIixcbiAgICAgIGJvd2luZ193b21hbjogXCJcdUQ4M0RcdURFNDcmendqO1x1MjY0MFx1RkUwRlwiLFxuICAgICAgYm93bGluZzogXCJcdUQ4M0NcdURGQjNcIixcbiAgICAgIGJveGluZ19nbG92ZTogXCJcdUQ4M0VcdURENEFcIixcbiAgICAgIGJveTogXCJcdUQ4M0RcdURDNjZcIixcbiAgICAgIGJyZWFkOiBcIlx1RDgzQ1x1REY1RVwiLFxuICAgICAgYnJpZGVfd2l0aF92ZWlsOiBcIlx1RDgzRFx1REM3MFwiLFxuICAgICAgYnJpZGdlX2F0X25pZ2h0OiBcIlx1RDgzQ1x1REYwOVwiLFxuICAgICAgYnJpZWZjYXNlOiBcIlx1RDgzRFx1RENCQ1wiLFxuICAgICAgYnJva2VuX2hlYXJ0OiBcIlx1RDgzRFx1REM5NFwiLFxuICAgICAgYnVnOiBcIlx1RDgzRFx1REMxQlwiLFxuICAgICAgYnVpbGRpbmdfY29uc3RydWN0aW9uOiBcIlx1RDgzQ1x1REZEN1wiLFxuICAgICAgYnVsYjogXCJcdUQ4M0RcdURDQTFcIixcbiAgICAgIGJ1bGxldHRyYWluX2Zyb250OiBcIlx1RDgzRFx1REU4NVwiLFxuICAgICAgYnVsbGV0dHJhaW5fc2lkZTogXCJcdUQ4M0RcdURFODRcIixcbiAgICAgIGJ1cnJpdG86IFwiXHVEODNDXHVERjJGXCIsXG4gICAgICBidXM6IFwiXHVEODNEXHVERThDXCIsXG4gICAgICBidXNpbmVzc19zdWl0X2xldml0YXRpbmc6IFwiXHVEODNEXHVERDc0XCIsXG4gICAgICBidXNzdG9wOiBcIlx1RDgzRFx1REU4RlwiLFxuICAgICAgYnVzdF9pbl9zaWxob3VldHRlOiBcIlx1RDgzRFx1REM2NFwiLFxuICAgICAgYnVzdHNfaW5fc2lsaG91ZXR0ZTogXCJcdUQ4M0RcdURDNjVcIixcbiAgICAgIGJ1dHRlcmZseTogXCJcdUQ4M0VcdUREOEJcIixcbiAgICAgIGNhY3R1czogXCJcdUQ4M0NcdURGMzVcIixcbiAgICAgIGNha2U6IFwiXHVEODNDXHVERjcwXCIsXG4gICAgICBjYWxlbmRhcjogXCJcdUQ4M0RcdURDQzZcIixcbiAgICAgIGNhbGxfbWVfaGFuZDogXCJcdUQ4M0VcdUREMTlcIixcbiAgICAgIGNhbGxpbmc6IFwiXHVEODNEXHVEQ0YyXCIsXG4gICAgICBjYW1lbDogXCJcdUQ4M0RcdURDMkJcIixcbiAgICAgIGNhbWVyYTogXCJcdUQ4M0RcdURDRjdcIixcbiAgICAgIGNhbWVyYV9mbGFzaDogXCJcdUQ4M0RcdURDRjhcIixcbiAgICAgIGNhbXBpbmc6IFwiXHVEODNDXHVERkQ1XCIsXG4gICAgICBjYW5jZXI6IFwiXHUyNjRCXHVGRTBGXCIsXG4gICAgICBjYW5kbGU6IFwiXHVEODNEXHVERDZGXCIsXG4gICAgICBjYW5keTogXCJcdUQ4M0NcdURGNkNcIixcbiAgICAgIGNhbm9lOiBcIlx1RDgzRFx1REVGNlwiLFxuICAgICAgY2FwaXRhbF9hYmNkOiBcIlx1RDgzRFx1REQyMFwiLFxuICAgICAgY2Fwcmljb3JuOiBcIlx1MjY1MVx1RkUwRlwiLFxuICAgICAgY2FyOiBcIlx1RDgzRFx1REU5N1wiLFxuICAgICAgY2FyZF9maWxlX2JveDogXCJcdUQ4M0RcdUREQzNcIixcbiAgICAgIGNhcmRfaW5kZXg6IFwiXHVEODNEXHVEQ0M3XCIsXG4gICAgICBjYXJkX2luZGV4X2RpdmlkZXJzOiBcIlx1RDgzRFx1RERDMlwiLFxuICAgICAgY2Fyb3VzZWxfaG9yc2U6IFwiXHVEODNDXHVERkEwXCIsXG4gICAgICBjYXJyb3Q6IFwiXHVEODNFXHVERDU1XCIsXG4gICAgICBjYXQ6IFwiXHVEODNEXHVEQzMxXCIsXG4gICAgICBjYXQyOiBcIlx1RDgzRFx1REMwOFwiLFxuICAgICAgY2Q6IFwiXHVEODNEXHVEQ0JGXCIsXG4gICAgICBjaGFpbnM6IFwiXHUyNkQzXCIsXG4gICAgICBjaGFtcGFnbmU6IFwiXHVEODNDXHVERjdFXCIsXG4gICAgICBjaGFydDogXCJcdUQ4M0RcdURDQjlcIixcbiAgICAgIGNoYXJ0X3dpdGhfZG93bndhcmRzX3RyZW5kOiBcIlx1RDgzRFx1RENDOVwiLFxuICAgICAgY2hhcnRfd2l0aF91cHdhcmRzX3RyZW5kOiBcIlx1RDgzRFx1RENDOFwiLFxuICAgICAgY2hlY2tlcmVkX2ZsYWc6IFwiXHVEODNDXHVERkMxXCIsXG4gICAgICBjaGVlc2U6IFwiXHVEODNFXHVEREMwXCIsXG4gICAgICBjaGVycmllczogXCJcdUQ4M0NcdURGNTJcIixcbiAgICAgIGNoZXJyeV9ibG9zc29tOiBcIlx1RDgzQ1x1REYzOFwiLFxuICAgICAgY2hlc3RudXQ6IFwiXHVEODNDXHVERjMwXCIsXG4gICAgICBjaGlja2VuOiBcIlx1RDgzRFx1REMxNFwiLFxuICAgICAgY2hpbGRyZW5fY3Jvc3Npbmc6IFwiXHVEODNEXHVERUI4XCIsXG4gICAgICBjaGlwbXVuazogXCJcdUQ4M0RcdURDM0ZcIixcbiAgICAgIGNob2NvbGF0ZV9iYXI6IFwiXHVEODNDXHVERjZCXCIsXG4gICAgICBjaHJpc3RtYXNfdHJlZTogXCJcdUQ4M0NcdURGODRcIixcbiAgICAgIGNodXJjaDogXCJcdTI2RUFcdUZFMEZcIixcbiAgICAgIGNpbmVtYTogXCJcdUQ4M0NcdURGQTZcIixcbiAgICAgIGNpcmN1c190ZW50OiBcIlx1RDgzQ1x1REZBQVwiLFxuICAgICAgY2l0eV9zdW5yaXNlOiBcIlx1RDgzQ1x1REYwN1wiLFxuICAgICAgY2l0eV9zdW5zZXQ6IFwiXHVEODNDXHVERjA2XCIsXG4gICAgICBjaXR5c2NhcGU6IFwiXHVEODNDXHVERkQ5XCIsXG4gICAgICBjbDogXCJcdUQ4M0NcdUREOTFcIixcbiAgICAgIGNsYW1wOiBcIlx1RDgzRFx1REREQ1wiLFxuICAgICAgY2xhcDogXCJcdUQ4M0RcdURDNEZcIixcbiAgICAgIGNsYXBwZXI6IFwiXHVEODNDXHVERkFDXCIsXG4gICAgICBjbGFzc2ljYWxfYnVpbGRpbmc6IFwiXHVEODNDXHVERkRCXCIsXG4gICAgICBjbGlua2luZ19nbGFzc2VzOiBcIlx1RDgzRVx1REQ0MlwiLFxuICAgICAgY2xpcGJvYXJkOiBcIlx1RDgzRFx1RENDQlwiLFxuICAgICAgY2xvY2sxOiBcIlx1RDgzRFx1REQ1MFwiLFxuICAgICAgY2xvY2sxMDogXCJcdUQ4M0RcdURENTlcIixcbiAgICAgIGNsb2NrMTAzMDogXCJcdUQ4M0RcdURENjVcIixcbiAgICAgIGNsb2NrMTE6IFwiXHVEODNEXHVERDVBXCIsXG4gICAgICBjbG9jazExMzA6IFwiXHVEODNEXHVERDY2XCIsXG4gICAgICBjbG9jazEyOiBcIlx1RDgzRFx1REQ1QlwiLFxuICAgICAgY2xvY2sxMjMwOiBcIlx1RDgzRFx1REQ2N1wiLFxuICAgICAgY2xvY2sxMzA6IFwiXHVEODNEXHVERDVDXCIsXG4gICAgICBjbG9jazI6IFwiXHVEODNEXHVERDUxXCIsXG4gICAgICBjbG9jazIzMDogXCJcdUQ4M0RcdURENURcIixcbiAgICAgIGNsb2NrMzogXCJcdUQ4M0RcdURENTJcIixcbiAgICAgIGNsb2NrMzMwOiBcIlx1RDgzRFx1REQ1RVwiLFxuICAgICAgY2xvY2s0OiBcIlx1RDgzRFx1REQ1M1wiLFxuICAgICAgY2xvY2s0MzA6IFwiXHVEODNEXHVERDVGXCIsXG4gICAgICBjbG9jazU6IFwiXHVEODNEXHVERDU0XCIsXG4gICAgICBjbG9jazUzMDogXCJcdUQ4M0RcdURENjBcIixcbiAgICAgIGNsb2NrNjogXCJcdUQ4M0RcdURENTVcIixcbiAgICAgIGNsb2NrNjMwOiBcIlx1RDgzRFx1REQ2MVwiLFxuICAgICAgY2xvY2s3OiBcIlx1RDgzRFx1REQ1NlwiLFxuICAgICAgY2xvY2s3MzA6IFwiXHVEODNEXHVERDYyXCIsXG4gICAgICBjbG9jazg6IFwiXHVEODNEXHVERDU3XCIsXG4gICAgICBjbG9jazgzMDogXCJcdUQ4M0RcdURENjNcIixcbiAgICAgIGNsb2NrOTogXCJcdUQ4M0RcdURENThcIixcbiAgICAgIGNsb2NrOTMwOiBcIlx1RDgzRFx1REQ2NFwiLFxuICAgICAgY2xvc2VkX2Jvb2s6IFwiXHVEODNEXHVEQ0Q1XCIsXG4gICAgICBjbG9zZWRfbG9ja193aXRoX2tleTogXCJcdUQ4M0RcdUREMTBcIixcbiAgICAgIGNsb3NlZF91bWJyZWxsYTogXCJcdUQ4M0NcdURGMDJcIixcbiAgICAgIGNsb3VkOiBcIlx1MjYwMVx1RkUwRlwiLFxuICAgICAgY2xvdWRfd2l0aF9saWdodG5pbmc6IFwiXHVEODNDXHVERjI5XCIsXG4gICAgICBjbG91ZF93aXRoX2xpZ2h0bmluZ19hbmRfcmFpbjogXCJcdTI2QzhcIixcbiAgICAgIGNsb3VkX3dpdGhfcmFpbjogXCJcdUQ4M0NcdURGMjdcIixcbiAgICAgIGNsb3VkX3dpdGhfc25vdzogXCJcdUQ4M0NcdURGMjhcIixcbiAgICAgIGNsb3duX2ZhY2U6IFwiXHVEODNFXHVERDIxXCIsXG4gICAgICBjbHViczogXCJcdTI2NjNcdUZFMEZcIixcbiAgICAgIGNvY2t0YWlsOiBcIlx1RDgzQ1x1REY3OFwiLFxuICAgICAgY29mZmVlOiBcIlx1MjYxNVx1RkUwRlwiLFxuICAgICAgY29mZmluOiBcIlx1MjZCMFx1RkUwRlwiLFxuICAgICAgY29sZF9zd2VhdDogXCJcdUQ4M0RcdURFMzBcIixcbiAgICAgIGNvbWV0OiBcIlx1MjYwNFx1RkUwRlwiLFxuICAgICAgY29tcHV0ZXI6IFwiXHVEODNEXHVEQ0JCXCIsXG4gICAgICBjb21wdXRlcl9tb3VzZTogXCJcdUQ4M0RcdUREQjFcIixcbiAgICAgIGNvbmZldHRpX2JhbGw6IFwiXHVEODNDXHVERjhBXCIsXG4gICAgICBjb25mb3VuZGVkOiBcIlx1RDgzRFx1REUxNlwiLFxuICAgICAgY29uZnVzZWQ6IFwiXHVEODNEXHVERTE1XCIsXG4gICAgICBjb25ncmF0dWxhdGlvbnM6IFwiXHUzMjk3XHVGRTBGXCIsXG4gICAgICBjb25zdHJ1Y3Rpb246IFwiXHVEODNEXHVERUE3XCIsXG4gICAgICBjb25zdHJ1Y3Rpb25fd29ya2VyX21hbjogXCJcdUQ4M0RcdURDNzdcIixcbiAgICAgIGNvbnN0cnVjdGlvbl93b3JrZXJfd29tYW46IFwiXHVEODNEXHVEQzc3Jnp3ajtcdTI2NDBcdUZFMEZcIixcbiAgICAgIGNvbnRyb2xfa25vYnM6IFwiXHVEODNDXHVERjlCXCIsXG4gICAgICBjb252ZW5pZW5jZV9zdG9yZTogXCJcdUQ4M0NcdURGRUFcIixcbiAgICAgIGNvb2tpZTogXCJcdUQ4M0NcdURGNkFcIixcbiAgICAgIGNvb2w6IFwiXHVEODNDXHVERDkyXCIsXG4gICAgICBwb2xpY2VtYW46IFwiXHVEODNEXHVEQzZFXCIsXG4gICAgICBjb3B5cmlnaHQ6IFwiXHUwMEE5XHVGRTBGXCIsXG4gICAgICBjb3JuOiBcIlx1RDgzQ1x1REYzRFwiLFxuICAgICAgY291Y2hfYW5kX2xhbXA6IFwiXHVEODNEXHVERUNCXCIsXG4gICAgICBjb3VwbGU6IFwiXHVEODNEXHVEQzZCXCIsXG4gICAgICBjb3VwbGVfd2l0aF9oZWFydF93b21hbl9tYW46IFwiXHVEODNEXHVEQzkxXCIsXG4gICAgICBjb3VwbGVfd2l0aF9oZWFydF9tYW5fbWFuOiBcIlx1RDgzRFx1REM2OCZ6d2o7XHUyNzY0XHVGRTBGJnp3ajtcdUQ4M0RcdURDNjhcIixcbiAgICAgIGNvdXBsZV93aXRoX2hlYXJ0X3dvbWFuX3dvbWFuOiBcIlx1RDgzRFx1REM2OSZ6d2o7XHUyNzY0XHVGRTBGJnp3ajtcdUQ4M0RcdURDNjlcIixcbiAgICAgIGNvdXBsZWtpc3NfbWFuX21hbjogXCJcdUQ4M0RcdURDNjgmendqO1x1Mjc2NFx1RkUwRiZ6d2o7XHVEODNEXHVEQzhCJnp3ajtcdUQ4M0RcdURDNjhcIixcbiAgICAgIGNvdXBsZWtpc3NfbWFuX3dvbWFuOiBcIlx1RDgzRFx1REM4RlwiLFxuICAgICAgY291cGxla2lzc193b21hbl93b21hbjogXCJcdUQ4M0RcdURDNjkmendqO1x1Mjc2NFx1RkUwRiZ6d2o7XHVEODNEXHVEQzhCJnp3ajtcdUQ4M0RcdURDNjlcIixcbiAgICAgIGNvdzogXCJcdUQ4M0RcdURDMkVcIixcbiAgICAgIGNvdzI6IFwiXHVEODNEXHVEQzA0XCIsXG4gICAgICBjb3dib3lfaGF0X2ZhY2U6IFwiXHVEODNFXHVERDIwXCIsXG4gICAgICBjcmFiOiBcIlx1RDgzRVx1REQ4MFwiLFxuICAgICAgY3JheW9uOiBcIlx1RDgzRFx1REQ4RFwiLFxuICAgICAgY3JlZGl0X2NhcmQ6IFwiXHVEODNEXHVEQ0IzXCIsXG4gICAgICBjcmVzY2VudF9tb29uOiBcIlx1RDgzQ1x1REYxOVwiLFxuICAgICAgY3JpY2tldDogXCJcdUQ4M0NcdURGQ0ZcIixcbiAgICAgIGNyb2NvZGlsZTogXCJcdUQ4M0RcdURDMEFcIixcbiAgICAgIGNyb2lzc2FudDogXCJcdUQ4M0VcdURENTBcIixcbiAgICAgIGNyb3NzZWRfZmluZ2VyczogXCJcdUQ4M0VcdUREMUVcIixcbiAgICAgIGNyb3NzZWRfZmxhZ3M6IFwiXHVEODNDXHVERjhDXCIsXG4gICAgICBjcm9zc2VkX3N3b3JkczogXCJcdTI2OTRcdUZFMEZcIixcbiAgICAgIGNyb3duOiBcIlx1RDgzRFx1REM1MVwiLFxuICAgICAgY3J5OiBcIlx1RDgzRFx1REUyMlwiLFxuICAgICAgY3J5aW5nX2NhdF9mYWNlOiBcIlx1RDgzRFx1REUzRlwiLFxuICAgICAgY3J5c3RhbF9iYWxsOiBcIlx1RDgzRFx1REQyRVwiLFxuICAgICAgY3VjdW1iZXI6IFwiXHVEODNFXHVERDUyXCIsXG4gICAgICBjdXBpZDogXCJcdUQ4M0RcdURDOThcIixcbiAgICAgIGN1cmx5X2xvb3A6IFwiXHUyN0IwXCIsXG4gICAgICBjdXJyZW5jeV9leGNoYW5nZTogXCJcdUQ4M0RcdURDQjFcIixcbiAgICAgIGN1cnJ5OiBcIlx1RDgzQ1x1REY1QlwiLFxuICAgICAgY3VzdGFyZDogXCJcdUQ4M0NcdURGNkVcIixcbiAgICAgIGN1c3RvbXM6IFwiXHVEODNEXHVERUMzXCIsXG4gICAgICBjeWNsb25lOiBcIlx1RDgzQ1x1REYwMFwiLFxuICAgICAgZGFnZ2VyOiBcIlx1RDgzRFx1RERFMVwiLFxuICAgICAgZGFuY2VyOiBcIlx1RDgzRFx1REM4M1wiLFxuICAgICAgZGFuY2luZ193b21lbjogXCJcdUQ4M0RcdURDNkZcIixcbiAgICAgIGRhbmNpbmdfbWVuOiBcIlx1RDgzRFx1REM2RiZ6d2o7XHUyNjQyXHVGRTBGXCIsXG4gICAgICBkYW5nbzogXCJcdUQ4M0NcdURGNjFcIixcbiAgICAgIGRhcmtfc3VuZ2xhc3NlczogXCJcdUQ4M0RcdURENzZcIixcbiAgICAgIGRhcnQ6IFwiXHVEODNDXHVERkFGXCIsXG4gICAgICBkYXNoOiBcIlx1RDgzRFx1RENBOFwiLFxuICAgICAgZGF0ZTogXCJcdUQ4M0RcdURDQzVcIixcbiAgICAgIGRlY2lkdW91c190cmVlOiBcIlx1RDgzQ1x1REYzM1wiLFxuICAgICAgZGVlcjogXCJcdUQ4M0VcdUREOENcIixcbiAgICAgIGRlcGFydG1lbnRfc3RvcmU6IFwiXHVEODNDXHVERkVDXCIsXG4gICAgICBkZXJlbGljdF9ob3VzZTogXCJcdUQ4M0NcdURGREFcIixcbiAgICAgIGRlc2VydDogXCJcdUQ4M0NcdURGRENcIixcbiAgICAgIGRlc2VydF9pc2xhbmQ6IFwiXHVEODNDXHVERkREXCIsXG4gICAgICBkZXNrdG9wX2NvbXB1dGVyOiBcIlx1RDgzRFx1RERBNVwiLFxuICAgICAgbWFsZV9kZXRlY3RpdmU6IFwiXHVEODNEXHVERDc1XHVGRTBGXCIsXG4gICAgICBkaWFtb25kX3NoYXBlX3dpdGhfYV9kb3RfaW5zaWRlOiBcIlx1RDgzRFx1RENBMFwiLFxuICAgICAgZGlhbW9uZHM6IFwiXHUyNjY2XHVGRTBGXCIsXG4gICAgICBkaXNhcHBvaW50ZWQ6IFwiXHVEODNEXHVERTFFXCIsXG4gICAgICBkaXNhcHBvaW50ZWRfcmVsaWV2ZWQ6IFwiXHVEODNEXHVERTI1XCIsXG4gICAgICBkaXp6eTogXCJcdUQ4M0RcdURDQUJcIixcbiAgICAgIGRpenp5X2ZhY2U6IFwiXHVEODNEXHVERTM1XCIsXG4gICAgICBkb19ub3RfbGl0dGVyOiBcIlx1RDgzRFx1REVBRlwiLFxuICAgICAgZG9nOiBcIlx1RDgzRFx1REMzNlwiLFxuICAgICAgZG9nMjogXCJcdUQ4M0RcdURDMTVcIixcbiAgICAgIGRvbGxhcjogXCJcdUQ4M0RcdURDQjVcIixcbiAgICAgIGRvbGxzOiBcIlx1RDgzQ1x1REY4RVwiLFxuICAgICAgZG9scGhpbjogXCJcdUQ4M0RcdURDMkNcIixcbiAgICAgIGRvb3I6IFwiXHVEODNEXHVERUFBXCIsXG4gICAgICBkb3VnaG51dDogXCJcdUQ4M0NcdURGNjlcIixcbiAgICAgIGRvdmU6IFwiXHVEODNEXHVERDRBXCIsXG4gICAgICBkcmFnb246IFwiXHVEODNEXHVEQzA5XCIsXG4gICAgICBkcmFnb25fZmFjZTogXCJcdUQ4M0RcdURDMzJcIixcbiAgICAgIGRyZXNzOiBcIlx1RDgzRFx1REM1N1wiLFxuICAgICAgZHJvbWVkYXJ5X2NhbWVsOiBcIlx1RDgzRFx1REMyQVwiLFxuICAgICAgZHJvb2xpbmdfZmFjZTogXCJcdUQ4M0VcdUREMjRcIixcbiAgICAgIGRyb3BsZXQ6IFwiXHVEODNEXHVEQ0E3XCIsXG4gICAgICBkcnVtOiBcIlx1RDgzRVx1REQ0MVwiLFxuICAgICAgZHVjazogXCJcdUQ4M0VcdUREODZcIixcbiAgICAgIGR2ZDogXCJcdUQ4M0RcdURDQzBcIixcbiAgICAgIFwiZS1tYWlsXCI6IFwiXHVEODNEXHVEQ0U3XCIsXG4gICAgICBlYWdsZTogXCJcdUQ4M0VcdUREODVcIixcbiAgICAgIGVhcjogXCJcdUQ4M0RcdURDNDJcIixcbiAgICAgIGVhcl9vZl9yaWNlOiBcIlx1RDgzQ1x1REYzRVwiLFxuICAgICAgZWFydGhfYWZyaWNhOiBcIlx1RDgzQ1x1REYwRFwiLFxuICAgICAgZWFydGhfYW1lcmljYXM6IFwiXHVEODNDXHVERjBFXCIsXG4gICAgICBlYXJ0aF9hc2lhOiBcIlx1RDgzQ1x1REYwRlwiLFxuICAgICAgZWdnOiBcIlx1RDgzRVx1REQ1QVwiLFxuICAgICAgZWdncGxhbnQ6IFwiXHVEODNDXHVERjQ2XCIsXG4gICAgICBlaWdodF9wb2ludGVkX2JsYWNrX3N0YXI6IFwiXHUyNzM0XHVGRTBGXCIsXG4gICAgICBlaWdodF9zcG9rZWRfYXN0ZXJpc2s6IFwiXHUyNzMzXHVGRTBGXCIsXG4gICAgICBlbGVjdHJpY19wbHVnOiBcIlx1RDgzRFx1REQwQ1wiLFxuICAgICAgZWxlcGhhbnQ6IFwiXHVEODNEXHVEQzE4XCIsXG4gICAgICBlbWFpbDogXCJcdTI3MDlcdUZFMEZcIixcbiAgICAgIGVuZDogXCJcdUQ4M0RcdUREMUFcIixcbiAgICAgIGVudmVsb3BlX3dpdGhfYXJyb3c6IFwiXHVEODNEXHVEQ0U5XCIsXG4gICAgICBldXJvOiBcIlx1RDgzRFx1RENCNlwiLFxuICAgICAgZXVyb3BlYW5fY2FzdGxlOiBcIlx1RDgzQ1x1REZGMFwiLFxuICAgICAgZXVyb3BlYW5fcG9zdF9vZmZpY2U6IFwiXHVEODNDXHVERkU0XCIsXG4gICAgICBldmVyZ3JlZW5fdHJlZTogXCJcdUQ4M0NcdURGMzJcIixcbiAgICAgIGV4Y2xhbWF0aW9uOiBcIlx1Mjc1N1x1RkUwRlwiLFxuICAgICAgZXhwcmVzc2lvbmxlc3M6IFwiXHVEODNEXHVERTExXCIsXG4gICAgICBleWU6IFwiXHVEODNEXHVEQzQxXCIsXG4gICAgICBleWVfc3BlZWNoX2J1YmJsZTogXCJcdUQ4M0RcdURDNDEmendqO1x1RDgzRFx1RERFOFwiLFxuICAgICAgZXllZ2xhc3NlczogXCJcdUQ4M0RcdURDNTNcIixcbiAgICAgIGV5ZXM6IFwiXHVEODNEXHVEQzQwXCIsXG4gICAgICBmYWNlX3dpdGhfaGVhZF9iYW5kYWdlOiBcIlx1RDgzRVx1REQxNVwiLFxuICAgICAgZmFjZV93aXRoX3RoZXJtb21ldGVyOiBcIlx1RDgzRVx1REQxMlwiLFxuICAgICAgZmlzdF9vbmNvbWluZzogXCJcdUQ4M0RcdURDNEFcIixcbiAgICAgIGZhY3Rvcnk6IFwiXHVEODNDXHVERkVEXCIsXG4gICAgICBmYWxsZW5fbGVhZjogXCJcdUQ4M0NcdURGNDJcIixcbiAgICAgIGZhbWlseV9tYW5fd29tYW5fYm95OiBcIlx1RDgzRFx1REM2QVwiLFxuICAgICAgZmFtaWx5X21hbl9ib3k6IFwiXHVEODNEXHVEQzY4Jnp3ajtcdUQ4M0RcdURDNjZcIixcbiAgICAgIGZhbWlseV9tYW5fYm95X2JveTogXCJcdUQ4M0RcdURDNjgmendqO1x1RDgzRFx1REM2NiZ6d2o7XHVEODNEXHVEQzY2XCIsXG4gICAgICBmYW1pbHlfbWFuX2dpcmw6IFwiXHVEODNEXHVEQzY4Jnp3ajtcdUQ4M0RcdURDNjdcIixcbiAgICAgIGZhbWlseV9tYW5fZ2lybF9ib3k6IFwiXHVEODNEXHVEQzY4Jnp3ajtcdUQ4M0RcdURDNjcmendqO1x1RDgzRFx1REM2NlwiLFxuICAgICAgZmFtaWx5X21hbl9naXJsX2dpcmw6IFwiXHVEODNEXHVEQzY4Jnp3ajtcdUQ4M0RcdURDNjcmendqO1x1RDgzRFx1REM2N1wiLFxuICAgICAgZmFtaWx5X21hbl9tYW5fYm95OiBcIlx1RDgzRFx1REM2OCZ6d2o7XHVEODNEXHVEQzY4Jnp3ajtcdUQ4M0RcdURDNjZcIixcbiAgICAgIGZhbWlseV9tYW5fbWFuX2JveV9ib3k6IFwiXHVEODNEXHVEQzY4Jnp3ajtcdUQ4M0RcdURDNjgmendqO1x1RDgzRFx1REM2NiZ6d2o7XHVEODNEXHVEQzY2XCIsXG4gICAgICBmYW1pbHlfbWFuX21hbl9naXJsOiBcIlx1RDgzRFx1REM2OCZ6d2o7XHVEODNEXHVEQzY4Jnp3ajtcdUQ4M0RcdURDNjdcIixcbiAgICAgIGZhbWlseV9tYW5fbWFuX2dpcmxfYm95OiBcIlx1RDgzRFx1REM2OCZ6d2o7XHVEODNEXHVEQzY4Jnp3ajtcdUQ4M0RcdURDNjcmendqO1x1RDgzRFx1REM2NlwiLFxuICAgICAgZmFtaWx5X21hbl9tYW5fZ2lybF9naXJsOiBcIlx1RDgzRFx1REM2OCZ6d2o7XHVEODNEXHVEQzY4Jnp3ajtcdUQ4M0RcdURDNjcmendqO1x1RDgzRFx1REM2N1wiLFxuICAgICAgZmFtaWx5X21hbl93b21hbl9ib3lfYm95OiBcIlx1RDgzRFx1REM2OCZ6d2o7XHVEODNEXHVEQzY5Jnp3ajtcdUQ4M0RcdURDNjYmendqO1x1RDgzRFx1REM2NlwiLFxuICAgICAgZmFtaWx5X21hbl93b21hbl9naXJsOiBcIlx1RDgzRFx1REM2OCZ6d2o7XHVEODNEXHVEQzY5Jnp3ajtcdUQ4M0RcdURDNjdcIixcbiAgICAgIGZhbWlseV9tYW5fd29tYW5fZ2lybF9ib3k6IFwiXHVEODNEXHVEQzY4Jnp3ajtcdUQ4M0RcdURDNjkmendqO1x1RDgzRFx1REM2NyZ6d2o7XHVEODNEXHVEQzY2XCIsXG4gICAgICBmYW1pbHlfbWFuX3dvbWFuX2dpcmxfZ2lybDogXCJcdUQ4M0RcdURDNjgmendqO1x1RDgzRFx1REM2OSZ6d2o7XHVEODNEXHVEQzY3Jnp3ajtcdUQ4M0RcdURDNjdcIixcbiAgICAgIGZhbWlseV93b21hbl9ib3k6IFwiXHVEODNEXHVEQzY5Jnp3ajtcdUQ4M0RcdURDNjZcIixcbiAgICAgIGZhbWlseV93b21hbl9ib3lfYm95OiBcIlx1RDgzRFx1REM2OSZ6d2o7XHVEODNEXHVEQzY2Jnp3ajtcdUQ4M0RcdURDNjZcIixcbiAgICAgIGZhbWlseV93b21hbl9naXJsOiBcIlx1RDgzRFx1REM2OSZ6d2o7XHVEODNEXHVEQzY3XCIsXG4gICAgICBmYW1pbHlfd29tYW5fZ2lybF9ib3k6IFwiXHVEODNEXHVEQzY5Jnp3ajtcdUQ4M0RcdURDNjcmendqO1x1RDgzRFx1REM2NlwiLFxuICAgICAgZmFtaWx5X3dvbWFuX2dpcmxfZ2lybDogXCJcdUQ4M0RcdURDNjkmendqO1x1RDgzRFx1REM2NyZ6d2o7XHVEODNEXHVEQzY3XCIsXG4gICAgICBmYW1pbHlfd29tYW5fd29tYW5fYm95OiBcIlx1RDgzRFx1REM2OSZ6d2o7XHVEODNEXHVEQzY5Jnp3ajtcdUQ4M0RcdURDNjZcIixcbiAgICAgIGZhbWlseV93b21hbl93b21hbl9ib3lfYm95OiBcIlx1RDgzRFx1REM2OSZ6d2o7XHVEODNEXHVEQzY5Jnp3ajtcdUQ4M0RcdURDNjYmendqO1x1RDgzRFx1REM2NlwiLFxuICAgICAgZmFtaWx5X3dvbWFuX3dvbWFuX2dpcmw6IFwiXHVEODNEXHVEQzY5Jnp3ajtcdUQ4M0RcdURDNjkmendqO1x1RDgzRFx1REM2N1wiLFxuICAgICAgZmFtaWx5X3dvbWFuX3dvbWFuX2dpcmxfYm95OiBcIlx1RDgzRFx1REM2OSZ6d2o7XHVEODNEXHVEQzY5Jnp3ajtcdUQ4M0RcdURDNjcmendqO1x1RDgzRFx1REM2NlwiLFxuICAgICAgZmFtaWx5X3dvbWFuX3dvbWFuX2dpcmxfZ2lybDogXCJcdUQ4M0RcdURDNjkmendqO1x1RDgzRFx1REM2OSZ6d2o7XHVEODNEXHVEQzY3Jnp3ajtcdUQ4M0RcdURDNjdcIixcbiAgICAgIGZhc3RfZm9yd2FyZDogXCJcdTIzRTlcIixcbiAgICAgIGZheDogXCJcdUQ4M0RcdURDRTBcIixcbiAgICAgIGZlYXJmdWw6IFwiXHVEODNEXHVERTI4XCIsXG4gICAgICBmZWV0OiBcIlx1RDgzRFx1REMzRVwiLFxuICAgICAgZmVtYWxlX2RldGVjdGl2ZTogXCJcdUQ4M0RcdURENzVcdUZFMEYmendqO1x1MjY0MFx1RkUwRlwiLFxuICAgICAgZmVycmlzX3doZWVsOiBcIlx1RDgzQ1x1REZBMVwiLFxuICAgICAgZmVycnk6IFwiXHUyNkY0XCIsXG4gICAgICBmaWVsZF9ob2NrZXk6IFwiXHVEODNDXHVERkQxXCIsXG4gICAgICBmaWxlX2NhYmluZXQ6IFwiXHVEODNEXHVEREM0XCIsXG4gICAgICBmaWxlX2ZvbGRlcjogXCJcdUQ4M0RcdURDQzFcIixcbiAgICAgIGZpbG1fcHJvamVjdG9yOiBcIlx1RDgzRFx1RENGRFwiLFxuICAgICAgZmlsbV9zdHJpcDogXCJcdUQ4M0NcdURGOUVcIixcbiAgICAgIGZpcmU6IFwiXHVEODNEXHVERDI1XCIsXG4gICAgICBmaXJlX2VuZ2luZTogXCJcdUQ4M0RcdURFOTJcIixcbiAgICAgIGZpcmV3b3JrczogXCJcdUQ4M0NcdURGODZcIixcbiAgICAgIGZpcnN0X3F1YXJ0ZXJfbW9vbjogXCJcdUQ4M0NcdURGMTNcIixcbiAgICAgIGZpcnN0X3F1YXJ0ZXJfbW9vbl93aXRoX2ZhY2U6IFwiXHVEODNDXHVERjFCXCIsXG4gICAgICBmaXNoOiBcIlx1RDgzRFx1REMxRlwiLFxuICAgICAgZmlzaF9jYWtlOiBcIlx1RDgzQ1x1REY2NVwiLFxuICAgICAgZmlzaGluZ19wb2xlX2FuZF9maXNoOiBcIlx1RDgzQ1x1REZBM1wiLFxuICAgICAgZmlzdF9yYWlzZWQ6IFwiXHUyNzBBXCIsXG4gICAgICBmaXN0X2xlZnQ6IFwiXHVEODNFXHVERDFCXCIsXG4gICAgICBmaXN0X3JpZ2h0OiBcIlx1RDgzRVx1REQxQ1wiLFxuICAgICAgZmxhZ3M6IFwiXHVEODNDXHVERjhGXCIsXG4gICAgICBmbGFzaGxpZ2h0OiBcIlx1RDgzRFx1REQyNlwiLFxuICAgICAgZmxldXJfZGVfbGlzOiBcIlx1MjY5Q1x1RkUwRlwiLFxuICAgICAgZmxpZ2h0X2Fycml2YWw6IFwiXHVEODNEXHVERUVDXCIsXG4gICAgICBmbGlnaHRfZGVwYXJ0dXJlOiBcIlx1RDgzRFx1REVFQlwiLFxuICAgICAgZmxvcHB5X2Rpc2s6IFwiXHVEODNEXHVEQ0JFXCIsXG4gICAgICBmbG93ZXJfcGxheWluZ19jYXJkczogXCJcdUQ4M0NcdURGQjRcIixcbiAgICAgIGZsdXNoZWQ6IFwiXHVEODNEXHVERTMzXCIsXG4gICAgICBmb2c6IFwiXHVEODNDXHVERjJCXCIsXG4gICAgICBmb2dneTogXCJcdUQ4M0NcdURGMDFcIixcbiAgICAgIGZvb3RiYWxsOiBcIlx1RDgzQ1x1REZDOFwiLFxuICAgICAgZm9vdHByaW50czogXCJcdUQ4M0RcdURDNjNcIixcbiAgICAgIGZvcmtfYW5kX2tuaWZlOiBcIlx1RDgzQ1x1REY3NFwiLFxuICAgICAgZm91bnRhaW46IFwiXHUyNkYyXHVGRTBGXCIsXG4gICAgICBmb3VudGFpbl9wZW46IFwiXHVEODNEXHVERDhCXCIsXG4gICAgICBmb3VyX2xlYWZfY2xvdmVyOiBcIlx1RDgzQ1x1REY0MFwiLFxuICAgICAgZm94X2ZhY2U6IFwiXHVEODNFXHVERDhBXCIsXG4gICAgICBmcmFtZWRfcGljdHVyZTogXCJcdUQ4M0RcdUREQkNcIixcbiAgICAgIGZyZWU6IFwiXHVEODNDXHVERDkzXCIsXG4gICAgICBmcmllZF9lZ2c6IFwiXHVEODNDXHVERjczXCIsXG4gICAgICBmcmllZF9zaHJpbXA6IFwiXHVEODNDXHVERjY0XCIsXG4gICAgICBmcmllczogXCJcdUQ4M0NcdURGNUZcIixcbiAgICAgIGZyb2c6IFwiXHVEODNEXHVEQzM4XCIsXG4gICAgICBmcm93bmluZzogXCJcdUQ4M0RcdURFMjZcIixcbiAgICAgIGZyb3duaW5nX2ZhY2U6IFwiXHUyNjM5XHVGRTBGXCIsXG4gICAgICBmcm93bmluZ19tYW46IFwiXHVEODNEXHVERTREJnp3ajtcdTI2NDJcdUZFMEZcIixcbiAgICAgIGZyb3duaW5nX3dvbWFuOiBcIlx1RDgzRFx1REU0RFwiLFxuICAgICAgbWlkZGxlX2ZpbmdlcjogXCJcdUQ4M0RcdUREOTVcIixcbiAgICAgIGZ1ZWxwdW1wOiBcIlx1MjZGRFx1RkUwRlwiLFxuICAgICAgZnVsbF9tb29uOiBcIlx1RDgzQ1x1REYxNVwiLFxuICAgICAgZnVsbF9tb29uX3dpdGhfZmFjZTogXCJcdUQ4M0NcdURGMURcIixcbiAgICAgIGZ1bmVyYWxfdXJuOiBcIlx1MjZCMVx1RkUwRlwiLFxuICAgICAgZ2FtZV9kaWU6IFwiXHVEODNDXHVERkIyXCIsXG4gICAgICBnZWFyOiBcIlx1MjY5OVx1RkUwRlwiLFxuICAgICAgZ2VtOiBcIlx1RDgzRFx1REM4RVwiLFxuICAgICAgZ2VtaW5pOiBcIlx1MjY0QVx1RkUwRlwiLFxuICAgICAgZ2hvc3Q6IFwiXHVEODNEXHVEQzdCXCIsXG4gICAgICBnaWZ0OiBcIlx1RDgzQ1x1REY4MVwiLFxuICAgICAgZ2lmdF9oZWFydDogXCJcdUQ4M0RcdURDOURcIixcbiAgICAgIGdpcmw6IFwiXHVEODNEXHVEQzY3XCIsXG4gICAgICBnbG9iZV93aXRoX21lcmlkaWFuczogXCJcdUQ4M0NcdURGMTBcIixcbiAgICAgIGdvYWxfbmV0OiBcIlx1RDgzRVx1REQ0NVwiLFxuICAgICAgZ29hdDogXCJcdUQ4M0RcdURDMTBcIixcbiAgICAgIGdvbGY6IFwiXHUyNkYzXHVGRTBGXCIsXG4gICAgICBnb2xmaW5nX21hbjogXCJcdUQ4M0NcdURGQ0NcdUZFMEZcIixcbiAgICAgIGdvbGZpbmdfd29tYW46IFwiXHVEODNDXHVERkNDXHVGRTBGJnp3ajtcdTI2NDBcdUZFMEZcIixcbiAgICAgIGdvcmlsbGE6IFwiXHVEODNFXHVERDhEXCIsXG4gICAgICBncmFwZXM6IFwiXHVEODNDXHVERjQ3XCIsXG4gICAgICBncmVlbl9hcHBsZTogXCJcdUQ4M0NcdURGNEZcIixcbiAgICAgIGdyZWVuX2Jvb2s6IFwiXHVEODNEXHVEQ0Q3XCIsXG4gICAgICBncmVlbl9oZWFydDogXCJcdUQ4M0RcdURDOUFcIixcbiAgICAgIGdyZWVuX3NhbGFkOiBcIlx1RDgzRVx1REQ1N1wiLFxuICAgICAgZ3JleV9leGNsYW1hdGlvbjogXCJcdTI3NTVcIixcbiAgICAgIGdyZXlfcXVlc3Rpb246IFwiXHUyNzU0XCIsXG4gICAgICBncmltYWNpbmc6IFwiXHVEODNEXHVERTJDXCIsXG4gICAgICBncmluOiBcIlx1RDgzRFx1REUwMVwiLFxuICAgICAgZ3Jpbm5pbmc6IFwiXHVEODNEXHVERTAwXCIsXG4gICAgICBndWFyZHNtYW46IFwiXHVEODNEXHVEQzgyXCIsXG4gICAgICBndWFyZHN3b21hbjogXCJcdUQ4M0RcdURDODImendqO1x1MjY0MFx1RkUwRlwiLFxuICAgICAgZ3VpdGFyOiBcIlx1RDgzQ1x1REZCOFwiLFxuICAgICAgZ3VuOiBcIlx1RDgzRFx1REQyQlwiLFxuICAgICAgaGFpcmN1dF93b21hbjogXCJcdUQ4M0RcdURDODdcIixcbiAgICAgIGhhaXJjdXRfbWFuOiBcIlx1RDgzRFx1REM4NyZ6d2o7XHUyNjQyXHVGRTBGXCIsXG4gICAgICBoYW1idXJnZXI6IFwiXHVEODNDXHVERjU0XCIsXG4gICAgICBoYW1tZXI6IFwiXHVEODNEXHVERDI4XCIsXG4gICAgICBoYW1tZXJfYW5kX3BpY2s6IFwiXHUyNjkyXCIsXG4gICAgICBoYW1tZXJfYW5kX3dyZW5jaDogXCJcdUQ4M0RcdURFRTBcIixcbiAgICAgIGhhbXN0ZXI6IFwiXHVEODNEXHVEQzM5XCIsXG4gICAgICBoYW5kOiBcIlx1MjcwQlwiLFxuICAgICAgaGFuZGJhZzogXCJcdUQ4M0RcdURDNUNcIixcbiAgICAgIGhhbmRzaGFrZTogXCJcdUQ4M0VcdUREMURcIixcbiAgICAgIGhhbmtleTogXCJcdUQ4M0RcdURDQTlcIixcbiAgICAgIGhhdGNoZWRfY2hpY2s6IFwiXHVEODNEXHVEQzI1XCIsXG4gICAgICBoYXRjaGluZ19jaGljazogXCJcdUQ4M0RcdURDMjNcIixcbiAgICAgIGhlYWRwaG9uZXM6IFwiXHVEODNDXHVERkE3XCIsXG4gICAgICBoZWFyX25vX2V2aWw6IFwiXHVEODNEXHVERTQ5XCIsXG4gICAgICBoZWFydDogXCJcdTI3NjRcdUZFMEZcIixcbiAgICAgIGhlYXJ0X2RlY29yYXRpb246IFwiXHVEODNEXHVEQzlGXCIsXG4gICAgICBoZWFydF9leWVzOiBcIlx1RDgzRFx1REUwRFwiLFxuICAgICAgaGVhcnRfZXllc19jYXQ6IFwiXHVEODNEXHVERTNCXCIsXG4gICAgICBoZWFydGJlYXQ6IFwiXHVEODNEXHVEQzkzXCIsXG4gICAgICBoZWFydHB1bHNlOiBcIlx1RDgzRFx1REM5N1wiLFxuICAgICAgaGVhcnRzOiBcIlx1MjY2NVx1RkUwRlwiLFxuICAgICAgaGVhdnlfY2hlY2tfbWFyazogXCJcdTI3MTRcdUZFMEZcIixcbiAgICAgIGhlYXZ5X2RpdmlzaW9uX3NpZ246IFwiXHUyNzk3XCIsXG4gICAgICBoZWF2eV9kb2xsYXJfc2lnbjogXCJcdUQ4M0RcdURDQjJcIixcbiAgICAgIGhlYXZ5X2hlYXJ0X2V4Y2xhbWF0aW9uOiBcIlx1Mjc2M1x1RkUwRlwiLFxuICAgICAgaGVhdnlfbWludXNfc2lnbjogXCJcdTI3OTZcIixcbiAgICAgIGhlYXZ5X211bHRpcGxpY2F0aW9uX3g6IFwiXHUyNzE2XHVGRTBGXCIsXG4gICAgICBoZWF2eV9wbHVzX3NpZ246IFwiXHUyNzk1XCIsXG4gICAgICBoZWxpY29wdGVyOiBcIlx1RDgzRFx1REU4MVwiLFxuICAgICAgaGVyYjogXCJcdUQ4M0NcdURGM0ZcIixcbiAgICAgIGhpYmlzY3VzOiBcIlx1RDgzQ1x1REYzQVwiLFxuICAgICAgaGlnaF9icmlnaHRuZXNzOiBcIlx1RDgzRFx1REQwNlwiLFxuICAgICAgaGlnaF9oZWVsOiBcIlx1RDgzRFx1REM2MFwiLFxuICAgICAgaG9jaG86IFwiXHVEODNEXHVERDJBXCIsXG4gICAgICBob2xlOiBcIlx1RDgzRFx1REQ3M1wiLFxuICAgICAgaG9uZXlfcG90OiBcIlx1RDgzQ1x1REY2RlwiLFxuICAgICAgaG9yc2U6IFwiXHVEODNEXHVEQzM0XCIsXG4gICAgICBob3JzZV9yYWNpbmc6IFwiXHVEODNDXHVERkM3XCIsXG4gICAgICBob3NwaXRhbDogXCJcdUQ4M0NcdURGRTVcIixcbiAgICAgIGhvdF9wZXBwZXI6IFwiXHVEODNDXHVERjM2XCIsXG4gICAgICBob3Rkb2c6IFwiXHVEODNDXHVERjJEXCIsXG4gICAgICBob3RlbDogXCJcdUQ4M0NcdURGRThcIixcbiAgICAgIGhvdHNwcmluZ3M6IFwiXHUyNjY4XHVGRTBGXCIsXG4gICAgICBob3VyZ2xhc3M6IFwiXHUyMzFCXHVGRTBGXCIsXG4gICAgICBob3VyZ2xhc3NfZmxvd2luZ19zYW5kOiBcIlx1MjNGM1wiLFxuICAgICAgaG91c2U6IFwiXHVEODNDXHVERkUwXCIsXG4gICAgICBob3VzZV93aXRoX2dhcmRlbjogXCJcdUQ4M0NcdURGRTFcIixcbiAgICAgIGhvdXNlczogXCJcdUQ4M0NcdURGRDhcIixcbiAgICAgIGh1Z3M6IFwiXHVEODNFXHVERDE3XCIsXG4gICAgICBodXNoZWQ6IFwiXHVEODNEXHVERTJGXCIsXG4gICAgICBpY2VfY3JlYW06IFwiXHVEODNDXHVERjY4XCIsXG4gICAgICBpY2VfaG9ja2V5OiBcIlx1RDgzQ1x1REZEMlwiLFxuICAgICAgaWNlX3NrYXRlOiBcIlx1MjZGOFwiLFxuICAgICAgaWNlY3JlYW06IFwiXHVEODNDXHVERjY2XCIsXG4gICAgICBpZDogXCJcdUQ4M0NcdUREOTRcIixcbiAgICAgIGlkZW9ncmFwaF9hZHZhbnRhZ2U6IFwiXHVEODNDXHVERTUwXCIsXG4gICAgICBpbXA6IFwiXHVEODNEXHVEQzdGXCIsXG4gICAgICBpbmJveF90cmF5OiBcIlx1RDgzRFx1RENFNVwiLFxuICAgICAgaW5jb21pbmdfZW52ZWxvcGU6IFwiXHVEODNEXHVEQ0U4XCIsXG4gICAgICB0aXBwaW5nX2hhbmRfd29tYW46IFwiXHVEODNEXHVEQzgxXCIsXG4gICAgICBpbmZvcm1hdGlvbl9zb3VyY2U6IFwiXHUyMTM5XHVGRTBGXCIsXG4gICAgICBpbm5vY2VudDogXCJcdUQ4M0RcdURFMDdcIixcbiAgICAgIGludGVycm9iYW5nOiBcIlx1MjA0OVx1RkUwRlwiLFxuICAgICAgaXBob25lOiBcIlx1RDgzRFx1RENGMVwiLFxuICAgICAgaXpha2F5YV9sYW50ZXJuOiBcIlx1RDgzQ1x1REZFRVwiLFxuICAgICAgamFja19vX2xhbnRlcm46IFwiXHVEODNDXHVERjgzXCIsXG4gICAgICBqYXBhbjogXCJcdUQ4M0RcdURERkVcIixcbiAgICAgIGphcGFuZXNlX2Nhc3RsZTogXCJcdUQ4M0NcdURGRUZcIixcbiAgICAgIGphcGFuZXNlX2dvYmxpbjogXCJcdUQ4M0RcdURDN0FcIixcbiAgICAgIGphcGFuZXNlX29ncmU6IFwiXHVEODNEXHVEQzc5XCIsXG4gICAgICBqZWFuczogXCJcdUQ4M0RcdURDNTZcIixcbiAgICAgIGpveTogXCJcdUQ4M0RcdURFMDJcIixcbiAgICAgIGpveV9jYXQ6IFwiXHVEODNEXHVERTM5XCIsXG4gICAgICBqb3lzdGljazogXCJcdUQ4M0RcdURENzlcIixcbiAgICAgIGthYWJhOiBcIlx1RDgzRFx1REQ0QlwiLFxuICAgICAga2V5OiBcIlx1RDgzRFx1REQxMVwiLFxuICAgICAga2V5Ym9hcmQ6IFwiXHUyMzI4XHVGRTBGXCIsXG4gICAgICBrZXljYXBfdGVuOiBcIlx1RDgzRFx1REQxRlwiLFxuICAgICAga2lja19zY29vdGVyOiBcIlx1RDgzRFx1REVGNFwiLFxuICAgICAga2ltb25vOiBcIlx1RDgzRFx1REM1OFwiLFxuICAgICAga2lzczogXCJcdUQ4M0RcdURDOEJcIixcbiAgICAgIGtpc3Npbmc6IFwiXHVEODNEXHVERTE3XCIsXG4gICAgICBraXNzaW5nX2NhdDogXCJcdUQ4M0RcdURFM0RcIixcbiAgICAgIGtpc3NpbmdfY2xvc2VkX2V5ZXM6IFwiXHVEODNEXHVERTFBXCIsXG4gICAgICBraXNzaW5nX2hlYXJ0OiBcIlx1RDgzRFx1REUxOFwiLFxuICAgICAga2lzc2luZ19zbWlsaW5nX2V5ZXM6IFwiXHVEODNEXHVERTE5XCIsXG4gICAgICBraXdpX2ZydWl0OiBcIlx1RDgzRVx1REQ1RFwiLFxuICAgICAga29hbGE6IFwiXHVEODNEXHVEQzI4XCIsXG4gICAgICBrb2tvOiBcIlx1RDgzQ1x1REUwMVwiLFxuICAgICAgbGFiZWw6IFwiXHVEODNDXHVERkY3XCIsXG4gICAgICBsYXJnZV9ibHVlX2NpcmNsZTogXCJcdUQ4M0RcdUREMzVcIixcbiAgICAgIGxhcmdlX2JsdWVfZGlhbW9uZDogXCJcdUQ4M0RcdUREMzdcIixcbiAgICAgIGxhcmdlX29yYW5nZV9kaWFtb25kOiBcIlx1RDgzRFx1REQzNlwiLFxuICAgICAgbGFzdF9xdWFydGVyX21vb246IFwiXHVEODNDXHVERjE3XCIsXG4gICAgICBsYXN0X3F1YXJ0ZXJfbW9vbl93aXRoX2ZhY2U6IFwiXHVEODNDXHVERjFDXCIsXG4gICAgICBsYXRpbl9jcm9zczogXCJcdTI3MURcdUZFMEZcIixcbiAgICAgIGxhdWdoaW5nOiBcIlx1RDgzRFx1REUwNlwiLFxuICAgICAgbGVhdmVzOiBcIlx1RDgzQ1x1REY0M1wiLFxuICAgICAgbGVkZ2VyOiBcIlx1RDgzRFx1RENEMlwiLFxuICAgICAgbGVmdF9sdWdnYWdlOiBcIlx1RDgzRFx1REVDNVwiLFxuICAgICAgbGVmdF9yaWdodF9hcnJvdzogXCJcdTIxOTRcdUZFMEZcIixcbiAgICAgIGxlZnR3YXJkc19hcnJvd193aXRoX2hvb2s6IFwiXHUyMUE5XHVGRTBGXCIsXG4gICAgICBsZW1vbjogXCJcdUQ4M0NcdURGNEJcIixcbiAgICAgIGxlbzogXCJcdTI2NENcdUZFMEZcIixcbiAgICAgIGxlb3BhcmQ6IFwiXHVEODNEXHVEQzA2XCIsXG4gICAgICBsZXZlbF9zbGlkZXI6IFwiXHVEODNDXHVERjlBXCIsXG4gICAgICBsaWJyYTogXCJcdTI2NEVcdUZFMEZcIixcbiAgICAgIGxpZ2h0X3JhaWw6IFwiXHVEODNEXHVERTg4XCIsXG4gICAgICBsaW5rOiBcIlx1RDgzRFx1REQxN1wiLFxuICAgICAgbGlvbjogXCJcdUQ4M0VcdUREODFcIixcbiAgICAgIGxpcHM6IFwiXHVEODNEXHVEQzQ0XCIsXG4gICAgICBsaXBzdGljazogXCJcdUQ4M0RcdURDODRcIixcbiAgICAgIGxpemFyZDogXCJcdUQ4M0VcdUREOEVcIixcbiAgICAgIGxvY2s6IFwiXHVEODNEXHVERDEyXCIsXG4gICAgICBsb2NrX3dpdGhfaW5rX3BlbjogXCJcdUQ4M0RcdUREMEZcIixcbiAgICAgIGxvbGxpcG9wOiBcIlx1RDgzQ1x1REY2RFwiLFxuICAgICAgbG9vcDogXCJcdTI3QkZcIixcbiAgICAgIGxvdWRfc291bmQ6IFwiXHVEODNEXHVERDBBXCIsXG4gICAgICBsb3Vkc3BlYWtlcjogXCJcdUQ4M0RcdURDRTJcIixcbiAgICAgIGxvdmVfaG90ZWw6IFwiXHVEODNDXHVERkU5XCIsXG4gICAgICBsb3ZlX2xldHRlcjogXCJcdUQ4M0RcdURDOENcIixcbiAgICAgIGxvd19icmlnaHRuZXNzOiBcIlx1RDgzRFx1REQwNVwiLFxuICAgICAgbHlpbmdfZmFjZTogXCJcdUQ4M0VcdUREMjVcIixcbiAgICAgIG06IFwiXHUyNEMyXHVGRTBGXCIsXG4gICAgICBtYWc6IFwiXHVEODNEXHVERDBEXCIsXG4gICAgICBtYWdfcmlnaHQ6IFwiXHVEODNEXHVERDBFXCIsXG4gICAgICBtYWhqb25nOiBcIlx1RDgzQ1x1REMwNFx1RkUwRlwiLFxuICAgICAgbWFpbGJveDogXCJcdUQ4M0RcdURDRUJcIixcbiAgICAgIG1haWxib3hfY2xvc2VkOiBcIlx1RDgzRFx1RENFQVwiLFxuICAgICAgbWFpbGJveF93aXRoX21haWw6IFwiXHVEODNEXHVEQ0VDXCIsXG4gICAgICBtYWlsYm94X3dpdGhfbm9fbWFpbDogXCJcdUQ4M0RcdURDRURcIixcbiAgICAgIG1hbjogXCJcdUQ4M0RcdURDNjhcIixcbiAgICAgIG1hbl9hcnRpc3Q6IFwiXHVEODNEXHVEQzY4Jnp3ajtcdUQ4M0NcdURGQThcIixcbiAgICAgIG1hbl9hc3Ryb25hdXQ6IFwiXHVEODNEXHVEQzY4Jnp3ajtcdUQ4M0RcdURFODBcIixcbiAgICAgIG1hbl9jYXJ0d2hlZWxpbmc6IFwiXHVEODNFXHVERDM4Jnp3ajtcdTI2NDJcdUZFMEZcIixcbiAgICAgIG1hbl9jb29rOiBcIlx1RDgzRFx1REM2OCZ6d2o7XHVEODNDXHVERjczXCIsXG4gICAgICBtYW5fZGFuY2luZzogXCJcdUQ4M0RcdUREN0FcIixcbiAgICAgIG1hbl9mYWNlcGFsbWluZzogXCJcdUQ4M0VcdUREMjYmendqO1x1MjY0Mlx1RkUwRlwiLFxuICAgICAgbWFuX2ZhY3Rvcnlfd29ya2VyOiBcIlx1RDgzRFx1REM2OCZ6d2o7XHVEODNDXHVERkVEXCIsXG4gICAgICBtYW5fZmFybWVyOiBcIlx1RDgzRFx1REM2OCZ6d2o7XHVEODNDXHVERjNFXCIsXG4gICAgICBtYW5fZmlyZWZpZ2h0ZXI6IFwiXHVEODNEXHVEQzY4Jnp3ajtcdUQ4M0RcdURFOTJcIixcbiAgICAgIG1hbl9oZWFsdGhfd29ya2VyOiBcIlx1RDgzRFx1REM2OCZ6d2o7XHUyNjk1XHVGRTBGXCIsXG4gICAgICBtYW5faW5fdHV4ZWRvOiBcIlx1RDgzRVx1REQzNVwiLFxuICAgICAgbWFuX2p1ZGdlOiBcIlx1RDgzRFx1REM2OCZ6d2o7XHUyNjk2XHVGRTBGXCIsXG4gICAgICBtYW5fanVnZ2xpbmc6IFwiXHVEODNFXHVERDM5Jnp3ajtcdTI2NDJcdUZFMEZcIixcbiAgICAgIG1hbl9tZWNoYW5pYzogXCJcdUQ4M0RcdURDNjgmendqO1x1RDgzRFx1REQyN1wiLFxuICAgICAgbWFuX29mZmljZV93b3JrZXI6IFwiXHVEODNEXHVEQzY4Jnp3ajtcdUQ4M0RcdURDQkNcIixcbiAgICAgIG1hbl9waWxvdDogXCJcdUQ4M0RcdURDNjgmendqO1x1MjcwOFx1RkUwRlwiLFxuICAgICAgbWFuX3BsYXlpbmdfaGFuZGJhbGw6IFwiXHVEODNFXHVERDNFJnp3ajtcdTI2NDJcdUZFMEZcIixcbiAgICAgIG1hbl9wbGF5aW5nX3dhdGVyX3BvbG86IFwiXHVEODNFXHVERDNEJnp3ajtcdTI2NDJcdUZFMEZcIixcbiAgICAgIG1hbl9zY2llbnRpc3Q6IFwiXHVEODNEXHVEQzY4Jnp3ajtcdUQ4M0RcdUREMkNcIixcbiAgICAgIG1hbl9zaHJ1Z2dpbmc6IFwiXHVEODNFXHVERDM3Jnp3ajtcdTI2NDJcdUZFMEZcIixcbiAgICAgIG1hbl9zaW5nZXI6IFwiXHVEODNEXHVEQzY4Jnp3ajtcdUQ4M0NcdURGQTRcIixcbiAgICAgIG1hbl9zdHVkZW50OiBcIlx1RDgzRFx1REM2OCZ6d2o7XHVEODNDXHVERjkzXCIsXG4gICAgICBtYW5fdGVhY2hlcjogXCJcdUQ4M0RcdURDNjgmendqO1x1RDgzQ1x1REZFQlwiLFxuICAgICAgbWFuX3RlY2hub2xvZ2lzdDogXCJcdUQ4M0RcdURDNjgmendqO1x1RDgzRFx1RENCQlwiLFxuICAgICAgbWFuX3dpdGhfZ3VhX3BpX21hbzogXCJcdUQ4M0RcdURDNzJcIixcbiAgICAgIG1hbl93aXRoX3R1cmJhbjogXCJcdUQ4M0RcdURDNzNcIixcbiAgICAgIHRhbmdlcmluZTogXCJcdUQ4M0NcdURGNEFcIixcbiAgICAgIG1hbnNfc2hvZTogXCJcdUQ4M0RcdURDNUVcIixcbiAgICAgIG1hbnRlbHBpZWNlX2Nsb2NrOiBcIlx1RDgzRFx1REQ3MFwiLFxuICAgICAgbWFwbGVfbGVhZjogXCJcdUQ4M0NcdURGNDFcIixcbiAgICAgIG1hcnRpYWxfYXJ0c191bmlmb3JtOiBcIlx1RDgzRVx1REQ0QlwiLFxuICAgICAgbWFzazogXCJcdUQ4M0RcdURFMzdcIixcbiAgICAgIG1hc3NhZ2Vfd29tYW46IFwiXHVEODNEXHVEQzg2XCIsXG4gICAgICBtYXNzYWdlX21hbjogXCJcdUQ4M0RcdURDODYmendqO1x1MjY0Mlx1RkUwRlwiLFxuICAgICAgbWVhdF9vbl9ib25lOiBcIlx1RDgzQ1x1REY1NlwiLFxuICAgICAgbWVkYWxfbWlsaXRhcnk6IFwiXHVEODNDXHVERjk2XCIsXG4gICAgICBtZWRhbF9zcG9ydHM6IFwiXHVEODNDXHVERkM1XCIsXG4gICAgICBtZWdhOiBcIlx1RDgzRFx1RENFM1wiLFxuICAgICAgbWVsb246IFwiXHVEODNDXHVERjQ4XCIsXG4gICAgICBtZW1vOiBcIlx1RDgzRFx1RENERFwiLFxuICAgICAgbWVuX3dyZXN0bGluZzogXCJcdUQ4M0VcdUREM0MmendqO1x1MjY0Mlx1RkUwRlwiLFxuICAgICAgbWVub3JhaDogXCJcdUQ4M0RcdURENEVcIixcbiAgICAgIG1lbnM6IFwiXHVEODNEXHVERUI5XCIsXG4gICAgICBtZXRhbDogXCJcdUQ4M0VcdUREMThcIixcbiAgICAgIG1ldHJvOiBcIlx1RDgzRFx1REU4N1wiLFxuICAgICAgbWljcm9waG9uZTogXCJcdUQ4M0NcdURGQTRcIixcbiAgICAgIG1pY3Jvc2NvcGU6IFwiXHVEODNEXHVERDJDXCIsXG4gICAgICBtaWxrX2dsYXNzOiBcIlx1RDgzRVx1REQ1QlwiLFxuICAgICAgbWlsa3lfd2F5OiBcIlx1RDgzQ1x1REYwQ1wiLFxuICAgICAgbWluaWJ1czogXCJcdUQ4M0RcdURFOTBcIixcbiAgICAgIG1pbmlkaXNjOiBcIlx1RDgzRFx1RENCRFwiLFxuICAgICAgbW9iaWxlX3Bob25lX29mZjogXCJcdUQ4M0RcdURDRjRcIixcbiAgICAgIG1vbmV5X21vdXRoX2ZhY2U6IFwiXHVEODNFXHVERDExXCIsXG4gICAgICBtb25leV93aXRoX3dpbmdzOiBcIlx1RDgzRFx1RENCOFwiLFxuICAgICAgbW9uZXliYWc6IFwiXHVEODNEXHVEQ0IwXCIsXG4gICAgICBtb25rZXk6IFwiXHVEODNEXHVEQzEyXCIsXG4gICAgICBtb25rZXlfZmFjZTogXCJcdUQ4M0RcdURDMzVcIixcbiAgICAgIG1vbm9yYWlsOiBcIlx1RDgzRFx1REU5RFwiLFxuICAgICAgbW9vbjogXCJcdUQ4M0NcdURGMTRcIixcbiAgICAgIG1vcnRhcl9ib2FyZDogXCJcdUQ4M0NcdURGOTNcIixcbiAgICAgIG1vc3F1ZTogXCJcdUQ4M0RcdURENENcIixcbiAgICAgIG1vdG9yX2JvYXQ6IFwiXHVEODNEXHVERUU1XCIsXG4gICAgICBtb3Rvcl9zY29vdGVyOiBcIlx1RDgzRFx1REVGNVwiLFxuICAgICAgbW90b3JjeWNsZTogXCJcdUQ4M0NcdURGQ0RcIixcbiAgICAgIG1vdG9yd2F5OiBcIlx1RDgzRFx1REVFM1wiLFxuICAgICAgbW91bnRfZnVqaTogXCJcdUQ4M0RcdURERkJcIixcbiAgICAgIG1vdW50YWluOiBcIlx1MjZGMFwiLFxuICAgICAgbW91bnRhaW5fYmlraW5nX21hbjogXCJcdUQ4M0RcdURFQjVcIixcbiAgICAgIG1vdW50YWluX2Jpa2luZ193b21hbjogXCJcdUQ4M0RcdURFQjUmendqO1x1MjY0MFx1RkUwRlwiLFxuICAgICAgbW91bnRhaW5fY2FibGV3YXk6IFwiXHVEODNEXHVERUEwXCIsXG4gICAgICBtb3VudGFpbl9yYWlsd2F5OiBcIlx1RDgzRFx1REU5RVwiLFxuICAgICAgbW91bnRhaW5fc25vdzogXCJcdUQ4M0NcdURGRDRcIixcbiAgICAgIG1vdXNlOiBcIlx1RDgzRFx1REMyRFwiLFxuICAgICAgbW91c2UyOiBcIlx1RDgzRFx1REMwMVwiLFxuICAgICAgbW92aWVfY2FtZXJhOiBcIlx1RDgzQ1x1REZBNVwiLFxuICAgICAgbW95YWk6IFwiXHVEODNEXHVEREZGXCIsXG4gICAgICBtcnNfY2xhdXM6IFwiXHVEODNFXHVERDM2XCIsXG4gICAgICBtdXNjbGU6IFwiXHVEODNEXHVEQ0FBXCIsXG4gICAgICBtdXNocm9vbTogXCJcdUQ4M0NcdURGNDRcIixcbiAgICAgIG11c2ljYWxfa2V5Ym9hcmQ6IFwiXHVEODNDXHVERkI5XCIsXG4gICAgICBtdXNpY2FsX25vdGU6IFwiXHVEODNDXHVERkI1XCIsXG4gICAgICBtdXNpY2FsX3Njb3JlOiBcIlx1RDgzQ1x1REZCQ1wiLFxuICAgICAgbXV0ZTogXCJcdUQ4M0RcdUREMDdcIixcbiAgICAgIG5haWxfY2FyZTogXCJcdUQ4M0RcdURDODVcIixcbiAgICAgIG5hbWVfYmFkZ2U6IFwiXHVEODNEXHVEQ0RCXCIsXG4gICAgICBuYXRpb25hbF9wYXJrOiBcIlx1RDgzQ1x1REZERVwiLFxuICAgICAgbmF1c2VhdGVkX2ZhY2U6IFwiXHVEODNFXHVERDIyXCIsXG4gICAgICBuZWNrdGllOiBcIlx1RDgzRFx1REM1NFwiLFxuICAgICAgbmVnYXRpdmVfc3F1YXJlZF9jcm9zc19tYXJrOiBcIlx1Mjc0RVwiLFxuICAgICAgbmVyZF9mYWNlOiBcIlx1RDgzRVx1REQxM1wiLFxuICAgICAgbmV1dHJhbF9mYWNlOiBcIlx1RDgzRFx1REUxMFwiLFxuICAgICAgbmV3OiBcIlx1RDgzQ1x1REQ5NVwiLFxuICAgICAgbmV3X21vb246IFwiXHVEODNDXHVERjExXCIsXG4gICAgICBuZXdfbW9vbl93aXRoX2ZhY2U6IFwiXHVEODNDXHVERjFBXCIsXG4gICAgICBuZXdzcGFwZXI6IFwiXHVEODNEXHVEQ0YwXCIsXG4gICAgICBuZXdzcGFwZXJfcm9sbDogXCJcdUQ4M0RcdUREREVcIixcbiAgICAgIG5leHRfdHJhY2tfYnV0dG9uOiBcIlx1MjNFRFwiLFxuICAgICAgbmc6IFwiXHVEODNDXHVERDk2XCIsXG4gICAgICBub19nb29kX21hbjogXCJcdUQ4M0RcdURFNDUmendqO1x1MjY0Mlx1RkUwRlwiLFxuICAgICAgbm9fZ29vZF93b21hbjogXCJcdUQ4M0RcdURFNDVcIixcbiAgICAgIG5pZ2h0X3dpdGhfc3RhcnM6IFwiXHVEODNDXHVERjAzXCIsXG4gICAgICBub19iZWxsOiBcIlx1RDgzRFx1REQxNVwiLFxuICAgICAgbm9fYmljeWNsZXM6IFwiXHVEODNEXHVERUIzXCIsXG4gICAgICBub19lbnRyeTogXCJcdTI2RDRcdUZFMEZcIixcbiAgICAgIG5vX2VudHJ5X3NpZ246IFwiXHVEODNEXHVERUFCXCIsXG4gICAgICBub19tb2JpbGVfcGhvbmVzOiBcIlx1RDgzRFx1RENGNVwiLFxuICAgICAgbm9fbW91dGg6IFwiXHVEODNEXHVERTM2XCIsXG4gICAgICBub19wZWRlc3RyaWFuczogXCJcdUQ4M0RcdURFQjdcIixcbiAgICAgIG5vX3Ntb2tpbmc6IFwiXHVEODNEXHVERUFEXCIsXG4gICAgICBcIm5vbi1wb3RhYmxlX3dhdGVyXCI6IFwiXHVEODNEXHVERUIxXCIsXG4gICAgICBub3NlOiBcIlx1RDgzRFx1REM0M1wiLFxuICAgICAgbm90ZWJvb2s6IFwiXHVEODNEXHVEQ0QzXCIsXG4gICAgICBub3RlYm9va193aXRoX2RlY29yYXRpdmVfY292ZXI6IFwiXHVEODNEXHVEQ0Q0XCIsXG4gICAgICBub3RlczogXCJcdUQ4M0NcdURGQjZcIixcbiAgICAgIG51dF9hbmRfYm9sdDogXCJcdUQ4M0RcdUREMjlcIixcbiAgICAgIG86IFwiXHUyQjU1XHVGRTBGXCIsXG4gICAgICBvMjogXCJcdUQ4M0NcdUREN0VcdUZFMEZcIixcbiAgICAgIG9jZWFuOiBcIlx1RDgzQ1x1REYwQVwiLFxuICAgICAgb2N0b3B1czogXCJcdUQ4M0RcdURDMTlcIixcbiAgICAgIG9kZW46IFwiXHVEODNDXHVERjYyXCIsXG4gICAgICBvZmZpY2U6IFwiXHVEODNDXHVERkUyXCIsXG4gICAgICBvaWxfZHJ1bTogXCJcdUQ4M0RcdURFRTJcIixcbiAgICAgIG9rOiBcIlx1RDgzQ1x1REQ5N1wiLFxuICAgICAgb2tfaGFuZDogXCJcdUQ4M0RcdURDNENcIixcbiAgICAgIG9rX21hbjogXCJcdUQ4M0RcdURFNDYmendqO1x1MjY0Mlx1RkUwRlwiLFxuICAgICAgb2tfd29tYW46IFwiXHVEODNEXHVERTQ2XCIsXG4gICAgICBvbGRfa2V5OiBcIlx1RDgzRFx1RERERFwiLFxuICAgICAgb2xkZXJfbWFuOiBcIlx1RDgzRFx1REM3NFwiLFxuICAgICAgb2xkZXJfd29tYW46IFwiXHVEODNEXHVEQzc1XCIsXG4gICAgICBvbTogXCJcdUQ4M0RcdURENDlcIixcbiAgICAgIG9uOiBcIlx1RDgzRFx1REQxQlwiLFxuICAgICAgb25jb21pbmdfYXV0b21vYmlsZTogXCJcdUQ4M0RcdURFOThcIixcbiAgICAgIG9uY29taW5nX2J1czogXCJcdUQ4M0RcdURFOERcIixcbiAgICAgIG9uY29taW5nX3BvbGljZV9jYXI6IFwiXHVEODNEXHVERTk0XCIsXG4gICAgICBvbmNvbWluZ190YXhpOiBcIlx1RDgzRFx1REU5NlwiLFxuICAgICAgb3Blbl9maWxlX2ZvbGRlcjogXCJcdUQ4M0RcdURDQzJcIixcbiAgICAgIG9wZW5faGFuZHM6IFwiXHVEODNEXHVEQzUwXCIsXG4gICAgICBvcGVuX21vdXRoOiBcIlx1RDgzRFx1REUyRVwiLFxuICAgICAgb3Blbl91bWJyZWxsYTogXCJcdTI2MDJcdUZFMEZcIixcbiAgICAgIG9waGl1Y2h1czogXCJcdTI2Q0VcIixcbiAgICAgIG9yYW5nZV9ib29rOiBcIlx1RDgzRFx1RENEOVwiLFxuICAgICAgb3J0aG9kb3hfY3Jvc3M6IFwiXHUyNjI2XHVGRTBGXCIsXG4gICAgICBvdXRib3hfdHJheTogXCJcdUQ4M0RcdURDRTRcIixcbiAgICAgIG93bDogXCJcdUQ4M0VcdUREODlcIixcbiAgICAgIG94OiBcIlx1RDgzRFx1REMwMlwiLFxuICAgICAgcGFja2FnZTogXCJcdUQ4M0RcdURDRTZcIixcbiAgICAgIHBhZ2VfZmFjaW5nX3VwOiBcIlx1RDgzRFx1RENDNFwiLFxuICAgICAgcGFnZV93aXRoX2N1cmw6IFwiXHVEODNEXHVEQ0MzXCIsXG4gICAgICBwYWdlcjogXCJcdUQ4M0RcdURDREZcIixcbiAgICAgIHBhaW50YnJ1c2g6IFwiXHVEODNEXHVERDhDXCIsXG4gICAgICBwYWxtX3RyZWU6IFwiXHVEODNDXHVERjM0XCIsXG4gICAgICBwYW5jYWtlczogXCJcdUQ4M0VcdURENUVcIixcbiAgICAgIHBhbmRhX2ZhY2U6IFwiXHVEODNEXHVEQzNDXCIsXG4gICAgICBwYXBlcmNsaXA6IFwiXHVEODNEXHVEQ0NFXCIsXG4gICAgICBwYXBlcmNsaXBzOiBcIlx1RDgzRFx1REQ4N1wiLFxuICAgICAgcGFyYXNvbF9vbl9ncm91bmQ6IFwiXHUyNkYxXCIsXG4gICAgICBwYXJraW5nOiBcIlx1RDgzQ1x1REQ3Rlx1RkUwRlwiLFxuICAgICAgcGFydF9hbHRlcm5hdGlvbl9tYXJrOiBcIlx1MzAzRFx1RkUwRlwiLFxuICAgICAgcGFydGx5X3N1bm55OiBcIlx1MjZDNVx1RkUwRlwiLFxuICAgICAgcGFzc2VuZ2VyX3NoaXA6IFwiXHVEODNEXHVERUYzXCIsXG4gICAgICBwYXNzcG9ydF9jb250cm9sOiBcIlx1RDgzRFx1REVDMlwiLFxuICAgICAgcGF1c2VfYnV0dG9uOiBcIlx1MjNGOFwiLFxuICAgICAgcGVhY2Vfc3ltYm9sOiBcIlx1MjYyRVx1RkUwRlwiLFxuICAgICAgcGVhY2g6IFwiXHVEODNDXHVERjUxXCIsXG4gICAgICBwZWFudXRzOiBcIlx1RDgzRVx1REQ1Q1wiLFxuICAgICAgcGVhcjogXCJcdUQ4M0NcdURGNTBcIixcbiAgICAgIHBlbjogXCJcdUQ4M0RcdUREOEFcIixcbiAgICAgIHBlbmNpbDI6IFwiXHUyNzBGXHVGRTBGXCIsXG4gICAgICBwZW5ndWluOiBcIlx1RDgzRFx1REMyN1wiLFxuICAgICAgcGVuc2l2ZTogXCJcdUQ4M0RcdURFMTRcIixcbiAgICAgIHBlcmZvcm1pbmdfYXJ0czogXCJcdUQ4M0NcdURGQURcIixcbiAgICAgIHBlcnNldmVyZTogXCJcdUQ4M0RcdURFMjNcIixcbiAgICAgIHBlcnNvbl9mZW5jaW5nOiBcIlx1RDgzRVx1REQzQVwiLFxuICAgICAgcG91dGluZ193b21hbjogXCJcdUQ4M0RcdURFNEVcIixcbiAgICAgIHBob25lOiBcIlx1MjYwRVx1RkUwRlwiLFxuICAgICAgcGljazogXCJcdTI2Q0ZcIixcbiAgICAgIHBpZzogXCJcdUQ4M0RcdURDMzdcIixcbiAgICAgIHBpZzI6IFwiXHVEODNEXHVEQzE2XCIsXG4gICAgICBwaWdfbm9zZTogXCJcdUQ4M0RcdURDM0RcIixcbiAgICAgIHBpbGw6IFwiXHVEODNEXHVEQzhBXCIsXG4gICAgICBwaW5lYXBwbGU6IFwiXHVEODNDXHVERjREXCIsXG4gICAgICBwaW5nX3Bvbmc6IFwiXHVEODNDXHVERkQzXCIsXG4gICAgICBwaXNjZXM6IFwiXHUyNjUzXHVGRTBGXCIsXG4gICAgICBwaXp6YTogXCJcdUQ4M0NcdURGNTVcIixcbiAgICAgIHBsYWNlX29mX3dvcnNoaXA6IFwiXHVEODNEXHVERUQwXCIsXG4gICAgICBwbGF0ZV93aXRoX2N1dGxlcnk6IFwiXHVEODNDXHVERjdEXCIsXG4gICAgICBwbGF5X29yX3BhdXNlX2J1dHRvbjogXCJcdTIzRUZcIixcbiAgICAgIHBvaW50X2Rvd246IFwiXHVEODNEXHVEQzQ3XCIsXG4gICAgICBwb2ludF9sZWZ0OiBcIlx1RDgzRFx1REM0OFwiLFxuICAgICAgcG9pbnRfcmlnaHQ6IFwiXHVEODNEXHVEQzQ5XCIsXG4gICAgICBwb2ludF91cDogXCJcdTI2MURcdUZFMEZcIixcbiAgICAgIHBvaW50X3VwXzI6IFwiXHVEODNEXHVEQzQ2XCIsXG4gICAgICBwb2xpY2VfY2FyOiBcIlx1RDgzRFx1REU5M1wiLFxuICAgICAgcG9saWNld29tYW46IFwiXHVEODNEXHVEQzZFJnp3ajtcdTI2NDBcdUZFMEZcIixcbiAgICAgIHBvb2RsZTogXCJcdUQ4M0RcdURDMjlcIixcbiAgICAgIHBvcGNvcm46IFwiXHVEODNDXHVERjdGXCIsXG4gICAgICBwb3N0X29mZmljZTogXCJcdUQ4M0NcdURGRTNcIixcbiAgICAgIHBvc3RhbF9ob3JuOiBcIlx1RDgzRFx1RENFRlwiLFxuICAgICAgcG9zdGJveDogXCJcdUQ4M0RcdURDRUVcIixcbiAgICAgIHBvdGFibGVfd2F0ZXI6IFwiXHVEODNEXHVERUIwXCIsXG4gICAgICBwb3RhdG86IFwiXHVEODNFXHVERDU0XCIsXG4gICAgICBwb3VjaDogXCJcdUQ4M0RcdURDNURcIixcbiAgICAgIHBvdWx0cnlfbGVnOiBcIlx1RDgzQ1x1REY1N1wiLFxuICAgICAgcG91bmQ6IFwiXHVEODNEXHVEQ0I3XCIsXG4gICAgICByYWdlOiBcIlx1RDgzRFx1REUyMVwiLFxuICAgICAgcG91dGluZ19jYXQ6IFwiXHVEODNEXHVERTNFXCIsXG4gICAgICBwb3V0aW5nX21hbjogXCJcdUQ4M0RcdURFNEUmendqO1x1MjY0Mlx1RkUwRlwiLFxuICAgICAgcHJheTogXCJcdUQ4M0RcdURFNEZcIixcbiAgICAgIHByYXllcl9iZWFkczogXCJcdUQ4M0RcdURDRkZcIixcbiAgICAgIHByZWduYW50X3dvbWFuOiBcIlx1RDgzRVx1REQzMFwiLFxuICAgICAgcHJldmlvdXNfdHJhY2tfYnV0dG9uOiBcIlx1MjNFRVwiLFxuICAgICAgcHJpbmNlOiBcIlx1RDgzRVx1REQzNFwiLFxuICAgICAgcHJpbmNlc3M6IFwiXHVEODNEXHVEQzc4XCIsXG4gICAgICBwcmludGVyOiBcIlx1RDgzRFx1RERBOFwiLFxuICAgICAgcHVycGxlX2hlYXJ0OiBcIlx1RDgzRFx1REM5Q1wiLFxuICAgICAgcHVyc2U6IFwiXHVEODNEXHVEQzVCXCIsXG4gICAgICBwdXNocGluOiBcIlx1RDgzRFx1RENDQ1wiLFxuICAgICAgcHV0X2xpdHRlcl9pbl9pdHNfcGxhY2U6IFwiXHVEODNEXHVERUFFXCIsXG4gICAgICBxdWVzdGlvbjogXCJcdTI3NTNcIixcbiAgICAgIHJhYmJpdDogXCJcdUQ4M0RcdURDMzBcIixcbiAgICAgIHJhYmJpdDI6IFwiXHVEODNEXHVEQzA3XCIsXG4gICAgICByYWNlaG9yc2U6IFwiXHVEODNEXHVEQzBFXCIsXG4gICAgICByYWNpbmdfY2FyOiBcIlx1RDgzQ1x1REZDRVwiLFxuICAgICAgcmFkaW86IFwiXHVEODNEXHVEQ0ZCXCIsXG4gICAgICByYWRpb19idXR0b246IFwiXHVEODNEXHVERDE4XCIsXG4gICAgICByYWRpb2FjdGl2ZTogXCJcdTI2MjJcdUZFMEZcIixcbiAgICAgIHJhaWx3YXlfY2FyOiBcIlx1RDgzRFx1REU4M1wiLFxuICAgICAgcmFpbHdheV90cmFjazogXCJcdUQ4M0RcdURFRTRcIixcbiAgICAgIHJhaW5ib3c6IFwiXHVEODNDXHVERjA4XCIsXG4gICAgICByYWluYm93X2ZsYWc6IFwiXHVEODNDXHVERkYzXHVGRTBGJnp3ajtcdUQ4M0NcdURGMDhcIixcbiAgICAgIHJhaXNlZF9iYWNrX29mX2hhbmQ6IFwiXHVEODNFXHVERDFBXCIsXG4gICAgICByYWlzZWRfaGFuZF93aXRoX2ZpbmdlcnNfc3BsYXllZDogXCJcdUQ4M0RcdUREOTBcIixcbiAgICAgIHJhaXNlZF9oYW5kczogXCJcdUQ4M0RcdURFNENcIixcbiAgICAgIHJhaXNpbmdfaGFuZF93b21hbjogXCJcdUQ4M0RcdURFNEJcIixcbiAgICAgIHJhaXNpbmdfaGFuZF9tYW46IFwiXHVEODNEXHVERTRCJnp3ajtcdTI2NDJcdUZFMEZcIixcbiAgICAgIHJhbTogXCJcdUQ4M0RcdURDMEZcIixcbiAgICAgIHJhbWVuOiBcIlx1RDgzQ1x1REY1Q1wiLFxuICAgICAgcmF0OiBcIlx1RDgzRFx1REMwMFwiLFxuICAgICAgcmVjb3JkX2J1dHRvbjogXCJcdTIzRkFcIixcbiAgICAgIHJlY3ljbGU6IFwiXHUyNjdCXHVGRTBGXCIsXG4gICAgICByZWRfY2lyY2xlOiBcIlx1RDgzRFx1REQzNFwiLFxuICAgICAgcmVnaXN0ZXJlZDogXCJcdTAwQUVcdUZFMEZcIixcbiAgICAgIHJlbGF4ZWQ6IFwiXHUyNjNBXHVGRTBGXCIsXG4gICAgICByZWxpZXZlZDogXCJcdUQ4M0RcdURFMENcIixcbiAgICAgIHJlbWluZGVyX3JpYmJvbjogXCJcdUQ4M0NcdURGOTdcIixcbiAgICAgIHJlcGVhdDogXCJcdUQ4M0RcdUREMDFcIixcbiAgICAgIHJlcGVhdF9vbmU6IFwiXHVEODNEXHVERDAyXCIsXG4gICAgICByZXNjdWVfd29ya2VyX2hlbG1ldDogXCJcdTI2RDFcIixcbiAgICAgIHJlc3Ryb29tOiBcIlx1RDgzRFx1REVCQlwiLFxuICAgICAgcmV2b2x2aW5nX2hlYXJ0czogXCJcdUQ4M0RcdURDOUVcIixcbiAgICAgIHJld2luZDogXCJcdTIzRUFcIixcbiAgICAgIHJoaW5vY2Vyb3M6IFwiXHVEODNFXHVERDhGXCIsXG4gICAgICByaWJib246IFwiXHVEODNDXHVERjgwXCIsXG4gICAgICByaWNlOiBcIlx1RDgzQ1x1REY1QVwiLFxuICAgICAgcmljZV9iYWxsOiBcIlx1RDgzQ1x1REY1OVwiLFxuICAgICAgcmljZV9jcmFja2VyOiBcIlx1RDgzQ1x1REY1OFwiLFxuICAgICAgcmljZV9zY2VuZTogXCJcdUQ4M0NcdURGOTFcIixcbiAgICAgIHJpZ2h0X2FuZ2VyX2J1YmJsZTogXCJcdUQ4M0RcdURERUZcIixcbiAgICAgIHJpbmc6IFwiXHVEODNEXHVEQzhEXCIsXG4gICAgICByb2JvdDogXCJcdUQ4M0VcdUREMTZcIixcbiAgICAgIHJvY2tldDogXCJcdUQ4M0RcdURFODBcIixcbiAgICAgIHJvZmw6IFwiXHVEODNFXHVERDIzXCIsXG4gICAgICByb2xsX2V5ZXM6IFwiXHVEODNEXHVERTQ0XCIsXG4gICAgICByb2xsZXJfY29hc3RlcjogXCJcdUQ4M0NcdURGQTJcIixcbiAgICAgIHJvb3N0ZXI6IFwiXHVEODNEXHVEQzEzXCIsXG4gICAgICByb3NlOiBcIlx1RDgzQ1x1REYzOVwiLFxuICAgICAgcm9zZXR0ZTogXCJcdUQ4M0NcdURGRjVcIixcbiAgICAgIHJvdGF0aW5nX2xpZ2h0OiBcIlx1RDgzRFx1REVBOFwiLFxuICAgICAgcm91bmRfcHVzaHBpbjogXCJcdUQ4M0RcdURDQ0RcIixcbiAgICAgIHJvd2luZ19tYW46IFwiXHVEODNEXHVERUEzXCIsXG4gICAgICByb3dpbmdfd29tYW46IFwiXHVEODNEXHVERUEzJnp3ajtcdTI2NDBcdUZFMEZcIixcbiAgICAgIHJ1Z2J5X2Zvb3RiYWxsOiBcIlx1RDgzQ1x1REZDOVwiLFxuICAgICAgcnVubmluZ19tYW46IFwiXHVEODNDXHVERkMzXCIsXG4gICAgICBydW5uaW5nX3NoaXJ0X3dpdGhfc2FzaDogXCJcdUQ4M0NcdURGQkRcIixcbiAgICAgIHJ1bm5pbmdfd29tYW46IFwiXHVEODNDXHVERkMzJnp3ajtcdTI2NDBcdUZFMEZcIixcbiAgICAgIHNhOiBcIlx1RDgzQ1x1REUwMlx1RkUwRlwiLFxuICAgICAgc2FnaXR0YXJpdXM6IFwiXHUyNjUwXHVGRTBGXCIsXG4gICAgICBzYWtlOiBcIlx1RDgzQ1x1REY3NlwiLFxuICAgICAgc2FuZGFsOiBcIlx1RDgzRFx1REM2MVwiLFxuICAgICAgc2FudGE6IFwiXHVEODNDXHVERjg1XCIsXG4gICAgICBzYXRlbGxpdGU6IFwiXHVEODNEXHVEQ0UxXCIsXG4gICAgICBzYXhvcGhvbmU6IFwiXHVEODNDXHVERkI3XCIsXG4gICAgICBzY2hvb2w6IFwiXHVEODNDXHVERkVCXCIsXG4gICAgICBzY2hvb2xfc2F0Y2hlbDogXCJcdUQ4M0NcdURGOTJcIixcbiAgICAgIHNjaXNzb3JzOiBcIlx1MjcwMlx1RkUwRlwiLFxuICAgICAgc2NvcnBpb246IFwiXHVEODNFXHVERDgyXCIsXG4gICAgICBzY29ycGl1czogXCJcdTI2NEZcdUZFMEZcIixcbiAgICAgIHNjcmVhbTogXCJcdUQ4M0RcdURFMzFcIixcbiAgICAgIHNjcmVhbV9jYXQ6IFwiXHVEODNEXHVERTQwXCIsXG4gICAgICBzY3JvbGw6IFwiXHVEODNEXHVEQ0RDXCIsXG4gICAgICBzZWF0OiBcIlx1RDgzRFx1RENCQVwiLFxuICAgICAgc2VjcmV0OiBcIlx1MzI5OVx1RkUwRlwiLFxuICAgICAgc2VlX25vX2V2aWw6IFwiXHVEODNEXHVERTQ4XCIsXG4gICAgICBzZWVkbGluZzogXCJcdUQ4M0NcdURGMzFcIixcbiAgICAgIHNlbGZpZTogXCJcdUQ4M0VcdUREMzNcIixcbiAgICAgIHNoYWxsb3dfcGFuX29mX2Zvb2Q6IFwiXHVEODNFXHVERDU4XCIsXG4gICAgICBzaGFtcm9jazogXCJcdTI2MThcdUZFMEZcIixcbiAgICAgIHNoYXJrOiBcIlx1RDgzRVx1REQ4OFwiLFxuICAgICAgc2hhdmVkX2ljZTogXCJcdUQ4M0NcdURGNjdcIixcbiAgICAgIHNoZWVwOiBcIlx1RDgzRFx1REMxMVwiLFxuICAgICAgc2hlbGw6IFwiXHVEODNEXHVEQzFBXCIsXG4gICAgICBzaGllbGQ6IFwiXHVEODNEXHVERUUxXCIsXG4gICAgICBzaGludG9fc2hyaW5lOiBcIlx1MjZFOVwiLFxuICAgICAgc2hpcDogXCJcdUQ4M0RcdURFQTJcIixcbiAgICAgIHNoaXJ0OiBcIlx1RDgzRFx1REM1NVwiLFxuICAgICAgc2hvcHBpbmc6IFwiXHVEODNEXHVERUNEXCIsXG4gICAgICBzaG9wcGluZ19jYXJ0OiBcIlx1RDgzRFx1REVEMlwiLFxuICAgICAgc2hvd2VyOiBcIlx1RDgzRFx1REVCRlwiLFxuICAgICAgc2hyaW1wOiBcIlx1RDgzRVx1REQ5MFwiLFxuICAgICAgc2lnbmFsX3N0cmVuZ3RoOiBcIlx1RDgzRFx1RENGNlwiLFxuICAgICAgc2l4X3BvaW50ZWRfc3RhcjogXCJcdUQ4M0RcdUREMkZcIixcbiAgICAgIHNraTogXCJcdUQ4M0NcdURGQkZcIixcbiAgICAgIHNraWVyOiBcIlx1MjZGN1wiLFxuICAgICAgc2t1bGw6IFwiXHVEODNEXHVEQzgwXCIsXG4gICAgICBza3VsbF9hbmRfY3Jvc3Nib25lczogXCJcdTI2MjBcdUZFMEZcIixcbiAgICAgIHNsZWVwaW5nOiBcIlx1RDgzRFx1REUzNFwiLFxuICAgICAgc2xlZXBpbmdfYmVkOiBcIlx1RDgzRFx1REVDQ1wiLFxuICAgICAgc2xlZXB5OiBcIlx1RDgzRFx1REUyQVwiLFxuICAgICAgc2xpZ2h0bHlfZnJvd25pbmdfZmFjZTogXCJcdUQ4M0RcdURFNDFcIixcbiAgICAgIHNsaWdodGx5X3NtaWxpbmdfZmFjZTogXCJcdUQ4M0RcdURFNDJcIixcbiAgICAgIHNsb3RfbWFjaGluZTogXCJcdUQ4M0NcdURGQjBcIixcbiAgICAgIHNtYWxsX2FpcnBsYW5lOiBcIlx1RDgzRFx1REVFOVwiLFxuICAgICAgc21hbGxfYmx1ZV9kaWFtb25kOiBcIlx1RDgzRFx1REQzOVwiLFxuICAgICAgc21hbGxfb3JhbmdlX2RpYW1vbmQ6IFwiXHVEODNEXHVERDM4XCIsXG4gICAgICBzbWFsbF9yZWRfdHJpYW5nbGU6IFwiXHVEODNEXHVERDNBXCIsXG4gICAgICBzbWFsbF9yZWRfdHJpYW5nbGVfZG93bjogXCJcdUQ4M0RcdUREM0JcIixcbiAgICAgIHNtaWxlOiBcIlx1RDgzRFx1REUwNFwiLFxuICAgICAgc21pbGVfY2F0OiBcIlx1RDgzRFx1REUzOFwiLFxuICAgICAgc21pbGV5OiBcIlx1RDgzRFx1REUwM1wiLFxuICAgICAgc21pbGV5X2NhdDogXCJcdUQ4M0RcdURFM0FcIixcbiAgICAgIHNtaWxpbmdfaW1wOiBcIlx1RDgzRFx1REUwOFwiLFxuICAgICAgc21pcms6IFwiXHVEODNEXHVERTBGXCIsXG4gICAgICBzbWlya19jYXQ6IFwiXHVEODNEXHVERTNDXCIsXG4gICAgICBzbW9raW5nOiBcIlx1RDgzRFx1REVBQ1wiLFxuICAgICAgc25haWw6IFwiXHVEODNEXHVEQzBDXCIsXG4gICAgICBzbmFrZTogXCJcdUQ4M0RcdURDMERcIixcbiAgICAgIHNuZWV6aW5nX2ZhY2U6IFwiXHVEODNFXHVERDI3XCIsXG4gICAgICBzbm93Ym9hcmRlcjogXCJcdUQ4M0NcdURGQzJcIixcbiAgICAgIHNub3dmbGFrZTogXCJcdTI3NDRcdUZFMEZcIixcbiAgICAgIHNub3dtYW46IFwiXHUyNkM0XHVGRTBGXCIsXG4gICAgICBzbm93bWFuX3dpdGhfc25vdzogXCJcdTI2MDNcdUZFMEZcIixcbiAgICAgIHNvYjogXCJcdUQ4M0RcdURFMkRcIixcbiAgICAgIHNvY2NlcjogXCJcdTI2QkRcdUZFMEZcIixcbiAgICAgIHNvb246IFwiXHVEODNEXHVERDFDXCIsXG4gICAgICBzb3M6IFwiXHVEODNDXHVERDk4XCIsXG4gICAgICBzb3VuZDogXCJcdUQ4M0RcdUREMDlcIixcbiAgICAgIHNwYWNlX2ludmFkZXI6IFwiXHVEODNEXHVEQzdFXCIsXG4gICAgICBzcGFkZXM6IFwiXHUyNjYwXHVGRTBGXCIsXG4gICAgICBzcGFnaGV0dGk6IFwiXHVEODNDXHVERjVEXCIsXG4gICAgICBzcGFya2xlOiBcIlx1Mjc0N1x1RkUwRlwiLFxuICAgICAgc3BhcmtsZXI6IFwiXHVEODNDXHVERjg3XCIsXG4gICAgICBzcGFya2xlczogXCJcdTI3MjhcIixcbiAgICAgIHNwYXJrbGluZ19oZWFydDogXCJcdUQ4M0RcdURDOTZcIixcbiAgICAgIHNwZWFrX25vX2V2aWw6IFwiXHVEODNEXHVERTRBXCIsXG4gICAgICBzcGVha2VyOiBcIlx1RDgzRFx1REQwOFwiLFxuICAgICAgc3BlYWtpbmdfaGVhZDogXCJcdUQ4M0RcdURERTNcIixcbiAgICAgIHNwZWVjaF9iYWxsb29uOiBcIlx1RDgzRFx1RENBQ1wiLFxuICAgICAgc3BlZWRib2F0OiBcIlx1RDgzRFx1REVBNFwiLFxuICAgICAgc3BpZGVyOiBcIlx1RDgzRFx1REQ3N1wiLFxuICAgICAgc3BpZGVyX3dlYjogXCJcdUQ4M0RcdURENzhcIixcbiAgICAgIHNwaXJhbF9jYWxlbmRhcjogXCJcdUQ4M0RcdURERDNcIixcbiAgICAgIHNwaXJhbF9ub3RlcGFkOiBcIlx1RDgzRFx1REREMlwiLFxuICAgICAgc3Bvb246IFwiXHVEODNFXHVERDQ0XCIsXG4gICAgICBzcXVpZDogXCJcdUQ4M0VcdUREOTFcIixcbiAgICAgIHN0YWRpdW06IFwiXHVEODNDXHVERkRGXCIsXG4gICAgICBzdGFyOiBcIlx1MkI1MFx1RkUwRlwiLFxuICAgICAgc3RhcjI6IFwiXHVEODNDXHVERjFGXCIsXG4gICAgICBzdGFyX2FuZF9jcmVzY2VudDogXCJcdTI2MkFcdUZFMEZcIixcbiAgICAgIHN0YXJfb2ZfZGF2aWQ6IFwiXHUyNzIxXHVGRTBGXCIsXG4gICAgICBzdGFyczogXCJcdUQ4M0NcdURGMjBcIixcbiAgICAgIHN0YXRpb246IFwiXHVEODNEXHVERTg5XCIsXG4gICAgICBzdGF0dWVfb2ZfbGliZXJ0eTogXCJcdUQ4M0RcdURERkRcIixcbiAgICAgIHN0ZWFtX2xvY29tb3RpdmU6IFwiXHVEODNEXHVERTgyXCIsXG4gICAgICBzdGV3OiBcIlx1RDgzQ1x1REY3MlwiLFxuICAgICAgc3RvcF9idXR0b246IFwiXHUyM0Y5XCIsXG4gICAgICBzdG9wX3NpZ246IFwiXHVEODNEXHVERUQxXCIsXG4gICAgICBzdG9wd2F0Y2g6IFwiXHUyM0YxXCIsXG4gICAgICBzdHJhaWdodF9ydWxlcjogXCJcdUQ4M0RcdURDQ0ZcIixcbiAgICAgIHN0cmF3YmVycnk6IFwiXHVEODNDXHVERjUzXCIsXG4gICAgICBzdHVja19vdXRfdG9uZ3VlOiBcIlx1RDgzRFx1REUxQlwiLFxuICAgICAgc3R1Y2tfb3V0X3Rvbmd1ZV9jbG9zZWRfZXllczogXCJcdUQ4M0RcdURFMURcIixcbiAgICAgIHN0dWNrX291dF90b25ndWVfd2lua2luZ19leWU6IFwiXHVEODNEXHVERTFDXCIsXG4gICAgICBzdHVkaW9fbWljcm9waG9uZTogXCJcdUQ4M0NcdURGOTlcIixcbiAgICAgIHN0dWZmZWRfZmxhdGJyZWFkOiBcIlx1RDgzRVx1REQ1OVwiLFxuICAgICAgc3VuX2JlaGluZF9sYXJnZV9jbG91ZDogXCJcdUQ4M0NcdURGMjVcIixcbiAgICAgIHN1bl9iZWhpbmRfcmFpbl9jbG91ZDogXCJcdUQ4M0NcdURGMjZcIixcbiAgICAgIHN1bl9iZWhpbmRfc21hbGxfY2xvdWQ6IFwiXHVEODNDXHVERjI0XCIsXG4gICAgICBzdW5fd2l0aF9mYWNlOiBcIlx1RDgzQ1x1REYxRVwiLFxuICAgICAgc3VuZmxvd2VyOiBcIlx1RDgzQ1x1REYzQlwiLFxuICAgICAgc3VuZ2xhc3NlczogXCJcdUQ4M0RcdURFMEVcIixcbiAgICAgIHN1bm55OiBcIlx1MjYwMFx1RkUwRlwiLFxuICAgICAgc3VucmlzZTogXCJcdUQ4M0NcdURGMDVcIixcbiAgICAgIHN1bnJpc2Vfb3Zlcl9tb3VudGFpbnM6IFwiXHVEODNDXHVERjA0XCIsXG4gICAgICBzdXJmaW5nX21hbjogXCJcdUQ4M0NcdURGQzRcIixcbiAgICAgIHN1cmZpbmdfd29tYW46IFwiXHVEODNDXHVERkM0Jnp3ajtcdTI2NDBcdUZFMEZcIixcbiAgICAgIHN1c2hpOiBcIlx1RDgzQ1x1REY2M1wiLFxuICAgICAgc3VzcGVuc2lvbl9yYWlsd2F5OiBcIlx1RDgzRFx1REU5RlwiLFxuICAgICAgc3dlYXQ6IFwiXHVEODNEXHVERTEzXCIsXG4gICAgICBzd2VhdF9kcm9wczogXCJcdUQ4M0RcdURDQTZcIixcbiAgICAgIHN3ZWF0X3NtaWxlOiBcIlx1RDgzRFx1REUwNVwiLFxuICAgICAgc3dlZXRfcG90YXRvOiBcIlx1RDgzQ1x1REY2MFwiLFxuICAgICAgc3dpbW1pbmdfbWFuOiBcIlx1RDgzQ1x1REZDQVwiLFxuICAgICAgc3dpbW1pbmdfd29tYW46IFwiXHVEODNDXHVERkNBJnp3ajtcdTI2NDBcdUZFMEZcIixcbiAgICAgIHN5bWJvbHM6IFwiXHVEODNEXHVERDIzXCIsXG4gICAgICBzeW5hZ29ndWU6IFwiXHVEODNEXHVERDREXCIsXG4gICAgICBzeXJpbmdlOiBcIlx1RDgzRFx1REM4OVwiLFxuICAgICAgdGFjbzogXCJcdUQ4M0NcdURGMkVcIixcbiAgICAgIHRhZGE6IFwiXHVEODNDXHVERjg5XCIsXG4gICAgICB0YW5hYmF0YV90cmVlOiBcIlx1RDgzQ1x1REY4QlwiLFxuICAgICAgdGF1cnVzOiBcIlx1MjY0OVx1RkUwRlwiLFxuICAgICAgdGF4aTogXCJcdUQ4M0RcdURFOTVcIixcbiAgICAgIHRlYTogXCJcdUQ4M0NcdURGNzVcIixcbiAgICAgIHRlbGVwaG9uZV9yZWNlaXZlcjogXCJcdUQ4M0RcdURDREVcIixcbiAgICAgIHRlbGVzY29wZTogXCJcdUQ4M0RcdUREMkRcIixcbiAgICAgIHRlbm5pczogXCJcdUQ4M0NcdURGQkVcIixcbiAgICAgIHRlbnQ6IFwiXHUyNkZBXHVGRTBGXCIsXG4gICAgICB0aGVybW9tZXRlcjogXCJcdUQ4M0NcdURGMjFcIixcbiAgICAgIHRoaW5raW5nOiBcIlx1RDgzRVx1REQxNFwiLFxuICAgICAgdGhvdWdodF9iYWxsb29uOiBcIlx1RDgzRFx1RENBRFwiLFxuICAgICAgdGlja2V0OiBcIlx1RDgzQ1x1REZBQlwiLFxuICAgICAgdGlja2V0czogXCJcdUQ4M0NcdURGOUZcIixcbiAgICAgIHRpZ2VyOiBcIlx1RDgzRFx1REMyRlwiLFxuICAgICAgdGlnZXIyOiBcIlx1RDgzRFx1REMwNVwiLFxuICAgICAgdGltZXJfY2xvY2s6IFwiXHUyM0YyXCIsXG4gICAgICB0aXBwaW5nX2hhbmRfbWFuOiBcIlx1RDgzRFx1REM4MSZ6d2o7XHUyNjQyXHVGRTBGXCIsXG4gICAgICB0aXJlZF9mYWNlOiBcIlx1RDgzRFx1REUyQlwiLFxuICAgICAgdG06IFwiXHUyMTIyXHVGRTBGXCIsXG4gICAgICB0b2lsZXQ6IFwiXHVEODNEXHVERUJEXCIsXG4gICAgICB0b2t5b190b3dlcjogXCJcdUQ4M0RcdURERkNcIixcbiAgICAgIHRvbWF0bzogXCJcdUQ4M0NcdURGNDVcIixcbiAgICAgIHRvbmd1ZTogXCJcdUQ4M0RcdURDNDVcIixcbiAgICAgIHRvcDogXCJcdUQ4M0RcdUREMURcIixcbiAgICAgIHRvcGhhdDogXCJcdUQ4M0NcdURGQTlcIixcbiAgICAgIHRvcm5hZG86IFwiXHVEODNDXHVERjJBXCIsXG4gICAgICB0cmFja2JhbGw6IFwiXHVEODNEXHVEREIyXCIsXG4gICAgICB0cmFjdG9yOiBcIlx1RDgzRFx1REU5Q1wiLFxuICAgICAgdHJhZmZpY19saWdodDogXCJcdUQ4M0RcdURFQTVcIixcbiAgICAgIHRyYWluOiBcIlx1RDgzRFx1REU4QlwiLFxuICAgICAgdHJhaW4yOiBcIlx1RDgzRFx1REU4NlwiLFxuICAgICAgdHJhbTogXCJcdUQ4M0RcdURFOEFcIixcbiAgICAgIHRyaWFuZ3VsYXJfZmxhZ19vbl9wb3N0OiBcIlx1RDgzRFx1REVBOVwiLFxuICAgICAgdHJpYW5ndWxhcl9ydWxlcjogXCJcdUQ4M0RcdURDRDBcIixcbiAgICAgIHRyaWRlbnQ6IFwiXHVEODNEXHVERDMxXCIsXG4gICAgICB0cml1bXBoOiBcIlx1RDgzRFx1REUyNFwiLFxuICAgICAgdHJvbGxleWJ1czogXCJcdUQ4M0RcdURFOEVcIixcbiAgICAgIHRyb3BoeTogXCJcdUQ4M0NcdURGQzZcIixcbiAgICAgIHRyb3BpY2FsX2RyaW5rOiBcIlx1RDgzQ1x1REY3OVwiLFxuICAgICAgdHJvcGljYWxfZmlzaDogXCJcdUQ4M0RcdURDMjBcIixcbiAgICAgIHRydWNrOiBcIlx1RDgzRFx1REU5QVwiLFxuICAgICAgdHJ1bXBldDogXCJcdUQ4M0NcdURGQkFcIixcbiAgICAgIHR1bGlwOiBcIlx1RDgzQ1x1REYzN1wiLFxuICAgICAgdHVtYmxlcl9nbGFzczogXCJcdUQ4M0VcdURENDNcIixcbiAgICAgIHR1cmtleTogXCJcdUQ4M0VcdUREODNcIixcbiAgICAgIHR1cnRsZTogXCJcdUQ4M0RcdURDMjJcIixcbiAgICAgIHR2OiBcIlx1RDgzRFx1RENGQVwiLFxuICAgICAgdHdpc3RlZF9yaWdodHdhcmRzX2Fycm93czogXCJcdUQ4M0RcdUREMDBcIixcbiAgICAgIHR3b19oZWFydHM6IFwiXHVEODNEXHVEQzk1XCIsXG4gICAgICB0d29fbWVuX2hvbGRpbmdfaGFuZHM6IFwiXHVEODNEXHVEQzZDXCIsXG4gICAgICB0d29fd29tZW5faG9sZGluZ19oYW5kczogXCJcdUQ4M0RcdURDNkRcIixcbiAgICAgIHU1MjcyOiBcIlx1RDgzQ1x1REUzOVwiLFxuICAgICAgdTU0MDg6IFwiXHVEODNDXHVERTM0XCIsXG4gICAgICB1NTViNjogXCJcdUQ4M0NcdURFM0FcIixcbiAgICAgIHU2MzA3OiBcIlx1RDgzQ1x1REUyRlx1RkUwRlwiLFxuICAgICAgdTY3MDg6IFwiXHVEODNDXHVERTM3XHVGRTBGXCIsXG4gICAgICB1NjcwOTogXCJcdUQ4M0NcdURFMzZcIixcbiAgICAgIHU2ZTgwOiBcIlx1RDgzQ1x1REUzNVwiLFxuICAgICAgdTcxMjE6IFwiXHVEODNDXHVERTFBXHVGRTBGXCIsXG4gICAgICB1NzUzMzogXCJcdUQ4M0NcdURFMzhcIixcbiAgICAgIHU3OTgxOiBcIlx1RDgzQ1x1REUzMlwiLFxuICAgICAgdTdhN2E6IFwiXHVEODNDXHVERTMzXCIsXG4gICAgICB1bWJyZWxsYTogXCJcdTI2MTRcdUZFMEZcIixcbiAgICAgIHVuYW11c2VkOiBcIlx1RDgzRFx1REUxMlwiLFxuICAgICAgdW5kZXJhZ2U6IFwiXHVEODNEXHVERDFFXCIsXG4gICAgICB1bmljb3JuOiBcIlx1RDgzRVx1REQ4NFwiLFxuICAgICAgdW5sb2NrOiBcIlx1RDgzRFx1REQxM1wiLFxuICAgICAgdXA6IFwiXHVEODNDXHVERDk5XCIsXG4gICAgICB1cHNpZGVfZG93bl9mYWNlOiBcIlx1RDgzRFx1REU0M1wiLFxuICAgICAgdjogXCJcdTI3MENcdUZFMEZcIixcbiAgICAgIHZlcnRpY2FsX3RyYWZmaWNfbGlnaHQ6IFwiXHVEODNEXHVERUE2XCIsXG4gICAgICB2aHM6IFwiXHVEODNEXHVEQ0ZDXCIsXG4gICAgICB2aWJyYXRpb25fbW9kZTogXCJcdUQ4M0RcdURDRjNcIixcbiAgICAgIHZpZGVvX2NhbWVyYTogXCJcdUQ4M0RcdURDRjlcIixcbiAgICAgIHZpZGVvX2dhbWU6IFwiXHVEODNDXHVERkFFXCIsXG4gICAgICB2aW9saW46IFwiXHVEODNDXHVERkJCXCIsXG4gICAgICB2aXJnbzogXCJcdTI2NERcdUZFMEZcIixcbiAgICAgIHZvbGNhbm86IFwiXHVEODNDXHVERjBCXCIsXG4gICAgICB2b2xsZXliYWxsOiBcIlx1RDgzQ1x1REZEMFwiLFxuICAgICAgdnM6IFwiXHVEODNDXHVERDlBXCIsXG4gICAgICB2dWxjYW5fc2FsdXRlOiBcIlx1RDgzRFx1REQ5NlwiLFxuICAgICAgd2Fsa2luZ19tYW46IFwiXHVEODNEXHVERUI2XCIsXG4gICAgICB3YWxraW5nX3dvbWFuOiBcIlx1RDgzRFx1REVCNiZ6d2o7XHUyNjQwXHVGRTBGXCIsXG4gICAgICB3YW5pbmdfY3Jlc2NlbnRfbW9vbjogXCJcdUQ4M0NcdURGMThcIixcbiAgICAgIHdhbmluZ19naWJib3VzX21vb246IFwiXHVEODNDXHVERjE2XCIsXG4gICAgICB3YXJuaW5nOiBcIlx1MjZBMFx1RkUwRlwiLFxuICAgICAgd2FzdGViYXNrZXQ6IFwiXHVEODNEXHVEREQxXCIsXG4gICAgICB3YXRjaDogXCJcdTIzMUFcdUZFMEZcIixcbiAgICAgIHdhdGVyX2J1ZmZhbG86IFwiXHVEODNEXHVEQzAzXCIsXG4gICAgICB3YXRlcm1lbG9uOiBcIlx1RDgzQ1x1REY0OVwiLFxuICAgICAgd2F2ZTogXCJcdUQ4M0RcdURDNEJcIixcbiAgICAgIHdhdnlfZGFzaDogXCJcdTMwMzBcdUZFMEZcIixcbiAgICAgIHdheGluZ19jcmVzY2VudF9tb29uOiBcIlx1RDgzQ1x1REYxMlwiLFxuICAgICAgd2M6IFwiXHVEODNEXHVERUJFXCIsXG4gICAgICB3ZWFyeTogXCJcdUQ4M0RcdURFMjlcIixcbiAgICAgIHdlZGRpbmc6IFwiXHVEODNEXHVEQzkyXCIsXG4gICAgICB3ZWlnaHRfbGlmdGluZ19tYW46IFwiXHVEODNDXHVERkNCXHVGRTBGXCIsXG4gICAgICB3ZWlnaHRfbGlmdGluZ193b21hbjogXCJcdUQ4M0NcdURGQ0JcdUZFMEYmendqO1x1MjY0MFx1RkUwRlwiLFxuICAgICAgd2hhbGU6IFwiXHVEODNEXHVEQzMzXCIsXG4gICAgICB3aGFsZTI6IFwiXHVEODNEXHVEQzBCXCIsXG4gICAgICB3aGVlbF9vZl9kaGFybWE6IFwiXHUyNjM4XHVGRTBGXCIsXG4gICAgICB3aGVlbGNoYWlyOiBcIlx1MjY3Rlx1RkUwRlwiLFxuICAgICAgd2hpdGVfY2hlY2tfbWFyazogXCJcdTI3MDVcIixcbiAgICAgIHdoaXRlX2NpcmNsZTogXCJcdTI2QUFcdUZFMEZcIixcbiAgICAgIHdoaXRlX2ZsYWc6IFwiXHVEODNDXHVERkYzXHVGRTBGXCIsXG4gICAgICB3aGl0ZV9mbG93ZXI6IFwiXHVEODNEXHVEQ0FFXCIsXG4gICAgICB3aGl0ZV9sYXJnZV9zcXVhcmU6IFwiXHUyQjFDXHVGRTBGXCIsXG4gICAgICB3aGl0ZV9tZWRpdW1fc21hbGxfc3F1YXJlOiBcIlx1MjVGRFx1RkUwRlwiLFxuICAgICAgd2hpdGVfbWVkaXVtX3NxdWFyZTogXCJcdTI1RkJcdUZFMEZcIixcbiAgICAgIHdoaXRlX3NtYWxsX3NxdWFyZTogXCJcdTI1QUJcdUZFMEZcIixcbiAgICAgIHdoaXRlX3NxdWFyZV9idXR0b246IFwiXHVEODNEXHVERDMzXCIsXG4gICAgICB3aWx0ZWRfZmxvd2VyOiBcIlx1RDgzRVx1REQ0MFwiLFxuICAgICAgd2luZF9jaGltZTogXCJcdUQ4M0NcdURGOTBcIixcbiAgICAgIHdpbmRfZmFjZTogXCJcdUQ4M0NcdURGMkNcIixcbiAgICAgIHdpbmVfZ2xhc3M6IFwiXHVEODNDXHVERjc3XCIsXG4gICAgICB3aW5rOiBcIlx1RDgzRFx1REUwOVwiLFxuICAgICAgd29sZjogXCJcdUQ4M0RcdURDM0FcIixcbiAgICAgIHdvbWFuOiBcIlx1RDgzRFx1REM2OVwiLFxuICAgICAgd29tYW5fYXJ0aXN0OiBcIlx1RDgzRFx1REM2OSZ6d2o7XHVEODNDXHVERkE4XCIsXG4gICAgICB3b21hbl9hc3Ryb25hdXQ6IFwiXHVEODNEXHVEQzY5Jnp3ajtcdUQ4M0RcdURFODBcIixcbiAgICAgIHdvbWFuX2NhcnR3aGVlbGluZzogXCJcdUQ4M0VcdUREMzgmendqO1x1MjY0MFx1RkUwRlwiLFxuICAgICAgd29tYW5fY29vazogXCJcdUQ4M0RcdURDNjkmendqO1x1RDgzQ1x1REY3M1wiLFxuICAgICAgd29tYW5fZmFjZXBhbG1pbmc6IFwiXHVEODNFXHVERDI2Jnp3ajtcdTI2NDBcdUZFMEZcIixcbiAgICAgIHdvbWFuX2ZhY3Rvcnlfd29ya2VyOiBcIlx1RDgzRFx1REM2OSZ6d2o7XHVEODNDXHVERkVEXCIsXG4gICAgICB3b21hbl9mYXJtZXI6IFwiXHVEODNEXHVEQzY5Jnp3ajtcdUQ4M0NcdURGM0VcIixcbiAgICAgIHdvbWFuX2ZpcmVmaWdodGVyOiBcIlx1RDgzRFx1REM2OSZ6d2o7XHVEODNEXHVERTkyXCIsXG4gICAgICB3b21hbl9oZWFsdGhfd29ya2VyOiBcIlx1RDgzRFx1REM2OSZ6d2o7XHUyNjk1XHVGRTBGXCIsXG4gICAgICB3b21hbl9qdWRnZTogXCJcdUQ4M0RcdURDNjkmendqO1x1MjY5Nlx1RkUwRlwiLFxuICAgICAgd29tYW5fanVnZ2xpbmc6IFwiXHVEODNFXHVERDM5Jnp3ajtcdTI2NDBcdUZFMEZcIixcbiAgICAgIHdvbWFuX21lY2hhbmljOiBcIlx1RDgzRFx1REM2OSZ6d2o7XHVEODNEXHVERDI3XCIsXG4gICAgICB3b21hbl9vZmZpY2Vfd29ya2VyOiBcIlx1RDgzRFx1REM2OSZ6d2o7XHVEODNEXHVEQ0JDXCIsXG4gICAgICB3b21hbl9waWxvdDogXCJcdUQ4M0RcdURDNjkmendqO1x1MjcwOFx1RkUwRlwiLFxuICAgICAgd29tYW5fcGxheWluZ19oYW5kYmFsbDogXCJcdUQ4M0VcdUREM0UmendqO1x1MjY0MFx1RkUwRlwiLFxuICAgICAgd29tYW5fcGxheWluZ193YXRlcl9wb2xvOiBcIlx1RDgzRVx1REQzRCZ6d2o7XHUyNjQwXHVGRTBGXCIsXG4gICAgICB3b21hbl9zY2llbnRpc3Q6IFwiXHVEODNEXHVEQzY5Jnp3ajtcdUQ4M0RcdUREMkNcIixcbiAgICAgIHdvbWFuX3NocnVnZ2luZzogXCJcdUQ4M0VcdUREMzcmendqO1x1MjY0MFx1RkUwRlwiLFxuICAgICAgd29tYW5fc2luZ2VyOiBcIlx1RDgzRFx1REM2OSZ6d2o7XHVEODNDXHVERkE0XCIsXG4gICAgICB3b21hbl9zdHVkZW50OiBcIlx1RDgzRFx1REM2OSZ6d2o7XHVEODNDXHVERjkzXCIsXG4gICAgICB3b21hbl90ZWFjaGVyOiBcIlx1RDgzRFx1REM2OSZ6d2o7XHVEODNDXHVERkVCXCIsXG4gICAgICB3b21hbl90ZWNobm9sb2dpc3Q6IFwiXHVEODNEXHVEQzY5Jnp3ajtcdUQ4M0RcdURDQkJcIixcbiAgICAgIHdvbWFuX3dpdGhfdHVyYmFuOiBcIlx1RDgzRFx1REM3MyZ6d2o7XHUyNjQwXHVGRTBGXCIsXG4gICAgICB3b21hbnNfY2xvdGhlczogXCJcdUQ4M0RcdURDNUFcIixcbiAgICAgIHdvbWFuc19oYXQ6IFwiXHVEODNEXHVEQzUyXCIsXG4gICAgICB3b21lbl93cmVzdGxpbmc6IFwiXHVEODNFXHVERDNDJnp3ajtcdTI2NDBcdUZFMEZcIixcbiAgICAgIHdvbWVuczogXCJcdUQ4M0RcdURFQkFcIixcbiAgICAgIHdvcmxkX21hcDogXCJcdUQ4M0RcdURERkFcIixcbiAgICAgIHdvcnJpZWQ6IFwiXHVEODNEXHVERTFGXCIsXG4gICAgICB3cmVuY2g6IFwiXHVEODNEXHVERDI3XCIsXG4gICAgICB3cml0aW5nX2hhbmQ6IFwiXHUyNzBEXHVGRTBGXCIsXG4gICAgICB4OiBcIlx1Mjc0Q1wiLFxuICAgICAgeWVsbG93X2hlYXJ0OiBcIlx1RDgzRFx1REM5QlwiLFxuICAgICAgeWVuOiBcIlx1RDgzRFx1RENCNFwiLFxuICAgICAgeWluX3lhbmc6IFwiXHUyNjJGXHVGRTBGXCIsXG4gICAgICB5dW06IFwiXHVEODNEXHVERTBCXCIsXG4gICAgICB6YXA6IFwiXHUyNkExXHVGRTBGXCIsXG4gICAgICB6aXBwZXJfbW91dGhfZmFjZTogXCJcdUQ4M0VcdUREMTBcIixcbiAgICAgIHp6ejogXCJcdUQ4M0RcdURDQTRcIixcbiAgICAgIC8qIHNwZWNpYWwgZW1vamlzIDpQICovXG4gICAgICBvY3RvY2F0OiAnPGltZyBhbHQ9XCI6b2N0b2NhdDpcIiBoZWlnaHQ9XCIyMFwiIHdpZHRoPVwiMjBcIiBhbGlnbj1cImFic21pZGRsZVwiIHNyYz1cImh0dHBzOi8vYXNzZXRzLWNkbi5naXRodWIuY29tL2ltYWdlcy9pY29ucy9lbW9qaS9vY3RvY2F0LnBuZ1wiPicsXG4gICAgICBzaG93ZG93bjogYDxzcGFuIHN0eWxlPVwiZm9udC1mYW1pbHk6ICdBbm9ueW1vdXMgUHJvJywgbW9ub3NwYWNlOyB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsgdGV4dC1kZWNvcmF0aW9uLXN0eWxlOiBkYXNoZWQ7IHRleHQtZGVjb3JhdGlvbi1jb2xvcjogIzNlOGI4YTt0ZXh0LXVuZGVybGluZS1wb3NpdGlvbjogdW5kZXI7XCI+Uzwvc3Bhbj5gXG4gICAgfSwgYS5Db252ZXJ0ZXIgPSBmdW5jdGlvbih0KSB7XG4gICAgICB2YXIgdSA9IHt9LCBzID0gW10sIGkgPSBbXSwgYyA9IHt9LCBtID0geSwgaCA9IHtcbiAgICAgICAgcGFyc2VkOiB7fSxcbiAgICAgICAgcmF3OiBcIlwiLFxuICAgICAgICBmb3JtYXQ6IFwiXCJcbiAgICAgIH07XG4gICAgICBDKCk7XG4gICAgICBmdW5jdGlvbiBDKCkge1xuICAgICAgICB0ID0gdCB8fCB7fTtcbiAgICAgICAgZm9yICh2YXIgXyBpbiBwKVxuICAgICAgICAgIHAuaGFzT3duUHJvcGVydHkoXykgJiYgKHVbX10gPSBwW19dKTtcbiAgICAgICAgaWYgKHR5cGVvZiB0ID09IFwib2JqZWN0XCIpXG4gICAgICAgICAgZm9yICh2YXIgcSBpbiB0KVxuICAgICAgICAgICAgdC5oYXNPd25Qcm9wZXJ0eShxKSAmJiAodVtxXSA9IHRbcV0pO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgdGhyb3cgRXJyb3IoXCJDb252ZXJ0ZXIgZXhwZWN0cyB0aGUgcGFzc2VkIHBhcmFtZXRlciB0byBiZSBhbiBvYmplY3QsIGJ1dCBcIiArIHR5cGVvZiB0ICsgXCIgd2FzIHBhc3NlZCBpbnN0ZWFkLlwiKTtcbiAgICAgICAgdS5leHRlbnNpb25zICYmIGEuaGVscGVyLmZvckVhY2godS5leHRlbnNpb25zLCBVKTtcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIFUoXywgcSkge1xuICAgICAgICBpZiAocSA9IHEgfHwgbnVsbCwgYS5oZWxwZXIuaXNTdHJpbmcoXykpXG4gICAgICAgICAgaWYgKF8gPSBhLmhlbHBlci5zdGRFeHROYW1lKF8pLCBxID0gXywgYS5leHRlbnNpb25zW19dKSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oXCJERVBSRUNBVElPTiBXQVJOSU5HOiBcIiArIF8gKyBcIiBpcyBhbiBvbGQgZXh0ZW5zaW9uIHRoYXQgdXNlcyBhIGRlcHJlY2F0ZWQgbG9hZGluZyBtZXRob2QuUGxlYXNlIGluZm9ybSB0aGUgZGV2ZWxvcGVyIHRoYXQgdGhlIGV4dGVuc2lvbiBzaG91bGQgYmUgdXBkYXRlZCFcIiksIEgoYS5leHRlbnNpb25zW19dLCBfKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9IGVsc2UgaWYgKCFhLmhlbHBlci5pc1VuZGVmaW5lZChvW19dKSlcbiAgICAgICAgICAgIF8gPSBvW19dO1xuICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgIHRocm93IEVycm9yKCdFeHRlbnNpb24gXCInICsgXyArICdcIiBjb3VsZCBub3QgYmUgbG9hZGVkLiBJdCB3YXMgZWl0aGVyIG5vdCBmb3VuZCBvciBpcyBub3QgYSB2YWxpZCBleHRlbnNpb24uJyk7XG4gICAgICAgIHR5cGVvZiBfID09IFwiZnVuY3Rpb25cIiAmJiAoXyA9IF8oKSksIGEuaGVscGVyLmlzQXJyYXkoXykgfHwgKF8gPSBbX10pO1xuICAgICAgICB2YXIgSiA9IHYoXywgcSk7XG4gICAgICAgIGlmICghSi52YWxpZClcbiAgICAgICAgICB0aHJvdyBFcnJvcihKLmVycm9yKTtcbiAgICAgICAgZm9yICh2YXIgWiA9IDA7IFogPCBfLmxlbmd0aDsgKytaKSB7XG4gICAgICAgICAgc3dpdGNoIChfW1pdLnR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgXCJsYW5nXCI6XG4gICAgICAgICAgICAgIHMucHVzaChfW1pdKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwib3V0cHV0XCI6XG4gICAgICAgICAgICAgIGkucHVzaChfW1pdKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChfW1pdLmhhc093blByb3BlcnR5KFwibGlzdGVuZXJzXCIpKVxuICAgICAgICAgICAgZm9yICh2YXIgQiBpbiBfW1pdLmxpc3RlbmVycylcbiAgICAgICAgICAgICAgX1taXS5saXN0ZW5lcnMuaGFzT3duUHJvcGVydHkoQikgJiYgVihCLCBfW1pdLmxpc3RlbmVyc1tCXSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIEgoXywgcSkge1xuICAgICAgICB0eXBlb2YgXyA9PSBcImZ1bmN0aW9uXCIgJiYgKF8gPSBfKG5ldyBhLkNvbnZlcnRlcigpKSksIGEuaGVscGVyLmlzQXJyYXkoXykgfHwgKF8gPSBbX10pO1xuICAgICAgICB2YXIgSiA9IHYoXywgcSk7XG4gICAgICAgIGlmICghSi52YWxpZClcbiAgICAgICAgICB0aHJvdyBFcnJvcihKLmVycm9yKTtcbiAgICAgICAgZm9yICh2YXIgWiA9IDA7IFogPCBfLmxlbmd0aDsgKytaKVxuICAgICAgICAgIHN3aXRjaCAoX1taXS50eXBlKSB7XG4gICAgICAgICAgICBjYXNlIFwibGFuZ1wiOlxuICAgICAgICAgICAgICBzLnB1c2goX1taXSk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcIm91dHB1dFwiOlxuICAgICAgICAgICAgICBpLnB1c2goX1taXSk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoXCJFeHRlbnNpb24gbG9hZGVyIGVycm9yOiBUeXBlIHVucmVjb2duaXplZCEhIVwiKTtcbiAgICAgICAgICB9XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBWKF8sIHEpIHtcbiAgICAgICAgaWYgKCFhLmhlbHBlci5pc1N0cmluZyhfKSlcbiAgICAgICAgICB0aHJvdyBFcnJvcihcIkludmFsaWQgYXJndW1lbnQgaW4gY29udmVydGVyLmxpc3RlbigpIG1ldGhvZDogbmFtZSBtdXN0IGJlIGEgc3RyaW5nLCBidXQgXCIgKyB0eXBlb2YgXyArIFwiIGdpdmVuXCIpO1xuICAgICAgICBpZiAodHlwZW9mIHEgIT0gXCJmdW5jdGlvblwiKVxuICAgICAgICAgIHRocm93IEVycm9yKFwiSW52YWxpZCBhcmd1bWVudCBpbiBjb252ZXJ0ZXIubGlzdGVuKCkgbWV0aG9kOiBjYWxsYmFjayBtdXN0IGJlIGEgZnVuY3Rpb24sIGJ1dCBcIiArIHR5cGVvZiBxICsgXCIgZ2l2ZW5cIik7XG4gICAgICAgIGMuaGFzT3duUHJvcGVydHkoXykgfHwgKGNbX10gPSBbXSksIGNbX10ucHVzaChxKTtcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIEcoXykge1xuICAgICAgICB2YXIgcSA9IF8ubWF0Y2goL15cXHMqLylbMF0ubGVuZ3RoLCBKID0gbmV3IFJlZ0V4cChcIl5cXFxcc3swLFwiICsgcSArIFwifVwiLCBcImdtXCIpO1xuICAgICAgICByZXR1cm4gXy5yZXBsYWNlKEosIFwiXCIpO1xuICAgICAgfVxuICAgICAgdGhpcy5fZGlzcGF0Y2ggPSBmdW5jdGlvbihxLCBKLCBaLCBCKSB7XG4gICAgICAgIGlmIChjLmhhc093blByb3BlcnR5KHEpKVxuICAgICAgICAgIGZvciAodmFyIGsgPSAwOyBrIDwgY1txXS5sZW5ndGg7ICsraykge1xuICAgICAgICAgICAgdmFyIEYgPSBjW3FdW2tdKHEsIEosIHRoaXMsIFosIEIpO1xuICAgICAgICAgICAgRiAmJiB0eXBlb2YgRiA8IFwidVwiICYmIChKID0gRik7XG4gICAgICAgICAgfVxuICAgICAgICByZXR1cm4gSjtcbiAgICAgIH0sIHRoaXMubGlzdGVuID0gZnVuY3Rpb24oXywgcSkge1xuICAgICAgICByZXR1cm4gVihfLCBxKSwgdGhpcztcbiAgICAgIH0sIHRoaXMubWFrZUh0bWwgPSBmdW5jdGlvbihfKSB7XG4gICAgICAgIGlmICghXylcbiAgICAgICAgICByZXR1cm4gXztcbiAgICAgICAgdmFyIHEgPSB7XG4gICAgICAgICAgZ0h0bWxCbG9ja3M6IFtdLFxuICAgICAgICAgIGdIdG1sTWRCbG9ja3M6IFtdLFxuICAgICAgICAgIGdIdG1sU3BhbnM6IFtdLFxuICAgICAgICAgIGdVcmxzOiB7fSxcbiAgICAgICAgICBnVGl0bGVzOiB7fSxcbiAgICAgICAgICBnRGltZW5zaW9uczoge30sXG4gICAgICAgICAgZ0xpc3RMZXZlbDogMCxcbiAgICAgICAgICBoYXNoTGlua0NvdW50czoge30sXG4gICAgICAgICAgbGFuZ0V4dGVuc2lvbnM6IHMsXG4gICAgICAgICAgb3V0cHV0TW9kaWZpZXJzOiBpLFxuICAgICAgICAgIGNvbnZlcnRlcjogdGhpcyxcbiAgICAgICAgICBnaENvZGVCbG9ja3M6IFtdLFxuICAgICAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgICAgICBwYXJzZWQ6IHt9LFxuICAgICAgICAgICAgcmF3OiBcIlwiLFxuICAgICAgICAgICAgZm9ybWF0OiBcIlwiXG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gXyA9IF8ucmVwbGFjZSgvXHUwMEE4L2csIFwiXHUwMEE4VFwiKSwgXyA9IF8ucmVwbGFjZSgvXFwkL2csIFwiXHUwMEE4RFwiKSwgXyA9IF8ucmVwbGFjZSgvXFxyXFxuL2csIGBcbmApLCBfID0gXy5yZXBsYWNlKC9cXHIvZywgYFxuYCksIF8gPSBfLnJlcGxhY2UoL1xcdTAwQTAvZywgXCImbmJzcDtcIiksIHUuc21hcnRJbmRlbnRhdGlvbkZpeCAmJiAoXyA9IEcoXykpLCBfID0gYFxuXG5gICsgXyArIGBcblxuYCwgXyA9IGEuc3ViUGFyc2VyKFwiZGV0YWJcIikoXywgdSwgcSksIF8gPSBfLnJlcGxhY2UoL15bIFxcdF0rJC9tZywgXCJcIiksIGEuaGVscGVyLmZvckVhY2gocywgZnVuY3Rpb24oSikge1xuICAgICAgICAgIF8gPSBhLnN1YlBhcnNlcihcInJ1bkV4dGVuc2lvblwiKShKLCBfLCB1LCBxKTtcbiAgICAgICAgfSksIF8gPSBhLnN1YlBhcnNlcihcIm1ldGFkYXRhXCIpKF8sIHUsIHEpLCBfID0gYS5zdWJQYXJzZXIoXCJoYXNoUHJlQ29kZVRhZ3NcIikoXywgdSwgcSksIF8gPSBhLnN1YlBhcnNlcihcImdpdGh1YkNvZGVCbG9ja3NcIikoXywgdSwgcSksIF8gPSBhLnN1YlBhcnNlcihcImhhc2hIVE1MQmxvY2tzXCIpKF8sIHUsIHEpLCBfID0gYS5zdWJQYXJzZXIoXCJoYXNoQ29kZVRhZ3NcIikoXywgdSwgcSksIF8gPSBhLnN1YlBhcnNlcihcInN0cmlwTGlua0RlZmluaXRpb25zXCIpKF8sIHUsIHEpLCBfID0gYS5zdWJQYXJzZXIoXCJibG9ja0dhbXV0XCIpKF8sIHUsIHEpLCBfID0gYS5zdWJQYXJzZXIoXCJ1bmhhc2hIVE1MU3BhbnNcIikoXywgdSwgcSksIF8gPSBhLnN1YlBhcnNlcihcInVuZXNjYXBlU3BlY2lhbENoYXJzXCIpKF8sIHUsIHEpLCBfID0gXy5yZXBsYWNlKC9cdTAwQThEL2csIFwiJCRcIiksIF8gPSBfLnJlcGxhY2UoL1x1MDBBOFQvZywgXCJcdTAwQThcIiksIF8gPSBhLnN1YlBhcnNlcihcImNvbXBsZXRlSFRNTERvY3VtZW50XCIpKF8sIHUsIHEpLCBhLmhlbHBlci5mb3JFYWNoKGksIGZ1bmN0aW9uKEopIHtcbiAgICAgICAgICBfID0gYS5zdWJQYXJzZXIoXCJydW5FeHRlbnNpb25cIikoSiwgXywgdSwgcSk7XG4gICAgICAgIH0pLCBoID0gcS5tZXRhZGF0YSwgXztcbiAgICAgIH0sIHRoaXMubWFrZU1hcmtkb3duID0gdGhpcy5tYWtlTWQgPSBmdW5jdGlvbihfLCBxKSB7XG4gICAgICAgIGlmIChfID0gXy5yZXBsYWNlKC9cXHJcXG4vZywgYFxuYCksIF8gPSBfLnJlcGxhY2UoL1xcci9nLCBgXG5gKSwgXyA9IF8ucmVwbGFjZSgvPlsgXFx0XSs8LywgXCI+XHUwMEE4TkJTUDs8XCIpLCAhcSlcbiAgICAgICAgICBpZiAod2luZG93ICYmIHdpbmRvdy5kb2N1bWVudClcbiAgICAgICAgICAgIHEgPSB3aW5kb3cuZG9jdW1lbnQ7XG4gICAgICAgICAgZWxzZVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSFRNTFBhcnNlciBpcyB1bmRlZmluZWQuIElmIGluIGEgd2Vid29ya2VyIG9yIG5vZGVqcyBlbnZpcm9ubWVudCwgeW91IG5lZWQgdG8gcHJvdmlkZSBhIFdIQVRXRyBET00gYW5kIEhUTUwgc3VjaCBhcyBKU0RPTVwiKTtcbiAgICAgICAgdmFyIEogPSBxLmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgIEouaW5uZXJIVE1MID0gXztcbiAgICAgICAgdmFyIFogPSB7XG4gICAgICAgICAgcHJlTGlzdDogbChKKVxuICAgICAgICB9O1xuICAgICAgICBPKEopO1xuICAgICAgICBmb3IgKHZhciBCID0gSi5jaGlsZE5vZGVzLCBrID0gXCJcIiwgRiA9IDA7IEYgPCBCLmxlbmd0aDsgRisrKVxuICAgICAgICAgIGsgKz0gYS5zdWJQYXJzZXIoXCJtYWtlTWFya2Rvd24ubm9kZVwiKShCW0ZdLCBaKTtcbiAgICAgICAgZnVuY3Rpb24gTyh3KSB7XG4gICAgICAgICAgZm9yICh2YXIgSSA9IDA7IEkgPCB3LmNoaWxkTm9kZXMubGVuZ3RoOyArK0kpIHtcbiAgICAgICAgICAgIHZhciBLID0gdy5jaGlsZE5vZGVzW0ldO1xuICAgICAgICAgICAgSy5ub2RlVHlwZSA9PT0gMyA/ICEvXFxTLy50ZXN0KEsubm9kZVZhbHVlKSAmJiAhL15bIF0rJC8udGVzdChLLm5vZGVWYWx1ZSkgPyAody5yZW1vdmVDaGlsZChLKSwgLS1JKSA6IChLLm5vZGVWYWx1ZSA9IEsubm9kZVZhbHVlLnNwbGl0KGBcbmApLmpvaW4oXCIgXCIpLCBLLm5vZGVWYWx1ZSA9IEsubm9kZVZhbHVlLnJlcGxhY2UoLyhcXHMpKy9nLCBcIiQxXCIpKSA6IEsubm9kZVR5cGUgPT09IDEgJiYgTyhLKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gbCh3KSB7XG4gICAgICAgICAgZm9yICh2YXIgSSA9IHcucXVlcnlTZWxlY3RvckFsbChcInByZVwiKSwgSyA9IFtdLCBXID0gMDsgVyA8IEkubGVuZ3RoOyArK1cpXG4gICAgICAgICAgICBpZiAoSVtXXS5jaGlsZEVsZW1lbnRDb3VudCA9PT0gMSAmJiBJW1ddLmZpcnN0Q2hpbGQudGFnTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcImNvZGVcIikge1xuICAgICAgICAgICAgICB2YXIgcmUgPSBJW1ddLmZpcnN0Q2hpbGQuaW5uZXJIVE1MLnRyaW0oKSwgYWUgPSBJW1ddLmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlKFwiZGF0YS1sYW5ndWFnZVwiKSB8fCBcIlwiO1xuICAgICAgICAgICAgICBpZiAoYWUgPT09IFwiXCIpXG4gICAgICAgICAgICAgICAgZm9yICh2YXIgZmUgPSBJW1ddLmZpcnN0Q2hpbGQuY2xhc3NOYW1lLnNwbGl0KFwiIFwiKSwgamUgPSAwOyBqZSA8IGZlLmxlbmd0aDsgKytqZSkge1xuICAgICAgICAgICAgICAgICAgdmFyIHhlID0gZmVbamVdLm1hdGNoKC9ebGFuZ3VhZ2UtKC4rKSQvKTtcbiAgICAgICAgICAgICAgICAgIGlmICh4ZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBhZSA9IHhlWzFdO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJlID0gYS5oZWxwZXIudW5lc2NhcGVIVE1MRW50aXRpZXMocmUpLCBLLnB1c2gocmUpLCBJW1ddLm91dGVySFRNTCA9ICc8cHJlY29kZSBsYW5ndWFnZT1cIicgKyBhZSArICdcIiBwcmVjb2RlbnVtPVwiJyArIFcudG9TdHJpbmcoKSArICdcIj48L3ByZWNvZGU+JztcbiAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICBLLnB1c2goSVtXXS5pbm5lckhUTUwpLCBJW1ddLmlubmVySFRNTCA9IFwiXCIsIElbV10uc2V0QXR0cmlidXRlKFwicHJlbnVtXCIsIFcudG9TdHJpbmcoKSk7XG4gICAgICAgICAgcmV0dXJuIEs7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGs7XG4gICAgICB9LCB0aGlzLnNldE9wdGlvbiA9IGZ1bmN0aW9uKF8sIHEpIHtcbiAgICAgICAgdVtfXSA9IHE7XG4gICAgICB9LCB0aGlzLmdldE9wdGlvbiA9IGZ1bmN0aW9uKF8pIHtcbiAgICAgICAgcmV0dXJuIHVbX107XG4gICAgICB9LCB0aGlzLmdldE9wdGlvbnMgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHU7XG4gICAgICB9LCB0aGlzLmFkZEV4dGVuc2lvbiA9IGZ1bmN0aW9uKF8sIHEpIHtcbiAgICAgICAgcSA9IHEgfHwgbnVsbCwgVShfLCBxKTtcbiAgICAgIH0sIHRoaXMudXNlRXh0ZW5zaW9uID0gZnVuY3Rpb24oXykge1xuICAgICAgICBVKF8pO1xuICAgICAgfSwgdGhpcy5zZXRGbGF2b3IgPSBmdW5jdGlvbihfKSB7XG4gICAgICAgIGlmICghYi5oYXNPd25Qcm9wZXJ0eShfKSlcbiAgICAgICAgICB0aHJvdyBFcnJvcihfICsgXCIgZmxhdm9yIHdhcyBub3QgZm91bmRcIik7XG4gICAgICAgIHZhciBxID0gYltfXTtcbiAgICAgICAgbSA9IF87XG4gICAgICAgIGZvciAodmFyIEogaW4gcSlcbiAgICAgICAgICBxLmhhc093blByb3BlcnR5KEopICYmICh1W0pdID0gcVtKXSk7XG4gICAgICB9LCB0aGlzLmdldEZsYXZvciA9IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gbTtcbiAgICAgIH0sIHRoaXMucmVtb3ZlRXh0ZW5zaW9uID0gZnVuY3Rpb24oXykge1xuICAgICAgICBhLmhlbHBlci5pc0FycmF5KF8pIHx8IChfID0gW19dKTtcbiAgICAgICAgZm9yICh2YXIgcSA9IDA7IHEgPCBfLmxlbmd0aDsgKytxKSB7XG4gICAgICAgICAgZm9yICh2YXIgSiA9IF9bcV0sIFogPSAwOyBaIDwgcy5sZW5ndGg7ICsrWilcbiAgICAgICAgICAgIHNbWl0gPT09IEogJiYgcy5zcGxpY2UoWiwgMSk7XG4gICAgICAgICAgZm9yICh2YXIgQiA9IDA7IEIgPCBpLmxlbmd0aDsgKytCKVxuICAgICAgICAgICAgaVtCXSA9PT0gSiAmJiBpLnNwbGljZShCLCAxKTtcbiAgICAgICAgfVxuICAgICAgfSwgdGhpcy5nZXRBbGxFeHRlbnNpb25zID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbGFuZ3VhZ2U6IHMsXG4gICAgICAgICAgb3V0cHV0OiBpXG4gICAgICAgIH07XG4gICAgICB9LCB0aGlzLmdldE1ldGFkYXRhID0gZnVuY3Rpb24oXykge1xuICAgICAgICByZXR1cm4gXyA/IGgucmF3IDogaC5wYXJzZWQ7XG4gICAgICB9LCB0aGlzLmdldE1ldGFkYXRhRm9ybWF0ID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBoLmZvcm1hdDtcbiAgICAgIH0sIHRoaXMuX3NldE1ldGFkYXRhUGFpciA9IGZ1bmN0aW9uKF8sIHEpIHtcbiAgICAgICAgaC5wYXJzZWRbX10gPSBxO1xuICAgICAgfSwgdGhpcy5fc2V0TWV0YWRhdGFGb3JtYXQgPSBmdW5jdGlvbihfKSB7XG4gICAgICAgIGguZm9ybWF0ID0gXztcbiAgICAgIH0sIHRoaXMuX3NldE1ldGFkYXRhUmF3ID0gZnVuY3Rpb24oXykge1xuICAgICAgICBoLnJhdyA9IF87XG4gICAgICB9O1xuICAgIH0sIGEuc3ViUGFyc2VyKFwiYW5jaG9yc1wiLCBmdW5jdGlvbih0LCB1LCBzKSB7XG4gICAgICB0ID0gcy5jb252ZXJ0ZXIuX2Rpc3BhdGNoKFwiYW5jaG9ycy5iZWZvcmVcIiwgdCwgdSwgcyk7XG4gICAgICB2YXIgaSA9IGZ1bmN0aW9uKGMsIG0sIGgsIEMsIFUsIEgsIFYpIHtcbiAgICAgICAgaWYgKGEuaGVscGVyLmlzVW5kZWZpbmVkKFYpICYmIChWID0gXCJcIiksIGggPSBoLnRvTG93ZXJDYXNlKCksIGMuc2VhcmNoKC9cXCg8P1xccyo+PyA/KFsnXCJdLipbJ1wiXSk/XFwpJC9tKSA+IC0xKVxuICAgICAgICAgIEMgPSBcIlwiO1xuICAgICAgICBlbHNlIGlmICghQylcbiAgICAgICAgICBpZiAoaCB8fCAoaCA9IG0udG9Mb3dlckNhc2UoKS5yZXBsYWNlKC8gP1xcbi9nLCBcIiBcIikpLCBDID0gXCIjXCIgKyBoLCAhYS5oZWxwZXIuaXNVbmRlZmluZWQocy5nVXJsc1toXSkpXG4gICAgICAgICAgICBDID0gcy5nVXJsc1toXSwgYS5oZWxwZXIuaXNVbmRlZmluZWQocy5nVGl0bGVzW2hdKSB8fCAoViA9IHMuZ1RpdGxlc1toXSk7XG4gICAgICAgICAgZWxzZVxuICAgICAgICAgICAgcmV0dXJuIGM7XG4gICAgICAgIEMgPSBDLnJlcGxhY2UoYS5oZWxwZXIucmVnZXhlcy5hc3Rlcmlza0Rhc2hBbmRDb2xvbiwgYS5oZWxwZXIuZXNjYXBlQ2hhcmFjdGVyc0NhbGxiYWNrKTtcbiAgICAgICAgdmFyIEcgPSAnPGEgaHJlZj1cIicgKyBDICsgJ1wiJztcbiAgICAgICAgcmV0dXJuIFYgIT09IFwiXCIgJiYgViAhPT0gbnVsbCAmJiAoViA9IFYucmVwbGFjZSgvXCIvZywgXCImcXVvdDtcIiksIFYgPSBWLnJlcGxhY2UoYS5oZWxwZXIucmVnZXhlcy5hc3Rlcmlza0Rhc2hBbmRDb2xvbiwgYS5oZWxwZXIuZXNjYXBlQ2hhcmFjdGVyc0NhbGxiYWNrKSwgRyArPSAnIHRpdGxlPVwiJyArIFYgKyAnXCInKSwgdS5vcGVuTGlua3NJbk5ld1dpbmRvdyAmJiAhL14jLy50ZXN0KEMpICYmIChHICs9ICcgcmVsPVwibm9vcGVuZXIgbm9yZWZlcnJlclwiIHRhcmdldD1cIlx1MDBBOEU5NUVibGFua1wiJyksIEcgKz0gXCI+XCIgKyBtICsgXCI8L2E+XCIsIEc7XG4gICAgICB9O1xuICAgICAgcmV0dXJuIHQgPSB0LnJlcGxhY2UoL1xcWygoPzpcXFtbXlxcXV0qXXxbXlxcW1xcXV0pKildID8oPzpcXG4gKik/XFxbKC4qPyldKCkoKSgpKCkvZywgaSksIHQgPSB0LnJlcGxhY2UoXG4gICAgICAgIC9cXFsoKD86XFxbW15cXF1dKl18W15cXFtcXF1dKSopXSgpWyBcXHRdKlxcKFsgXFx0XT88KFtePl0qKT4oPzpbIFxcdF0qKChbXCInXSkoW15cIl0qPylcXDUpKT9bIFxcdF0/XFwpL2csXG4gICAgICAgIGlcbiAgICAgICksIHQgPSB0LnJlcGxhY2UoXG4gICAgICAgIC9cXFsoKD86XFxbW15cXF1dKl18W15cXFtcXF1dKSopXSgpWyBcXHRdKlxcKFsgXFx0XT88PyhbXFxTXSs/KD86XFwoW1xcU10qP1xcKVtcXFNdKj8pPyk+Pyg/OlsgXFx0XSooKFtcIiddKShbXlwiXSo/KVxcNSkpP1sgXFx0XT9cXCkvZyxcbiAgICAgICAgaVxuICAgICAgKSwgdCA9IHQucmVwbGFjZSgvXFxbKFteXFxbXFxdXSspXSgpKCkoKSgpKCkvZywgaSksIHUuZ2hNZW50aW9ucyAmJiAodCA9IHQucmVwbGFjZSgvKF58XFxzKShcXFxcKT8oQChbYS16XFxkXSsoPzpbYS16XFxkLi1dKz9bYS16XFxkXSspKikpL2dtaSwgZnVuY3Rpb24oYywgbSwgaCwgQywgVSkge1xuICAgICAgICBpZiAoaCA9PT0gXCJcXFxcXCIpXG4gICAgICAgICAgcmV0dXJuIG0gKyBDO1xuICAgICAgICBpZiAoIWEuaGVscGVyLmlzU3RyaW5nKHUuZ2hNZW50aW9uc0xpbmspKVxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImdoTWVudGlvbnNMaW5rIG9wdGlvbiBtdXN0IGJlIGEgc3RyaW5nXCIpO1xuICAgICAgICB2YXIgSCA9IHUuZ2hNZW50aW9uc0xpbmsucmVwbGFjZSgvXFx7dX0vZywgVSksIFYgPSBcIlwiO1xuICAgICAgICByZXR1cm4gdS5vcGVuTGlua3NJbk5ld1dpbmRvdyAmJiAoViA9ICcgcmVsPVwibm9vcGVuZXIgbm9yZWZlcnJlclwiIHRhcmdldD1cIlx1MDBBOEU5NUVibGFua1wiJyksIG0gKyAnPGEgaHJlZj1cIicgKyBIICsgJ1wiJyArIFYgKyBcIj5cIiArIEMgKyBcIjwvYT5cIjtcbiAgICAgIH0pKSwgdCA9IHMuY29udmVydGVyLl9kaXNwYXRjaChcImFuY2hvcnMuYWZ0ZXJcIiwgdCwgdSwgcyksIHQ7XG4gICAgfSk7XG4gICAgdmFyIHogPSAvKFsqfl9dK3xcXGIpKCgoaHR0cHM/fGZ0cHxkaWN0KTpcXC9cXC98d3d3XFwuKVteJ1wiPlxcc10rP1xcLlteJ1wiPlxcc10rPykoKShcXDEpPyg/PVxcc3wkKSg/IVtcIjw+XSkvZ2ksIEwgPSAvKFsqfl9dK3xcXGIpKCgoaHR0cHM/fGZ0cHxkaWN0KTpcXC9cXC98d3d3XFwuKVteJ1wiPlxcc10rXFwuW14nXCI+XFxzXSs/KShbLiE/LCgpXFxbXFxdXSk/KFxcMSk/KD89XFxzfCQpKD8hW1wiPD5dKS9naSwgUiA9IC8oKTwoKChodHRwcz98ZnRwfGRpY3QpOlxcL1xcL3x3d3dcXC4pW14nXCI+XFxzXSspKCk+KCkvZ2ksIGogPSAvKF58XFxzKSg/Om1haWx0bzopPyhbQS1aYS16MC05ISMkJSYnKistLz0/Xl9ge3x9fi5dK0BbLWEtejAtOV0rKFxcLlstYS16MC05XSspKlxcLlthLXpdKykoPz0kfFxccykvZ21pLCBUID0gLzwoKSg/Om1haWx0bzopPyhbLS5cXHddK0BbLWEtejAtOV0rKFxcLlstYS16MC05XSspKlxcLlthLXpdKyk+L2dpLCAkID0gZnVuY3Rpb24odCkge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKHUsIHMsIGksIGMsIG0sIGgsIEMpIHtcbiAgICAgICAgaSA9IGkucmVwbGFjZShhLmhlbHBlci5yZWdleGVzLmFzdGVyaXNrRGFzaEFuZENvbG9uLCBhLmhlbHBlci5lc2NhcGVDaGFyYWN0ZXJzQ2FsbGJhY2spO1xuICAgICAgICB2YXIgVSA9IGksIEggPSBcIlwiLCBWID0gXCJcIiwgRyA9IHMgfHwgXCJcIiwgXyA9IEMgfHwgXCJcIjtcbiAgICAgICAgcmV0dXJuIC9ed3d3XFwuL2kudGVzdChpKSAmJiAoaSA9IGkucmVwbGFjZSgvXnd3d1xcLi9pLCBcImh0dHA6Ly93d3cuXCIpKSwgdC5leGNsdWRlVHJhaWxpbmdQdW5jdHVhdGlvbkZyb21VUkxzICYmIGggJiYgKEggPSBoKSwgdC5vcGVuTGlua3NJbk5ld1dpbmRvdyAmJiAoViA9ICcgcmVsPVwibm9vcGVuZXIgbm9yZWZlcnJlclwiIHRhcmdldD1cIlx1MDBBOEU5NUVibGFua1wiJyksIEcgKyAnPGEgaHJlZj1cIicgKyBpICsgJ1wiJyArIFYgKyBcIj5cIiArIFUgKyBcIjwvYT5cIiArIEggKyBfO1xuICAgICAgfTtcbiAgICB9LCBOID0gZnVuY3Rpb24odCwgdSkge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKHMsIGksIGMpIHtcbiAgICAgICAgdmFyIG0gPSBcIm1haWx0bzpcIjtcbiAgICAgICAgcmV0dXJuIGkgPSBpIHx8IFwiXCIsIGMgPSBhLnN1YlBhcnNlcihcInVuZXNjYXBlU3BlY2lhbENoYXJzXCIpKGMsIHQsIHUpLCB0LmVuY29kZUVtYWlscyA/IChtID0gYS5oZWxwZXIuZW5jb2RlRW1haWxBZGRyZXNzKG0gKyBjKSwgYyA9IGEuaGVscGVyLmVuY29kZUVtYWlsQWRkcmVzcyhjKSkgOiBtID0gbSArIGMsIGkgKyAnPGEgaHJlZj1cIicgKyBtICsgJ1wiPicgKyBjICsgXCI8L2E+XCI7XG4gICAgICB9O1xuICAgIH07XG4gICAgYS5zdWJQYXJzZXIoXCJhdXRvTGlua3NcIiwgZnVuY3Rpb24odCwgdSwgcykge1xuICAgICAgcmV0dXJuIHQgPSBzLmNvbnZlcnRlci5fZGlzcGF0Y2goXCJhdXRvTGlua3MuYmVmb3JlXCIsIHQsIHUsIHMpLCB0ID0gdC5yZXBsYWNlKFIsICQodSkpLCB0ID0gdC5yZXBsYWNlKFQsIE4odSwgcykpLCB0ID0gcy5jb252ZXJ0ZXIuX2Rpc3BhdGNoKFwiYXV0b0xpbmtzLmFmdGVyXCIsIHQsIHUsIHMpLCB0O1xuICAgIH0pLCBhLnN1YlBhcnNlcihcInNpbXBsaWZpZWRBdXRvTGlua3NcIiwgZnVuY3Rpb24odCwgdSwgcykge1xuICAgICAgcmV0dXJuIHUuc2ltcGxpZmllZEF1dG9MaW5rICYmICh0ID0gcy5jb252ZXJ0ZXIuX2Rpc3BhdGNoKFwic2ltcGxpZmllZEF1dG9MaW5rcy5iZWZvcmVcIiwgdCwgdSwgcyksIHUuZXhjbHVkZVRyYWlsaW5nUHVuY3R1YXRpb25Gcm9tVVJMcyA/IHQgPSB0LnJlcGxhY2UoTCwgJCh1KSkgOiB0ID0gdC5yZXBsYWNlKHosICQodSkpLCB0ID0gdC5yZXBsYWNlKGosIE4odSwgcykpLCB0ID0gcy5jb252ZXJ0ZXIuX2Rpc3BhdGNoKFwic2ltcGxpZmllZEF1dG9MaW5rcy5hZnRlclwiLCB0LCB1LCBzKSksIHQ7XG4gICAgfSksIGEuc3ViUGFyc2VyKFwiYmxvY2tHYW11dFwiLCBmdW5jdGlvbih0LCB1LCBzKSB7XG4gICAgICByZXR1cm4gdCA9IHMuY29udmVydGVyLl9kaXNwYXRjaChcImJsb2NrR2FtdXQuYmVmb3JlXCIsIHQsIHUsIHMpLCB0ID0gYS5zdWJQYXJzZXIoXCJibG9ja1F1b3Rlc1wiKSh0LCB1LCBzKSwgdCA9IGEuc3ViUGFyc2VyKFwiaGVhZGVyc1wiKSh0LCB1LCBzKSwgdCA9IGEuc3ViUGFyc2VyKFwiaG9yaXpvbnRhbFJ1bGVcIikodCwgdSwgcyksIHQgPSBhLnN1YlBhcnNlcihcImxpc3RzXCIpKHQsIHUsIHMpLCB0ID0gYS5zdWJQYXJzZXIoXCJjb2RlQmxvY2tzXCIpKHQsIHUsIHMpLCB0ID0gYS5zdWJQYXJzZXIoXCJ0YWJsZXNcIikodCwgdSwgcyksIHQgPSBhLnN1YlBhcnNlcihcImhhc2hIVE1MQmxvY2tzXCIpKHQsIHUsIHMpLCB0ID0gYS5zdWJQYXJzZXIoXCJwYXJhZ3JhcGhzXCIpKHQsIHUsIHMpLCB0ID0gcy5jb252ZXJ0ZXIuX2Rpc3BhdGNoKFwiYmxvY2tHYW11dC5hZnRlclwiLCB0LCB1LCBzKSwgdDtcbiAgICB9KSwgYS5zdWJQYXJzZXIoXCJibG9ja1F1b3Rlc1wiLCBmdW5jdGlvbih0LCB1LCBzKSB7XG4gICAgICB0ID0gcy5jb252ZXJ0ZXIuX2Rpc3BhdGNoKFwiYmxvY2tRdW90ZXMuYmVmb3JlXCIsIHQsIHUsIHMpLCB0ID0gdCArIGBcblxuYDtcbiAgICAgIHZhciBpID0gLyheIHswLDN9PlsgXFx0XT8uK1xcbiguK1xcbikqXFxuKikrL2dtO1xuICAgICAgcmV0dXJuIHUuc3BsaXRBZGphY2VudEJsb2NrcXVvdGVzICYmIChpID0gL14gezAsM30+W1xcc1xcU10qPyg/OlxcblxcbikvZ20pLCB0ID0gdC5yZXBsYWNlKGksIGZ1bmN0aW9uKGMpIHtcbiAgICAgICAgcmV0dXJuIGMgPSBjLnJlcGxhY2UoL15bIFxcdF0qPlsgXFx0XT8vZ20sIFwiXCIpLCBjID0gYy5yZXBsYWNlKC9cdTAwQTgwL2csIFwiXCIpLCBjID0gYy5yZXBsYWNlKC9eWyBcXHRdKyQvZ20sIFwiXCIpLCBjID0gYS5zdWJQYXJzZXIoXCJnaXRodWJDb2RlQmxvY2tzXCIpKGMsIHUsIHMpLCBjID0gYS5zdWJQYXJzZXIoXCJibG9ja0dhbXV0XCIpKGMsIHUsIHMpLCBjID0gYy5yZXBsYWNlKC8oXnxcXG4pL2csIFwiJDEgIFwiKSwgYyA9IGMucmVwbGFjZSgvKFxccyo8cHJlPlteXFxyXSs/PFxcL3ByZT4pL2dtLCBmdW5jdGlvbihtLCBoKSB7XG4gICAgICAgICAgdmFyIEMgPSBoO1xuICAgICAgICAgIHJldHVybiBDID0gQy5yZXBsYWNlKC9eICAvbWcsIFwiXHUwMEE4MFwiKSwgQyA9IEMucmVwbGFjZSgvXHUwMEE4MC9nLCBcIlwiKSwgQztcbiAgICAgICAgfSksIGEuc3ViUGFyc2VyKFwiaGFzaEJsb2NrXCIpKGA8YmxvY2txdW90ZT5cbmAgKyBjICsgYFxuPC9ibG9ja3F1b3RlPmAsIHUsIHMpO1xuICAgICAgfSksIHQgPSBzLmNvbnZlcnRlci5fZGlzcGF0Y2goXCJibG9ja1F1b3Rlcy5hZnRlclwiLCB0LCB1LCBzKSwgdDtcbiAgICB9KSwgYS5zdWJQYXJzZXIoXCJjb2RlQmxvY2tzXCIsIGZ1bmN0aW9uKHQsIHUsIHMpIHtcbiAgICAgIHQgPSBzLmNvbnZlcnRlci5fZGlzcGF0Y2goXCJjb2RlQmxvY2tzLmJlZm9yZVwiLCB0LCB1LCBzKSwgdCArPSBcIlx1MDBBODBcIjtcbiAgICAgIHZhciBpID0gLyg/OlxcblxcbnxeKSgoPzooPzpbIF17NH18XFx0KS4qXFxuKykrKShcXG4qWyBdezAsM31bXiBcXHRcXG5dfCg/PVx1MDBBODApKS9nO1xuICAgICAgcmV0dXJuIHQgPSB0LnJlcGxhY2UoaSwgZnVuY3Rpb24oYywgbSwgaCkge1xuICAgICAgICB2YXIgQyA9IG0sIFUgPSBoLCBIID0gYFxuYDtcbiAgICAgICAgcmV0dXJuIEMgPSBhLnN1YlBhcnNlcihcIm91dGRlbnRcIikoQywgdSwgcyksIEMgPSBhLnN1YlBhcnNlcihcImVuY29kZUNvZGVcIikoQywgdSwgcyksIEMgPSBhLnN1YlBhcnNlcihcImRldGFiXCIpKEMsIHUsIHMpLCBDID0gQy5yZXBsYWNlKC9eXFxuKy9nLCBcIlwiKSwgQyA9IEMucmVwbGFjZSgvXFxuKyQvZywgXCJcIiksIHUub21pdEV4dHJhV0xJbkNvZGVCbG9ja3MgJiYgKEggPSBcIlwiKSwgQyA9IFwiPHByZT48Y29kZT5cIiArIEMgKyBIICsgXCI8L2NvZGU+PC9wcmU+XCIsIGEuc3ViUGFyc2VyKFwiaGFzaEJsb2NrXCIpKEMsIHUsIHMpICsgVTtcbiAgICAgIH0pLCB0ID0gdC5yZXBsYWNlKC9cdTAwQTgwLywgXCJcIiksIHQgPSBzLmNvbnZlcnRlci5fZGlzcGF0Y2goXCJjb2RlQmxvY2tzLmFmdGVyXCIsIHQsIHUsIHMpLCB0O1xuICAgIH0pLCBhLnN1YlBhcnNlcihcImNvZGVTcGFuc1wiLCBmdW5jdGlvbih0LCB1LCBzKSB7XG4gICAgICByZXR1cm4gdCA9IHMuY29udmVydGVyLl9kaXNwYXRjaChcImNvZGVTcGFucy5iZWZvcmVcIiwgdCwgdSwgcyksIHR5cGVvZiB0ID4gXCJ1XCIgJiYgKHQgPSBcIlwiKSwgdCA9IHQucmVwbGFjZShcbiAgICAgICAgLyhefFteXFxcXF0pKGArKShbXlxccl0qP1teYF0pXFwyKD8hYCkvZ20sXG4gICAgICAgIGZ1bmN0aW9uKGksIGMsIG0sIGgpIHtcbiAgICAgICAgICB2YXIgQyA9IGg7XG4gICAgICAgICAgcmV0dXJuIEMgPSBDLnJlcGxhY2UoL14oWyBcXHRdKikvZywgXCJcIiksIEMgPSBDLnJlcGxhY2UoL1sgXFx0XSokL2csIFwiXCIpLCBDID0gYS5zdWJQYXJzZXIoXCJlbmNvZGVDb2RlXCIpKEMsIHUsIHMpLCBDID0gYyArIFwiPGNvZGU+XCIgKyBDICsgXCI8L2NvZGU+XCIsIEMgPSBhLnN1YlBhcnNlcihcImhhc2hIVE1MU3BhbnNcIikoQywgdSwgcyksIEM7XG4gICAgICAgIH1cbiAgICAgICksIHQgPSBzLmNvbnZlcnRlci5fZGlzcGF0Y2goXCJjb2RlU3BhbnMuYWZ0ZXJcIiwgdCwgdSwgcyksIHQ7XG4gICAgfSksIGEuc3ViUGFyc2VyKFwiY29tcGxldGVIVE1MRG9jdW1lbnRcIiwgZnVuY3Rpb24odCwgdSwgcykge1xuICAgICAgaWYgKCF1LmNvbXBsZXRlSFRNTERvY3VtZW50KVxuICAgICAgICByZXR1cm4gdDtcbiAgICAgIHQgPSBzLmNvbnZlcnRlci5fZGlzcGF0Y2goXCJjb21wbGV0ZUhUTUxEb2N1bWVudC5iZWZvcmVcIiwgdCwgdSwgcyk7XG4gICAgICB2YXIgaSA9IFwiaHRtbFwiLCBjID0gYDwhRE9DVFlQRSBIVE1MPlxuYCwgbSA9IFwiXCIsIGggPSBgPG1ldGEgY2hhcnNldD1cInV0Zi04XCI+XG5gLCBDID0gXCJcIiwgVSA9IFwiXCI7XG4gICAgICB0eXBlb2Ygcy5tZXRhZGF0YS5wYXJzZWQuZG9jdHlwZSA8IFwidVwiICYmIChjID0gXCI8IURPQ1RZUEUgXCIgKyBzLm1ldGFkYXRhLnBhcnNlZC5kb2N0eXBlICsgYD5cbmAsIGkgPSBzLm1ldGFkYXRhLnBhcnNlZC5kb2N0eXBlLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSwgKGkgPT09IFwiaHRtbFwiIHx8IGkgPT09IFwiaHRtbDVcIikgJiYgKGggPSAnPG1ldGEgY2hhcnNldD1cInV0Zi04XCI+JykpO1xuICAgICAgZm9yICh2YXIgSCBpbiBzLm1ldGFkYXRhLnBhcnNlZClcbiAgICAgICAgaWYgKHMubWV0YWRhdGEucGFyc2VkLmhhc093blByb3BlcnR5KEgpKVxuICAgICAgICAgIHN3aXRjaCAoSC50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICAgICAgICBjYXNlIFwiZG9jdHlwZVwiOlxuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJ0aXRsZVwiOlxuICAgICAgICAgICAgICBtID0gXCI8dGl0bGU+XCIgKyBzLm1ldGFkYXRhLnBhcnNlZC50aXRsZSArIGA8L3RpdGxlPlxuYDtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwiY2hhcnNldFwiOlxuICAgICAgICAgICAgICBpID09PSBcImh0bWxcIiB8fCBpID09PSBcImh0bWw1XCIgPyBoID0gJzxtZXRhIGNoYXJzZXQ9XCInICsgcy5tZXRhZGF0YS5wYXJzZWQuY2hhcnNldCArIGBcIj5cbmAgOiBoID0gJzxtZXRhIG5hbWU9XCJjaGFyc2V0XCIgY29udGVudD1cIicgKyBzLm1ldGFkYXRhLnBhcnNlZC5jaGFyc2V0ICsgYFwiPlxuYDtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwibGFuZ3VhZ2VcIjpcbiAgICAgICAgICAgIGNhc2UgXCJsYW5nXCI6XG4gICAgICAgICAgICAgIEMgPSAnIGxhbmc9XCInICsgcy5tZXRhZGF0YS5wYXJzZWRbSF0gKyAnXCInLCBVICs9ICc8bWV0YSBuYW1lPVwiJyArIEggKyAnXCIgY29udGVudD1cIicgKyBzLm1ldGFkYXRhLnBhcnNlZFtIXSArIGBcIj5cbmA7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgVSArPSAnPG1ldGEgbmFtZT1cIicgKyBIICsgJ1wiIGNvbnRlbnQ9XCInICsgcy5tZXRhZGF0YS5wYXJzZWRbSF0gKyBgXCI+XG5gO1xuICAgICAgICAgIH1cbiAgICAgIHJldHVybiB0ID0gYyArIFwiPGh0bWxcIiArIEMgKyBgPlxuPGhlYWQ+XG5gICsgbSArIGggKyBVICsgYDwvaGVhZD5cbjxib2R5PlxuYCArIHQudHJpbSgpICsgYFxuPC9ib2R5PlxuPC9odG1sPmAsIHQgPSBzLmNvbnZlcnRlci5fZGlzcGF0Y2goXCJjb21wbGV0ZUhUTUxEb2N1bWVudC5hZnRlclwiLCB0LCB1LCBzKSwgdDtcbiAgICB9KSwgYS5zdWJQYXJzZXIoXCJkZXRhYlwiLCBmdW5jdGlvbih0LCB1LCBzKSB7XG4gICAgICByZXR1cm4gdCA9IHMuY29udmVydGVyLl9kaXNwYXRjaChcImRldGFiLmJlZm9yZVwiLCB0LCB1LCBzKSwgdCA9IHQucmVwbGFjZSgvXFx0KD89XFx0KS9nLCBcIiAgICBcIiksIHQgPSB0LnJlcGxhY2UoL1xcdC9nLCBcIlx1MDBBOEFcdTAwQThCXCIpLCB0ID0gdC5yZXBsYWNlKC9cdTAwQThCKC4rPylcdTAwQThBL2csIGZ1bmN0aW9uKGksIGMpIHtcbiAgICAgICAgZm9yICh2YXIgbSA9IGMsIGggPSA0IC0gbS5sZW5ndGggJSA0LCBDID0gMDsgQyA8IGg7IEMrKylcbiAgICAgICAgICBtICs9IFwiIFwiO1xuICAgICAgICByZXR1cm4gbTtcbiAgICAgIH0pLCB0ID0gdC5yZXBsYWNlKC9cdTAwQThBL2csIFwiICAgIFwiKSwgdCA9IHQucmVwbGFjZSgvXHUwMEE4Qi9nLCBcIlwiKSwgdCA9IHMuY29udmVydGVyLl9kaXNwYXRjaChcImRldGFiLmFmdGVyXCIsIHQsIHUsIHMpLCB0O1xuICAgIH0pLCBhLnN1YlBhcnNlcihcImVsbGlwc2lzXCIsIGZ1bmN0aW9uKHQsIHUsIHMpIHtcbiAgICAgIHJldHVybiB1LmVsbGlwc2lzICYmICh0ID0gcy5jb252ZXJ0ZXIuX2Rpc3BhdGNoKFwiZWxsaXBzaXMuYmVmb3JlXCIsIHQsIHUsIHMpLCB0ID0gdC5yZXBsYWNlKC9cXC5cXC5cXC4vZywgXCJcdTIwMjZcIiksIHQgPSBzLmNvbnZlcnRlci5fZGlzcGF0Y2goXCJlbGxpcHNpcy5hZnRlclwiLCB0LCB1LCBzKSksIHQ7XG4gICAgfSksIGEuc3ViUGFyc2VyKFwiZW1vamlcIiwgZnVuY3Rpb24odCwgdSwgcykge1xuICAgICAgaWYgKCF1LmVtb2ppKVxuICAgICAgICByZXR1cm4gdDtcbiAgICAgIHQgPSBzLmNvbnZlcnRlci5fZGlzcGF0Y2goXCJlbW9qaS5iZWZvcmVcIiwgdCwgdSwgcyk7XG4gICAgICB2YXIgaSA9IC86KFtcXFNdKz8pOi9nO1xuICAgICAgcmV0dXJuIHQgPSB0LnJlcGxhY2UoaSwgZnVuY3Rpb24oYywgbSkge1xuICAgICAgICByZXR1cm4gYS5oZWxwZXIuZW1vamlzLmhhc093blByb3BlcnR5KG0pID8gYS5oZWxwZXIuZW1vamlzW21dIDogYztcbiAgICAgIH0pLCB0ID0gcy5jb252ZXJ0ZXIuX2Rpc3BhdGNoKFwiZW1vamkuYWZ0ZXJcIiwgdCwgdSwgcyksIHQ7XG4gICAgfSksIGEuc3ViUGFyc2VyKFwiZW5jb2RlQW1wc0FuZEFuZ2xlc1wiLCBmdW5jdGlvbih0LCB1LCBzKSB7XG4gICAgICByZXR1cm4gdCA9IHMuY29udmVydGVyLl9kaXNwYXRjaChcImVuY29kZUFtcHNBbmRBbmdsZXMuYmVmb3JlXCIsIHQsIHUsIHMpLCB0ID0gdC5yZXBsYWNlKC8mKD8hIz9beFhdPyg/OlswLTlhLWZBLUZdK3xcXHcrKTspL2csIFwiJmFtcDtcIiksIHQgPSB0LnJlcGxhY2UoLzwoPyFbYS16XFwvPyQhXSkvZ2ksIFwiJmx0O1wiKSwgdCA9IHQucmVwbGFjZSgvPC9nLCBcIiZsdDtcIiksIHQgPSB0LnJlcGxhY2UoLz4vZywgXCImZ3Q7XCIpLCB0ID0gcy5jb252ZXJ0ZXIuX2Rpc3BhdGNoKFwiZW5jb2RlQW1wc0FuZEFuZ2xlcy5hZnRlclwiLCB0LCB1LCBzKSwgdDtcbiAgICB9KSwgYS5zdWJQYXJzZXIoXCJlbmNvZGVCYWNrc2xhc2hFc2NhcGVzXCIsIGZ1bmN0aW9uKHQsIHUsIHMpIHtcbiAgICAgIHJldHVybiB0ID0gcy5jb252ZXJ0ZXIuX2Rpc3BhdGNoKFwiZW5jb2RlQmFja3NsYXNoRXNjYXBlcy5iZWZvcmVcIiwgdCwgdSwgcyksIHQgPSB0LnJlcGxhY2UoL1xcXFwoXFxcXCkvZywgYS5oZWxwZXIuZXNjYXBlQ2hhcmFjdGVyc0NhbGxiYWNrKSwgdCA9IHQucmVwbGFjZSgvXFxcXChbYCpfe31cXFtcXF0oKT4jKy4hfj18Oi1dKS9nLCBhLmhlbHBlci5lc2NhcGVDaGFyYWN0ZXJzQ2FsbGJhY2spLCB0ID0gcy5jb252ZXJ0ZXIuX2Rpc3BhdGNoKFwiZW5jb2RlQmFja3NsYXNoRXNjYXBlcy5hZnRlclwiLCB0LCB1LCBzKSwgdDtcbiAgICB9KSwgYS5zdWJQYXJzZXIoXCJlbmNvZGVDb2RlXCIsIGZ1bmN0aW9uKHQsIHUsIHMpIHtcbiAgICAgIHJldHVybiB0ID0gcy5jb252ZXJ0ZXIuX2Rpc3BhdGNoKFwiZW5jb2RlQ29kZS5iZWZvcmVcIiwgdCwgdSwgcyksIHQgPSB0LnJlcGxhY2UoLyYvZywgXCImYW1wO1wiKS5yZXBsYWNlKC88L2csIFwiJmx0O1wiKS5yZXBsYWNlKC8+L2csIFwiJmd0O1wiKS5yZXBsYWNlKC8oWypfe31cXFtcXF1cXFxcPX4tXSkvZywgYS5oZWxwZXIuZXNjYXBlQ2hhcmFjdGVyc0NhbGxiYWNrKSwgdCA9IHMuY29udmVydGVyLl9kaXNwYXRjaChcImVuY29kZUNvZGUuYWZ0ZXJcIiwgdCwgdSwgcyksIHQ7XG4gICAgfSksIGEuc3ViUGFyc2VyKFwiZXNjYXBlU3BlY2lhbENoYXJzV2l0aGluVGFnQXR0cmlidXRlc1wiLCBmdW5jdGlvbih0LCB1LCBzKSB7XG4gICAgICB0ID0gcy5jb252ZXJ0ZXIuX2Rpc3BhdGNoKFwiZXNjYXBlU3BlY2lhbENoYXJzV2l0aGluVGFnQXR0cmlidXRlcy5iZWZvcmVcIiwgdCwgdSwgcyk7XG4gICAgICB2YXIgaSA9IC88XFwvP1thLXpcXGRfOi1dKyg/OltcXHNdK1tcXHNcXFNdKz8pPz4vZ2ksIGMgPSAvPCEoLS0oPzooPzpbXj4tXXwtW14+XSkoPzpbXi1dfC1bXi1dKSopLS0pPi9naTtcbiAgICAgIHJldHVybiB0ID0gdC5yZXBsYWNlKGksIGZ1bmN0aW9uKG0pIHtcbiAgICAgICAgcmV0dXJuIG0ucmVwbGFjZSgvKC4pPFxcLz9jb2RlPig/PS4pL2csIFwiJDFgXCIpLnJlcGxhY2UoLyhbXFxcXGAqX349fF0pL2csIGEuaGVscGVyLmVzY2FwZUNoYXJhY3RlcnNDYWxsYmFjayk7XG4gICAgICB9KSwgdCA9IHQucmVwbGFjZShjLCBmdW5jdGlvbihtKSB7XG4gICAgICAgIHJldHVybiBtLnJlcGxhY2UoLyhbXFxcXGAqX349fF0pL2csIGEuaGVscGVyLmVzY2FwZUNoYXJhY3RlcnNDYWxsYmFjayk7XG4gICAgICB9KSwgdCA9IHMuY29udmVydGVyLl9kaXNwYXRjaChcImVzY2FwZVNwZWNpYWxDaGFyc1dpdGhpblRhZ0F0dHJpYnV0ZXMuYWZ0ZXJcIiwgdCwgdSwgcyksIHQ7XG4gICAgfSksIGEuc3ViUGFyc2VyKFwiZ2l0aHViQ29kZUJsb2Nrc1wiLCBmdW5jdGlvbih0LCB1LCBzKSB7XG4gICAgICByZXR1cm4gdS5naENvZGVCbG9ja3MgPyAodCA9IHMuY29udmVydGVyLl9kaXNwYXRjaChcImdpdGh1YkNvZGVCbG9ja3MuYmVmb3JlXCIsIHQsIHUsIHMpLCB0ICs9IFwiXHUwMEE4MFwiLCB0ID0gdC5yZXBsYWNlKC8oPzpefFxcbikoPzogezAsM30pKGBgYCt8fn5+KykoPzogKikoW15cXHNgfl0qKVxcbihbXFxzXFxTXSo/KVxcbig/OiB7MCwzfSlcXDEvZywgZnVuY3Rpb24oaSwgYywgbSwgaCkge1xuICAgICAgICB2YXIgQyA9IHUub21pdEV4dHJhV0xJbkNvZGVCbG9ja3MgPyBcIlwiIDogYFxuYDtcbiAgICAgICAgcmV0dXJuIGggPSBhLnN1YlBhcnNlcihcImVuY29kZUNvZGVcIikoaCwgdSwgcyksIGggPSBhLnN1YlBhcnNlcihcImRldGFiXCIpKGgsIHUsIHMpLCBoID0gaC5yZXBsYWNlKC9eXFxuKy9nLCBcIlwiKSwgaCA9IGgucmVwbGFjZSgvXFxuKyQvZywgXCJcIiksIGggPSBcIjxwcmU+PGNvZGVcIiArIChtID8gJyBjbGFzcz1cIicgKyBtICsgXCIgbGFuZ3VhZ2UtXCIgKyBtICsgJ1wiJyA6IFwiXCIpICsgXCI+XCIgKyBoICsgQyArIFwiPC9jb2RlPjwvcHJlPlwiLCBoID0gYS5zdWJQYXJzZXIoXCJoYXNoQmxvY2tcIikoaCwgdSwgcyksIGBcblxuXHUwMEE4R2AgKyAocy5naENvZGVCbG9ja3MucHVzaCh7IHRleHQ6IGksIGNvZGVibG9jazogaCB9KSAtIDEpICsgYEdcblxuYDtcbiAgICAgIH0pLCB0ID0gdC5yZXBsYWNlKC9cdTAwQTgwLywgXCJcIiksIHMuY29udmVydGVyLl9kaXNwYXRjaChcImdpdGh1YkNvZGVCbG9ja3MuYWZ0ZXJcIiwgdCwgdSwgcykpIDogdDtcbiAgICB9KSwgYS5zdWJQYXJzZXIoXCJoYXNoQmxvY2tcIiwgZnVuY3Rpb24odCwgdSwgcykge1xuICAgICAgcmV0dXJuIHQgPSBzLmNvbnZlcnRlci5fZGlzcGF0Y2goXCJoYXNoQmxvY2suYmVmb3JlXCIsIHQsIHUsIHMpLCB0ID0gdC5yZXBsYWNlKC8oXlxcbit8XFxuKyQpL2csIFwiXCIpLCB0ID0gYFxuXG5cdTAwQThLYCArIChzLmdIdG1sQmxvY2tzLnB1c2godCkgLSAxKSArIGBLXG5cbmAsIHQgPSBzLmNvbnZlcnRlci5fZGlzcGF0Y2goXCJoYXNoQmxvY2suYWZ0ZXJcIiwgdCwgdSwgcyksIHQ7XG4gICAgfSksIGEuc3ViUGFyc2VyKFwiaGFzaENvZGVUYWdzXCIsIGZ1bmN0aW9uKHQsIHUsIHMpIHtcbiAgICAgIHQgPSBzLmNvbnZlcnRlci5fZGlzcGF0Y2goXCJoYXNoQ29kZVRhZ3MuYmVmb3JlXCIsIHQsIHUsIHMpO1xuICAgICAgdmFyIGkgPSBmdW5jdGlvbihjLCBtLCBoLCBDKSB7XG4gICAgICAgIHZhciBVID0gaCArIGEuc3ViUGFyc2VyKFwiZW5jb2RlQ29kZVwiKShtLCB1LCBzKSArIEM7XG4gICAgICAgIHJldHVybiBcIlx1MDBBOENcIiArIChzLmdIdG1sU3BhbnMucHVzaChVKSAtIDEpICsgXCJDXCI7XG4gICAgICB9O1xuICAgICAgcmV0dXJuIHQgPSBhLmhlbHBlci5yZXBsYWNlUmVjdXJzaXZlUmVnRXhwKHQsIGksIFwiPGNvZGVcXFxcYltePl0qPlwiLCBcIjwvY29kZT5cIiwgXCJnaW1cIiksIHQgPSBzLmNvbnZlcnRlci5fZGlzcGF0Y2goXCJoYXNoQ29kZVRhZ3MuYWZ0ZXJcIiwgdCwgdSwgcyksIHQ7XG4gICAgfSksIGEuc3ViUGFyc2VyKFwiaGFzaEVsZW1lbnRcIiwgZnVuY3Rpb24odCwgdSwgcykge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKGksIGMpIHtcbiAgICAgICAgdmFyIG0gPSBjO1xuICAgICAgICByZXR1cm4gbSA9IG0ucmVwbGFjZSgvXFxuXFxuL2csIGBcbmApLCBtID0gbS5yZXBsYWNlKC9eXFxuLywgXCJcIiksIG0gPSBtLnJlcGxhY2UoL1xcbiskL2csIFwiXCIpLCBtID0gYFxuXG5cdTAwQThLYCArIChzLmdIdG1sQmxvY2tzLnB1c2gobSkgLSAxKSArIGBLXG5cbmAsIG07XG4gICAgICB9O1xuICAgIH0pLCBhLnN1YlBhcnNlcihcImhhc2hIVE1MQmxvY2tzXCIsIGZ1bmN0aW9uKHQsIHUsIHMpIHtcbiAgICAgIHQgPSBzLmNvbnZlcnRlci5fZGlzcGF0Y2goXCJoYXNoSFRNTEJsb2Nrcy5iZWZvcmVcIiwgdCwgdSwgcyk7XG4gICAgICB2YXIgaSA9IFtcbiAgICAgICAgXCJwcmVcIixcbiAgICAgICAgXCJkaXZcIixcbiAgICAgICAgXCJoMVwiLFxuICAgICAgICBcImgyXCIsXG4gICAgICAgIFwiaDNcIixcbiAgICAgICAgXCJoNFwiLFxuICAgICAgICBcImg1XCIsXG4gICAgICAgIFwiaDZcIixcbiAgICAgICAgXCJibG9ja3F1b3RlXCIsXG4gICAgICAgIFwidGFibGVcIixcbiAgICAgICAgXCJkbFwiLFxuICAgICAgICBcIm9sXCIsXG4gICAgICAgIFwidWxcIixcbiAgICAgICAgXCJzY3JpcHRcIixcbiAgICAgICAgXCJub3NjcmlwdFwiLFxuICAgICAgICBcImZvcm1cIixcbiAgICAgICAgXCJmaWVsZHNldFwiLFxuICAgICAgICBcImlmcmFtZVwiLFxuICAgICAgICBcIm1hdGhcIixcbiAgICAgICAgXCJzdHlsZVwiLFxuICAgICAgICBcInNlY3Rpb25cIixcbiAgICAgICAgXCJoZWFkZXJcIixcbiAgICAgICAgXCJmb290ZXJcIixcbiAgICAgICAgXCJuYXZcIixcbiAgICAgICAgXCJhcnRpY2xlXCIsXG4gICAgICAgIFwiYXNpZGVcIixcbiAgICAgICAgXCJhZGRyZXNzXCIsXG4gICAgICAgIFwiYXVkaW9cIixcbiAgICAgICAgXCJjYW52YXNcIixcbiAgICAgICAgXCJmaWd1cmVcIixcbiAgICAgICAgXCJoZ3JvdXBcIixcbiAgICAgICAgXCJvdXRwdXRcIixcbiAgICAgICAgXCJ2aWRlb1wiLFxuICAgICAgICBcInBcIlxuICAgICAgXSwgYyA9IGZ1bmN0aW9uKF8sIHEsIEosIFopIHtcbiAgICAgICAgdmFyIEIgPSBfO1xuICAgICAgICByZXR1cm4gSi5zZWFyY2goL1xcYm1hcmtkb3duXFxiLykgIT09IC0xICYmIChCID0gSiArIHMuY29udmVydGVyLm1ha2VIdG1sKHEpICsgWiksIGBcblxuXHUwMEE4S2AgKyAocy5nSHRtbEJsb2Nrcy5wdXNoKEIpIC0gMSkgKyBgS1xuXG5gO1xuICAgICAgfTtcbiAgICAgIHUuYmFja3NsYXNoRXNjYXBlc0hUTUxUYWdzICYmICh0ID0gdC5yZXBsYWNlKC9cXFxcPChcXC8/W14+XSs/KT4vZywgZnVuY3Rpb24oXywgcSkge1xuICAgICAgICByZXR1cm4gXCImbHQ7XCIgKyBxICsgXCImZ3Q7XCI7XG4gICAgICB9KSk7XG4gICAgICBmb3IgKHZhciBtID0gMDsgbSA8IGkubGVuZ3RoOyArK20pXG4gICAgICAgIGZvciAodmFyIGgsIEMgPSBuZXcgUmVnRXhwKFwiXiB7MCwzfSg8XCIgKyBpW21dICsgXCJcXFxcYltePl0qPilcIiwgXCJpbVwiKSwgVSA9IFwiPFwiICsgaVttXSArIFwiXFxcXGJbXj5dKj5cIiwgSCA9IFwiPC9cIiArIGlbbV0gKyBcIj5cIjsgKGggPSBhLmhlbHBlci5yZWdleEluZGV4T2YodCwgQykpICE9PSAtMTsgKSB7XG4gICAgICAgICAgdmFyIFYgPSBhLmhlbHBlci5zcGxpdEF0SW5kZXgodCwgaCksIEcgPSBhLmhlbHBlci5yZXBsYWNlUmVjdXJzaXZlUmVnRXhwKFZbMV0sIGMsIFUsIEgsIFwiaW1cIik7XG4gICAgICAgICAgaWYgKEcgPT09IFZbMV0pXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB0ID0gVlswXS5jb25jYXQoRyk7XG4gICAgICAgIH1cbiAgICAgIHJldHVybiB0ID0gdC5yZXBsYWNlKFxuICAgICAgICAvKFxcbiB7MCwzfSg8KGhyKVxcYihbXjw+XSkqP1xcLz8+KVsgXFx0XSooPz1cXG57Mix9KSkvZyxcbiAgICAgICAgYS5zdWJQYXJzZXIoXCJoYXNoRWxlbWVudFwiKSh0LCB1LCBzKVxuICAgICAgKSwgdCA9IGEuaGVscGVyLnJlcGxhY2VSZWN1cnNpdmVSZWdFeHAodCwgZnVuY3Rpb24oXykge1xuICAgICAgICByZXR1cm4gYFxuXG5cdTAwQThLYCArIChzLmdIdG1sQmxvY2tzLnB1c2goXykgLSAxKSArIGBLXG5cbmA7XG4gICAgICB9LCBcIl4gezAsM308IS0tXCIsIFwiLS0+XCIsIFwiZ21cIiksIHQgPSB0LnJlcGxhY2UoXG4gICAgICAgIC8oPzpcXG5cXG4pKCB7MCwzfSg/OjwoWz8lXSlbXlxccl0qP1xcMj4pWyBcXHRdKig/PVxcbnsyLH0pKS9nLFxuICAgICAgICBhLnN1YlBhcnNlcihcImhhc2hFbGVtZW50XCIpKHQsIHUsIHMpXG4gICAgICApLCB0ID0gcy5jb252ZXJ0ZXIuX2Rpc3BhdGNoKFwiaGFzaEhUTUxCbG9ja3MuYWZ0ZXJcIiwgdCwgdSwgcyksIHQ7XG4gICAgfSksIGEuc3ViUGFyc2VyKFwiaGFzaEhUTUxTcGFuc1wiLCBmdW5jdGlvbih0LCB1LCBzKSB7XG4gICAgICB0ID0gcy5jb252ZXJ0ZXIuX2Rpc3BhdGNoKFwiaGFzaEhUTUxTcGFucy5iZWZvcmVcIiwgdCwgdSwgcyk7XG4gICAgICBmdW5jdGlvbiBpKGMpIHtcbiAgICAgICAgcmV0dXJuIFwiXHUwMEE4Q1wiICsgKHMuZ0h0bWxTcGFucy5wdXNoKGMpIC0gMSkgKyBcIkNcIjtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0ID0gdC5yZXBsYWNlKC88W14+XSs/XFwvPi9naSwgZnVuY3Rpb24oYykge1xuICAgICAgICByZXR1cm4gaShjKTtcbiAgICAgIH0pLCB0ID0gdC5yZXBsYWNlKC88KFtePl0rPyk+W1xcc1xcU10qPzxcXC9cXDE+L2csIGZ1bmN0aW9uKGMpIHtcbiAgICAgICAgcmV0dXJuIGkoYyk7XG4gICAgICB9KSwgdCA9IHQucmVwbGFjZSgvPChbXj5dKz8pXFxzW14+XSs/PltcXHNcXFNdKj88XFwvXFwxPi9nLCBmdW5jdGlvbihjKSB7XG4gICAgICAgIHJldHVybiBpKGMpO1xuICAgICAgfSksIHQgPSB0LnJlcGxhY2UoLzxbXj5dKz8+L2dpLCBmdW5jdGlvbihjKSB7XG4gICAgICAgIHJldHVybiBpKGMpO1xuICAgICAgfSksIHQgPSBzLmNvbnZlcnRlci5fZGlzcGF0Y2goXCJoYXNoSFRNTFNwYW5zLmFmdGVyXCIsIHQsIHUsIHMpLCB0O1xuICAgIH0pLCBhLnN1YlBhcnNlcihcInVuaGFzaEhUTUxTcGFuc1wiLCBmdW5jdGlvbih0LCB1LCBzKSB7XG4gICAgICB0ID0gcy5jb252ZXJ0ZXIuX2Rpc3BhdGNoKFwidW5oYXNoSFRNTFNwYW5zLmJlZm9yZVwiLCB0LCB1LCBzKTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcy5nSHRtbFNwYW5zLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIGZvciAodmFyIGMgPSBzLmdIdG1sU3BhbnNbaV0sIG0gPSAwOyAvXHUwMEE4QyhcXGQrKUMvLnRlc3QoYyk7ICkge1xuICAgICAgICAgIHZhciBoID0gUmVnRXhwLiQxO1xuICAgICAgICAgIGlmIChjID0gYy5yZXBsYWNlKFwiXHUwMEE4Q1wiICsgaCArIFwiQ1wiLCBzLmdIdG1sU3BhbnNbaF0pLCBtID09PSAxMCkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIm1heGltdW0gbmVzdGluZyBvZiAxMCBzcGFucyByZWFjaGVkISEhXCIpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgICsrbTtcbiAgICAgICAgfVxuICAgICAgICB0ID0gdC5yZXBsYWNlKFwiXHUwMEE4Q1wiICsgaSArIFwiQ1wiLCBjKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0ID0gcy5jb252ZXJ0ZXIuX2Rpc3BhdGNoKFwidW5oYXNoSFRNTFNwYW5zLmFmdGVyXCIsIHQsIHUsIHMpLCB0O1xuICAgIH0pLCBhLnN1YlBhcnNlcihcImhhc2hQcmVDb2RlVGFnc1wiLCBmdW5jdGlvbih0LCB1LCBzKSB7XG4gICAgICB0ID0gcy5jb252ZXJ0ZXIuX2Rpc3BhdGNoKFwiaGFzaFByZUNvZGVUYWdzLmJlZm9yZVwiLCB0LCB1LCBzKTtcbiAgICAgIHZhciBpID0gZnVuY3Rpb24oYywgbSwgaCwgQykge1xuICAgICAgICB2YXIgVSA9IGggKyBhLnN1YlBhcnNlcihcImVuY29kZUNvZGVcIikobSwgdSwgcykgKyBDO1xuICAgICAgICByZXR1cm4gYFxuXG5cdTAwQThHYCArIChzLmdoQ29kZUJsb2Nrcy5wdXNoKHsgdGV4dDogYywgY29kZWJsb2NrOiBVIH0pIC0gMSkgKyBgR1xuXG5gO1xuICAgICAgfTtcbiAgICAgIHJldHVybiB0ID0gYS5oZWxwZXIucmVwbGFjZVJlY3Vyc2l2ZVJlZ0V4cCh0LCBpLCBcIl4gezAsM308cHJlXFxcXGJbXj5dKj5cXFxccyo8Y29kZVxcXFxiW14+XSo+XCIsIFwiXiB7MCwzfTwvY29kZT5cXFxccyo8L3ByZT5cIiwgXCJnaW1cIiksIHQgPSBzLmNvbnZlcnRlci5fZGlzcGF0Y2goXCJoYXNoUHJlQ29kZVRhZ3MuYWZ0ZXJcIiwgdCwgdSwgcyksIHQ7XG4gICAgfSksIGEuc3ViUGFyc2VyKFwiaGVhZGVyc1wiLCBmdW5jdGlvbih0LCB1LCBzKSB7XG4gICAgICB0ID0gcy5jb252ZXJ0ZXIuX2Rpc3BhdGNoKFwiaGVhZGVycy5iZWZvcmVcIiwgdCwgdSwgcyk7XG4gICAgICB2YXIgaSA9IGlzTmFOKHBhcnNlSW50KHUuaGVhZGVyTGV2ZWxTdGFydCkpID8gMSA6IHBhcnNlSW50KHUuaGVhZGVyTGV2ZWxTdGFydCksIGMgPSB1LnNtb290aExpdmVQcmV2aWV3ID8gL14oLispWyBcXHRdKlxcbj17Mix9WyBcXHRdKlxcbisvZ20gOiAvXiguKylbIFxcdF0qXFxuPStbIFxcdF0qXFxuKy9nbSwgbSA9IHUuc21vb3RoTGl2ZVByZXZpZXcgPyAvXiguKylbIFxcdF0qXFxuLXsyLH1bIFxcdF0qXFxuKy9nbSA6IC9eKC4rKVsgXFx0XSpcXG4tK1sgXFx0XSpcXG4rL2dtO1xuICAgICAgdCA9IHQucmVwbGFjZShjLCBmdW5jdGlvbihVLCBIKSB7XG4gICAgICAgIHZhciBWID0gYS5zdWJQYXJzZXIoXCJzcGFuR2FtdXRcIikoSCwgdSwgcyksIEcgPSB1Lm5vSGVhZGVySWQgPyBcIlwiIDogJyBpZD1cIicgKyBDKEgpICsgJ1wiJywgXyA9IGksIHEgPSBcIjxoXCIgKyBfICsgRyArIFwiPlwiICsgViArIFwiPC9oXCIgKyBfICsgXCI+XCI7XG4gICAgICAgIHJldHVybiBhLnN1YlBhcnNlcihcImhhc2hCbG9ja1wiKShxLCB1LCBzKTtcbiAgICAgIH0pLCB0ID0gdC5yZXBsYWNlKG0sIGZ1bmN0aW9uKFUsIEgpIHtcbiAgICAgICAgdmFyIFYgPSBhLnN1YlBhcnNlcihcInNwYW5HYW11dFwiKShILCB1LCBzKSwgRyA9IHUubm9IZWFkZXJJZCA/IFwiXCIgOiAnIGlkPVwiJyArIEMoSCkgKyAnXCInLCBfID0gaSArIDEsIHEgPSBcIjxoXCIgKyBfICsgRyArIFwiPlwiICsgViArIFwiPC9oXCIgKyBfICsgXCI+XCI7XG4gICAgICAgIHJldHVybiBhLnN1YlBhcnNlcihcImhhc2hCbG9ja1wiKShxLCB1LCBzKTtcbiAgICAgIH0pO1xuICAgICAgdmFyIGggPSB1LnJlcXVpcmVTcGFjZUJlZm9yZUhlYWRpbmdUZXh0ID8gL14oI3sxLDZ9KVsgXFx0XSsoLis/KVsgXFx0XSojKlxcbisvZ20gOiAvXigjezEsNn0pWyBcXHRdKiguKz8pWyBcXHRdKiMqXFxuKy9nbTtcbiAgICAgIHQgPSB0LnJlcGxhY2UoaCwgZnVuY3Rpb24oVSwgSCwgVikge1xuICAgICAgICB2YXIgRyA9IFY7XG4gICAgICAgIHUuY3VzdG9taXplZEhlYWRlcklkICYmIChHID0gVi5yZXBsYWNlKC9cXHM/XFx7KFtee10rPyl9XFxzKiQvLCBcIlwiKSk7XG4gICAgICAgIHZhciBfID0gYS5zdWJQYXJzZXIoXCJzcGFuR2FtdXRcIikoRywgdSwgcyksIHEgPSB1Lm5vSGVhZGVySWQgPyBcIlwiIDogJyBpZD1cIicgKyBDKFYpICsgJ1wiJywgSiA9IGkgLSAxICsgSC5sZW5ndGgsIFogPSBcIjxoXCIgKyBKICsgcSArIFwiPlwiICsgXyArIFwiPC9oXCIgKyBKICsgXCI+XCI7XG4gICAgICAgIHJldHVybiBhLnN1YlBhcnNlcihcImhhc2hCbG9ja1wiKShaLCB1LCBzKTtcbiAgICAgIH0pO1xuICAgICAgZnVuY3Rpb24gQyhVKSB7XG4gICAgICAgIHZhciBILCBWO1xuICAgICAgICBpZiAodS5jdXN0b21pemVkSGVhZGVySWQpIHtcbiAgICAgICAgICB2YXIgRyA9IFUubWF0Y2goL1xceyhbXntdKz8pfVxccyokLyk7XG4gICAgICAgICAgRyAmJiBHWzFdICYmIChVID0gR1sxXSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIEggPSBVLCBhLmhlbHBlci5pc1N0cmluZyh1LnByZWZpeEhlYWRlcklkKSA/IFYgPSB1LnByZWZpeEhlYWRlcklkIDogdS5wcmVmaXhIZWFkZXJJZCA9PT0gITAgPyBWID0gXCJzZWN0aW9uLVwiIDogViA9IFwiXCIsIHUucmF3UHJlZml4SGVhZGVySWQgfHwgKEggPSBWICsgSCksIHUuZ2hDb21wYXRpYmxlSGVhZGVySWQgPyBIID0gSC5yZXBsYWNlKC8gL2csIFwiLVwiKS5yZXBsYWNlKC8mYW1wOy9nLCBcIlwiKS5yZXBsYWNlKC9cdTAwQThUL2csIFwiXCIpLnJlcGxhY2UoL1x1MDBBOEQvZywgXCJcIikucmVwbGFjZSgvWyYrJCxcXC86Oz0/QFwiI3t9fF5cdTAwQTh+XFxbXFxdYFxcXFwqKSglLiEnPD5dL2csIFwiXCIpLnRvTG93ZXJDYXNlKCkgOiB1LnJhd0hlYWRlcklkID8gSCA9IEgucmVwbGFjZSgvIC9nLCBcIi1cIikucmVwbGFjZSgvJmFtcDsvZywgXCImXCIpLnJlcGxhY2UoL1x1MDBBOFQvZywgXCJcdTAwQThcIikucmVwbGFjZSgvXHUwMEE4RC9nLCBcIiRcIikucmVwbGFjZSgvW1wiJ10vZywgXCItXCIpLnRvTG93ZXJDYXNlKCkgOiBIID0gSC5yZXBsYWNlKC9bXlxcd10vZywgXCJcIikudG9Mb3dlckNhc2UoKSwgdS5yYXdQcmVmaXhIZWFkZXJJZCAmJiAoSCA9IFYgKyBIKSwgcy5oYXNoTGlua0NvdW50c1tIXSA/IEggPSBIICsgXCItXCIgKyBzLmhhc2hMaW5rQ291bnRzW0hdKysgOiBzLmhhc2hMaW5rQ291bnRzW0hdID0gMSwgSDtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0ID0gcy5jb252ZXJ0ZXIuX2Rpc3BhdGNoKFwiaGVhZGVycy5hZnRlclwiLCB0LCB1LCBzKSwgdDtcbiAgICB9KSwgYS5zdWJQYXJzZXIoXCJob3Jpem9udGFsUnVsZVwiLCBmdW5jdGlvbih0LCB1LCBzKSB7XG4gICAgICB0ID0gcy5jb252ZXJ0ZXIuX2Rpc3BhdGNoKFwiaG9yaXpvbnRhbFJ1bGUuYmVmb3JlXCIsIHQsIHUsIHMpO1xuICAgICAgdmFyIGkgPSBhLnN1YlBhcnNlcihcImhhc2hCbG9ja1wiKShcIjxociAvPlwiLCB1LCBzKTtcbiAgICAgIHJldHVybiB0ID0gdC5yZXBsYWNlKC9eIHswLDJ9KCA/LSl7Myx9WyBcXHRdKiQvZ20sIGkpLCB0ID0gdC5yZXBsYWNlKC9eIHswLDJ9KCA/XFwqKXszLH1bIFxcdF0qJC9nbSwgaSksIHQgPSB0LnJlcGxhY2UoL14gezAsMn0oID9fKXszLH1bIFxcdF0qJC9nbSwgaSksIHQgPSBzLmNvbnZlcnRlci5fZGlzcGF0Y2goXCJob3Jpem9udGFsUnVsZS5hZnRlclwiLCB0LCB1LCBzKSwgdDtcbiAgICB9KSwgYS5zdWJQYXJzZXIoXCJpbWFnZXNcIiwgZnVuY3Rpb24odCwgdSwgcykge1xuICAgICAgdCA9IHMuY29udmVydGVyLl9kaXNwYXRjaChcImltYWdlcy5iZWZvcmVcIiwgdCwgdSwgcyk7XG4gICAgICB2YXIgaSA9IC8hXFxbKFteXFxdXSo/KV1bIFxcdF0qKClcXChbIFxcdF0/PD8oW1xcU10rPyg/OlxcKFtcXFNdKj9cXClbXFxTXSo/KT8pPj8oPzogPShbKlxcZF0rW0EtWmEteiVdezAsNH0peChbKlxcZF0rW0EtWmEteiVdezAsNH0pKT9bIFxcdF0qKD86KFtcIiddKShbXlwiXSo/KVxcNik/WyBcXHRdP1xcKS9nLCBjID0gLyFcXFsoW15cXF1dKj8pXVsgXFx0XSooKVxcKFsgXFx0XT88KFtePl0qKT4oPzogPShbKlxcZF0rW0EtWmEteiVdezAsNH0peChbKlxcZF0rW0EtWmEteiVdezAsNH0pKT9bIFxcdF0qKD86KD86KFtcIiddKShbXlwiXSo/KVxcNikpP1sgXFx0XT9cXCkvZywgbSA9IC8hXFxbKFteXFxdXSo/KV1bIFxcdF0qKClcXChbIFxcdF0/PD8oZGF0YTouKz9cXC8uKz87YmFzZTY0LFtBLVphLXowLTkrLz1cXG5dKz8pPj8oPzogPShbKlxcZF0rW0EtWmEteiVdezAsNH0peChbKlxcZF0rW0EtWmEteiVdezAsNH0pKT9bIFxcdF0qKD86KFtcIiddKShbXlwiXSo/KVxcNik/WyBcXHRdP1xcKS9nLCBoID0gLyFcXFsoW15cXF1dKj8pXSA/KD86XFxuICopP1xcWyhbXFxzXFxTXSo/KV0oKSgpKCkoKSgpL2csIEMgPSAvIVxcWyhbXlxcW1xcXV0rKV0oKSgpKCkoKSgpL2c7XG4gICAgICBmdW5jdGlvbiBVKFYsIEcsIF8sIHEsIEosIFosIEIsIGspIHtcbiAgICAgICAgcmV0dXJuIHEgPSBxLnJlcGxhY2UoL1xccy9nLCBcIlwiKSwgSChWLCBHLCBfLCBxLCBKLCBaLCBCLCBrKTtcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIEgoViwgRywgXywgcSwgSiwgWiwgQiwgaykge1xuICAgICAgICB2YXIgRiA9IHMuZ1VybHMsIE8gPSBzLmdUaXRsZXMsIGwgPSBzLmdEaW1lbnNpb25zO1xuICAgICAgICBpZiAoXyA9IF8udG9Mb3dlckNhc2UoKSwgayB8fCAoayA9IFwiXCIpLCBWLnNlYXJjaCgvXFwoPD9cXHMqPj8gPyhbJ1wiXS4qWydcIl0pP1xcKSQvbSkgPiAtMSlcbiAgICAgICAgICBxID0gXCJcIjtcbiAgICAgICAgZWxzZSBpZiAocSA9PT0gXCJcIiB8fCBxID09PSBudWxsKVxuICAgICAgICAgIGlmICgoXyA9PT0gXCJcIiB8fCBfID09PSBudWxsKSAmJiAoXyA9IEcudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC8gP1xcbi9nLCBcIiBcIikpLCBxID0gXCIjXCIgKyBfLCAhYS5oZWxwZXIuaXNVbmRlZmluZWQoRltfXSkpXG4gICAgICAgICAgICBxID0gRltfXSwgYS5oZWxwZXIuaXNVbmRlZmluZWQoT1tfXSkgfHwgKGsgPSBPW19dKSwgYS5oZWxwZXIuaXNVbmRlZmluZWQobFtfXSkgfHwgKEogPSBsW19dLndpZHRoLCBaID0gbFtfXS5oZWlnaHQpO1xuICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgIHJldHVybiBWO1xuICAgICAgICBHID0gRy5yZXBsYWNlKC9cIi9nLCBcIiZxdW90O1wiKS5yZXBsYWNlKGEuaGVscGVyLnJlZ2V4ZXMuYXN0ZXJpc2tEYXNoQW5kQ29sb24sIGEuaGVscGVyLmVzY2FwZUNoYXJhY3RlcnNDYWxsYmFjayksIHEgPSBxLnJlcGxhY2UoYS5oZWxwZXIucmVnZXhlcy5hc3Rlcmlza0Rhc2hBbmRDb2xvbiwgYS5oZWxwZXIuZXNjYXBlQ2hhcmFjdGVyc0NhbGxiYWNrKTtcbiAgICAgICAgdmFyIHcgPSAnPGltZyBzcmM9XCInICsgcSArICdcIiBhbHQ9XCInICsgRyArICdcIic7XG4gICAgICAgIHJldHVybiBrICYmIGEuaGVscGVyLmlzU3RyaW5nKGspICYmIChrID0gay5yZXBsYWNlKC9cIi9nLCBcIiZxdW90O1wiKS5yZXBsYWNlKGEuaGVscGVyLnJlZ2V4ZXMuYXN0ZXJpc2tEYXNoQW5kQ29sb24sIGEuaGVscGVyLmVzY2FwZUNoYXJhY3RlcnNDYWxsYmFjayksIHcgKz0gJyB0aXRsZT1cIicgKyBrICsgJ1wiJyksIEogJiYgWiAmJiAoSiA9IEogPT09IFwiKlwiID8gXCJhdXRvXCIgOiBKLCBaID0gWiA9PT0gXCIqXCIgPyBcImF1dG9cIiA6IFosIHcgKz0gJyB3aWR0aD1cIicgKyBKICsgJ1wiJywgdyArPSAnIGhlaWdodD1cIicgKyBaICsgJ1wiJyksIHcgKz0gXCIgLz5cIiwgdztcbiAgICAgIH1cbiAgICAgIHJldHVybiB0ID0gdC5yZXBsYWNlKGgsIEgpLCB0ID0gdC5yZXBsYWNlKG0sIFUpLCB0ID0gdC5yZXBsYWNlKGMsIEgpLCB0ID0gdC5yZXBsYWNlKGksIEgpLCB0ID0gdC5yZXBsYWNlKEMsIEgpLCB0ID0gcy5jb252ZXJ0ZXIuX2Rpc3BhdGNoKFwiaW1hZ2VzLmFmdGVyXCIsIHQsIHUsIHMpLCB0O1xuICAgIH0pLCBhLnN1YlBhcnNlcihcIml0YWxpY3NBbmRCb2xkXCIsIGZ1bmN0aW9uKHQsIHUsIHMpIHtcbiAgICAgIHQgPSBzLmNvbnZlcnRlci5fZGlzcGF0Y2goXCJpdGFsaWNzQW5kQm9sZC5iZWZvcmVcIiwgdCwgdSwgcyk7XG4gICAgICBmdW5jdGlvbiBpKGMsIG0sIGgpIHtcbiAgICAgICAgcmV0dXJuIG0gKyBjICsgaDtcbiAgICAgIH1cbiAgICAgIHJldHVybiB1LmxpdGVyYWxNaWRXb3JkVW5kZXJzY29yZXMgPyAodCA9IHQucmVwbGFjZSgvXFxiX19fKFxcU1tcXHNcXFNdKj8pX19fXFxiL2csIGZ1bmN0aW9uKGMsIG0pIHtcbiAgICAgICAgcmV0dXJuIGkobSwgXCI8c3Ryb25nPjxlbT5cIiwgXCI8L2VtPjwvc3Ryb25nPlwiKTtcbiAgICAgIH0pLCB0ID0gdC5yZXBsYWNlKC9cXGJfXyhcXFNbXFxzXFxTXSo/KV9fXFxiL2csIGZ1bmN0aW9uKGMsIG0pIHtcbiAgICAgICAgcmV0dXJuIGkobSwgXCI8c3Ryb25nPlwiLCBcIjwvc3Ryb25nPlwiKTtcbiAgICAgIH0pLCB0ID0gdC5yZXBsYWNlKC9cXGJfKFxcU1tcXHNcXFNdKj8pX1xcYi9nLCBmdW5jdGlvbihjLCBtKSB7XG4gICAgICAgIHJldHVybiBpKG0sIFwiPGVtPlwiLCBcIjwvZW0+XCIpO1xuICAgICAgfSkpIDogKHQgPSB0LnJlcGxhY2UoL19fXyhcXFNbXFxzXFxTXSo/KV9fXy9nLCBmdW5jdGlvbihjLCBtKSB7XG4gICAgICAgIHJldHVybiAvXFxTJC8udGVzdChtKSA/IGkobSwgXCI8c3Ryb25nPjxlbT5cIiwgXCI8L2VtPjwvc3Ryb25nPlwiKSA6IGM7XG4gICAgICB9KSwgdCA9IHQucmVwbGFjZSgvX18oXFxTW1xcc1xcU10qPylfXy9nLCBmdW5jdGlvbihjLCBtKSB7XG4gICAgICAgIHJldHVybiAvXFxTJC8udGVzdChtKSA/IGkobSwgXCI8c3Ryb25nPlwiLCBcIjwvc3Ryb25nPlwiKSA6IGM7XG4gICAgICB9KSwgdCA9IHQucmVwbGFjZSgvXyhbXlxcc19dW1xcc1xcU10qPylfL2csIGZ1bmN0aW9uKGMsIG0pIHtcbiAgICAgICAgcmV0dXJuIC9cXFMkLy50ZXN0KG0pID8gaShtLCBcIjxlbT5cIiwgXCI8L2VtPlwiKSA6IGM7XG4gICAgICB9KSksIHUubGl0ZXJhbE1pZFdvcmRBc3Rlcmlza3MgPyAodCA9IHQucmVwbGFjZSgvKFteKl18XilcXEJcXCpcXCpcXCooXFxTW1xcc1xcU10qPylcXCpcXCpcXCpcXEIoPyFcXCopL2csIGZ1bmN0aW9uKGMsIG0sIGgpIHtcbiAgICAgICAgcmV0dXJuIGkoaCwgbSArIFwiPHN0cm9uZz48ZW0+XCIsIFwiPC9lbT48L3N0cm9uZz5cIik7XG4gICAgICB9KSwgdCA9IHQucmVwbGFjZSgvKFteKl18XilcXEJcXCpcXCooXFxTW1xcc1xcU10qPylcXCpcXCpcXEIoPyFcXCopL2csIGZ1bmN0aW9uKGMsIG0sIGgpIHtcbiAgICAgICAgcmV0dXJuIGkoaCwgbSArIFwiPHN0cm9uZz5cIiwgXCI8L3N0cm9uZz5cIik7XG4gICAgICB9KSwgdCA9IHQucmVwbGFjZSgvKFteKl18XilcXEJcXCooXFxTW1xcc1xcU10qPylcXCpcXEIoPyFcXCopL2csIGZ1bmN0aW9uKGMsIG0sIGgpIHtcbiAgICAgICAgcmV0dXJuIGkoaCwgbSArIFwiPGVtPlwiLCBcIjwvZW0+XCIpO1xuICAgICAgfSkpIDogKHQgPSB0LnJlcGxhY2UoL1xcKlxcKlxcKihcXFNbXFxzXFxTXSo/KVxcKlxcKlxcKi9nLCBmdW5jdGlvbihjLCBtKSB7XG4gICAgICAgIHJldHVybiAvXFxTJC8udGVzdChtKSA/IGkobSwgXCI8c3Ryb25nPjxlbT5cIiwgXCI8L2VtPjwvc3Ryb25nPlwiKSA6IGM7XG4gICAgICB9KSwgdCA9IHQucmVwbGFjZSgvXFwqXFwqKFxcU1tcXHNcXFNdKj8pXFwqXFwqL2csIGZ1bmN0aW9uKGMsIG0pIHtcbiAgICAgICAgcmV0dXJuIC9cXFMkLy50ZXN0KG0pID8gaShtLCBcIjxzdHJvbmc+XCIsIFwiPC9zdHJvbmc+XCIpIDogYztcbiAgICAgIH0pLCB0ID0gdC5yZXBsYWNlKC9cXCooW15cXHMqXVtcXHNcXFNdKj8pXFwqL2csIGZ1bmN0aW9uKGMsIG0pIHtcbiAgICAgICAgcmV0dXJuIC9cXFMkLy50ZXN0KG0pID8gaShtLCBcIjxlbT5cIiwgXCI8L2VtPlwiKSA6IGM7XG4gICAgICB9KSksIHQgPSBzLmNvbnZlcnRlci5fZGlzcGF0Y2goXCJpdGFsaWNzQW5kQm9sZC5hZnRlclwiLCB0LCB1LCBzKSwgdDtcbiAgICB9KSwgYS5zdWJQYXJzZXIoXCJsaXN0c1wiLCBmdW5jdGlvbih0LCB1LCBzKSB7XG4gICAgICBmdW5jdGlvbiBpKGgsIEMpIHtcbiAgICAgICAgcy5nTGlzdExldmVsKyssIGggPSBoLnJlcGxhY2UoL1xcbnsyLH0kLywgYFxuYCksIGggKz0gXCJcdTAwQTgwXCI7XG4gICAgICAgIHZhciBVID0gLyhcXG4pPyheIHswLDN9KShbKistXXxcXGQrWy5dKVsgXFx0XSsoKFxcWyh4fFh8ICk/XSk/WyBcXHRdKlteXFxyXSs/KFxcbnsxLDJ9KSkoPz1cXG4qKFx1MDBBODB8IHswLDN9KFsqKy1dfFxcZCtbLl0pWyBcXHRdKykpL2dtLCBIID0gL1xcblsgXFx0XSpcXG4oPyFcdTAwQTgwKS8udGVzdChoKTtcbiAgICAgICAgcmV0dXJuIHUuZGlzYWJsZUZvcmNlZDRTcGFjZXNJbmRlbnRlZFN1Ymxpc3RzICYmIChVID0gLyhcXG4pPyheIHswLDN9KShbKistXXxcXGQrWy5dKVsgXFx0XSsoKFxcWyh4fFh8ICk/XSk/WyBcXHRdKlteXFxyXSs/KFxcbnsxLDJ9KSkoPz1cXG4qKFx1MDBBODB8XFwyKFsqKy1dfFxcZCtbLl0pWyBcXHRdKykpL2dtKSwgaCA9IGgucmVwbGFjZShVLCBmdW5jdGlvbihWLCBHLCBfLCBxLCBKLCBaLCBCKSB7XG4gICAgICAgICAgQiA9IEIgJiYgQi50cmltKCkgIT09IFwiXCI7XG4gICAgICAgICAgdmFyIGsgPSBhLnN1YlBhcnNlcihcIm91dGRlbnRcIikoSiwgdSwgcyksIEYgPSBcIlwiO1xuICAgICAgICAgIHJldHVybiBaICYmIHUudGFza2xpc3RzICYmIChGID0gJyBjbGFzcz1cInRhc2stbGlzdC1pdGVtXCIgc3R5bGU9XCJsaXN0LXN0eWxlLXR5cGU6IG5vbmU7XCInLCBrID0gay5yZXBsYWNlKC9eWyBcXHRdKlxcWyh4fFh8ICk/XS9tLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHZhciBPID0gJzxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBkaXNhYmxlZCBzdHlsZT1cIm1hcmdpbjogMHB4IDAuMzVlbSAwLjI1ZW0gLTEuNmVtOyB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1wiJztcbiAgICAgICAgICAgIHJldHVybiBCICYmIChPICs9IFwiIGNoZWNrZWRcIiksIE8gKz0gXCI+XCIsIE87XG4gICAgICAgICAgfSkpLCBrID0gay5yZXBsYWNlKC9eKFstKitdfFxcZFxcLilbIFxcdF0rW1xcU1xcbiBdKi9nLCBmdW5jdGlvbihPKSB7XG4gICAgICAgICAgICByZXR1cm4gXCJcdTAwQThBXCIgKyBPO1xuICAgICAgICAgIH0pLCBHIHx8IGsuc2VhcmNoKC9cXG57Mix9LykgPiAtMSA/IChrID0gYS5zdWJQYXJzZXIoXCJnaXRodWJDb2RlQmxvY2tzXCIpKGssIHUsIHMpLCBrID0gYS5zdWJQYXJzZXIoXCJibG9ja0dhbXV0XCIpKGssIHUsIHMpKSA6IChrID0gYS5zdWJQYXJzZXIoXCJsaXN0c1wiKShrLCB1LCBzKSwgayA9IGsucmVwbGFjZSgvXFxuJC8sIFwiXCIpLCBrID0gYS5zdWJQYXJzZXIoXCJoYXNoSFRNTEJsb2Nrc1wiKShrLCB1LCBzKSwgayA9IGsucmVwbGFjZSgvXFxuXFxuKy9nLCBgXG5cbmApLCBIID8gayA9IGEuc3ViUGFyc2VyKFwicGFyYWdyYXBoc1wiKShrLCB1LCBzKSA6IGsgPSBhLnN1YlBhcnNlcihcInNwYW5HYW11dFwiKShrLCB1LCBzKSksIGsgPSBrLnJlcGxhY2UoXCJcdTAwQThBXCIsIFwiXCIpLCBrID0gXCI8bGlcIiArIEYgKyBcIj5cIiArIGsgKyBgPC9saT5cbmAsIGs7XG4gICAgICAgIH0pLCBoID0gaC5yZXBsYWNlKC9cdTAwQTgwL2csIFwiXCIpLCBzLmdMaXN0TGV2ZWwtLSwgQyAmJiAoaCA9IGgucmVwbGFjZSgvXFxzKyQvLCBcIlwiKSksIGg7XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBjKGgsIEMpIHtcbiAgICAgICAgaWYgKEMgPT09IFwib2xcIikge1xuICAgICAgICAgIHZhciBVID0gaC5tYXRjaCgvXiAqKFxcZCspXFwuLyk7XG4gICAgICAgICAgaWYgKFUgJiYgVVsxXSAhPT0gXCIxXCIpXG4gICAgICAgICAgICByZXR1cm4gJyBzdGFydD1cIicgKyBVWzFdICsgJ1wiJztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIG0oaCwgQywgVSkge1xuICAgICAgICB2YXIgSCA9IHUuZGlzYWJsZUZvcmNlZDRTcGFjZXNJbmRlbnRlZFN1Ymxpc3RzID8gL14gP1xcZCtcXC5bIFxcdF0vZ20gOiAvXiB7MCwzfVxcZCtcXC5bIFxcdF0vZ20sIFYgPSB1LmRpc2FibGVGb3JjZWQ0U3BhY2VzSW5kZW50ZWRTdWJsaXN0cyA/IC9eID9bKistXVsgXFx0XS9nbSA6IC9eIHswLDN9WyorLV1bIFxcdF0vZ20sIEcgPSBDID09PSBcInVsXCIgPyBIIDogViwgXyA9IFwiXCI7XG4gICAgICAgIGlmIChoLnNlYXJjaChHKSAhPT0gLTEpXG4gICAgICAgICAgKGZ1bmN0aW9uIEooWikge1xuICAgICAgICAgICAgdmFyIEIgPSBaLnNlYXJjaChHKSwgayA9IGMoaCwgQyk7XG4gICAgICAgICAgICBCICE9PSAtMSA/IChfICs9IGBcblxuPGAgKyBDICsgayArIGA+XG5gICsgaShaLnNsaWNlKDAsIEIpLCAhIVUpICsgXCI8L1wiICsgQyArIGA+XG5gLCBDID0gQyA9PT0gXCJ1bFwiID8gXCJvbFwiIDogXCJ1bFwiLCBHID0gQyA9PT0gXCJ1bFwiID8gSCA6IFYsIEooWi5zbGljZShCKSkpIDogXyArPSBgXG5cbjxgICsgQyArIGsgKyBgPlxuYCArIGkoWiwgISFVKSArIFwiPC9cIiArIEMgKyBgPlxuYDtcbiAgICAgICAgICB9KShoKTtcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgdmFyIHEgPSBjKGgsIEMpO1xuICAgICAgICAgIF8gPSBgXG5cbjxgICsgQyArIHEgKyBgPlxuYCArIGkoaCwgISFVKSArIFwiPC9cIiArIEMgKyBgPlxuYDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gXztcbiAgICAgIH1cbiAgICAgIHJldHVybiB0ID0gcy5jb252ZXJ0ZXIuX2Rpc3BhdGNoKFwibGlzdHMuYmVmb3JlXCIsIHQsIHUsIHMpLCB0ICs9IFwiXHUwMEE4MFwiLCBzLmdMaXN0TGV2ZWwgPyB0ID0gdC5yZXBsYWNlKFxuICAgICAgICAvXigoIHswLDN9KFsqKy1dfFxcZCtbLl0pWyBcXHRdKylbXlxccl0rPyhcdTAwQTgwfFxcbnsyLH0oPz1cXFMpKD8hWyBcXHRdKig/OlsqKy1dfFxcZCtbLl0pWyBcXHRdKykpKS9nbSxcbiAgICAgICAgZnVuY3Rpb24oaCwgQywgVSkge1xuICAgICAgICAgIHZhciBIID0gVS5zZWFyY2goL1sqKy1dL2cpID4gLTEgPyBcInVsXCIgOiBcIm9sXCI7XG4gICAgICAgICAgcmV0dXJuIG0oQywgSCwgITApO1xuICAgICAgICB9XG4gICAgICApIDogdCA9IHQucmVwbGFjZShcbiAgICAgICAgLyhcXG5cXG58Xlxcbj8pKCggezAsM30oWyorLV18XFxkK1suXSlbIFxcdF0rKVteXFxyXSs/KFx1MDBBODB8XFxuezIsfSg/PVxcUykoPyFbIFxcdF0qKD86WyorLV18XFxkK1suXSlbIFxcdF0rKSkpL2dtLFxuICAgICAgICBmdW5jdGlvbihoLCBDLCBVLCBIKSB7XG4gICAgICAgICAgdmFyIFYgPSBILnNlYXJjaCgvWyorLV0vZykgPiAtMSA/IFwidWxcIiA6IFwib2xcIjtcbiAgICAgICAgICByZXR1cm4gbShVLCBWLCAhMSk7XG4gICAgICAgIH1cbiAgICAgICksIHQgPSB0LnJlcGxhY2UoL1x1MDBBODAvLCBcIlwiKSwgdCA9IHMuY29udmVydGVyLl9kaXNwYXRjaChcImxpc3RzLmFmdGVyXCIsIHQsIHUsIHMpLCB0O1xuICAgIH0pLCBhLnN1YlBhcnNlcihcIm1ldGFkYXRhXCIsIGZ1bmN0aW9uKHQsIHUsIHMpIHtcbiAgICAgIGlmICghdS5tZXRhZGF0YSlcbiAgICAgICAgcmV0dXJuIHQ7XG4gICAgICB0ID0gcy5jb252ZXJ0ZXIuX2Rpc3BhdGNoKFwibWV0YWRhdGEuYmVmb3JlXCIsIHQsIHUsIHMpO1xuICAgICAgZnVuY3Rpb24gaShjKSB7XG4gICAgICAgIHMubWV0YWRhdGEucmF3ID0gYywgYyA9IGMucmVwbGFjZSgvJi9nLCBcIiZhbXA7XCIpLnJlcGxhY2UoL1wiL2csIFwiJnF1b3Q7XCIpLCBjID0gYy5yZXBsYWNlKC9cXG4gezR9L2csIFwiIFwiKSwgYy5yZXBsYWNlKC9eKFtcXFMgXSspOiArKFtcXHNcXFNdKz8pJC9nbSwgZnVuY3Rpb24obSwgaCwgQykge1xuICAgICAgICAgIHJldHVybiBzLm1ldGFkYXRhLnBhcnNlZFtoXSA9IEMsIFwiXCI7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHQgPSB0LnJlcGxhY2UoL15cXHMqXHUwMEFCXHUwMEFCXHUwMEFCKyhcXFMqPylcXG4oW1xcc1xcU10rPylcXG5cdTAwQkJcdTAwQkJcdTAwQkIrXFxuLywgZnVuY3Rpb24oYywgbSwgaCkge1xuICAgICAgICByZXR1cm4gaShoKSwgXCJcdTAwQThNXCI7XG4gICAgICB9KSwgdCA9IHQucmVwbGFjZSgvXlxccyotLS0rKFxcUyo/KVxcbihbXFxzXFxTXSs/KVxcbi0tLStcXG4vLCBmdW5jdGlvbihjLCBtLCBoKSB7XG4gICAgICAgIHJldHVybiBtICYmIChzLm1ldGFkYXRhLmZvcm1hdCA9IG0pLCBpKGgpLCBcIlx1MDBBOE1cIjtcbiAgICAgIH0pLCB0ID0gdC5yZXBsYWNlKC9cdTAwQThNL2csIFwiXCIpLCB0ID0gcy5jb252ZXJ0ZXIuX2Rpc3BhdGNoKFwibWV0YWRhdGEuYWZ0ZXJcIiwgdCwgdSwgcyksIHQ7XG4gICAgfSksIGEuc3ViUGFyc2VyKFwib3V0ZGVudFwiLCBmdW5jdGlvbih0LCB1LCBzKSB7XG4gICAgICByZXR1cm4gdCA9IHMuY29udmVydGVyLl9kaXNwYXRjaChcIm91dGRlbnQuYmVmb3JlXCIsIHQsIHUsIHMpLCB0ID0gdC5yZXBsYWNlKC9eKFxcdHxbIF17MSw0fSkvZ20sIFwiXHUwMEE4MFwiKSwgdCA9IHQucmVwbGFjZSgvXHUwMEE4MC9nLCBcIlwiKSwgdCA9IHMuY29udmVydGVyLl9kaXNwYXRjaChcIm91dGRlbnQuYWZ0ZXJcIiwgdCwgdSwgcyksIHQ7XG4gICAgfSksIGEuc3ViUGFyc2VyKFwicGFyYWdyYXBoc1wiLCBmdW5jdGlvbih0LCB1LCBzKSB7XG4gICAgICB0ID0gcy5jb252ZXJ0ZXIuX2Rpc3BhdGNoKFwicGFyYWdyYXBocy5iZWZvcmVcIiwgdCwgdSwgcyksIHQgPSB0LnJlcGxhY2UoL15cXG4rL2csIFwiXCIpLCB0ID0gdC5yZXBsYWNlKC9cXG4rJC9nLCBcIlwiKTtcbiAgICAgIGZvciAodmFyIGkgPSB0LnNwbGl0KC9cXG57Mix9L2cpLCBjID0gW10sIG0gPSBpLmxlbmd0aCwgaCA9IDA7IGggPCBtOyBoKyspIHtcbiAgICAgICAgdmFyIEMgPSBpW2hdO1xuICAgICAgICBDLnNlYXJjaCgvXHUwMEE4KEt8RykoXFxkKylcXDEvZykgPj0gMCA/IGMucHVzaChDKSA6IEMuc2VhcmNoKC9cXFMvKSA+PSAwICYmIChDID0gYS5zdWJQYXJzZXIoXCJzcGFuR2FtdXRcIikoQywgdSwgcyksIEMgPSBDLnJlcGxhY2UoL14oWyBcXHRdKikvZywgXCI8cD5cIiksIEMgKz0gXCI8L3A+XCIsIGMucHVzaChDKSk7XG4gICAgICB9XG4gICAgICBmb3IgKG0gPSBjLmxlbmd0aCwgaCA9IDA7IGggPCBtOyBoKyspIHtcbiAgICAgICAgZm9yICh2YXIgVSA9IFwiXCIsIEggPSBjW2hdLCBWID0gITE7IC9cdTAwQTgoS3xHKShcXGQrKVxcMS8udGVzdChIKTsgKSB7XG4gICAgICAgICAgdmFyIEcgPSBSZWdFeHAuJDEsIF8gPSBSZWdFeHAuJDI7XG4gICAgICAgICAgRyA9PT0gXCJLXCIgPyBVID0gcy5nSHRtbEJsb2Nrc1tfXSA6IFYgPyBVID0gYS5zdWJQYXJzZXIoXCJlbmNvZGVDb2RlXCIpKHMuZ2hDb2RlQmxvY2tzW19dLnRleHQsIHUsIHMpIDogVSA9IHMuZ2hDb2RlQmxvY2tzW19dLmNvZGVibG9jaywgVSA9IFUucmVwbGFjZSgvXFwkL2csIFwiJCQkJFwiKSwgSCA9IEgucmVwbGFjZSgvKFxcblxcbik/XHUwMEE4KEt8RylcXGQrXFwyKFxcblxcbik/LywgVSksIC9ePHByZVxcYltePl0qPlxccyo8Y29kZVxcYltePl0qPi8udGVzdChIKSAmJiAoViA9ICEwKTtcbiAgICAgICAgfVxuICAgICAgICBjW2hdID0gSDtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0ID0gYy5qb2luKGBcbmApLCB0ID0gdC5yZXBsYWNlKC9eXFxuKy9nLCBcIlwiKSwgdCA9IHQucmVwbGFjZSgvXFxuKyQvZywgXCJcIiksIHMuY29udmVydGVyLl9kaXNwYXRjaChcInBhcmFncmFwaHMuYWZ0ZXJcIiwgdCwgdSwgcyk7XG4gICAgfSksIGEuc3ViUGFyc2VyKFwicnVuRXh0ZW5zaW9uXCIsIGZ1bmN0aW9uKHQsIHUsIHMsIGkpIHtcbiAgICAgIGlmICh0LmZpbHRlcilcbiAgICAgICAgdSA9IHQuZmlsdGVyKHUsIGkuY29udmVydGVyLCBzKTtcbiAgICAgIGVsc2UgaWYgKHQucmVnZXgpIHtcbiAgICAgICAgdmFyIGMgPSB0LnJlZ2V4O1xuICAgICAgICBjIGluc3RhbmNlb2YgUmVnRXhwIHx8IChjID0gbmV3IFJlZ0V4cChjLCBcImdcIikpLCB1ID0gdS5yZXBsYWNlKGMsIHQucmVwbGFjZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdTtcbiAgICB9KSwgYS5zdWJQYXJzZXIoXCJzcGFuR2FtdXRcIiwgZnVuY3Rpb24odCwgdSwgcykge1xuICAgICAgcmV0dXJuIHQgPSBzLmNvbnZlcnRlci5fZGlzcGF0Y2goXCJzcGFuR2FtdXQuYmVmb3JlXCIsIHQsIHUsIHMpLCB0ID0gYS5zdWJQYXJzZXIoXCJjb2RlU3BhbnNcIikodCwgdSwgcyksIHQgPSBhLnN1YlBhcnNlcihcImVzY2FwZVNwZWNpYWxDaGFyc1dpdGhpblRhZ0F0dHJpYnV0ZXNcIikodCwgdSwgcyksIHQgPSBhLnN1YlBhcnNlcihcImVuY29kZUJhY2tzbGFzaEVzY2FwZXNcIikodCwgdSwgcyksIHQgPSBhLnN1YlBhcnNlcihcImltYWdlc1wiKSh0LCB1LCBzKSwgdCA9IGEuc3ViUGFyc2VyKFwiYW5jaG9yc1wiKSh0LCB1LCBzKSwgdCA9IGEuc3ViUGFyc2VyKFwiYXV0b0xpbmtzXCIpKHQsIHUsIHMpLCB0ID0gYS5zdWJQYXJzZXIoXCJzaW1wbGlmaWVkQXV0b0xpbmtzXCIpKHQsIHUsIHMpLCB0ID0gYS5zdWJQYXJzZXIoXCJlbW9qaVwiKSh0LCB1LCBzKSwgdCA9IGEuc3ViUGFyc2VyKFwidW5kZXJsaW5lXCIpKHQsIHUsIHMpLCB0ID0gYS5zdWJQYXJzZXIoXCJpdGFsaWNzQW5kQm9sZFwiKSh0LCB1LCBzKSwgdCA9IGEuc3ViUGFyc2VyKFwic3RyaWtldGhyb3VnaFwiKSh0LCB1LCBzKSwgdCA9IGEuc3ViUGFyc2VyKFwiZWxsaXBzaXNcIikodCwgdSwgcyksIHQgPSBhLnN1YlBhcnNlcihcImhhc2hIVE1MU3BhbnNcIikodCwgdSwgcyksIHQgPSBhLnN1YlBhcnNlcihcImVuY29kZUFtcHNBbmRBbmdsZXNcIikodCwgdSwgcyksIHUuc2ltcGxlTGluZUJyZWFrcyA/IC9cXG5cXG5cdTAwQThLLy50ZXN0KHQpIHx8ICh0ID0gdC5yZXBsYWNlKC9cXG4rL2csIGA8YnIgLz5cbmApKSA6IHQgPSB0LnJlcGxhY2UoLyAgK1xcbi9nLCBgPGJyIC8+XG5gKSwgdCA9IHMuY29udmVydGVyLl9kaXNwYXRjaChcInNwYW5HYW11dC5hZnRlclwiLCB0LCB1LCBzKSwgdDtcbiAgICB9KSwgYS5zdWJQYXJzZXIoXCJzdHJpa2V0aHJvdWdoXCIsIGZ1bmN0aW9uKHQsIHUsIHMpIHtcbiAgICAgIGZ1bmN0aW9uIGkoYykge1xuICAgICAgICByZXR1cm4gdS5zaW1wbGlmaWVkQXV0b0xpbmsgJiYgKGMgPSBhLnN1YlBhcnNlcihcInNpbXBsaWZpZWRBdXRvTGlua3NcIikoYywgdSwgcykpLCBcIjxkZWw+XCIgKyBjICsgXCI8L2RlbD5cIjtcbiAgICAgIH1cbiAgICAgIHJldHVybiB1LnN0cmlrZXRocm91Z2ggJiYgKHQgPSBzLmNvbnZlcnRlci5fZGlzcGF0Y2goXCJzdHJpa2V0aHJvdWdoLmJlZm9yZVwiLCB0LCB1LCBzKSwgdCA9IHQucmVwbGFjZSgvKD86fil7Mn0oW1xcc1xcU10rPykoPzp+KXsyfS9nLCBmdW5jdGlvbihjLCBtKSB7XG4gICAgICAgIHJldHVybiBpKG0pO1xuICAgICAgfSksIHQgPSBzLmNvbnZlcnRlci5fZGlzcGF0Y2goXCJzdHJpa2V0aHJvdWdoLmFmdGVyXCIsIHQsIHUsIHMpKSwgdDtcbiAgICB9KSwgYS5zdWJQYXJzZXIoXCJzdHJpcExpbmtEZWZpbml0aW9uc1wiLCBmdW5jdGlvbih0LCB1LCBzKSB7XG4gICAgICB2YXIgaSA9IC9eIHswLDN9XFxbKFteXFxdXSspXTpbIFxcdF0qXFxuP1sgXFx0XSo8PyhbXj5cXHNdKyk+Pyg/OiA9KFsqXFxkXStbQS1aYS16JV17MCw0fSl4KFsqXFxkXStbQS1aYS16JV17MCw0fSkpP1sgXFx0XSpcXG4/WyBcXHRdKig/OihcXG4qKVtcInwnKF0oLis/KVtcInwnKV1bIFxcdF0qKT8oPzpcXG4rfCg/PVx1MDBBODApKS9nbSwgYyA9IC9eIHswLDN9XFxbKFteXFxdXSspXTpbIFxcdF0qXFxuP1sgXFx0XSo8PyhkYXRhOi4rP1xcLy4rPztiYXNlNjQsW0EtWmEtejAtOSsvPVxcbl0rPyk+Pyg/OiA9KFsqXFxkXStbQS1aYS16JV17MCw0fSl4KFsqXFxkXStbQS1aYS16JV17MCw0fSkpP1sgXFx0XSpcXG4/WyBcXHRdKig/OihcXG4qKVtcInwnKF0oLis/KVtcInwnKV1bIFxcdF0qKT8oPzpcXG5cXG58KD89XHUwMEE4MCl8KD89XFxuXFxbKSkvZ207XG4gICAgICB0ICs9IFwiXHUwMEE4MFwiO1xuICAgICAgdmFyIG0gPSBmdW5jdGlvbihoLCBDLCBVLCBILCBWLCBHLCBfKSB7XG4gICAgICAgIHJldHVybiBDID0gQy50b0xvd2VyQ2FzZSgpLCB0LnRvTG93ZXJDYXNlKCkuc3BsaXQoQykubGVuZ3RoIC0gMSA8IDIgPyBoIDogKFUubWF0Y2goL15kYXRhOi4rP1xcLy4rPztiYXNlNjQsLykgPyBzLmdVcmxzW0NdID0gVS5yZXBsYWNlKC9cXHMvZywgXCJcIikgOiBzLmdVcmxzW0NdID0gYS5zdWJQYXJzZXIoXCJlbmNvZGVBbXBzQW5kQW5nbGVzXCIpKFUsIHUsIHMpLCBHID8gRyArIF8gOiAoXyAmJiAocy5nVGl0bGVzW0NdID0gXy5yZXBsYWNlKC9cInwnL2csIFwiJnF1b3Q7XCIpKSwgdS5wYXJzZUltZ0RpbWVuc2lvbnMgJiYgSCAmJiBWICYmIChzLmdEaW1lbnNpb25zW0NdID0ge1xuICAgICAgICAgIHdpZHRoOiBILFxuICAgICAgICAgIGhlaWdodDogVlxuICAgICAgICB9KSwgXCJcIikpO1xuICAgICAgfTtcbiAgICAgIHJldHVybiB0ID0gdC5yZXBsYWNlKGMsIG0pLCB0ID0gdC5yZXBsYWNlKGksIG0pLCB0ID0gdC5yZXBsYWNlKC9cdTAwQTgwLywgXCJcIiksIHQ7XG4gICAgfSksIGEuc3ViUGFyc2VyKFwidGFibGVzXCIsIGZ1bmN0aW9uKHQsIHUsIHMpIHtcbiAgICAgIGlmICghdS50YWJsZXMpXG4gICAgICAgIHJldHVybiB0O1xuICAgICAgdmFyIGkgPSAvXiB7MCwzfVxcfD8uK1xcfC4rXFxuIHswLDN9XFx8P1sgXFx0XSo6P1sgXFx0XSooPzpbLT1dKXsyLH1bIFxcdF0qOj9bIFxcdF0qXFx8WyBcXHRdKjo/WyBcXHRdKig/OlstPV0pezIsfVtcXHNcXFNdKz8oPzpcXG5cXG58XHUwMEE4MCkvZ20sIGMgPSAvXiB7MCwzfVxcfC4rXFx8WyBcXHRdKlxcbiB7MCwzfVxcfFsgXFx0XSo6P1sgXFx0XSooPzpbLT1dKXsyLH1bIFxcdF0qOj9bIFxcdF0qXFx8WyBcXHRdKlxcbiggezAsM31cXHwuK1xcfFsgXFx0XSpcXG4pKig/OlxcbnxcdTAwQTgwKS9nbTtcbiAgICAgIGZ1bmN0aW9uIG0oVikge1xuICAgICAgICByZXR1cm4gL146WyBcXHRdKi0tKiQvLnRlc3QoVikgPyAnIHN0eWxlPVwidGV4dC1hbGlnbjpsZWZ0O1wiJyA6IC9eLS0qWyBcXHRdKjpbIFxcdF0qJC8udGVzdChWKSA/ICcgc3R5bGU9XCJ0ZXh0LWFsaWduOnJpZ2h0O1wiJyA6IC9eOlsgXFx0XSotLSpbIFxcdF0qOiQvLnRlc3QoVikgPyAnIHN0eWxlPVwidGV4dC1hbGlnbjpjZW50ZXI7XCInIDogXCJcIjtcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIGgoViwgRykge1xuICAgICAgICB2YXIgXyA9IFwiXCI7XG4gICAgICAgIHJldHVybiBWID0gVi50cmltKCksICh1LnRhYmxlc0hlYWRlcklkIHx8IHUudGFibGVIZWFkZXJJZCkgJiYgKF8gPSAnIGlkPVwiJyArIFYucmVwbGFjZSgvIC9nLCBcIl9cIikudG9Mb3dlckNhc2UoKSArICdcIicpLCBWID0gYS5zdWJQYXJzZXIoXCJzcGFuR2FtdXRcIikoViwgdSwgcyksIFwiPHRoXCIgKyBfICsgRyArIFwiPlwiICsgViArIGA8L3RoPlxuYDtcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIEMoViwgRykge1xuICAgICAgICB2YXIgXyA9IGEuc3ViUGFyc2VyKFwic3BhbkdhbXV0XCIpKFYsIHUsIHMpO1xuICAgICAgICByZXR1cm4gXCI8dGRcIiArIEcgKyBcIj5cIiArIF8gKyBgPC90ZD5cbmA7XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBVKFYsIEcpIHtcbiAgICAgICAgZm9yICh2YXIgXyA9IGA8dGFibGU+XG48dGhlYWQ+XG48dHI+XG5gLCBxID0gVi5sZW5ndGgsIEogPSAwOyBKIDwgcTsgKytKKVxuICAgICAgICAgIF8gKz0gVltKXTtcbiAgICAgICAgZm9yIChfICs9IGA8L3RyPlxuPC90aGVhZD5cbjx0Ym9keT5cbmAsIEogPSAwOyBKIDwgRy5sZW5ndGg7ICsrSikge1xuICAgICAgICAgIF8gKz0gYDx0cj5cbmA7XG4gICAgICAgICAgZm9yICh2YXIgWiA9IDA7IFogPCBxOyArK1opXG4gICAgICAgICAgICBfICs9IEdbSl1bWl07XG4gICAgICAgICAgXyArPSBgPC90cj5cbmA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF8gKz0gYDwvdGJvZHk+XG48L3RhYmxlPlxuYCwgXztcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIEgoVikge1xuICAgICAgICB2YXIgRywgXyA9IFYuc3BsaXQoYFxuYCk7XG4gICAgICAgIGZvciAoRyA9IDA7IEcgPCBfLmxlbmd0aDsgKytHKVxuICAgICAgICAgIC9eIHswLDN9XFx8Ly50ZXN0KF9bR10pICYmIChfW0ddID0gX1tHXS5yZXBsYWNlKC9eIHswLDN9XFx8LywgXCJcIikpLCAvXFx8WyBcXHRdKiQvLnRlc3QoX1tHXSkgJiYgKF9bR10gPSBfW0ddLnJlcGxhY2UoL1xcfFsgXFx0XSokLywgXCJcIikpLCBfW0ddID0gYS5zdWJQYXJzZXIoXCJjb2RlU3BhbnNcIikoX1tHXSwgdSwgcyk7XG4gICAgICAgIHZhciBxID0gX1swXS5zcGxpdChcInxcIikubWFwKGZ1bmN0aW9uKHcpIHtcbiAgICAgICAgICByZXR1cm4gdy50cmltKCk7XG4gICAgICAgIH0pLCBKID0gX1sxXS5zcGxpdChcInxcIikubWFwKGZ1bmN0aW9uKHcpIHtcbiAgICAgICAgICByZXR1cm4gdy50cmltKCk7XG4gICAgICAgIH0pLCBaID0gW10sIEIgPSBbXSwgayA9IFtdLCBGID0gW107XG4gICAgICAgIGZvciAoXy5zaGlmdCgpLCBfLnNoaWZ0KCksIEcgPSAwOyBHIDwgXy5sZW5ndGg7ICsrRylcbiAgICAgICAgICBfW0ddLnRyaW0oKSAhPT0gXCJcIiAmJiBaLnB1c2goXG4gICAgICAgICAgICBfW0ddLnNwbGl0KFwifFwiKS5tYXAoZnVuY3Rpb24odykge1xuICAgICAgICAgICAgICByZXR1cm4gdy50cmltKCk7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICk7XG4gICAgICAgIGlmIChxLmxlbmd0aCA8IEoubGVuZ3RoKVxuICAgICAgICAgIHJldHVybiBWO1xuICAgICAgICBmb3IgKEcgPSAwOyBHIDwgSi5sZW5ndGg7ICsrRylcbiAgICAgICAgICBrLnB1c2gobShKW0ddKSk7XG4gICAgICAgIGZvciAoRyA9IDA7IEcgPCBxLmxlbmd0aDsgKytHKVxuICAgICAgICAgIGEuaGVscGVyLmlzVW5kZWZpbmVkKGtbR10pICYmIChrW0ddID0gXCJcIiksIEIucHVzaChoKHFbR10sIGtbR10pKTtcbiAgICAgICAgZm9yIChHID0gMDsgRyA8IFoubGVuZ3RoOyArK0cpIHtcbiAgICAgICAgICBmb3IgKHZhciBPID0gW10sIGwgPSAwOyBsIDwgQi5sZW5ndGg7ICsrbClcbiAgICAgICAgICAgIGEuaGVscGVyLmlzVW5kZWZpbmVkKFpbR11bbF0pLCBPLnB1c2goQyhaW0ddW2xdLCBrW2xdKSk7XG4gICAgICAgICAgRi5wdXNoKE8pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBVKEIsIEYpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHQgPSBzLmNvbnZlcnRlci5fZGlzcGF0Y2goXCJ0YWJsZXMuYmVmb3JlXCIsIHQsIHUsIHMpLCB0ID0gdC5yZXBsYWNlKC9cXFxcKFxcfCkvZywgYS5oZWxwZXIuZXNjYXBlQ2hhcmFjdGVyc0NhbGxiYWNrKSwgdCA9IHQucmVwbGFjZShpLCBIKSwgdCA9IHQucmVwbGFjZShjLCBIKSwgdCA9IHMuY29udmVydGVyLl9kaXNwYXRjaChcInRhYmxlcy5hZnRlclwiLCB0LCB1LCBzKSwgdDtcbiAgICB9KSwgYS5zdWJQYXJzZXIoXCJ1bmRlcmxpbmVcIiwgZnVuY3Rpb24odCwgdSwgcykge1xuICAgICAgcmV0dXJuIHUudW5kZXJsaW5lICYmICh0ID0gcy5jb252ZXJ0ZXIuX2Rpc3BhdGNoKFwidW5kZXJsaW5lLmJlZm9yZVwiLCB0LCB1LCBzKSwgdS5saXRlcmFsTWlkV29yZFVuZGVyc2NvcmVzID8gKHQgPSB0LnJlcGxhY2UoL1xcYl9fXyhcXFNbXFxzXFxTXSo/KV9fX1xcYi9nLCBmdW5jdGlvbihpLCBjKSB7XG4gICAgICAgIHJldHVybiBcIjx1PlwiICsgYyArIFwiPC91PlwiO1xuICAgICAgfSksIHQgPSB0LnJlcGxhY2UoL1xcYl9fKFxcU1tcXHNcXFNdKj8pX19cXGIvZywgZnVuY3Rpb24oaSwgYykge1xuICAgICAgICByZXR1cm4gXCI8dT5cIiArIGMgKyBcIjwvdT5cIjtcbiAgICAgIH0pKSA6ICh0ID0gdC5yZXBsYWNlKC9fX18oXFxTW1xcc1xcU10qPylfX18vZywgZnVuY3Rpb24oaSwgYykge1xuICAgICAgICByZXR1cm4gL1xcUyQvLnRlc3QoYykgPyBcIjx1PlwiICsgYyArIFwiPC91PlwiIDogaTtcbiAgICAgIH0pLCB0ID0gdC5yZXBsYWNlKC9fXyhcXFNbXFxzXFxTXSo/KV9fL2csIGZ1bmN0aW9uKGksIGMpIHtcbiAgICAgICAgcmV0dXJuIC9cXFMkLy50ZXN0KGMpID8gXCI8dT5cIiArIGMgKyBcIjwvdT5cIiA6IGk7XG4gICAgICB9KSksIHQgPSB0LnJlcGxhY2UoLyhfKS9nLCBhLmhlbHBlci5lc2NhcGVDaGFyYWN0ZXJzQ2FsbGJhY2spLCB0ID0gcy5jb252ZXJ0ZXIuX2Rpc3BhdGNoKFwidW5kZXJsaW5lLmFmdGVyXCIsIHQsIHUsIHMpKSwgdDtcbiAgICB9KSwgYS5zdWJQYXJzZXIoXCJ1bmVzY2FwZVNwZWNpYWxDaGFyc1wiLCBmdW5jdGlvbih0LCB1LCBzKSB7XG4gICAgICByZXR1cm4gdCA9IHMuY29udmVydGVyLl9kaXNwYXRjaChcInVuZXNjYXBlU3BlY2lhbENoYXJzLmJlZm9yZVwiLCB0LCB1LCBzKSwgdCA9IHQucmVwbGFjZSgvXHUwMEE4RShcXGQrKUUvZywgZnVuY3Rpb24oaSwgYykge1xuICAgICAgICB2YXIgbSA9IHBhcnNlSW50KGMpO1xuICAgICAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShtKTtcbiAgICAgIH0pLCB0ID0gcy5jb252ZXJ0ZXIuX2Rpc3BhdGNoKFwidW5lc2NhcGVTcGVjaWFsQ2hhcnMuYWZ0ZXJcIiwgdCwgdSwgcyksIHQ7XG4gICAgfSksIGEuc3ViUGFyc2VyKFwibWFrZU1hcmtkb3duLmJsb2NrcXVvdGVcIiwgZnVuY3Rpb24odCwgdSkge1xuICAgICAgdmFyIHMgPSBcIlwiO1xuICAgICAgaWYgKHQuaGFzQ2hpbGROb2RlcygpKVxuICAgICAgICBmb3IgKHZhciBpID0gdC5jaGlsZE5vZGVzLCBjID0gaS5sZW5ndGgsIG0gPSAwOyBtIDwgYzsgKyttKSB7XG4gICAgICAgICAgdmFyIGggPSBhLnN1YlBhcnNlcihcIm1ha2VNYXJrZG93bi5ub2RlXCIpKGlbbV0sIHUpO1xuICAgICAgICAgIGggIT09IFwiXCIgJiYgKHMgKz0gaCk7XG4gICAgICAgIH1cbiAgICAgIHJldHVybiBzID0gcy50cmltKCksIHMgPSBcIj4gXCIgKyBzLnNwbGl0KGBcbmApLmpvaW4oYFxuPiBgKSwgcztcbiAgICB9KSwgYS5zdWJQYXJzZXIoXCJtYWtlTWFya2Rvd24uY29kZUJsb2NrXCIsIGZ1bmN0aW9uKHQsIHUpIHtcbiAgICAgIHZhciBzID0gdC5nZXRBdHRyaWJ1dGUoXCJsYW5ndWFnZVwiKSwgaSA9IHQuZ2V0QXR0cmlidXRlKFwicHJlY29kZW51bVwiKTtcbiAgICAgIHJldHVybiBcImBgYFwiICsgcyArIGBcbmAgKyB1LnByZUxpc3RbaV0gKyBcIlxcbmBgYFwiO1xuICAgIH0pLCBhLnN1YlBhcnNlcihcIm1ha2VNYXJrZG93bi5jb2RlU3BhblwiLCBmdW5jdGlvbih0KSB7XG4gICAgICByZXR1cm4gXCJgXCIgKyB0LmlubmVySFRNTCArIFwiYFwiO1xuICAgIH0pLCBhLnN1YlBhcnNlcihcIm1ha2VNYXJrZG93bi5lbXBoYXNpc1wiLCBmdW5jdGlvbih0LCB1KSB7XG4gICAgICB2YXIgcyA9IFwiXCI7XG4gICAgICBpZiAodC5oYXNDaGlsZE5vZGVzKCkpIHtcbiAgICAgICAgcyArPSBcIipcIjtcbiAgICAgICAgZm9yICh2YXIgaSA9IHQuY2hpbGROb2RlcywgYyA9IGkubGVuZ3RoLCBtID0gMDsgbSA8IGM7ICsrbSlcbiAgICAgICAgICBzICs9IGEuc3ViUGFyc2VyKFwibWFrZU1hcmtkb3duLm5vZGVcIikoaVttXSwgdSk7XG4gICAgICAgIHMgKz0gXCIqXCI7XG4gICAgICB9XG4gICAgICByZXR1cm4gcztcbiAgICB9KSwgYS5zdWJQYXJzZXIoXCJtYWtlTWFya2Rvd24uaGVhZGVyXCIsIGZ1bmN0aW9uKHQsIHUsIHMpIHtcbiAgICAgIHZhciBpID0gbmV3IEFycmF5KHMgKyAxKS5qb2luKFwiI1wiKSwgYyA9IFwiXCI7XG4gICAgICBpZiAodC5oYXNDaGlsZE5vZGVzKCkpIHtcbiAgICAgICAgYyA9IGkgKyBcIiBcIjtcbiAgICAgICAgZm9yICh2YXIgbSA9IHQuY2hpbGROb2RlcywgaCA9IG0ubGVuZ3RoLCBDID0gMDsgQyA8IGg7ICsrQylcbiAgICAgICAgICBjICs9IGEuc3ViUGFyc2VyKFwibWFrZU1hcmtkb3duLm5vZGVcIikobVtDXSwgdSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gYztcbiAgICB9KSwgYS5zdWJQYXJzZXIoXCJtYWtlTWFya2Rvd24uaHJcIiwgZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gXCItLS1cIjtcbiAgICB9KSwgYS5zdWJQYXJzZXIoXCJtYWtlTWFya2Rvd24uaW1hZ2VcIiwgZnVuY3Rpb24odCkge1xuICAgICAgdmFyIHUgPSBcIlwiO1xuICAgICAgcmV0dXJuIHQuaGFzQXR0cmlidXRlKFwic3JjXCIpICYmICh1ICs9IFwiIVtcIiArIHQuZ2V0QXR0cmlidXRlKFwiYWx0XCIpICsgXCJdKFwiLCB1ICs9IFwiPFwiICsgdC5nZXRBdHRyaWJ1dGUoXCJzcmNcIikgKyBcIj5cIiwgdC5oYXNBdHRyaWJ1dGUoXCJ3aWR0aFwiKSAmJiB0Lmhhc0F0dHJpYnV0ZShcImhlaWdodFwiKSAmJiAodSArPSBcIiA9XCIgKyB0LmdldEF0dHJpYnV0ZShcIndpZHRoXCIpICsgXCJ4XCIgKyB0LmdldEF0dHJpYnV0ZShcImhlaWdodFwiKSksIHQuaGFzQXR0cmlidXRlKFwidGl0bGVcIikgJiYgKHUgKz0gJyBcIicgKyB0LmdldEF0dHJpYnV0ZShcInRpdGxlXCIpICsgJ1wiJyksIHUgKz0gXCIpXCIpLCB1O1xuICAgIH0pLCBhLnN1YlBhcnNlcihcIm1ha2VNYXJrZG93bi5saW5rc1wiLCBmdW5jdGlvbih0LCB1KSB7XG4gICAgICB2YXIgcyA9IFwiXCI7XG4gICAgICBpZiAodC5oYXNDaGlsZE5vZGVzKCkgJiYgdC5oYXNBdHRyaWJ1dGUoXCJocmVmXCIpKSB7XG4gICAgICAgIHZhciBpID0gdC5jaGlsZE5vZGVzLCBjID0gaS5sZW5ndGg7XG4gICAgICAgIHMgPSBcIltcIjtcbiAgICAgICAgZm9yICh2YXIgbSA9IDA7IG0gPCBjOyArK20pXG4gICAgICAgICAgcyArPSBhLnN1YlBhcnNlcihcIm1ha2VNYXJrZG93bi5ub2RlXCIpKGlbbV0sIHUpO1xuICAgICAgICBzICs9IFwiXShcIiwgcyArPSBcIjxcIiArIHQuZ2V0QXR0cmlidXRlKFwiaHJlZlwiKSArIFwiPlwiLCB0Lmhhc0F0dHJpYnV0ZShcInRpdGxlXCIpICYmIChzICs9ICcgXCInICsgdC5nZXRBdHRyaWJ1dGUoXCJ0aXRsZVwiKSArICdcIicpLCBzICs9IFwiKVwiO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHM7XG4gICAgfSksIGEuc3ViUGFyc2VyKFwibWFrZU1hcmtkb3duLmxpc3RcIiwgZnVuY3Rpb24odCwgdSwgcykge1xuICAgICAgdmFyIGkgPSBcIlwiO1xuICAgICAgaWYgKCF0Lmhhc0NoaWxkTm9kZXMoKSlcbiAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICBmb3IgKHZhciBjID0gdC5jaGlsZE5vZGVzLCBtID0gYy5sZW5ndGgsIGggPSB0LmdldEF0dHJpYnV0ZShcInN0YXJ0XCIpIHx8IDEsIEMgPSAwOyBDIDwgbTsgKytDKVxuICAgICAgICBpZiAoISh0eXBlb2YgY1tDXS50YWdOYW1lID4gXCJ1XCIgfHwgY1tDXS50YWdOYW1lLnRvTG93ZXJDYXNlKCkgIT09IFwibGlcIikpIHtcbiAgICAgICAgICB2YXIgVSA9IFwiXCI7XG4gICAgICAgICAgcyA9PT0gXCJvbFwiID8gVSA9IGgudG9TdHJpbmcoKSArIFwiLiBcIiA6IFUgPSBcIi0gXCIsIGkgKz0gVSArIGEuc3ViUGFyc2VyKFwibWFrZU1hcmtkb3duLmxpc3RJdGVtXCIpKGNbQ10sIHUpLCArK2g7XG4gICAgICAgIH1cbiAgICAgIHJldHVybiBpICs9IGBcbjwhLS0gLS0+XG5gLCBpLnRyaW0oKTtcbiAgICB9KSwgYS5zdWJQYXJzZXIoXCJtYWtlTWFya2Rvd24ubGlzdEl0ZW1cIiwgZnVuY3Rpb24odCwgdSkge1xuICAgICAgZm9yICh2YXIgcyA9IFwiXCIsIGkgPSB0LmNoaWxkTm9kZXMsIGMgPSBpLmxlbmd0aCwgbSA9IDA7IG0gPCBjOyArK20pXG4gICAgICAgIHMgKz0gYS5zdWJQYXJzZXIoXCJtYWtlTWFya2Rvd24ubm9kZVwiKShpW21dLCB1KTtcbiAgICAgIHJldHVybiAvXFxuJC8udGVzdChzKSA/IHMgPSBzLnNwbGl0KGBcbmApLmpvaW4oYFxuICAgIGApLnJlcGxhY2UoL14gezR9JC9nbSwgXCJcIikucmVwbGFjZSgvXFxuXFxuKy9nLCBgXG5cbmApIDogcyArPSBgXG5gLCBzO1xuICAgIH0pLCBhLnN1YlBhcnNlcihcIm1ha2VNYXJrZG93bi5ub2RlXCIsIGZ1bmN0aW9uKHQsIHUsIHMpIHtcbiAgICAgIHMgPSBzIHx8ICExO1xuICAgICAgdmFyIGkgPSBcIlwiO1xuICAgICAgaWYgKHQubm9kZVR5cGUgPT09IDMpXG4gICAgICAgIHJldHVybiBhLnN1YlBhcnNlcihcIm1ha2VNYXJrZG93bi50eHRcIikodCwgdSk7XG4gICAgICBpZiAodC5ub2RlVHlwZSA9PT0gOClcbiAgICAgICAgcmV0dXJuIFwiPCEtLVwiICsgdC5kYXRhICsgYC0tPlxuXG5gO1xuICAgICAgaWYgKHQubm9kZVR5cGUgIT09IDEpXG4gICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgdmFyIGMgPSB0LnRhZ05hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgIHN3aXRjaCAoYykge1xuICAgICAgICBjYXNlIFwiaDFcIjpcbiAgICAgICAgICBzIHx8IChpID0gYS5zdWJQYXJzZXIoXCJtYWtlTWFya2Rvd24uaGVhZGVyXCIpKHQsIHUsIDEpICsgYFxuXG5gKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcImgyXCI6XG4gICAgICAgICAgcyB8fCAoaSA9IGEuc3ViUGFyc2VyKFwibWFrZU1hcmtkb3duLmhlYWRlclwiKSh0LCB1LCAyKSArIGBcblxuYCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJoM1wiOlxuICAgICAgICAgIHMgfHwgKGkgPSBhLnN1YlBhcnNlcihcIm1ha2VNYXJrZG93bi5oZWFkZXJcIikodCwgdSwgMykgKyBgXG5cbmApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiaDRcIjpcbiAgICAgICAgICBzIHx8IChpID0gYS5zdWJQYXJzZXIoXCJtYWtlTWFya2Rvd24uaGVhZGVyXCIpKHQsIHUsIDQpICsgYFxuXG5gKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcImg1XCI6XG4gICAgICAgICAgcyB8fCAoaSA9IGEuc3ViUGFyc2VyKFwibWFrZU1hcmtkb3duLmhlYWRlclwiKSh0LCB1LCA1KSArIGBcblxuYCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJoNlwiOlxuICAgICAgICAgIHMgfHwgKGkgPSBhLnN1YlBhcnNlcihcIm1ha2VNYXJrZG93bi5oZWFkZXJcIikodCwgdSwgNikgKyBgXG5cbmApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwicFwiOlxuICAgICAgICAgIHMgfHwgKGkgPSBhLnN1YlBhcnNlcihcIm1ha2VNYXJrZG93bi5wYXJhZ3JhcGhcIikodCwgdSkgKyBgXG5cbmApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiYmxvY2txdW90ZVwiOlxuICAgICAgICAgIHMgfHwgKGkgPSBhLnN1YlBhcnNlcihcIm1ha2VNYXJrZG93bi5ibG9ja3F1b3RlXCIpKHQsIHUpICsgYFxuXG5gKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcImhyXCI6XG4gICAgICAgICAgcyB8fCAoaSA9IGEuc3ViUGFyc2VyKFwibWFrZU1hcmtkb3duLmhyXCIpKHQsIHUpICsgYFxuXG5gKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcIm9sXCI6XG4gICAgICAgICAgcyB8fCAoaSA9IGEuc3ViUGFyc2VyKFwibWFrZU1hcmtkb3duLmxpc3RcIikodCwgdSwgXCJvbFwiKSArIGBcblxuYCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJ1bFwiOlxuICAgICAgICAgIHMgfHwgKGkgPSBhLnN1YlBhcnNlcihcIm1ha2VNYXJrZG93bi5saXN0XCIpKHQsIHUsIFwidWxcIikgKyBgXG5cbmApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwicHJlY29kZVwiOlxuICAgICAgICAgIHMgfHwgKGkgPSBhLnN1YlBhcnNlcihcIm1ha2VNYXJrZG93bi5jb2RlQmxvY2tcIikodCwgdSkgKyBgXG5cbmApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwicHJlXCI6XG4gICAgICAgICAgcyB8fCAoaSA9IGEuc3ViUGFyc2VyKFwibWFrZU1hcmtkb3duLnByZVwiKSh0LCB1KSArIGBcblxuYCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJ0YWJsZVwiOlxuICAgICAgICAgIHMgfHwgKGkgPSBhLnN1YlBhcnNlcihcIm1ha2VNYXJrZG93bi50YWJsZVwiKSh0LCB1KSArIGBcblxuYCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJjb2RlXCI6XG4gICAgICAgICAgaSA9IGEuc3ViUGFyc2VyKFwibWFrZU1hcmtkb3duLmNvZGVTcGFuXCIpKHQsIHUpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiZW1cIjpcbiAgICAgICAgY2FzZSBcImlcIjpcbiAgICAgICAgICBpID0gYS5zdWJQYXJzZXIoXCJtYWtlTWFya2Rvd24uZW1waGFzaXNcIikodCwgdSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJzdHJvbmdcIjpcbiAgICAgICAgY2FzZSBcImJcIjpcbiAgICAgICAgICBpID0gYS5zdWJQYXJzZXIoXCJtYWtlTWFya2Rvd24uc3Ryb25nXCIpKHQsIHUpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiZGVsXCI6XG4gICAgICAgICAgaSA9IGEuc3ViUGFyc2VyKFwibWFrZU1hcmtkb3duLnN0cmlrZXRocm91Z2hcIikodCwgdSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJhXCI6XG4gICAgICAgICAgaSA9IGEuc3ViUGFyc2VyKFwibWFrZU1hcmtkb3duLmxpbmtzXCIpKHQsIHUpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiaW1nXCI6XG4gICAgICAgICAgaSA9IGEuc3ViUGFyc2VyKFwibWFrZU1hcmtkb3duLmltYWdlXCIpKHQsIHUpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGkgPSB0Lm91dGVySFRNTCArIGBcblxuYDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBpO1xuICAgIH0pLCBhLnN1YlBhcnNlcihcIm1ha2VNYXJrZG93bi5wYXJhZ3JhcGhcIiwgZnVuY3Rpb24odCwgdSkge1xuICAgICAgdmFyIHMgPSBcIlwiO1xuICAgICAgaWYgKHQuaGFzQ2hpbGROb2RlcygpKVxuICAgICAgICBmb3IgKHZhciBpID0gdC5jaGlsZE5vZGVzLCBjID0gaS5sZW5ndGgsIG0gPSAwOyBtIDwgYzsgKyttKVxuICAgICAgICAgIHMgKz0gYS5zdWJQYXJzZXIoXCJtYWtlTWFya2Rvd24ubm9kZVwiKShpW21dLCB1KTtcbiAgICAgIHJldHVybiBzID0gcy50cmltKCksIHM7XG4gICAgfSksIGEuc3ViUGFyc2VyKFwibWFrZU1hcmtkb3duLnByZVwiLCBmdW5jdGlvbih0LCB1KSB7XG4gICAgICB2YXIgcyA9IHQuZ2V0QXR0cmlidXRlKFwicHJlbnVtXCIpO1xuICAgICAgcmV0dXJuIFwiPHByZT5cIiArIHUucHJlTGlzdFtzXSArIFwiPC9wcmU+XCI7XG4gICAgfSksIGEuc3ViUGFyc2VyKFwibWFrZU1hcmtkb3duLnN0cmlrZXRocm91Z2hcIiwgZnVuY3Rpb24odCwgdSkge1xuICAgICAgdmFyIHMgPSBcIlwiO1xuICAgICAgaWYgKHQuaGFzQ2hpbGROb2RlcygpKSB7XG4gICAgICAgIHMgKz0gXCJ+flwiO1xuICAgICAgICBmb3IgKHZhciBpID0gdC5jaGlsZE5vZGVzLCBjID0gaS5sZW5ndGgsIG0gPSAwOyBtIDwgYzsgKyttKVxuICAgICAgICAgIHMgKz0gYS5zdWJQYXJzZXIoXCJtYWtlTWFya2Rvd24ubm9kZVwiKShpW21dLCB1KTtcbiAgICAgICAgcyArPSBcIn5+XCI7XG4gICAgICB9XG4gICAgICByZXR1cm4gcztcbiAgICB9KSwgYS5zdWJQYXJzZXIoXCJtYWtlTWFya2Rvd24uc3Ryb25nXCIsIGZ1bmN0aW9uKHQsIHUpIHtcbiAgICAgIHZhciBzID0gXCJcIjtcbiAgICAgIGlmICh0Lmhhc0NoaWxkTm9kZXMoKSkge1xuICAgICAgICBzICs9IFwiKipcIjtcbiAgICAgICAgZm9yICh2YXIgaSA9IHQuY2hpbGROb2RlcywgYyA9IGkubGVuZ3RoLCBtID0gMDsgbSA8IGM7ICsrbSlcbiAgICAgICAgICBzICs9IGEuc3ViUGFyc2VyKFwibWFrZU1hcmtkb3duLm5vZGVcIikoaVttXSwgdSk7XG4gICAgICAgIHMgKz0gXCIqKlwiO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHM7XG4gICAgfSksIGEuc3ViUGFyc2VyKFwibWFrZU1hcmtkb3duLnRhYmxlXCIsIGZ1bmN0aW9uKHQsIHUpIHtcbiAgICAgIHZhciBzID0gXCJcIiwgaSA9IFtbXSwgW11dLCBjID0gdC5xdWVyeVNlbGVjdG9yQWxsKFwidGhlYWQ+dHI+dGhcIiksIG0gPSB0LnF1ZXJ5U2VsZWN0b3JBbGwoXCJ0Ym9keT50clwiKSwgaCwgQztcbiAgICAgIGZvciAoaCA9IDA7IGggPCBjLmxlbmd0aDsgKytoKSB7XG4gICAgICAgIHZhciBVID0gYS5zdWJQYXJzZXIoXCJtYWtlTWFya2Rvd24udGFibGVDZWxsXCIpKGNbaF0sIHUpLCBIID0gXCItLS1cIjtcbiAgICAgICAgaWYgKGNbaF0uaGFzQXR0cmlidXRlKFwic3R5bGVcIikpIHtcbiAgICAgICAgICB2YXIgViA9IGNbaF0uZ2V0QXR0cmlidXRlKFwic3R5bGVcIikudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9cXHMvZywgXCJcIik7XG4gICAgICAgICAgc3dpdGNoIChWKSB7XG4gICAgICAgICAgICBjYXNlIFwidGV4dC1hbGlnbjpsZWZ0O1wiOlxuICAgICAgICAgICAgICBIID0gXCI6LS0tXCI7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcInRleHQtYWxpZ246cmlnaHQ7XCI6XG4gICAgICAgICAgICAgIEggPSBcIi0tLTpcIjtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwidGV4dC1hbGlnbjpjZW50ZXI7XCI6XG4gICAgICAgICAgICAgIEggPSBcIjotLS06XCI7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpWzBdW2hdID0gVS50cmltKCksIGlbMV1baF0gPSBIO1xuICAgICAgfVxuICAgICAgZm9yIChoID0gMDsgaCA8IG0ubGVuZ3RoOyArK2gpIHtcbiAgICAgICAgdmFyIEcgPSBpLnB1c2goW10pIC0gMSwgXyA9IG1baF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJ0ZFwiKTtcbiAgICAgICAgZm9yIChDID0gMDsgQyA8IGMubGVuZ3RoOyArK0MpIHtcbiAgICAgICAgICB2YXIgcSA9IFwiIFwiO1xuICAgICAgICAgIHR5cGVvZiBfW0NdIDwgXCJ1XCIgJiYgKHEgPSBhLnN1YlBhcnNlcihcIm1ha2VNYXJrZG93bi50YWJsZUNlbGxcIikoX1tDXSwgdSkpLCBpW0ddLnB1c2gocSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHZhciBKID0gMztcbiAgICAgIGZvciAoaCA9IDA7IGggPCBpLmxlbmd0aDsgKytoKVxuICAgICAgICBmb3IgKEMgPSAwOyBDIDwgaVtoXS5sZW5ndGg7ICsrQykge1xuICAgICAgICAgIHZhciBaID0gaVtoXVtDXS5sZW5ndGg7XG4gICAgICAgICAgWiA+IEogJiYgKEogPSBaKTtcbiAgICAgICAgfVxuICAgICAgZm9yIChoID0gMDsgaCA8IGkubGVuZ3RoOyArK2gpIHtcbiAgICAgICAgZm9yIChDID0gMDsgQyA8IGlbaF0ubGVuZ3RoOyArK0MpXG4gICAgICAgICAgaCA9PT0gMSA/IGlbaF1bQ10uc2xpY2UoLTEpID09PSBcIjpcIiA/IGlbaF1bQ10gPSBhLmhlbHBlci5wYWRFbmQoaVtoXVtDXS5zbGljZSgtMSksIEogLSAxLCBcIi1cIikgKyBcIjpcIiA6IGlbaF1bQ10gPSBhLmhlbHBlci5wYWRFbmQoaVtoXVtDXSwgSiwgXCItXCIpIDogaVtoXVtDXSA9IGEuaGVscGVyLnBhZEVuZChpW2hdW0NdLCBKKTtcbiAgICAgICAgcyArPSBcInwgXCIgKyBpW2hdLmpvaW4oXCIgfCBcIikgKyBgIHxcbmA7XG4gICAgICB9XG4gICAgICByZXR1cm4gcy50cmltKCk7XG4gICAgfSksIGEuc3ViUGFyc2VyKFwibWFrZU1hcmtkb3duLnRhYmxlQ2VsbFwiLCBmdW5jdGlvbih0LCB1KSB7XG4gICAgICB2YXIgcyA9IFwiXCI7XG4gICAgICBpZiAoIXQuaGFzQ2hpbGROb2RlcygpKVxuICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgIGZvciAodmFyIGkgPSB0LmNoaWxkTm9kZXMsIGMgPSBpLmxlbmd0aCwgbSA9IDA7IG0gPCBjOyArK20pXG4gICAgICAgIHMgKz0gYS5zdWJQYXJzZXIoXCJtYWtlTWFya2Rvd24ubm9kZVwiKShpW21dLCB1LCAhMCk7XG4gICAgICByZXR1cm4gcy50cmltKCk7XG4gICAgfSksIGEuc3ViUGFyc2VyKFwibWFrZU1hcmtkb3duLnR4dFwiLCBmdW5jdGlvbih0KSB7XG4gICAgICB2YXIgdSA9IHQubm9kZVZhbHVlO1xuICAgICAgcmV0dXJuIHUgPSB1LnJlcGxhY2UoLyArL2csIFwiIFwiKSwgdSA9IHUucmVwbGFjZSgvXHUwMEE4TkJTUDsvZywgXCIgXCIpLCB1ID0gYS5oZWxwZXIudW5lc2NhcGVIVE1MRW50aXRpZXModSksIHUgPSB1LnJlcGxhY2UoLyhbKl9+fGBdKS9nLCBcIlxcXFwkMVwiKSwgdSA9IHUucmVwbGFjZSgvXihcXHMqKT4vZywgXCJcXFxcJDE+XCIpLCB1ID0gdS5yZXBsYWNlKC9eIy9nbSwgXCJcXFxcI1wiKSwgdSA9IHUucmVwbGFjZSgvXihcXHMqKShbLT1dezMsfSkoXFxzKikkLywgXCIkMVxcXFwkMiQzXCIpLCB1ID0gdS5yZXBsYWNlKC9eKCB7MCwzfVxcZCspXFwuL2dtLCBcIiQxXFxcXC5cIiksIHUgPSB1LnJlcGxhY2UoL14oIHswLDN9KShbKy1dKS9nbSwgXCIkMVxcXFwkMlwiKSwgdSA9IHUucmVwbGFjZSgvXShbXFxzXSopXFwoL2csIFwiXFxcXF0kMVxcXFwoXCIpLCB1ID0gdS5yZXBsYWNlKC9eIHswLDN9XFxbKFtcXFMgXFx0XSo/KV06L2dtLCBcIlxcXFxbJDFdOlwiKSwgdTtcbiAgICB9KTtcbiAgICB2YXIgRCA9IHRoaXM7XG4gICAgZS5leHBvcnRzID8gZS5leHBvcnRzID0gYSA6IEQuc2hvd2Rvd24gPSBhO1xuICB9KS5jYWxsKEVuKTtcbn0pKEdvKTtcbmNsYXNzICRuIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgYmUodGhpcywgXCJsb2dnZXJcIik7XG4gICAgYmUodGhpcywgXCJjb252ZXJ0ZXJcIik7XG4gICAgdGhpcy5sb2dnZXIgPSBNYS56aGlMb2coXCJzaG93ZG93bi1hZGFwdG9yXCIpLCB0aGlzLmNvbnZlcnRlciA9IG5ldyBOdC5Db252ZXJ0ZXIoKTtcbiAgfVxuICBpc0F2YWlsYWJsZSgpIHtcbiAgICByZXR1cm4gdHlwZW9mIE50IDwgXCJ1XCI7XG4gIH1cbiAgcmVuZGVyTWFya2Rvd25TdHIocikge1xuICAgIGlmICghdGhpcy5pc0F2YWlsYWJsZSgpKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiU2hvd2Rvd24gaXMgbm90IGF2YWlsYWJsZVwiKTtcbiAgICByZXR1cm4gdGhpcy5sb2dnZXIuaW5mbyhcIlNob3dkb3duIGlzIHJlbmRlcmluZyBtZCB0byBIVE1MLi4uXCIpLCBQcm9taXNlLnJlc29sdmUodGhpcy5jb252ZXJ0ZXIubWFrZUh0bWwocikpO1xuICB9XG59XG5jbGFzcyBjcyB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIGJlKHRoaXMsIFwibG9nZ2VyXCIpO1xuICAgIGJlKHRoaXMsIFwibWRBZGFwdG9yXCIsIG5ldyAkbigpKTtcbiAgICB0aGlzLmxvZ2dlciA9IE1hLnpoaUxvZyhcIm1hcmtkb3duLXV0aWxcIik7XG4gIH1cbiAgLyoqXG4gICAqIFx1ODNCN1x1NTNENlx1NUY1M1x1NTI0RCBNRCBcdTg5RTNcdTY3OTBcdTU2NjhcdTU0MERcdTc5RjBcbiAgICovXG4gIGdldEN1cnJlbnRBZGFwdG9yTmFtZSgpIHtcbiAgICByZXR1cm4gdGhpcy5tZEFkYXB0b3IgaW5zdGFuY2VvZiBibiA/IFwiTHV0ZVwiIDogdGhpcy5tZEFkYXB0b3IgaW5zdGFuY2VvZiAkbiA/IFwiU2hvd2Rvd25cIiA6IFwiTm9uZVwiO1xuICB9XG4gIC8qKlxuICAgKiBcdTZFMzJcdTY3RDNNYXJrZG93blxuICAgKlxuICAgKiBAcGFyYW0gbWQgLSBNYXJrZG93blx1NjU4N1x1NjcyQ1xuICAgKi9cbiAgYXN5bmMgcmVuZGVySFRNTChyKSB7XG4gICAgY29uc3QgbiA9IG5ldyBibigpO1xuICAgIHJldHVybiB0aGlzLmxvZ2dlci5kZWJ1ZyhcIkx1dGUgc3RhdHVzID0+XCIsIG4uaXNBdmFpbGFibGUoKSksIG4uaXNBdmFpbGFibGUoKSAmJiAodGhpcy5tZEFkYXB0b3IgPSBuKSwgdGhpcy5sb2dnZXIuaW5mbyhgVXNpbmcgJHt0aGlzLmdldEN1cnJlbnRBZGFwdG9yTmFtZSgpfSBhcyBtYXJrZG93biByZW5kZXJlcmApLCBhd2FpdCB0aGlzLm1kQWRhcHRvci5yZW5kZXJNYXJrZG93blN0cihyKTtcbiAgfVxufVxuY2xhc3MgS28ge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBiZSh0aGlzLCBcIm1kVXRpbFwiKTtcbiAgICB0aGlzLm1kVXRpbCA9IG5ldyBjcygpO1xuICB9XG4gIC8qKlxuICAgKiBcdTc5RkJcdTk2NjRcdTY4MDdcdTk4OThcdTY1NzBcdTVCNTdcbiAgICpcbiAgICogQHBhcmFtIHN0ciAtIFx1NUI1N1x1N0IyNlx1NEUzMlxuICAgKi9cbiAgcmVtb3ZlVGl0bGVOdW1iZXIocikge1xuICAgIGxldCBuID0gcjtcbiAgICBjb25zdCBhID0gLyhbMC05XSopXFwuLztcbiAgICByZXR1cm4gbiA9IG4ucmVwbGFjZShhLCBcIlwiKSwgbjtcbiAgfVxuICAvKipcbiAgICogXHU1MjIwXHU5NjY0XHU2MzAyXHU0RUY2XHU3Njg0SFRNTFxuICAgKlxuICAgKiBAcGFyYW0gc3RyIC0gXHU1MzlGXHU1QjU3XHU3QjI2XG4gICAqL1xuICByZW1vdmVXaWRnZXRUYWcocikge1xuICAgIGxldCBuID0gci50b1N0cmluZygpO1xuICAgIGNvbnN0IGEgPSAvPGlmcmFtZS4qc3JjPVwiXFwvd2lkZ2V0c1xcL3B1Ymxpc2hlci4qPFxcL2lmcmFtZT4vZztcbiAgICBuID0gbi5yZXBsYWNlKGEsIFwiXCIpO1xuICAgIGNvbnN0IGQgPSAvPGlmcmFtZS4qc3JjPVwiXFwvd2lkZ2V0c1xcL3N5LXBvc3QtcHVibGlzaGVyLio8XFwvaWZyYW1lPi9nO1xuICAgIG4gPSBuLnJlcGxhY2UoZCwgXCJcIik7XG4gICAgY29uc3QgbyA9IC88aWZyYW1lLipcXC93aWRnZXRzXFwvTm90ZSpcXHNBdHRycy4qXFwvaWZyYW1lPi9nO1xuICAgIHJldHVybiBuID0gbi5yZXBsYWNlKG8sIFwiXCIpLCBuO1xuICB9XG4gIC8qKlxuICAgKiBcdTUyMjBcdTk2NjRNYXJrZG93blx1NjU4N1x1NjcyQ1x1NzY4NFx1NjMwMlx1NEVGNlx1NzY4NEhUTUxcbiAgICpcbiAgICogQHBhcmFtIHN0ciAtIFx1NTM5Rlx1NUI1N1x1N0IyNlxuICAgKi9cbiAgcmVtb3ZlTWRXaWRnZXRUYWcocikge1xuICAgIGxldCBuID0gci50b1N0cmluZygpO1xuICAgIHJldHVybiBuID0gdGhpcy5yZW1vdmVXaWRnZXRUYWcobiksIG47XG4gIH1cbiAgLyoqXG4gICAqIFx1NTNCQlx1OTY2NGh0bWxcdTY4MDdcdTdCN0VcdUZGMENcdTZCOEJcdTdGM0FcdTRFMERcdTUxNjhcdTRFNUZcdTUzRUZcdTRFRTVcbiAgICpcbiAgICogQHBhcmFtIHN0ciAtIFx1NUI1N1x1N0IyNlx1NEUzMlxuICAgKi9cbiAgZmlsdGVySHRtbChyKSB7XG4gICAgciA9IHIucmVwbGFjZSgvPHN0eWxlKCgufFxcbnxcXHIpKj8pPFxcL3N0eWxlPi9nLCBcIlwiKSwgciA9IHIucmVwbGFjZSgvPHNjcmlwdCgoLnxcXG58XFxyKSo/KTxcXC9zY3JpcHQ+L2csIFwiXCIpLCByID0gci5yZXBsYWNlKC88W14+XSo+L2csIFwiXCIpLCByID0gci5yZXBsYWNlKC8mLio7L2csIFwiXCIpLCByID0gci5yZXBsYWNlKC8oXlxccyopfChcXHMqJCkvZywgXCJcIiksIHIgPSByLnJlcGxhY2UoLzwvZywgXCJcIikucmVwbGFjZSgvPi9nLCBcIlwiKSwgciA9IHIucmVwbGFjZSgvXCIvZywgXCJcIikucmVwbGFjZSgvJy9nLCBcIlwiKSwgciA9IHIucmVwbGFjZSgvXFwqL2csIFwiXCIpLCByID0gci5yZXBsYWNlKC9cXCQvZywgXCJcIiksIHIgPSByLnJlcGxhY2UoL1xcLi9nLCBcIlwiKSwgciA9IHIucmVwbGFjZSgvXFwrL2csIFwiXCIpLCByID0gci5yZXBsYWNlKC9cXHMrL2csIFwiXCIpLCByID0gci5yZXBsYWNlKC9bOnxcdUZGMUFdL2csIFwiX1wiKSwgciA9IHIucmVwbGFjZSgvWzt8XHVGRjFCXS9nLCBcIl9cIiksIHIgPSByLnJlcGxhY2UoL1xcXi9nLCBcIl9cIiksIHIgPSByLnJlcGxhY2UoLyEvZywgXCJfXCIpLCByID0gci5yZXBsYWNlKC9AL2csIFwiYXRfXCIpO1xuICAgIGNvbnN0IG4gPSBbXCJcXFxcZCovXFxcXGQvXFxcXGQqXCIsIFwiW1x1MzAwMXxcXFxcXFxcXF1cIiwgXCJbXHVGRjBDfCxdXCIsIFwiXFxcXGRcIiwgXCIvXCIsIFwiLVwiXTtcbiAgICBmb3IgKGxldCBhID0gMDsgYSA8IG4ubGVuZ3RoOyBhKyspIHtcbiAgICAgIGNvbnN0IGQgPSBuZXcgUmVnRXhwKG5bYV0sIFwiZ1wiKTtcbiAgICAgIHIgPSByLnJlcGxhY2UoZCwgXCJcIik7XG4gICAgfVxuICAgIHJldHVybiByID0gci50b0xvd2VyQ2FzZSgpLCByO1xuICB9XG4gIC8qKlxuICAgKiBcdTYyMkFcdTUzRDZcdTYzMDdcdTVCOUFcdTk1N0ZcdTVFQTZodG1sXG4gICAqXG4gICAqIEBwYXJhbSBodG1sIC0gaHRtbFxuICAgKiBAcGFyYW0gbGVuZ3RoIC0gXHU5NTdGXHU1RUE2XG4gICAqIEBwYXJhbSBpZ25vcmUgLSBcdTRFMERcdTg5ODFcdTdFRDNcdTVDM0VcdTc3MDFcdTc1NjVcdTUzRjdcbiAgICovXG4gIHBhcnNlSHRtbChyLCBuLCBhKSB7XG4gICAgY29uc3QgZCA9IHRoaXMuZmlsdGVySHRtbChyKTtcbiAgICByZXR1cm4gZC5sZW5ndGggPCBuID8gZCA6IGEgPT09ICEwID8gZC5zdWJzdHJpbmcoMCwgbikgOiBkLnN1YnN0cmluZygwLCBuKSArIFwiLi4uXCI7XG4gIH1cbiAgLyoqXG4gICAqIFx1NUMwNk1hcmtkb3duXHU4RjZDXHU2MzYyXHU0RTNBSFRNTFxuICAgKlxuICAgKiBAcGFyYW0gbWQgLSBNYXJrZG93blxuICAgKi9cbiAgYXN5bmMgbWRUb0h0bWwocikge1xuICAgIGNvbnN0IG4gPSBhd2FpdCB0aGlzLm1kVXRpbC5yZW5kZXJIVE1MKHIpO1xuICAgIHJldHVybiB0aGlzLnJlbW92ZVdpZGdldFRhZyhuKTtcbiAgfVxuICAvKipcbiAgICogXHU1QzA2TWFya2Rvd25cdThGNkNcdTYzNjJcdTRFM0FcdTdFQUZcdTY1ODdcdTY3MkNcbiAgICpcbiAgICogQHBhcmFtIG1kIC0gTWFya2Rvd25cbiAgICovXG4gIGFzeW5jIG1kVG9QbGFpblRleHQocikge1xuICAgIGNvbnN0IG4gPSBhd2FpdCB0aGlzLm1kVG9IdG1sKHIpO1xuICAgIHJldHVybiB0aGlzLmZpbHRlckh0bWwobik7XG4gIH1cbiAgLyoqXG4gICAqIFx1NzlGQlx1OTY2NEgxXHU2ODA3XHU3QjdFXG4gICAqXG4gICAqIEBwYXJhbSBodG1sIC0gaHRtbFxuICAgKi9cbiAgcmVtb3ZlSDEocikge1xuICAgIGxldCBuID0gcjtcbiAgICBjb25zdCBhID0gLzxoMS4qXFwvaDE+L2c7XG4gICAgcmV0dXJuIG4gPSBuLnJlcGxhY2UoYSwgXCJcIiksIG47XG4gIH1cbiAgLyoqXG4gICAqIFx1NzlGQlx1OTY2NE1hcmtkb3duXHU5MUNDXHU5NzYyXHU3Njg0SDFcdTY4MDdcdTdCN0VcbiAgICpcbiAgICogSmF2YVNjcmlwdCBcdTZCNjNcdTUyMTlcdTg4NjhcdThGQkVcdTVGMEZcdTUzRUZcdTRFRTVcdTc1MjhcdTY3NjVcdTUyMjBcdTk2NjRcdTYyNDBcdTY3MDkgTWFya2Rvd24gXHU0RTJEXHU3Njg0IGgxIFx1NjgwN1x1N0I3RVx1MzAwMlx1NEUwQlx1OTc2Mlx1NjYyRlx1NEUwMFx1NEUyQVx1NzkzQVx1NEY4Qlx1NEVFM1x1NzgwMVx1RkYxQVxuICAgKlxuICAgKiBjb25zdCBzdHIgPSBcIiMgVGhpcyBpcyBhbiBIMVxcbiMjIFRoaXMgaXMgYW4gSDJcXG4jIyMgVGhpcyBpcyBhbiBIM1wiO1xuICAgKlxuICAgKiBjb25zdCByZWdleCA9IC9eIyAuKiQvZ207XG4gICAqIGNvbnN0IHJlc3VsdCA9IHN0ci5yZXBsYWNlKHJlZ2V4LCAnJyk7XG4gICAqXG4gICAqIGNvbnNvbGUubG9nKHJlc3VsdCk7XG4gICAqIFx1NTcyOFx1OEZEOVx1NEUyQVx1NEY4Qlx1NUI1MFx1NEUyRFx1RkYwQ1x1NjIxMVx1NEVFQ1x1NEY3Rlx1NzUyOFx1NkI2M1x1NTIxOVx1ODg2OFx1OEZCRVx1NUYwRiAvXiMgLiokL2dtIFx1Njc2NVx1NTMzOVx1OTE0RFx1NjI0MFx1NjcwOVx1NzY4NCBoMSBcdTY4MDdcdTdCN0VcdTMwMDJcbiAgICogXHU1NzI4IEphdmFTY3JpcHQgXHU0RTJEXHVGRjBDXiBcdTUzMzlcdTkxNERcdTg4NENcdTk5OTZcdUZGMEMjIFx1NTMzOVx1OTE0RCAjIFx1NUI1N1x1N0IyNlx1RkYwQy4qIFx1NTMzOVx1OTE0RFx1NEVGQlx1NjEwRlx1NUI1N1x1N0IyNlx1RkYwQyQgXHU1MzM5XHU5MTREXHU4ODRDXHU1QzNFXHVGRjBDbSBcdTY4MDdcdThCQjBcdTg4NjhcdTc5M0FcdTU5MUFcdTg4NENcdTZBMjFcdTVGMEZcdTMwMDJcbiAgICovXG4gIHJlbW92ZU1kSDEocikge1xuICAgIGxldCBuID0gcjtcbiAgICBjb25zdCBhID0gL14jIC4qJC9nbTtcbiAgICByZXR1cm4gbiA9IG4ucmVwbGFjZShhLCBcIlwiKSwgbjtcbiAgfVxufVxuY2xhc3MgV28ge1xuICAvKipcbiAgICogXHU2OEMwXHU2RDRCXHU2NjJGXHU1NDI2XHU2NjJGXHU3QTdBXHU1QkY5XHU4QzYxXG4gICAqXG4gICAqIEBwYXJhbSBvYmogLSBcdTVCRjlcdThDNjFcbiAgICovXG4gIGlzRW1wdHlPYmplY3Qocikge1xuICAgIHJldHVybiByID8gT2JqZWN0LmdldFByb3RvdHlwZU9mKHIpID09PSBPYmplY3QucHJvdG90eXBlICYmIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHIpLmxlbmd0aCA9PT0gMCAmJiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHIpLmxlbmd0aCA9PT0gMCA6ICEwO1xuICB9XG59XG5jbGFzcyBKbyB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIGJlKHRoaXMsIFwiZGF0ZVV0aWxcIik7XG4gICAgYmUodGhpcywgXCJzdHJVdGlsXCIpO1xuICAgIGJlKHRoaXMsIFwidmVyc2lvblV0aWxcIik7XG4gICAgYmUodGhpcywgXCJodG1sVXRpbFwiKTtcbiAgICBiZSh0aGlzLCBcIm1hcmtkb3duVXRpbFwiKTtcbiAgICBiZSh0aGlzLCBcImpzb25VdGlsXCIpO1xuICAgIGJlKHRoaXMsIFwib2JqZWN0VXRpbFwiKTtcbiAgICB0aGlzLmRhdGVVdGlsID0gbmV3IHlvKCksIHRoaXMuc3RyVXRpbCA9IG5ldyB3bygpLCB0aGlzLnZlcnNpb25VdGlsID0gbmV3IGtvKCksIHRoaXMuaHRtbFV0aWwgPSBuZXcgS28oKSwgdGhpcy5tYXJrZG93blV0aWwgPSBuZXcgY3MoKSwgdGhpcy5qc29uVXRpbCA9IG5ldyB2bygpLCB0aGlzLm9iamVjdFV0aWwgPSBuZXcgV28oKTtcbiAgfVxufVxuY29uc3QgWm8gPSBKbztcbmV4cG9ydCB7XG4gIFpvIGFzIFpoaUNvbW1vbixcbiAgeXQgYXMgWmhpVXRpbFxufTtcbiIsICJ2YXIgXyA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eTtcbnZhciBEID0gKGksIHQsIGUpID0+IHQgaW4gaSA/IF8oaSwgdCwgeyBlbnVtZXJhYmxlOiAhMCwgY29uZmlndXJhYmxlOiAhMCwgd3JpdGFibGU6ICEwLCB2YWx1ZTogZSB9KSA6IGlbdF0gPSBlO1xudmFyIHIgPSAoaSwgdCwgZSkgPT4gKEQoaSwgdHlwZW9mIHQgIT0gXCJzeW1ib2xcIiA/IHQgKyBcIlwiIDogdCwgZSksIGUpO1xuY2xhc3MgRSB7XG59XG4vKipcbiAqIE5vZGVcdTczQUZcdTU4ODNcbiAqL1xucihFLCBcIk5PREVfRU5WX0tFWVwiLCBcIk5PREVfRU5WXCIpLCAvKipcbiAqIFx1NUYwMFx1NTNEMVx1NzNBRlx1NTg4M1xuICovXG5yKEUsIFwiTk9ERV9FTlZfREVWRUxPUE1FTlRcIiwgXCJkZXZlbG9wbWVudFwiKSwgLyoqXG4gKiBcdTc1MUZcdTRFQTdcdTczQUZcdTU4ODNcbiAqL1xucihFLCBcIk5PREVfRU5WX1BST0RVQ1RJT05cIiwgXCJwcm9kdWN0aW9uXCIpLCAvKipcbiAqIFx1NkQ0Qlx1OEJENVx1NzNBRlx1NTg4M1xuICovXG5yKEUsIFwiTk9ERV9FTlZfVEVTVFwiLCBcInRlc3RcIiksIC8qKlxuICogXHU2NjJGXHU1NDI2XHU1OTA0XHU0RThFXHU4QzAzXHU4QkQ1XHU2QTIxXHU1RjBGXG4gKi9cbnIoRSwgXCJWSVRFX0RFQlVHX01PREVfS0VZXCIsIFwiVklURV9ERUJVR19NT0RFXCIpO1xuY2xhc3MgTiB7XG4gIC8qKlxuICAgKiBcdTczQUZcdTU4ODNcdTUyMURcdTU5Q0JcdTUzMTZcbiAgICpcbiAgICogQHBhcmFtIGVudk1ldGEgLSBcdTk3MDBcdTg5ODFcdTRGMjBcdTUxNjUge1wiQkFTRV9VUkxcIjpcIi9cIixcIk1PREVcIjpcInByb2R1Y3Rpb25cIixcIkRFVlwiOmZhbHNlLFwiUFJPRFwiOnRydWUsXCJTU1JcIjpmYWxzZX0gXHUzMDAyXHU3Mjc5XHU1MjJCXHU2M0QwXHU5MTkyXHVGRjFBXHU2QjY0XHU1M0MyXHU2NTcwXHU2NjJGXHU5NzU5XHU2MDAxXHU1MTQzXHU2NTcwXHU2MzZFXHVGRjBDXHU1M0Q2XHU1MUIzXHU0RThFXHU2NzAwXHU3RUM4XHU0RjdGXHU3NTI4XHU3Njg0XHU5ODc5XHU3NkVFXHUzMDAyXHU1NkUwXHU2QjY0XHU0RUM1XHU0RUM1XHU1NzI4XHU2NzAwXHU3RUM4XHU0RjdGXHU3NTI4XHU3Njg0XHU1NzMwXHU2NUI5XHU2NjNFXHU3OTNBXHU0RjIwXHU5MDEyXHU2QjY0XHU1MDNDXHVGRjBDXHU0RTJEXHU5NUY0XHU5ODc5XHU3NkVFXHU4QkY3XHU0RkREXHU2MzAxXHU1M0MyXHU2NTcwXHU0RjIwXHU5MDEyXG4gICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vdml0ZWpzLmRldi9ndWlkZS9lbnYtYW5kLW1vZGUuaHRtbCNwcm9kdWN0aW9uLXJlcGxhY2VtZW50fVxuICAgKi9cbiAgY29uc3RydWN0b3IodCkge1xuICAgIHIodGhpcywgXCJlbnZNZXRhXCIpO1xuICAgIHRoaXMuZW52TWV0YSA9IHQ7XG4gIH1cbiAgLyoqXG4gICAqIFx1NjYyRlx1NTQyNlx1NjYyRlx1NUYwMFx1NTNEMVx1OTYzNlx1NkJCNVx1OEMwM1x1OEJENVxuICAgKi9cbiAgaXNOb2RlRGV2KCkge1xuICAgIHJldHVybiB0aGlzLmdldEVudihFLk5PREVfRU5WX0tFWSkgPT09IEUuTk9ERV9FTlZfREVWRUxPUE1FTlQ7XG4gIH1cbiAgLyoqXG4gICAqIFx1NjYyRlx1NTQyNlx1NjYyRlx1OEMwM1x1OEJENVx1OTYzNlx1NkJCNVxuICAgKi9cbiAgaXNEZXYoKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNOb2RlRGV2KCkgfHwgdGhpcy5nZXRCb29sZWFuRW52KEUuVklURV9ERUJVR19NT0RFX0tFWSk7XG4gIH1cbiAgLyoqXG4gICAqIFx1ODNCN1x1NTNENlx1NzNBRlx1NTg4M1x1NTNEOFx1OTFDRlx1RkYwQ2tleVx1NEUwRFx1NUI1OFx1NTcyOFx1OEZENFx1NTZERXVuZGVmaW5lZFxuICAgKiBAcGFyYW0ga2V5IC0ga2V5XG4gICAqL1xuICBnZXRFbnYodCkge1xuICAgIGxldCBlO1xuICAgIHRyeSB7XG4gICAgICB0aGlzLmVudk1ldGFbdF0gJiYgKGUgPSB0aGlzLmVudk1ldGFbdF0pO1xuICAgIH0gY2F0Y2gge1xuICAgIH1cbiAgICByZXR1cm4gZTtcbiAgfVxuICAvKipcbiAgICogXHU4M0I3XHU1M0Q2U3RyaW5nXHU3QzdCXHU1NzhCXHU3Njg0XHU3M0FGXHU1ODgzXHU1M0Q4XHU5MUNGXHVGRjBDa2V5XHU0RTBEXHU1QjU4XHU1NzI4XHU3NkY0XHU2M0E1XHU4RkQ0XHU1NkRFXHU3QTdBXHU1MDNDXG4gICAqIEBwYXJhbSBrZXkgLSBrZXlcbiAgICovXG4gIGdldFN0cmluZ0Vudih0KSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0RW52KHQpID8/IFwiXCI7XG4gIH1cbiAgLyoqXG4gICAqIFx1ODNCN1x1NTNENkJvb2xlYW5cdTdDN0JcdTU3OEJcdTc2ODRcdTczQUZcdTU4ODNcdTUzRDhcdTkxQ0ZcdUZGMENrZXlcdTRFMERcdTVCNThcdTU3MjhcdThGRDRcdTU2REVmYWxzZVxuICAgKiBAcGFyYW0ga2V5IC0ga2V5XG4gICAqL1xuICBnZXRCb29sZWFuRW52KHQpIHtcbiAgICBsZXQgZSA9ICExO1xuICAgIHJldHVybiB0aGlzLmdldEVudih0KSAmJiAoZSA9IHRoaXMuZ2V0U3RyaW5nRW52KHQpLnRvTG93ZXJDYXNlKCkgPT09IFwidHJ1ZVwiKSwgZTtcbiAgfVxuICAvKipcbiAgICogXHU4M0I3XHU1M0Q2XHU3M0FGXHU1ODgzXHU1M0Q4XHU5MUNGXHVGRjBDXHU1OTgyXHU2NzlDXHU2NzJBXHU1QjlBXHU0RTQ5XHU2MjE2XHU4MDA1XHU0RTNBXHU3QTdBXHU1MDNDXHVGRjBDXHU3NTI4XHU2MzA3XHU1QjlBXHU3Njg0XHU5RUQ4XHU4QkE0XHU1MDNDXHU0RUUzXHU2NkZGXG4gICAqXG4gICAqIEBwYXJhbSBrZXkgLSBrZXlcbiAgICogQHBhcmFtIGRlZmF1bHRWYWx1ZSAtIFx1OUVEOFx1OEJBNFx1NTAzQ1xuICAgKiBAc2luY2UgMC4xLjBcbiAgICogQGF1dGhvciB0ZXJ3ZXJcbiAgICovXG4gIGdldEVudk9yRGVmYXVsdCh0LCBlKSB7XG4gICAgY29uc3QgbiA9IHRoaXMuZ2V0U3RyaW5nRW52KHQpO1xuICAgIHJldHVybiBuLnRyaW0oKS5sZW5ndGggPT0gMCA/IGUgOiBuO1xuICB9XG59XG5leHBvcnQge1xuICBOIGFzIEVudixcbiAgRSBhcyBFbnZDb25zdGFudHNcbn07XG4iLCAiLypcbiAqIENvcHlyaWdodCAoYykgMjAyMywgVGVyd2VyIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi5cbiAqXG4gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdFxuICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXNcbiAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgVGVyd2VyIGRlc2lnbmF0ZXMgdGhpc1xuICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlIFwiQ2xhc3NwYXRoXCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkXG4gKiBieSBUZXJ3ZXIgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS5cbiAqXG4gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVRcbiAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvclxuICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlXG4gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdFxuICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS5cbiAqXG4gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uXG4gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sXG4gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuXG4gKlxuICogUGxlYXNlIGNvbnRhY3QgVGVyd2VyLCBTaGVuemhlbiwgR3Vhbmdkb25nLCBDaGluYSwgeW91d2VpY3NAMTYzLmNvbVxuICogb3IgdmlzaXQgd3d3LnRlcndlci5zcGFjZSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yIGhhdmUgYW55XG4gKiBxdWVzdGlvbnMuXG4gKi9cblxuaW1wb3J0IHsgWmhpVXRpbCB9IGZyb20gXCJ6aGktY29tbW9uXCJcbmltcG9ydCB7IEVudiB9IGZyb20gXCJ6aGktZW52XCJcblxuLyoqXG4gKiBcdTVERTVcdTUxNzdcdTdDN0JcdTdFREZcdTRFMDBcdTUxNjVcdTUzRTNcdUZGMENcdTZCQ0ZcdTRFMkFcdTVFOTRcdTc1MjhcdTgxRUFcdTVERjFcdTVCOUVcdTczQjBcbiAqXG4gKiBAcHVibGljXG4gKiBAYXV0aG9yIHRlcndlclxuICogQHNpbmNlIDEuMC4wXG4gKi9cbmNsYXNzIFpoaVNlcnZlckVsZWN0cm9uVXRpbCBleHRlbmRzIFpoaVV0aWwge1xuICBwdWJsaWMgc3RhdGljIG92ZXJyaWRlIHpoaUVudigpOiBFbnYge1xuICAgIGlmICghdGhpcy5lbnYpIHtcbiAgICAgIHRoaXMuZW52ID0gbmV3IEVudihpbXBvcnQubWV0YS5lbnYpXG4gICAgfVxuICAgIHJldHVybiB0aGlzLmVudlxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFpoaVNlcnZlckVsZWN0cm9uVXRpbFxuIiwgInZhciBnID0gT2JqZWN0LmRlZmluZVByb3BlcnR5O1xudmFyIFAgPSAoYSwgZSwgdCkgPT4gZSBpbiBhID8gZyhhLCBlLCB7IGVudW1lcmFibGU6ICEwLCBjb25maWd1cmFibGU6ICEwLCB3cml0YWJsZTogITAsIHZhbHVlOiB0IH0pIDogYVtlXSA9IHQ7XG52YXIgciA9IChhLCBlLCB0KSA9PiAoUChhLCB0eXBlb2YgZSAhPSBcInN5bWJvbFwiID8gZSArIFwiXCIgOiBlLCB0KSwgdCk7XG5jb25zdCB1ID0gY2xhc3Mge1xuICAvKipcbiAgICogXHU2OEMwXHU2RDRCXHU2NjJGXHU1NDI2XHU4RkQwXHU4ODRDXHU1NzI4Q2hyb21lXHU2M0QyXHU0RUY2XHU0RTJEXG4gICAqL1xuICBzdGF0aWMgaXNJbkNocm9tZUV4dGVuc2lvbigpIHtcbiAgICByZXR1cm4gdS5pc0luQnJvd3NlciA/IHdpbmRvdy5sb2NhdGlvbi5ocmVmLmluZGV4T2YoXCJjaHJvbWUtZXh0ZW5zaW9uOi8vXCIpID4gLTEgOiAhMTtcbiAgfVxufTtcbmxldCBpID0gdTtcbi8qKlxuICogXHU2NjJGXHU1NDI2XHU1NzI4XHU2RDRGXHU4OUM4XHU1NjY4XHU3M0FGXHU1ODgzXG4gKi9cbnIoaSwgXCJpc05vZGVcIiwgdHlwZW9mIHByb2Nlc3MgPCBcInVcIiksIC8qKlxuICogXHU2NjJGXHU1NDI2XHU1NzI4XHU2RDRGXHU4OUM4XHU1NjY4XHU3M0FGXHU1ODgzXG4gKi9cbnIoaSwgXCJpc0luQnJvd3NlclwiLCB0eXBlb2Ygd2luZG93IDwgXCJ1XCIpLCAvKipcbiAqIFx1NkQ0Rlx1ODlDOFx1NTY2OFx1OERFRlx1NUY4NFx1NTIwNlx1OTY5NFx1N0IyNlxuICovXG5yKGksIFwiQnJvd3NlclNlcGVyYXRvclwiLCBcIi9cIiksIC8qKlxuICogXHU2NjJGXHU1NDI2XHU2NjJGRWxlY3Ryb25cdTczQUZcdTU4ODNcbiAqL1xucihpLCBcImlzRWxlY3Ryb25cIiwgKCkgPT4gIXUuaXNJbkJyb3dzZXIgfHwgIXdpbmRvdy5uYXZpZ2F0b3IgfHwgIXdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50ID8gITEgOiAvRWxlY3Ryb24vLnRlc3Qod2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQpKSwgLyoqXG4gKiBcdTY2MkZcdTU0MjZcdTY3MDlOb2RlXHU3M0FGXHU1ODgzXHVGRjBDXHU3NkVFXHU1MjREXHU1MzA1XHU2MkVDIEVsZWN0cm9uIFx1NTQ4QyBOb2RlXG4gKi9cbnIoaSwgXCJoYXNOb2RlRW52XCIsICgpID0+IHUuaXNFbGVjdHJvbigpIHx8IHUuaXNOb2RlKSwgLyoqXG4gKiBcdTgzQjdcdTUzRDZ1cmxcdTUzQzJcdTY1NzBcbiAqXG4gKiBAcGFyYW0gc1BhcmFtIC0gXHU1M0MyXHU2NTcwXG4gKi9cbnIoaSwgXCJnZXRRdWVyeVN0cmluZ1wiLCAoZSkgPT4ge1xuICBpZiAoIXUuaXNJbkJyb3dzZXIpXG4gICAgcmV0dXJuIFwiXCI7XG4gIGNvbnN0IG4gPSB3aW5kb3cubG9jYXRpb24uc2VhcmNoLnN1YnN0cmluZygxKS5zcGxpdChcIiZcIik7XG4gIGZvciAobGV0IHMgPSAwOyBzIDwgbi5sZW5ndGg7IHMrKykge1xuICAgIGNvbnN0IGMgPSBuW3NdLnNwbGl0KFwiPVwiKTtcbiAgICBpZiAoY1swXSA9PT0gZSlcbiAgICAgIHJldHVybiBjWzFdO1xuICB9XG4gIHJldHVybiBcIlwiO1xufSksIC8qKlxuICogXHU2NkZGXHU2MzYyIFVSTCBcdTc2ODRcdTUzQzJcdTY1NzBcbiAqIFx1NjAxRFx1OERFRlx1RkYxQVxuICogMS4gXHU0RjdGXHU3NTI4XHU0RTg2IFVSTFNlYXJjaFBhcmFtcyBcdTVCRjlcdThDNjFcdTY3NjVcdTg5RTNcdTY3OTBcdTU0OENcdTY3ODRcdTVFRkEgVVJMIFx1NjdFNVx1OEJFMlx1NTNDMlx1NjU3MFx1MzAwMlxuICpcbiAqIDIuIFx1NTcyOFx1NTkwNFx1NzQwNlx1NTMwNVx1NTQyQiBoYXNoIFx1NzI0N1x1NkJCNVx1NzY4NCBVUkwgXHU2NUY2XHU0RjdGXHU3NTI4XHU0RTg2IHNwbGl0IFx1NTFGRFx1NjU3MFx1NUMwNiBVUkwgXHU1MjA2XHU2MjEwXHU0RTI0XHU5MEU4XHU1MjA2XHVGRjFBXHU1N0ZBXHU2NzJDIFVSTCBcdTU0OEMgaGFzaCBcdTcyNDdcdTZCQjVcdTMwMDJcbiAqXG4gKiAzLiBcdTcxMzZcdTU0MEVcdUZGMENcdTUxOERcdTZCMjFcdTRGN0ZcdTc1Mjggc3BsaXQgXHU1MUZEXHU2NTcwXHU1QzA2XHU1N0ZBXHU2NzJDIFVSTCBcdTUyMDZcdTYyMTBcdTRFMjRcdTkwRThcdTUyMDZcdUZGMUFcdThERUZcdTVGODRcdTU0OENcdTY3RTVcdThCRTJcdTUzQzJcdTY1NzBcdTMwMDJcbiAqXG4gKiA0LiBcdTVDMDZcdTY3RTVcdThCRTJcdTUzQzJcdTY1NzBcdThGNkNcdTYzNjJcdTRFM0EgVVJMU2VhcmNoUGFyYW1zIFx1NUJGOVx1OEM2MVx1RkYwQ1x1NzEzNlx1NTQwRVx1OEJCRVx1N0Y2RVx1NjMwN1x1NUI5QVx1NzY4NFx1NTNDMlx1NjU3MFx1NTQwRFx1NTQ4Q1x1NTAzQ1x1MzAwMlxuICpcbiAqIDUuIFx1NjcwMFx1NTQwRVx1RkYwQ1x1NEY3Rlx1NzUyOCB0b1N0cmluZyBcdTUxRkRcdTY1NzBcdTVDMDZcdTY3RTVcdThCRTJcdTUzQzJcdTY1NzBcdThGNkNcdTYzNjJcdTRFM0FcdTVCNTdcdTdCMjZcdTRFMzJcdUZGMENcdTVFNzZcdTVDMDZcdTUxNzZcdTRFMEVcdThERUZcdTVGODRcdTdFQzRcdTU0MDhcdTYyMTBcdTY1QjBcdTc2ODRcdTU3RkFcdTY3MkMgVVJMXHUzMDAyXHU1OTgyXHU2NzlDIFVSTCBcdTUzMDVcdTU0MkIgaGFzaCBcdTcyNDdcdTZCQjVcdUZGMENcdTUyMTlcdTVDMDZcdTUxNzZcdTZERkJcdTUyQTBcdTUyMzBcdTY1QjBcdTc2ODRcdTU3RkFcdTY3MkMgVVJMIFx1NEUyRFx1MzAwMlxuICpcbiAqIEBwYXJhbSB1cmwgLSBcdTk0RkVcdTYzQTVcdTU3MzBcdTU3NDBcbiAqIEBwYXJhbSBwYXJhbU5hbWUgLSBcdTUzQzJcdTY1NzBcdTU0MERcbiAqIEBwYXJhbSBwYXJhbVZhbHVlIC0gXHU1M0MyXHU2NTcwXHU1MDNDXG4gKi9cbnIoaSwgXCJyZXBsYWNlVXJsUGFyYW1cIiwgKGUsIHQsIG4pID0+IHtcbiAgbiA9PSBudWxsICYmIChuID0gXCJcIik7XG4gIGNvbnN0IHMgPSBuZXcgUmVnRXhwKFwiXFxcXGIoXCIgKyB0ICsgXCI9KS4qPygmfCN8JClcIik7XG4gIGlmIChlLnNlYXJjaChzKSA+PSAwKVxuICAgIHJldHVybiBlLnJlcGxhY2UocywgXCIkMVwiICsgbiArIFwiJDJcIik7XG4gIGNvbnN0IFtjLCBkXSA9IGUuc3BsaXQoXCIjXCIpLCBbeSwgYl0gPSBjLnNwbGl0KFwiP1wiKSwgbCA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoYik7XG4gIGwuc2V0KHQsIG4pO1xuICBjb25zdCBtID0gbC50b1N0cmluZygpLCBmID0geSArIChtID8gXCI/XCIgKyBtIDogXCJcIik7XG4gIHJldHVybiBkID8gZiArIFwiI1wiICsgZCA6IGY7XG59KSwgLyoqXG4gKiBcdThCQkVcdTdGNkV1cmxcdTUzQzJcdTY1NzBcbiAqXG4gKiBAcGFyYW0gdXJsc3RyaW5nIC0gdXJsXG4gKiBAcGFyYW0ga2V5IC0ga2V5XG4gKiBAcGFyYW0gdmFsdWUgLSB2YWx1ZVxuICovXG5yKGksIFwic2V0VXJsUGFyYW1ldGVyXCIsIChlLCB0LCBuKSA9PiB7XG4gIGlmIChlLmluY2x1ZGVzKHQpKVxuICAgIHJldHVybiB1LnJlcGxhY2VVcmxQYXJhbShlLCB0LCBuKTtcbiAgY29uc3QgcyA9IGUuc3BsaXQoXCIjXCIpO1xuICBsZXQgYyA9IHNbMF07XG4gIGNvbnN0IGQgPSBzWzFdO1xuICByZXR1cm4gYy5pbmNsdWRlcyhcIj9cIikgPyBjICs9IGAmJHt0fT0ke259YCA6IGMgKz0gYD8ke3R9PSR7bn1gLCBkICYmIChjICs9IFwiI1wiICsgZCksIGM7XG59KSwgLyoqXG4gKiBcdTkxQ0RcdTY1QjBcdTUyQTBcdThGN0RcdTYzMDdcdTVCOUF0YWJcbiAqXG4gKiBAcGFyYW0gdGFibmFtZSAtIHRhYm5hbWVcbiAqIEBwYXJhbSB0IC0gXHU1RUY2XHU4RkRGXHU2NUY2XHU5NUY0XG4gKi9cbnIoaSwgXCJyZWxvYWRUYWJQYWdlXCIsIChlLCB0ID0gMjAwKSA9PiB7XG4gIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgaWYgKHUuaXNJbkJyb3dzZXIpIHtcbiAgICAgIGNvbnN0IG4gPSB3aW5kb3cubG9jYXRpb24uaHJlZjtcbiAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gdS5zZXRVcmxQYXJhbWV0ZXIobiwgXCJ0YWJcIiwgZSk7XG4gICAgfVxuICB9LCB0KTtcbn0pLCAvKipcbiAqIFx1NTIzN1x1NjVCMFx1NUY1M1x1NTI0RHRhYlx1OTg3NVx1OTc2MlxuICovXG5yKGksIFwicmVsb2FkUGFnZVwiLCAoKSA9PiB7XG4gIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgdS5pc0luQnJvd3NlciAmJiB3aW5kb3cubG9jYXRpb24ucmVsb2FkKCk7XG4gIH0sIDIwMCk7XG59KSwgLyoqXG4gKiBcdTUyMzdcdTY1QjBcdTVGNTNcdTUyNER0YWJcdTk4NzVcdTk3NjJcbiAqXG4gKiBAcGFyYW0gbXNnIC0gXHU2RDg4XHU2MDZGXHU2M0QwXHU3OTNBXG4gKiBAcGFyYW0gY2IgLSBcdTU2REVcdThDMDNcbiAqL1xucihpLCBcInJlbG9hZFBhZ2VXaXRoTWVzc2FnZUNhbGxiYWNrXCIsIChlLCB0KSA9PiB7XG4gIHQgJiYgdChlKSwgc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICB1LmlzSW5Ccm93c2VyICYmIHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKTtcbiAgfSwgMjAwKTtcbn0pO1xudmFyIG8gPSAvKiBAX19QVVJFX18gKi8gKChhKSA9PiAoYS5CYXNlUGF0aFR5cGVfQXBwZWFyYW5jZSA9IFwiQXBwZWFyYW5jZVwiLCBhLkJhc2VQYXRoVHlwZV9EYXRhID0gXCJEYXRhXCIsIGEuQmFzZVBhdGhUeXBlX1RoZW1lcyA9IFwiVGhlbWVzXCIsIGEuQmFzZVBhdGhUeXBlX1poaVRoZW1lID0gXCJaaGlUaGVtZVwiLCBhLkJhc2VQYXRoVHlwZV9Ob25lID0gXCJOb25lXCIsIGEpKShvIHx8IHt9KTtcbmNvbnN0IGggPSBjbGFzcyB7XG4gIC8qKlxuICAgKiBcdTY4QzBcdTZENEJcdTY2MkZcdTU0MjZcdThGRDBcdTg4NENcdTU3MjhcdTYwMURcdTZFOTBcdTYyNTNcdTVGMDBcdTc2ODRcdTZENEZcdTg5QzhcdTU2NjhcdTRFMkRcbiAgICovXG4gIHN0YXRpYyBpc0luU2l5dWFuQnJvd3NlcigpIHtcbiAgICByZXR1cm4gaS5pc0luQnJvd3NlciA/IHR5cGVvZiB3aW5kb3cuc2l5dWFuIDwgXCJ1XCIgJiYgdHlwZW9mIHdpbmRvdy5MdXRlIDwgXCJ1XCIgOiAhMTtcbiAgfVxuICAvKipcbiAgICogXHU2MDFEXHU2RTkwXHU3QjE0XHU4QkIwIHdpbmRvdyBcdTVCRjlcdThDNjFcbiAgICovXG4gIHN0YXRpYyBzaXl1YW5XaW5kb3coKSB7XG4gICAgbGV0IGU7XG4gICAgcmV0dXJuIHRoaXMuaXNJblNpeXVhbldpZGdldCgpID8gZSA9IHBhcmVudC53aW5kb3cgOiB0aGlzLmlzSW5TaXl1YW5OZXdXaW4oKSB8fCB0aGlzLmlzSW5TaXl1YW5Ccm93c2VyKCkgfHwgdHlwZW9mIHdpbmRvdyA8IFwidVwiID8gZSA9IHdpbmRvdyA6IGUgPSB2b2lkIDAsIGU7XG4gIH1cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyByZXF1aXJlIGVuZFxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gaW1wb3J0IHN0YXJ0XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLyoqXG4gICAqIFx1NUYxNVx1NTE2NWpzb25cbiAgICpcbiAgICogQHBhcmFtIGpzUGF0aCAtIGpzXHU3NkY4XHU1QkY5XHU4REVGXHU1Rjg0XHU1MTY4XHU4REVGXHU1Rjg0XG4gICAqIEBwYXJhbSB0eXBlIC0gXHU3QzdCXHU1NzhCXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgaW1wb3J0SnMoZSwgdCkge1xuICAgIGxldCBuID0gZTtcbiAgICBzd2l0Y2ggKHQpIHtcbiAgICAgIGNhc2Ugby5CYXNlUGF0aFR5cGVfQXBwZWFyYW5jZTpcbiAgICAgICAgbiA9IHRoaXMuYnJvd3NlckpvaW5QYXRoKHRoaXMuc2l5dWFuQXBwZWFyYW5jZVJlbGF0aXZlUGF0aCgpLCBlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIG8uQmFzZVBhdGhUeXBlX0RhdGE6XG4gICAgICAgIG4gPSB0aGlzLmJyb3dzZXJKb2luUGF0aCh0aGlzLnNpeXVhbkRhdGFSZWxhdGl2ZVBhdGgoKSwgZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBvLkJhc2VQYXRoVHlwZV9UaGVtZXM6XG4gICAgICAgIG4gPSB0aGlzLmJyb3dzZXJKb2luUGF0aCh0aGlzLnNpeXVhblRoZW1lUmVsYXRpdmVQYXRoKCksIGUpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2Ugby5CYXNlUGF0aFR5cGVfWmhpVGhlbWU6XG4gICAgICAgIG4gPSB0aGlzLmJyb3dzZXJKb2luUGF0aCh0aGlzLnpoaVRoZW1lUmVsYXRpdmVQYXRoKCksIGUpO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcInR5cGUgbXVzdCBiZSBwcm92aWRlZFwiKTtcbiAgICB9XG4gICAgY29uc3QgeyBkZWZhdWx0OiBzIH0gPSBhd2FpdCBpbXBvcnQoXG4gICAgICAvKiBAdml0ZS1pZ25vcmUgKi9cbiAgICAgIG5cbiAgICApO1xuICAgIHJldHVybiBzO1xuICB9XG4gIC8qKlxuICAgKiBcdTVGMTVcdTUxNjVqc29uXG4gICAqXG4gICAqIEBwYXJhbSBqc29uUGF0aCAtIGpzb25cdTc2RjhcdTVCRjlcdThERUZcdTVGODRcdTUxNjhcdThERUZcdTVGODRcbiAgICogQHBhcmFtIHR5cGUgLSBcdTdDN0JcdTU3OEJcbiAgICovXG4gIC8vIHB1YmxpYyBzdGF0aWMgYXN5bmMgaW1wb3J0SnNvbihqc29uUGF0aDogc3RyaW5nLCB0eXBlOiBCYXNlUGF0aFR5cGVFbnVtKSB7XG4gIC8vICAgbGV0IGZ1bGxKc29uUGF0aCA9IGpzb25QYXRoXG4gIC8vICAgc3dpdGNoICh0eXBlKSB7XG4gIC8vICAgICBjYXNlIEJhc2VQYXRoVHlwZUVudW0uQmFzZVBhdGhUeXBlX0FwcGVhcmFuY2U6XG4gIC8vICAgICAgIGZ1bGxKc29uUGF0aCA9IHRoaXMuYnJvd3NlckpvaW5QYXRoKHRoaXMuc2l5dWFuQXBwZWFyYW5jZVJlbGF0aXZlUGF0aCgpLCBqc29uUGF0aClcbiAgLy8gICAgICAgYnJlYWtcbiAgLy8gICAgIGNhc2UgQmFzZVBhdGhUeXBlRW51bS5CYXNlUGF0aFR5cGVfRGF0YTpcbiAgLy8gICAgICAgZnVsbEpzb25QYXRoID0gdGhpcy5icm93c2VySm9pblBhdGgodGhpcy5zaXl1YW5EYXRhUmVsYXRpdmVQYXRoKCksIGpzb25QYXRoKVxuICAvLyAgICAgICBicmVha1xuICAvLyAgICAgY2FzZSBCYXNlUGF0aFR5cGVFbnVtLkJhc2VQYXRoVHlwZV9UaGVtZXM6XG4gIC8vICAgICAgIGZ1bGxKc29uUGF0aCA9IHRoaXMuYnJvd3NlckpvaW5QYXRoKHRoaXMuc2l5dWFuVGhlbWVSZWxhdGl2ZVBhdGgoKSwganNvblBhdGgpXG4gIC8vICAgICAgIGJyZWFrXG4gIC8vICAgICBjYXNlIEJhc2VQYXRoVHlwZUVudW0uQmFzZVBhdGhUeXBlX1poaVRoZW1lOlxuICAvLyAgICAgICBmdWxsSnNvblBhdGggPSB0aGlzLmJyb3dzZXJKb2luUGF0aCh0aGlzLnpoaVRoZW1lUmVsYXRpdmVQYXRoKCksIGpzb25QYXRoKVxuICAvLyAgICAgICBicmVha1xuICAvLyAgICAgZGVmYXVsdDpcbiAgLy8gICAgICAgdGhyb3cgbmV3IEVycm9yKFwidHlwZSBtdXN0IGJlIHByb3ZpZGVkXCIpXG4gIC8vICAgfVxuICAvL1xuICAvLyAgIGNvbnN0IHsgZGVmYXVsdDogZGF0YSB9ID0gYXdhaXQgaW1wb3J0KC8qIEB2aXRlLWlnbm9yZSAqLyBmdWxsSnNvblBhdGgsIHsgYXNzZXJ0OiB7IHR5cGU6IFwianNvblwiIH0gfSlcbiAgLy8gICByZXR1cm4gZGF0YVxuICAvLyB9XG4gIC8qKlxuICAgKiBcdTVGMTVcdTUxNjUganNvbiAtIFx1NEVFNSBkYXRhIFx1NEUzQVx1NTdGQVx1NjcyQ1x1OERFRlx1NUY4NFxuICAgKlxuICAgKiBAcGFyYW0ganNvblBhdGggLSBcdTc2RjhcdTVCRjlcdTRFOEUgZGF0YSBcdTc2ODRcdTc2RjhcdTVCRjlcdThERUZcdTVGODRcbiAgICovXG4gIC8vIHB1YmxpYyBzdGF0aWMgYXN5bmMgaW1wb3J0RGF0YUpzb24oanNvblBhdGg6IHN0cmluZykge1xuICAvLyAgIHJldHVybiBhd2FpdCB0aGlzLmltcG9ydEpzb24oanNvblBhdGgsIEJhc2VQYXRoVHlwZUVudW0uQmFzZVBhdGhUeXBlX0RhdGEpXG4gIC8vIH1cbiAgLyoqXG4gICAqIFx1NUYxNVx1NTE2NSBqc29uIC0gXHU0RUU1IGFwcGVhcmFuY2UgXHU0RTNBXHU1N0ZBXHU2NzJDXHU4REVGXHU1Rjg0XG4gICAqXG4gICAqIEBwYXJhbSBqc29uUGF0aCAtIFx1NzZGOFx1NUJGOVx1NEU4RSBhcHBlYXJhbmNlIFx1NzY4NFx1NzZGOFx1NUJGOVx1OERFRlx1NUY4NFxuICAgKi9cbiAgLy8gcHVibGljIHN0YXRpYyBhc3luYyBpbXBvcnRBcHBlYXJhbmNlSnNvbihqc29uUGF0aDogc3RyaW5nKSB7XG4gIC8vICAgcmV0dXJuIGF3YWl0IHRoaXMuaW1wb3J0SnNvbihqc29uUGF0aCwgQmFzZVBhdGhUeXBlRW51bS5CYXNlUGF0aFR5cGVfQXBwZWFyYW5jZSlcbiAgLy8gfVxuICAvKipcbiAgICogXHU1RjE1XHU1MTY1IGpzb24gLSBcdTRFRTUgdGhlbWVzIFx1NEUzQVx1NTdGQVx1NjcyQ1x1OERFRlx1NUY4NFxuICAgKlxuICAgKiBAcGFyYW0ganNvblBhdGggLSBcdTc2RjhcdTVCRjlcdTRFOEUgdGhlbWVzIFx1NzY4NFx1NzZGOFx1NUJGOVx1OERFRlx1NUY4NFxuICAgKi9cbiAgLy8gcHVibGljIHN0YXRpYyBhc3luYyBpbXBvcnRUaGVtZXNKc29uKGpzb25QYXRoOiBzdHJpbmcpIHtcbiAgLy8gICByZXR1cm4gYXdhaXQgdGhpcy5pbXBvcnRKc29uKGpzb25QYXRoLCBCYXNlUGF0aFR5cGVFbnVtLkJhc2VQYXRoVHlwZV9UaGVtZXMpXG4gIC8vIH1cbiAgLyoqXG4gICAqIFx1NUYxNVx1NTE2NSB6aGkgXHU0RTNCXHU5ODk4XHU3Njg0IGpzb24gLSBcdTRFRTUgemhpIFx1NEUzQlx1OTg5OCBcdTc2ODRcdTY4MzlcdThERUZcdTVGODRcdTRFM0FcdTU3RkFcdTY3MkNcdThERUZcdTVGODRcbiAgICpcbiAgICogQHBhcmFtIGpzb25QYXRoIC0gXHU3NkY4XHU1QkY5XHU0RThFIHpoaSBcdTRFM0JcdTk4OThcdTY4MzlcdThERUZcdTVGODRcdTc2ODRcdTc2RjhcdTVCRjlcdThERUZcdTVGODRcbiAgICovXG4gIC8vIHB1YmxpYyBzdGF0aWMgYXN5bmMgaW1wb3J0WmhpVGhlbWVKc29uKGpzb25QYXRoOiBzdHJpbmcpIHtcbiAgLy8gICByZXR1cm4gYXdhaXQgdGhpcy5pbXBvcnRKc29uKGpzb25QYXRoLCBCYXNlUGF0aFR5cGVFbnVtLkJhc2VQYXRoVHlwZV9aaGlUaGVtZSlcbiAgLy8gfVxuICAvKipcbiAgICogXHU1RjE1XHU1MTY1IHpoaSBcdTRFM0JcdTk4OThcdTc2ODQganMgLSBcdTRFRTUgemhpIFx1NEUzQlx1OTg5OCBcdTc2ODRcdTY4MzlcdThERUZcdTVGODRcdTRFM0FcdTU3RkFcdTY3MkNcdThERUZcdTVGODRcbiAgICpcbiAgICogQHBhcmFtIGpzUGF0aCAtIFx1NzZGOFx1NUJGOVx1NEU4RSB6aGkgXHU0RTNCXHU5ODk4XHU2ODM5XHU4REVGXHU1Rjg0XHU3Njg0XHU3NkY4XHU1QkY5XHU4REVGXHU1Rjg0XG4gICAqL1xuICBzdGF0aWMgYXN5bmMgaW1wb3J0WmhpVGhlbWVKcyhlKSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuaW1wb3J0SnMoZSwgby5CYXNlUGF0aFR5cGVfWmhpVGhlbWUpO1xuICB9XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gaW1wb3J0IHN0YXJ0XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLyoqXG4gICAqIFx1OERFRlx1NUY4NFx1NjJGQ1x1NjNBNVxuICAgKlxuICAgKiBAcGFyYW0gcGF0aHMgLSBcdThERUZcdTVGODRcdTY1NzBcdTdFQzRcbiAgICovXG4gIHN0YXRpYyBqb2luUGF0aCguLi5lKSB7XG4gICAgaWYgKGkuaGFzTm9kZUVudigpKSB7XG4gICAgICBjb25zdCB0ID0gdGhpcy5yZXF1aXJlTGliKFwicGF0aFwiKTtcbiAgICAgIGlmICh0KVxuICAgICAgICByZXR1cm4gdC5qb2luKC4uLmUpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5icm93c2VySm9pblBhdGgoLi4uZSk7XG4gIH1cbiAgc3RhdGljIGJyb3dzZXJKb2luUGF0aCguLi5lKSB7XG4gICAgcmV0dXJuIGUuam9pbihpLkJyb3dzZXJTZXBlcmF0b3IpO1xuICB9XG4gIC8qKlxuICAgKiBcdTYwMURcdTZFOTBcdTdCMTRcdThCQjAgY29uZiBcdTc2RUVcdTVGNTVcbiAgICovXG4gIHN0YXRpYyBzaXl1YW5Db25mUGF0aCgpIHtcbiAgICBjb25zdCBlID0gdGhpcy5zaXl1YW5XaW5kb3coKTtcbiAgICBpZiAoIWUpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJOb3QgaW4gc2l5dWFuIGVudlwiKTtcbiAgICByZXR1cm4gZS5zaXl1YW4uY29uZmlnLnN5c3RlbS5jb25mRGlyO1xuICB9XG4gIC8qKlxuICAgKiBcdTYwMURcdTZFOTBcdTdCMTRcdThCQjAgZGF0YSBcdTc2RUVcdTVGNTVcbiAgICovXG4gIHN0YXRpYyBzaXl1YW5EYXRhUGF0aCgpIHtcbiAgICBjb25zdCBlID0gdGhpcy5zaXl1YW5XaW5kb3coKTtcbiAgICBpZiAoIWUpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJOb3QgaW4gc2l5dWFuIGVudlwiKTtcbiAgICByZXR1cm4gZS5zaXl1YW4uY29uZmlnLnN5c3RlbS5kYXRhRGlyO1xuICB9XG4gIC8qKlxuICAgKiBcdTYwMURcdTZFOTBcdTdCMTRcdThCQjAgZGF0YSBcdTc2RUVcdTVGNTUtXHU3NkY4XHU1QkY5XHU4REVGXHU1Rjg0XG4gICAqL1xuICBzdGF0aWMgc2l5dWFuRGF0YVJlbGF0aXZlUGF0aCgpIHtcbiAgICBpZiAoIXRoaXMuc2l5dWFuV2luZG93KCkpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJOb3QgaW4gc2l5dWFuIGVudlwiKTtcbiAgICByZXR1cm4gXCJcIjtcbiAgfVxuICAvKipcbiAgICogXHU2MDFEXHU2RTkwXHU3QjE0XHU4QkIwIGFwcGVhcmFuY2UgXHU3NkVFXHU1RjU1XG4gICAqL1xuICBzdGF0aWMgc2l5dWFuQXBwZWFyYW5jZVBhdGgoKSB7XG4gICAgcmV0dXJuIHRoaXMuam9pblBhdGgodGhpcy5zaXl1YW5Db25mUGF0aCgpLCBcImFwcGVhcmFuY2VcIik7XG4gIH1cbiAgLyoqXG4gICAqIFx1NjAxRFx1NkU5MFx1N0IxNFx1OEJCMCBhcHBlYXJhbmNlIFx1NzZFRVx1NUY1NS1cdTc2RjhcdTVCRjlcdThERUZcdTVGODRcbiAgICovXG4gIHN0YXRpYyBzaXl1YW5BcHBlYXJhbmNlUmVsYXRpdmVQYXRoKCkge1xuICAgIGlmICghdGhpcy5zaXl1YW5XaW5kb3coKSlcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vdCBpbiBzaXl1YW4gZW52XCIpO1xuICAgIHJldHVybiB0aGlzLmJyb3dzZXJKb2luUGF0aChcIlwiLCBcImFwcGVhcmFuY2VcIik7XG4gIH1cbiAgLyoqXG4gICAqIFx1NjAxRFx1NkU5MFx1N0IxNFx1OEJCMCB0aGVtZXMgXHU3NkVFXHU1RjU1LVx1N0VERFx1NUJGOVx1OERFRlx1NUY4NFxuICAgKlxuICAgKiBcdTZDRThcdTYxMEY6IFx1NTk4Mlx1Njc5Q1x1NjYyRlx1OTc1RSBlbGVjdHJvbiBcdTU0OEMgTm9kZSBcdTczQUZcdTU4ODNcdUZGMENcdThGRDlcdTkxQ0NcdThGRDRcdTU2REVcdTc2ODRcdTY2MkZcdTZENEZcdTg5QzhcdTU2NjhcdTc2ODRcdThERUZcdTVGODRcdUZGMENcdTRFMERcdTY2MkZcdTcyNjlcdTc0MDZcdThERUZcdTVGODRcbiAgICogXHU1OTgyXHU2NzlDXHU0RjdGXHU3NTI4XHU3MjY5XHU3NDA2XHU4REVGXHU1Rjg0XHVGRjBDXHU4QkY3XHU4QzAzXHU3NTI4IHNpeXVhbkFwcGVhcmFuY2VQYXRoIFx1NjIxNlx1ODAwNSBzaXl1YW5EYXRhUGF0aFxuICAgKlxuICAgKiBAYXV0aG9yIHRlcndlclxuICAgKiBAc2luY2UgMC4xLjBcbiAgICovXG4gIHN0YXRpYyBzaXl1YW5UaGVtZVBhdGgoKSB7XG4gICAgaWYgKGkuaGFzTm9kZUVudigpKVxuICAgICAgcmV0dXJuIHRoaXMuam9pblBhdGgodGhpcy5zaXl1YW5BcHBlYXJhbmNlUGF0aCgpLCBcInRoZW1lc1wiKTtcbiAgICB7XG4gICAgICBjb25zdCBlID0gdGhpcy5zaXl1YW5XaW5kb3coKTtcbiAgICAgIGlmICghZSlcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm90IGluIHNpeXVhbiBlbnZcIik7XG4gICAgICByZXR1cm4gdGhpcy5qb2luUGF0aChlLmxvY2F0aW9uLm9yaWdpbiwgXCJhcHBlYXJhbmNlXCIsIFwidGhlbWVzXCIpO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogXHU2MDFEXHU2RTkwXHU3QjE0XHU4QkIwIHRoZW1lcyBcdTc2RUVcdTVGNTUtXHU3NkY4XHU1QkY5XHU4REVGXHU1Rjg0XG4gICAqL1xuICBzdGF0aWMgc2l5dWFuVGhlbWVSZWxhdGl2ZVBhdGgoKSB7XG4gICAgaWYgKCF0aGlzLnNpeXVhbldpbmRvdygpKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm90IGluIHNpeXVhbiBlbnZcIik7XG4gICAgcmV0dXJuIHRoaXMuYnJvd3NlckpvaW5QYXRoKFwiXCIsIFwiYXBwZWFyYW5jZVwiLCBcInRoZW1lc1wiKTtcbiAgfVxuICAvKipcbiAgICogemhpIFx1NEUzQlx1OTg5OFx1NzZFRVx1NUY1NSAtIFx1N0VERFx1NUJGOVx1OERFRlx1NUY4NFxuICAgKi9cbiAgc3RhdGljIHpoaVRoZW1lUGF0aCgpIHtcbiAgICByZXR1cm4gdGhpcy5qb2luUGF0aCh0aGlzLnNpeXVhblRoZW1lUGF0aCgpLCBcInpoaVwiKTtcbiAgfVxuICAvKipcbiAgICogemhpIFx1NEUzQlx1OTg5OFx1NzZFRVx1NUY1NSAtIFx1NzZGOFx1NUJGOVx1OERFRlx1NUY4NFxuICAgKi9cbiAgc3RhdGljIHpoaVRoZW1lUmVsYXRpdmVQYXRoKCkge1xuICAgIHJldHVybiB0aGlzLmJyb3dzZXJKb2luUGF0aCh0aGlzLnNpeXVhblRoZW1lUmVsYXRpdmVQYXRoKCksIFwiemhpXCIpO1xuICB9XG59O1xubGV0IHcgPSBoO1xuLyoqXG4gKiBcdTYwMURcdTZFOTBcdTdCMTRcdThCQjBpZnJhbWVcdTYzMDJcdTRFRjZcdTczQUZcdTU4ODNcbiAqL1xucih3LCBcImlzSW5TaXl1YW5XaWRnZXRcIiwgKCkgPT4gaS5pc0luQnJvd3NlciA/IHdpbmRvdy5mcmFtZUVsZW1lbnQgIT0gbnVsbCAmJiB3aW5kb3cuZnJhbWVFbGVtZW50LnBhcmVudEVsZW1lbnQgIT0gbnVsbCAmJiB3aW5kb3cuZnJhbWVFbGVtZW50LnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudCAhPSBudWxsICYmIHdpbmRvdy5mcmFtZUVsZW1lbnQucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmdldEF0dHJpYnV0ZShcImRhdGEtbm9kZS1pZFwiKSAhPT0gXCJcIiA6ICExKSwgLyoqXG4gKiBcdTYwMURcdTZFOTBcdTdCMTRcdThCQjBcdTY1QjBcdTdBOTdcdTUzRTNcbiAqXG4gKiBAZGVwcmVjYXRlZCB3aW5kb3cudGVyd2VyIFx1NTIyNFx1NjVBRFx1NjVCOVx1NUYwRlx1NURGMlx1NUU5Rlx1NUYwM1x1RkYwQ1x1NUVGQVx1OEJBRVx1NEVFNVx1NTQwRVx1NjI1M1x1NUYwMFx1NjVCMFx1N0E5N1x1NTNFM1x1NkNFOFx1NTE2NSB3aW5kb3cuc2l5dWFuTmV3V2luIFx1RkYwQ1x1OEZEOVx1NjgzN1x1OEJFRFx1NEU0OVx1NEYxQVx1NjZGNFx1NUJCOVx1NjYxM1x1NzQwNlx1ODlFM1xuICogQGF1dGhvciB0ZXJ3ZXJcbiAqIEB2ZXJzaW9uIDAuMS4wXG4gKiBAc2luY2UgMC4wLjFcbiAqL1xucih3LCBcImlzSW5TaXl1YW5OZXdXaW5cIiwgKCkgPT4gIWkuaXNJbkJyb3dzZXIgfHwgIWkuaXNFbGVjdHJvbigpID8gITEgOiB0eXBlb2Ygd2luZG93LnRlcndlciA8IFwidVwiIHx8IHR5cGVvZiB3aW5kb3cuc2l5dWFuTmV3V2luIDwgXCJ1XCIpLCAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyByZXF1aXJlIHN0YXJ0XG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09XG4vKipcbiAqIFx1NUYxNVx1NTE2NVx1NEY5RFx1OEQ1NlxuICpcbiAqIEBwYXJhbSBsaWJwYXRoIC0gXHU0RjlEXHU4RDU2XHU1MTY4XHU4REVGXHU1Rjg0XG4gKiBAcGFyYW0gYWJzIC0gXHU1M0VGXHU5MDA5XHVGRjBDXHU2NjJGXHU1NDI2XHU0RjdGXHU3NTI4XHU4OUM5XHU1Rjk3XHU4REVGXHU1Rjg0XHVGRjBDXHU5RUQ4XHU4QkE0XHU2NjJGIHRydWUgXHVGRjBDIFx1NTQyRlx1NzUyOFx1NEU0Qlx1NTQwRSB0eXBlXHU1M0MyXHU2NTcwXHU2NUUwXHU2NTQ4XG4gKiBAcGFyYW0gdHlwZSAtIFx1NTNFRlx1OTAwOVx1RkYwQ1x1NEVFNVx1OEMwMVx1NzY4NFx1NTdGQVx1NjcyQ1x1OERFRlx1NUY4NFx1NEUzQVx1NTFDNlxuICovXG5yKHcsIFwicmVxdWlyZUxpYlwiLCAoZSwgdCA9ICEwLCBuID0gby5CYXNlUGF0aFR5cGVfTm9uZSkgPT4ge1xuICBpZiAoIWkuaGFzTm9kZUVudigpKVxuICAgIHRocm93IG5ldyBFcnJvcihcInJlcXVpcmUgb255IHdvcmtzIG9uIG5vZGUgZW52XCIpO1xuICBsZXQgcyA9IGU7XG4gIGlmICghdClcbiAgICBzd2l0Y2ggKG4pIHtcbiAgICAgIGNhc2Ugby5CYXNlUGF0aFR5cGVfQXBwZWFyYW5jZTpcbiAgICAgICAgcyA9IGguam9pblBhdGgoaC5zaXl1YW5BcHBlYXJhbmNlUGF0aCgpLCBlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIG8uQmFzZVBhdGhUeXBlX0RhdGE6XG4gICAgICAgIHMgPSBoLmpvaW5QYXRoKGguc2l5dWFuRGF0YVBhdGgoKSwgZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBvLkJhc2VQYXRoVHlwZV9UaGVtZXM6XG4gICAgICAgIHMgPSBoLmpvaW5QYXRoKGguc2l5dWFuQXBwZWFyYW5jZVBhdGgoKSwgXCJ0aGVtZXNcIiwgZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBvLkJhc2VQYXRoVHlwZV9aaGlUaGVtZTpcbiAgICAgICAgcyA9IGguam9pblBhdGgoaC5zaXl1YW5BcHBlYXJhbmNlUGF0aCgpLCBcInRoZW1lc1wiLCBcInpoaVwiLCBlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJ0eXBlIG11c3QgYmUgcHJvdmlkZWQgd2hlbiBub3QgdXNlIGFic29sdXRlIHBhdGhcIik7XG4gICAgfVxuICBjb25zdCBjID0gaC5zaXl1YW5XaW5kb3coKTtcbiAgaWYgKCFjKVxuICAgIHJldHVybiByZXF1aXJlKHMpO1xuICBpZiAodHlwZW9mIGMucmVxdWlyZSA8IFwidVwiKVxuICAgIHJldHVybiBjLnJlcXVpcmUocyk7XG59KSwgLyoqXG4gKiBcdTVGMTVcdTUxNjVcdTRGOURcdThENTZcdUZGMENcdTRFRTUgZGF0YSBcdTc2ODRcdTU3RkFcdTY3MkNcdThERUZcdTVGODRcdTRFM0FcdTUxQzZcbiAqXG4gKiBAcGFyYW0gbGlicGF0aCAtIFx1NzZGOFx1NUJGOVx1NEU4RSBhcHBlYXJhbmNlIFx1NzY4NFx1NzZGOFx1NUJGOVx1OERFRlx1NUY4NFxuICovXG5yKHcsIFwicmVxdWlyZUFwcGVhcmFuY2VMaWJcIiwgKGUpID0+IGgucmVxdWlyZUxpYihlLCAhMSwgby5CYXNlUGF0aFR5cGVfQXBwZWFyYW5jZSkpLCAvKipcbiAqIFx1NUYxNVx1NTE2NVx1NEY5RFx1OEQ1Nlx1RkYwQ1x1NEVFNSBkYXRhIFx1NzY4NFx1NTdGQVx1NjcyQ1x1OERFRlx1NUY4NFx1NEUzQVx1NTFDNlxuICpcbiAqIEBwYXJhbSBsaWJwYXRoIC0gXHU3NkY4XHU1QkY5XHU0RThFIGRhdGEgXHU3Njg0XHU3NkY4XHU1QkY5XHU4REVGXHU1Rjg0XG4gKi9cbnIodywgXCJyZXF1aXJlRGF0YUxpYlwiLCAoZSkgPT4gaC5yZXF1aXJlTGliKGUsICExLCBvLkJhc2VQYXRoVHlwZV9EYXRhKSksIC8qKlxuICogXHU1RjE1XHU1MTY1XHU0RjlEXHU4RDU2XHVGRjBDXHU0RUU1IHRoZW1lIFx1NzY4NFx1NTdGQVx1NjcyQ1x1OERFRlx1NUY4NFx1NEUzQVx1NTFDNlxuICpcbiAqIEBwYXJhbSBsaWJwYXRoIC0gXHU3NkY4XHU1QkY5XHU0RThFIHRoZW1lIFx1NzY4NFx1NzZGOFx1NUJGOVx1OERFRlx1NUY4NFxuICovXG5yKHcsIFwicmVxdWlyZVRoZW1lc0xpYlwiLCAoZSkgPT4gaC5yZXF1aXJlTGliKGUsICExLCBvLkJhc2VQYXRoVHlwZV9UaGVtZXMpKSwgLyoqXG4gKiBcdTVGMTVcdTUxNjVcdTRGOURcdThENTZcdUZGMENcdTRFRTUgWmhpVGhlbWUgXHU3Njg0XHU1N0ZBXHU2NzJDXHU4REVGXHU1Rjg0XHU0RTNBXHU1MUM2XG4gKlxuICogQHBhcmFtIGxpYnBhdGggLSBcdTc2RjhcdTVCRjlcdTRFOEUgWmhpVGhlbWUgXHU3Njg0XHU3NkY4XHU1QkY5XHU4REVGXHU1Rjg0XG4gKi9cbnIodywgXCJyZXF1aXJlWmhpVGhlbWVMaWJcIiwgKGUpID0+IGgucmVxdWlyZUxpYihlLCAhMSwgby5CYXNlUGF0aFR5cGVfWmhpVGhlbWUpKTtcbnZhciBwID0gLyogQF9fUFVSRV9fICovICgoYSkgPT4gKGEuRGV2aWNlVHlwZV9Nb2JpbGVfRGV2aWNlID0gXCJNb2JpbGVcIiwgYS5EZXZpY2VUeXBlX1NpeXVhbl9XaWRnZXQgPSBcIlNpeXVhbl9XaWRnZXRcIiwgYS5EZXZpY2VUeXBlX1NpeXVhbl9OZXdXaW4gPSBcIlNpeXVhbl9OZXdXaW5kb3dcIiwgYS5EZXZpY2VUeXBlX1NpeXVhbl9NYWluV2luID0gXCJTaXl1YW5fTWFpbldpbmRvd1wiLCBhLkRldmljZVR5cGVfU2l5dWFuX0Jyb3dzZXIgPSBcIlNpeXVhbl9Ccm93c2VyXCIsIGEuRGV2aWNlVHlwZV9DaHJvbWVfRXh0ZW5zaW9uID0gXCJDaHJvbWVfRXh0ZW5zaW9uXCIsIGEuRGV2aWNlVHlwZV9DaHJvbWVfQnJvd3NlciA9IFwiQ2hyb21lX0Jyb3dzZXJcIiwgYS5EZXZpY2VUeXBlX05vZGUgPSBcIk5vZGVcIiwgYSkpKHAgfHwge30pO1xuY2xhc3MgdiB7XG4gIC8qKlxuICAgKiBcdTgzQjdcdTUzRDZcdTVGNTNcdTUyNERcdThCQkVcdTU5MDdcbiAgICovXG4gIHN0YXRpYyBnZXREZXZpY2UoKSB7XG4gICAgcmV0dXJuIHRoaXMuZGV0ZWN0TW9iaWxlRGV2aWNlKCkgPyBwLkRldmljZVR5cGVfTW9iaWxlX0RldmljZSA6IHcuaXNJblNpeXVhbldpZGdldCgpID8gcC5EZXZpY2VUeXBlX1NpeXVhbl9XaWRnZXQgOiB3LmlzSW5TaXl1YW5OZXdXaW4oKSA/IHAuRGV2aWNlVHlwZV9TaXl1YW5fTmV3V2luIDogaS5pc0VsZWN0cm9uKCkgPyBwLkRldmljZVR5cGVfU2l5dWFuX01haW5XaW4gOiB3LmlzSW5TaXl1YW5Ccm93c2VyKCkgPyBwLkRldmljZVR5cGVfU2l5dWFuX0Jyb3dzZXIgOiBpLmlzSW5DaHJvbWVFeHRlbnNpb24oKSA/IHAuRGV2aWNlVHlwZV9DaHJvbWVfRXh0ZW5zaW9uIDogaS5pc05vZGUgPyBwLkRldmljZVR5cGVfTm9kZSA6IHAuRGV2aWNlVHlwZV9DaHJvbWVfQnJvd3NlcjtcbiAgfVxuICAvKipcbiAgICogXHU2OEMwXHU2RDRCXHU3OUZCXHU1MkE4XHU3QUVGXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBzdGF0aWMgZGV0ZWN0TW9iaWxlRGV2aWNlKCkge1xuICAgIGxldCBlID0gITE7XG4gICAgcmV0dXJuIGkuaXNJbkJyb3dzZXIgJiYgZnVuY3Rpb24odCkge1xuICAgICAgKC8oYW5kcm9pZHxiYlxcZCt8bWVlZ28pLittb2JpbGV8YXZhbnRnb3xiYWRhXFwvfGJsYWNrYmVycnl8YmxhemVyfGNvbXBhbHxlbGFpbmV8ZmVubmVjfGhpcHRvcHxpZW1vYmlsZXxpcChob25lfG9kKXxpcmlzfGtpbmRsZXxsZ2UgfG1hZW1vfG1pZHB8bW1wfG1vYmlsZS4rZmlyZWZveHxuZXRmcm9udHxvcGVyYSBtKG9ifGluKWl8cGFsbSggb3MpP3xwaG9uZXxwKGl4aXxyZSlcXC98cGx1Y2tlcnxwb2NrZXR8cHNwfHNlcmllcyg0fDYpMHxzeW1iaWFufHRyZW98dXBcXC4oYnJvd3NlcnxsaW5rKXx2b2RhZm9uZXx3YXB8d2luZG93cyBjZXx4ZGF8eGlpbm8vaS50ZXN0KFxuICAgICAgICB0XG4gICAgICApIHx8IC8xMjA3fDYzMTB8NjU5MHwzZ3NvfDR0aHB8NTBbMS02XWl8Nzcwc3w4MDJzfGEgd2F8YWJhY3xhYyhlcnxvb3xzLSl8YWkoa298cm4pfGFsKGF2fGNhfGNvKXxhbW9pfGFuKGV4fG55fHl3KXxhcHR1fGFyKGNofGdvKXxhcyh0ZXx1cyl8YXR0d3xhdShkaXwtbXxyIHxzICl8YXZhbnxiZShja3xsbHxucSl8YmkobGJ8cmQpfGJsKGFjfGF6KXxicihlfHYpd3xidW1ifGJ3LShufHUpfGM1NVxcL3xjYXBpfGNjd2F8Y2RtLXxjZWxsfGNodG18Y2xkY3xjbWQtfGNvKG1wfG5kKXxjcmF3fGRhKGl0fGxsfG5nKXxkYnRlfGRjLXN8ZGV2aXxkaWNhfGRtb2J8ZG8oY3xwKW98ZHMoMTJ8LWQpfGVsKDQ5fGFpKXxlbShsMnx1bCl8ZXIoaWN8azApfGVzbDh8ZXooWzQtN10wfG9zfHdhfHplKXxmZXRjfGZseSgtfF8pfGcxIHV8ZzU2MHxnZW5lfGdmLTV8Zy1tb3xnbyhcXC53fG9kKXxncihhZHx1bil8aGFpZXxoY2l0fGhkLShtfHB8dCl8aGVpLXxoaShwdHx0YSl8aHAoIGl8aXApfGhzLWN8aHQoYygtfCB8X3xhfGd8cHxzfHQpfHRwKXxodShhd3x0Yyl8aS0oMjB8Z298bWEpfGkyMzB8aWFjKCB8LXxcXC8pfGlicm98aWRlYXxpZzAxfGlrb218aW0xa3xpbm5vfGlwYXF8aXJpc3xqYSh0fHYpYXxqYnJvfGplbXV8amlnc3xrZGRpfGtlaml8a2d0KCB8XFwvKXxrbG9ufGtwdCB8a3djLXxreW8oY3xrKXxsZShub3x4aSl8bGcoIGd8XFwvKGt8bHx1KXw1MHw1NHwtW2Etd10pfGxpYnd8bHlueHxtMS13fG0zZ2F8bTUwXFwvfG1hKHRlfHVpfHhvKXxtYygwMXwyMXxjYSl8bS1jcnxtZShyY3xyaSl8bWkobzh8b2F8dHMpfG1tZWZ8bW8oMDF8MDJ8Yml8ZGV8ZG98dCgtfCB8b3x2KXx6eil8bXQoNTB8cDF8diApfG13YnB8bXl3YXxuMTBbMC0yXXxuMjBbMi0zXXxuMzAoMHwyKXxuNTAoMHwyfDUpfG43KDAoMHwxKXwxMCl8bmUoKGN8bSktfG9ufHRmfHdmfHdnfHd0KXxub2soNnxpKXxuenBofG8yaW18b3AodGl8d3YpfG9yYW58b3dnMXxwODAwfHBhbihhfGR8dCl8cGR4Z3xwZygxM3wtKFsxLThdfGMpKXxwaGlsfHBpcmV8cGwoYXl8dWMpfHBuLTJ8cG8oY2t8cnR8c2UpfHByb3h8cHNpb3xwdC1nfHFhLWF8cWMoMDd8MTJ8MjF8MzJ8NjB8LVsyLTddfGktKXxxdGVrfHIzODB8cjYwMHxyYWtzfHJpbTl8cm8odmV8em8pfHM1NVxcL3xzYShnZXxtYXxtbXxtc3xueXx2YSl8c2MoMDF8aC18b298cC0pfHNka1xcL3xzZShjKC18MHwxKXw0N3xtY3xuZHxyaSl8c2doLXxzaGFyfHNpZSgtfG0pfHNrLTB8c2woNDV8aWQpfHNtKGFsfGFyfGIzfGl0fHQ1KXxzbyhmdHxueSl8c3AoMDF8aC18di18diApfHN5KDAxfG1iKXx0MigxOHw1MCl8dDYoMDB8MTB8MTgpfHRhKGd0fGxrKXx0Y2wtfHRkZy18dGVsKGl8bSl8dGltLXx0LW1vfHRvKHBsfHNoKXx0cyg3MHxtLXxtM3xtNSl8dHgtOXx1cChcXC5ifGcxfHNpKXx1dHN0fHY0MDB8djc1MHx2ZXJpfHZpKHJnfHRlKXx2ayg0MHw1WzAtM118LXYpfHZtNDB8dm9kYXx2dWxjfHZ4KDUyfDUzfDYwfDYxfDcwfDgwfDgxfDgzfDg1fDk4KXx3M2MoLXwgKXx3ZWJjfHdoaXR8d2koZyB8bmN8bncpfHdtbGJ8d29udXx4NzAwfHlhcy18eW91cnx6ZXRvfHp0ZS0vaS50ZXN0KFxuICAgICAgICB0LnN1YnN0cigwLCA0KVxuICAgICAgKSkgJiYgKGUgPSAhMCk7XG4gICAgfShuYXZpZ2F0b3IudXNlckFnZW50IHx8IG5hdmlnYXRvci52ZW5kb3IgfHwgd2luZG93Lm9wZXJhKSwgZTtcbiAgfVxufVxuZXhwb3J0IHtcbiAgbyBhcyBCYXNlUGF0aFR5cGVFbnVtLFxuICBpIGFzIEJyb3dzZXJVdGlsLFxuICB2IGFzIERldmljZURldGVjdGlvbixcbiAgcCBhcyBEZXZpY2VUeXBlRW51bSxcbiAgdyBhcyBTaXl1YW5EZXZpY2Vcbn07XG4iLCAiLypcbiAqIENvcHlyaWdodCAoYykgMjAyMywgVGVyd2VyIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi5cbiAqXG4gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdFxuICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXNcbiAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgVGVyd2VyIGRlc2lnbmF0ZXMgdGhpc1xuICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlIFwiQ2xhc3NwYXRoXCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkXG4gKiBieSBUZXJ3ZXIgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS5cbiAqXG4gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVRcbiAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvclxuICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlXG4gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdFxuICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS5cbiAqXG4gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uXG4gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sXG4gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuXG4gKlxuICogUGxlYXNlIGNvbnRhY3QgVGVyd2VyLCBTaGVuemhlbiwgR3Vhbmdkb25nLCBDaGluYSwgeW91d2VpY3NAMTYzLmNvbVxuICogb3IgdmlzaXQgd3d3LnRlcndlci5zcGFjZSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yIGhhdmUgYW55XG4gKiBxdWVzdGlvbnMuXG4gKi9cblxuaW1wb3J0IFpoaVNlcnZlckVsZWN0cm9uVXRpbCBmcm9tIFwiLi4vdXRpbC9aaGlTZXJ2ZXJFbGVjdHJvblV0aWxcIlxuaW1wb3J0IHsgQnJvd3NlclV0aWwsIFNpeXVhbkRldmljZSB9IGZyb20gXCJ6aGktZGV2aWNlXCJcblxuLyoqXG4gKiBcdTdBOTdcdTUzRTNcdTdCQTFcdTc0MDZcdTU2NjhcbiAqXG4gKiBAYXV0aG9yIHRlcndlclxuICogQHZlcnNpb24gMS4wLjBcbiAqIEBzaW5jZSAxLjAuMFxuICovXG5jbGFzcyBXaW5kb3dNYW5hZ2VyIHtcbiAgcHJpdmF0ZSByZWFkb25seSBsb2dnZXJcbiAgcHJpdmF0ZSByZWFkb25seSBjb21tb25cblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLmxvZ2dlciA9IFpoaVNlcnZlckVsZWN0cm9uVXRpbC56aGlMb2coXCJ3aW5kb3ctbWFuYWdlclwiKVxuICAgIHRoaXMuY29tbW9uID0gWmhpU2VydmVyRWxlY3Ryb25VdGlsLnpoaUNvbW1vbigpXG4gIH1cblxuICAvKipcbiAgICogXHU2MjUzXHU1RjAwXHU2NUIwXHU3QTk3XHU1M0UzXG4gICAqXG4gICAqIFx1NzkzQVx1NEY4Qlx1RkYxQVxuICAgKlxuICAgKiBgYGBcbiAgICogIyMgZGV2ZWxvcG1lbnRcbiAgICogd2luZG93TWFuYWdlci5vcGVuQnJvd3NlcldpbmRvdyhcImh0dHBzOi8vd3d3LmJhaWR1LmNvbVwiLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdHJ1ZSwgZmFsc2UpXG4gICAqIHdpbmRvd01hbmFnZXIub3BlbkJyb3dzZXJXaW5kb3coXCJodHRwczovL3d3dy5iYWlkdS5jb21cIiwgeyBcImtleTFcIjogXCJ2YWx1ZTFcIiwgXCJrZXkyXCI6IFwidmFsdWUyXCIgfSwgdW5kZWZpbmVkLCB0cnVlLCBmYWxzZSlcbiAgICpcbiAgICogIyMgcHJvZHVjdGlvblxuICAgKiB3aW5kb3dNYW5hZ2VyLm9wZW5Ccm93c2VyV2luZG93KFwiaHR0cHM6Ly93d3cuYmFpZHUuY29tXCIpXG4gICAqIGBgYFxuICAgKlxuICAgKiBAcGFyYW0gdXJsIC0gdXJsXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBcdTUzQzJcdTY1NzBcbiAgICogQHBhcmFtIHdpbiAtIFx1NzIzNlx1N0E5N1x1NTNFM1xuICAgKiBAcGFyYW0gaXNEZXYgLSBcdTY2MkZcdTU0MjZcdTYyNTNcdTVGMDBcdTVGMDBcdTUzRDFcdTgwMDVcdTVERTVcdTUxNzdcbiAgICogQHBhcmFtIG1vZGFsIC0gXHU2NjJGXHU1NDI2XHU2QTIxXHU2MDAxXG4gICAqL1xuICBwdWJsaWMgb3BlbkJyb3dzZXJXaW5kb3codXJsOiBzdHJpbmcsIHBhcmFtcz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sIHdpbj86IGFueSwgaXNEZXYgPSBmYWxzZSwgbW9kYWwgPSBmYWxzZSkge1xuICAgIHRyeSB7XG4gICAgICBpZiAodGhpcy5jb21tb24uc3RyVXRpbC5pc0VtcHR5U3RyaW5nKHVybCkpIHtcbiAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoXCJVcmwgY2Fubm90IGJlIGVtcHR5XCIpXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBpZiAoIUJyb3dzZXJVdGlsLmlzRWxlY3Ryb24oKSkge1xuICAgICAgICB0aGlzLmxvZ2dlci5pbmZvKFwiQnJvd3NlcldpbmRvdyBjYW4gb255IGJlIGF2YWlsYWJsZSBpbiBzaXl1YW4gRWxlY3Ryb24gZW52aXJvbm1lbnRcIilcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGlmIChwYXJhbXMpIHtcbiAgICAgICAgT2JqZWN0LmtleXMocGFyYW1zKS5mb3JFYWNoKChrZXk6IHN0cmluZykgPT4ge1xuICAgICAgICAgIGNvbnN0IHZhbHVlID0gcGFyYW1zW2tleV1cbiAgICAgICAgICB1cmwgPSBCcm93c2VyVXRpbC5zZXRVcmxQYXJhbWV0ZXIodXJsLCBrZXksIHZhbHVlKVxuICAgICAgICB9KVxuICAgICAgfVxuXG4gICAgICB0aGlzLmxvZ2dlci5pbmZvKHRoaXMuY29tbW9uLnN0clV0aWwuZihcIk9wZW5pbmcgYSBuZXcgQnJvd3NlcldpbmRvdyBmcm9tIHVybCA9PiB7MH1cIiwgdXJsKSlcblxuICAgICAgY29uc3QgbWFpbldpbiA9IHdpbiA/PyBTaXl1YW5EZXZpY2Uuc2l5dWFuV2luZG93KClcbiAgICAgIGNvbnN0IHsgYXBwLCBCcm93c2VyV2luZG93LCBnZXRDdXJyZW50V2luZG93IH0gPSBtYWluV2luLnJlcXVpcmUoXCJAZWxlY3Ryb24vcmVtb3RlXCIpXG4gICAgICBjb25zdCByZW1vdGUgPSBtYWluV2luLnJlcXVpcmUoXCJAZWxlY3Ryb24vcmVtb3RlXCIpLnJlcXVpcmUoXCJAZWxlY3Ryb24vcmVtb3RlL21haW5cIilcbiAgICAgIGNvbnN0IG1haW5XaW5kb3cgPSBnZXRDdXJyZW50V2luZG93KClcbiAgICAgIGNvbnN0IG5ld1dpbmRvdyA9IG5ldyBCcm93c2VyV2luZG93KHtcbiAgICAgICAgcGFyZW50OiBtYWluV2luZG93LFxuICAgICAgICB3aWR0aDogOTAwLFxuICAgICAgICBoZWlnaHQ6IDc1MCxcbiAgICAgICAgcmVzaXphYmxlOiB0cnVlLFxuICAgICAgICBtb2RhbDogbW9kYWwsXG4gICAgICAgIGljb246IFNpeXVhbkRldmljZS5icm93c2VySm9pblBhdGgoXG4gICAgICAgICAgU2l5dWFuRGV2aWNlLnNpeXVhbldpbmRvdygpLnNpeXVhbi5jb25maWcuc3lzdGVtLmFwcERpcixcbiAgICAgICAgICBcInN0YWdlXCIsXG4gICAgICAgICAgXCJpY29uLWxhcmdlLnBuZ1wiXG4gICAgICAgICksXG4gICAgICAgIHRpdGxlQmFyT3ZlcmxheToge1xuICAgICAgICAgIGNvbG9yOiBcIiNjY2NjY2NhNVwiLFxuICAgICAgICAgIHN5bWJvbENvbG9yOiBcImJsYWNrXCIsXG4gICAgICAgIH0sXG4gICAgICAgIHdlYlByZWZlcmVuY2VzOiB7XG4gICAgICAgICAgbmF0aXZlV2luZG93T3BlbjogdHJ1ZSxcbiAgICAgICAgICBub2RlSW50ZWdyYXRpb246IHRydWUsXG4gICAgICAgICAgd2Vidmlld1RhZzogdHJ1ZSxcbiAgICAgICAgICB3ZWJTZWN1cml0eTogZmFsc2UsXG4gICAgICAgICAgY29udGV4dElzb2xhdGlvbjogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgICB9KVxuXG4gICAgICBuZXdXaW5kb3cud2ViQ29udGVudHMudXNlckFnZW50ID0gYFNpWXVhbi8ke2FwcC5nZXRWZXJzaW9uKCl9IGh0dHBzOi8vYjNsb2cub3JnL3NpeXVhbiBFbGVjdHJvbmBcbiAgICAgIC8vIFx1NTE0MVx1OEJCOFxuICAgICAgcmVtb3RlLmVuYWJsZShuZXdXaW5kb3cud2ViQ29udGVudHMpXG4gICAgICBpZiAoaXNEZXYpIHtcbiAgICAgICAgbmV3V2luZG93LndlYkNvbnRlbnRzLm9wZW5EZXZUb29scygpXG4gICAgICB9XG4gICAgICBuZXdXaW5kb3cubG9hZFVSTCh1cmwpXG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoXCJPcGVuIGJyb3dzZXIgd2luZG93IGZhaWxlZFwiLCBlKVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBXaW5kb3dNYW5hZ2VyXG4iLCAiLypcbiAqIENvcHlyaWdodCAoYykgMjAyMywgVGVyd2VyIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi5cbiAqXG4gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdFxuICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXNcbiAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgVGVyd2VyIGRlc2lnbmF0ZXMgdGhpc1xuICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlIFwiQ2xhc3NwYXRoXCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkXG4gKiBieSBUZXJ3ZXIgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS5cbiAqXG4gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVRcbiAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvclxuICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlXG4gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdFxuICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS5cbiAqXG4gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uXG4gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sXG4gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuXG4gKlxuICogUGxlYXNlIGNvbnRhY3QgVGVyd2VyLCBTaGVuemhlbiwgR3Vhbmdkb25nLCBDaGluYSwgeW91d2VpY3NAMTYzLmNvbVxuICogb3IgdmlzaXQgd3d3LnRlcndlci5zcGFjZSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yIGhhdmUgYW55XG4gKiBxdWVzdGlvbnMuXG4gKi9cblxuaW1wb3J0IFpoaVNlcnZlckVsZWN0cm9uVXRpbCBmcm9tIFwiLi4vdXRpbC9aaGlTZXJ2ZXJFbGVjdHJvblV0aWxcIlxuaW1wb3J0IFdpbmRvd01hbmFnZXIgZnJvbSBcIi4vV2luZG93TWFuYWdlclwiXG5pbXBvcnQgeyBTaXl1YW5EZXZpY2UgfSBmcm9tIFwiemhpLWRldmljZVwiXG5cbi8qKlxuICogXHU4RkQ5XHU5MUNDXHU3RURGXHU0RTAwXHU2MzAyXHU4RjdEXHU0RTAwXHU0RTJBXHU2NUI5XHU2Q0Q1XHVGRjBDXHU1M0VGXHU0RUU1XHU2MjUzXHU1RjAwIEVsZWN0cm9uIFx1NzY4NCBCcm93c2VyV2luZG93XG4gKlxuICogQGF1dGhvciB0ZXJ3ZXJcbiAqIEB2ZXJzaW9uIDEuMC4wXG4gKiBAc2luY2UgMS4wLjBcbiAqL1xuY2xhc3MgWmhpQnJvd3NlcldpbmRvdyB7XG4gIHByaXZhdGUgcmVhZG9ubHkgbG9nZ2VyXG4gIHByaXZhdGUgcmVhZG9ubHkgY29tbW9uXG5cbiAgcHJpdmF0ZSByZWFkb25seSB3aW5kb3dNYW5hZ2VyXG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5sb2dnZXIgPSBaaGlTZXJ2ZXJFbGVjdHJvblV0aWwuemhpTG9nKFwiemhpLWJyb3dzZXItd2luZG93XCIpXG4gICAgdGhpcy5jb21tb24gPSBaaGlTZXJ2ZXJFbGVjdHJvblV0aWwuemhpQ29tbW9uKClcblxuICAgIHRoaXMud2luZG93TWFuYWdlciA9IG5ldyBXaW5kb3dNYW5hZ2VyKClcbiAgfVxuXG4gIC8qKlxuICAgKiBcdTYzMDJcdThGN0QgQnJvd3NlcldpbmRvd1xuICAgKlxuICAgKiBAYXV0aG9yIHRlcndlclxuICAgKiBAc2luY2UgMS4wLjBcbiAgICovXG4gIHB1YmxpYyBpbml0QnJvd3NlcldpbmRvdygpIHtcbiAgICBTaXl1YW5EZXZpY2Uuc2l5dWFuV2luZG93KCkuemhpV2luZG93ID0gdGhpcy53aW5kb3dNYW5hZ2VyXG4gICAgdGhpcy5sb2dnZXIuaW5mbyhcInpoaVdpbmRvdyBtb3VudGVkXCIpXG4gICAgcmV0dXJuIFwib2tcIlxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFpoaUJyb3dzZXJXaW5kb3dcbiIsICJpbXBvcnQgWmhpQnJvd3NlcldpbmRvdyBmcm9tIFwiLi9saWIvYnJvd3Nlci13aW5kb3dcIlxuXG4vKipcbiAqIHpoaS1zZXJ2ZXItZWxlY3Ryb24gXHU1MTY1XHU1M0UzXG4gKi9cbmNvbnN0IGluaXQgPSAoKSA9PiB7XG4gIGNvbnN0IHpoaUJyb3dzZXJXaW5kb3cgPSBuZXcgWmhpQnJvd3NlcldpbmRvdygpXG4gIHpoaUJyb3dzZXJXaW5kb3cuaW5pdEJyb3dzZXJXaW5kb3coKVxuICByZXR1cm4gXCJva1wiXG59XG5cbmV4cG9ydCBkZWZhdWx0IGluaXRcbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7OztBQUFBLElBQUksS0FBSyxPQUFPO0FBQ2hCLElBQUksS0FBSyxDQUFDQSxJQUFHQyxJQUFHLE1BQU1BLE1BQUtELEtBQUksR0FBR0EsSUFBR0MsSUFBRyxFQUFFLFlBQVksTUFBSSxjQUFjLE1BQUksVUFBVSxNQUFJLE9BQU8sRUFBRSxDQUFDLElBQUlELEdBQUVDLEVBQUMsSUFBSTtBQUMvRyxJQUFJLEtBQUssQ0FBQ0QsSUFBR0MsSUFBRyxPQUFPLEdBQUdELElBQUcsT0FBT0MsTUFBSyxXQUFXQSxLQUFJLEtBQUtBLElBQUcsQ0FBQyxHQUFHO0FBQ3BFLElBQUksS0FBSyxPQUFPLGFBQWEsTUFBTSxhQUFhLE9BQU8sU0FBUyxNQUFNLFNBQVMsT0FBTyxTQUFTLE1BQU0sU0FBUyxPQUFPLE9BQU8sTUFBTSxPQUFPLENBQUM7QUFDMUksU0FBUyxHQUFHRCxJQUFHO0FBQ2IsU0FBT0EsTUFBS0EsR0FBRSxjQUFjLE9BQU8sVUFBVSxlQUFlLEtBQUtBLElBQUcsU0FBUyxJQUFJQSxHQUFFLFVBQVVBO0FBQy9GO0FBQ0EsSUFBSSxLQUFLLENBQUM7QUFBVixJQUFhLEtBQUs7QUFBQSxFQUNoQixJQUFJLFVBQVU7QUFDWixXQUFPO0FBQUEsRUFDVDtBQUFBLEVBQ0EsSUFBSSxRQUFRQSxJQUFHO0FBQ2IsU0FBS0E7QUFBQSxFQUNQO0FBQ0Y7QUFQQSxJQU9HLEtBQUssQ0FBQztBQVBULElBT1ksS0FB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SUFBRyxrQkFBa0IsRUFBRTtBQUMzYSxRQUFFLElBQUksRUFBRSxHQUFHQSxJQUFHLGFBQWEsSUFBSSxHQUFHLEdBQUcsRUFBRSxFQUFFLElBQUksTUFBTSxFQUFFLElBQUksR0FBRyxPQUFPLENBQUMsSUFBSSxHQUFHO0FBQzNFLFVBQUksS0FBSyxFQUFFLEVBQUUsU0FBUyxJQUFJLE1BQU0sRUFBRSxXQUFXQSxFQUFDLElBQUksTUFBTSxFQUFFLE1BQU1BLEtBQUlBLEVBQUMsSUFBSSxNQUFNLEVBQUUsWUFBWUEsRUFBQyxJQUFJLFVBQVVBLEVBQUMsR0FBRyxLQUFLLEVBQUUsS0FBSyxRQUFRLEtBQUssUUFBUSxLQUFLLFFBQVEsRUFBRSxHQUFHLEtBQUssRUFBRSxJQUFJLE9BQU8sR0FBRyxLQUFLLEVBQUUsRUFBRSxLQUFLLFFBQVEsRUFBRSxJQUFJLE1BQU0sRUFBRSxHQUFHLEtBQUssRUFBRSxFQUFFLEtBQUssS0FBSyxJQUFJLFFBQVEsRUFBRSxHQUFHLEtBQUssRUFBRSxXQUFXLEVBQUUsS0FBSyxLQUFLLElBQUksUUFBUSxFQUFFLEdBQUcsS0FBSyxFQUFFLEVBQUUsRUFBRSxJQUFJLFlBQVksRUFBRSxLQUFLLEtBQUssSUFBSSxRQUFRLEVBQUUsR0FBRyxLQUFLLEVBQUUsRUFBRSxFQUFFLEtBQUssS0FBSyxJQUFJLFVBQVUsRUFBRSxJQUFJLFlBQVksRUFBRSxLQUFLLEtBQUssSUFBSSxRQUFRLEVBQUUsR0FBRyxLQUFLLEVBQUUsRUFBRSxFQUFFLEtBQUssS0FBSyxJQUFJLFVBQVUsRUFBRSxJQUFJLFlBQVksRUFBRSxLQUFLLEtBQUssSUFBSSxRQUFRLEVBQUUsR0FBRyxLQUFLLEVBQUUsRUFBRSxFQUFFLEtBQUssS0FBSyxJQUFJLFVBQVUsRUFBRSxJQUFJLFlBQVksS0FBSyxRQUFRLEVBQUUsR0FBRyxLQUFLLEVBQUUsRUFBRSxFQUFFLEtBQUssS0FBSyxJQUFJLFVBQVUsRUFBRSxJQUFJLFlBQVksRUFBRSxHQUFHLEtBQUssRUFBRSxFQUFFLEVBQUUsS0FBSyxLQUFLLElBQUks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QU0sU0FBUyxVQUFVLENBQUMsSUFBSSxDQUFDLEdBQUdDLEtBQUksQ0FBQyxHQUFHLElBQUksRUFBRSxRQUFRLFFBQUssSUFBSVA7QUFDNUcsUUFBRSxjQUFjLGFBQWFNLE1BQUssRUFBRSxTQUFTLEVBQUUsU0FBUyxNQUFNLE1BQU0sT0FBT0E7QUFDM0UsVUFBSSxJQUFJQSxHQUFFLE1BQU0sRUFBRTtBQUNsQixVQUFJLEdBQUc7QUFDTCxjQUFNQyxHQUFFLFNBQVMsRUFBRSxDQUFDLEdBQUdBLEdBQUUsV0FBVyxFQUFFLENBQUMsR0FBR0EsR0FBRSxPQUFPLEVBQUUsQ0FBQyxHQUFHQSxHQUFFLE9BQU8sU0FBUyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUdBLEdBQUUsT0FBTyxFQUFFLENBQUMsS0FBSyxJQUFJQSxHQUFFLFFBQVEsRUFBRSxDQUFDLEdBQUdBLEdBQUUsV0FBVyxFQUFFLENBQUMsR0FBRyxNQUFNQSxHQUFFLElBQUksTUFBTUEsR0FBRSxPQUFPLEVBQUUsQ0FBQyxPQUFPQSxHQUFFLFNBQVMsRUFBRSxDQUFDLEtBQUssUUFBUUEsR0FBRSxXQUFXRCxHQUFFLFFBQVEsR0FBRyxNQUFNLEtBQUssRUFBRSxDQUFDLElBQUksUUFBUUMsR0FBRSxPQUFPRCxHQUFFLFFBQVEsSUFBSSxNQUFNLEtBQUssRUFBRSxDQUFDLElBQUksUUFBUUMsR0FBRSxPQUFPLFNBQVMsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHQSxHQUFFLE9BQU8sRUFBRSxDQUFDLEtBQUssSUFBSUEsR0FBRSxRQUFRRCxHQUFFLFFBQVEsR0FBRyxNQUFNLEtBQUssRUFBRSxDQUFDLElBQUksUUFBUUMsR0FBRSxXQUFXRCxHQUFFLFFBQVEsR0FBRyxNQUFNLEtBQUssRUFBRSxDQUFDLElBQUksUUFBUSxNQUFNQyxHQUFFLElBQUksTUFBTUEsR0FBRSxPQUFPRCxHQUFFLE1BQU0sK0JBQStCLElBQUksRUFBRSxDQUFDLElBQUksVUFBVUMsR0FBRSxTQUFTQSxHQUFFLE9BQU8sR0FBRyxHQUFHQSxHQUFFLE1BQU0sQ0FBQyxH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QUFHLEVBQUUsUUFBUSxDQUFDLElBQUksRUFBRSxHQUFHLE9BQU8sR0FBRyxFQUFFLFFBQVEsQ0FBQyxJQUFJLEVBQUUsR0FBRyxPQUFPLEdBQUcsRUFBRSxXQUFXLENBQUMsSUFBSSxFQUFFLEdBQUcsSUFBSSxHQUFHLEVBQUUsU0FBUyxDQUFDLElBQUksRUFBRSxHQUFHLElBQUksR0FBRyxFQUFFLFdBQVcsQ0FBQyxJQUFJLEVBQUUsR0FBRyxJQUFJLEdBQUcsRUFBRSxZQUFZLENBQUMsSUFBSSxFQUFFLEdBQUcsSUFBSSxHQUFHLEVBQUUsVUFBVSxDQUFDLElBQUksRUFBRSxHQUFHLElBQUksR0FBRyxFQUFFLGFBQWEsQ0FBQyxJQUFJLEVBQUUsR0FBRyxJQUFJLEdBQUcsRUFBRSxVQUFVLENBQUMsSUFBSSxFQUFFLEdBQUcsSUFBSSxHQUFHLEVBQUUsV0FBVyxDQUFDLElBQUksRUFBRSxHQUFHLElBQUksR0FBRyxFQUFFLGVBQWUsQ0FBQyxJQUFJLEVBQUUsR0FBRyxRQUFRLEdBQUcsRUFBRSxhQUFhLENBQUMsSUFBSSxFQUFFLEdBQUcsUUFBUSxHQUFHLEVBQUUsZUFBZSxDQUFDLElBQUksRUFBRSxHQUFHLFFBQVEsR0FBRyxFQUFFLGdCQUFnQixDQUFDLElBQUksRUFBRSxHQUFHLFFBQVEsR0FBRyxFQUFFLGNBQWMsQ0FBQyxJQUFJLEVBQUUsR0FBRyxRQUFRLEdBQUcsRUFBRSxpQkFBaUIsQ0FBQyxJQUFJLEVBQUUsR0FBRyxRQUFRLEdBQUcsRUFBRSxjQUFjLENBQUMsSUFBSSxFQUFFLEdBQUcsUUFBUSxHQUFHLEVBQUUsZUFBZSxDQUFDLElBQUksRUFBRSxHQUFHLFFBQVEsR0FBRyxFQUFFLGlCQUFpQixDQUFDLEtBQUssRUFBRSxHQUFHLFVBQVUsR0FBRyxFQUFFLGVBQWUsQ0FBQyxLQUFLLEVBQUUsR0FBRyxVQUFVLEdBQUcsRUFBRSxpQkFBaUIsQ0FBQyxLQUFLLEVBQUUsR0FBRyxVQUFVLEdBQUcsRUFBRSxrQkFBa0IsQ0FBQyxLQUFLLEVBQUUsR0FBRyxVQUFVLEdBQUcsRUFBRSxn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LE1BQU1DLEdBQUU7QUFDMUIsU0FBTyxFQUFFLFFBQVEsR0FBRyxNQUFNLEtBQUssQ0FBQyxHQUFHLEVBQUUsT0FBTyxHQUFHLEtBQUssS0FBSyxDQUFDLEdBQUcsRUFBRSxNQUFNLEdBQUcsSUFBSSxLQUFLLENBQUMsR0FBRyxFQUFFLFNBQVMsR0FBRyxPQUFPLEtBQUssQ0FBQyxHQUFHLEVBQUUsWUFBWSxHQUFHLFVBQVUsS0FBSyxDQUFDLEdBQUcsRUFBRSxVQUFVLEdBQUcsUUFBUSxLQUFLLENBQUMsR0FBRyxFQUFFLFNBQVMsR0FBRyxPQUFPLEtBQUssQ0FBQyxHQUFHLEVBQUUsZ0JBQWdCLEdBQUcsY0FBYyxLQUFLLENBQUMsR0FBRyxFQUFFLFFBQVEsR0FBRyxNQUFNLEtBQUssQ0FBQyxHQUFHLEVBQUUsTUFBTSxHQUFHLElBQUksS0FBSyxDQUFDLEdBQUcsRUFBRSxRQUFRLEdBQUcsTUFBTSxLQUFLLENBQUMsR0FBRyxFQUFFLFNBQVMsR0FBRyxPQUFPLEtBQUssQ0FBQyxHQUFHLEVBQUUsT0FBTyxHQUFHLEtBQUssS0FBSyxDQUFDLEdBQUcsRUFBRSxVQUFVLEdBQUcsUUFBUSxLQUFLLENBQUMsR0FBRyxFQUFFLE9BQU8sR0FBRyxLQUFLLEtBQUssQ0FBQyxHQUFHLEVBQUUsUUFBUSxHQUFHLE1BQU0sS0FBSyxDQUFDLEdBQUcsRUFBRSxPQUFPLEdBQUcsS0FBSyxLQUFLLENBQUMsR0FBRyxFQUFFLE9BQU8sR0FBRyxLQUFLLEtBQUssQ0FBQyxHQUFHLEVBQUUsVUFBVSxHQUFHLFFBQVEsS0FBSyxDQUFDLEdBQUcsRUFBRSxRQUFRLEdBQUcsTUFBTSxLQUFLLENBQUMsR0FBRyxFQUFFLFVBQVUsR0FBRyxRQUFRLEtBQUssQ0FBQyxHQUFHLEVBQUUsV0FBVyxHQUFHLFNBQVMsS0FBSyxDQUFDLEdBQUcsRUFBRSxTQUFTLEdBQUcsT0FBTyxLQUFLLENBQUMsR0FBRyxFQUFFLFlBQVksR0FBRyxVQUFVLEtBQUssQ0FBQyxHQUFHLEVBQUUsU0FBUyxHQUFHLE9BQU8sS0FBSyxDQUFDLEdBQUcs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TUFDVCxLQUFLO0FBQUEsTUFDTCxPQUFPO0FBQUEsTUFDUCxVQUFVO0FBQUEsTUFDVixZQUFZO0FBQUEsTUFDWixnQkFBZ0I7QUFBQSxNQUNoQixVQUFVO0FBQUEsTUFDVixjQUFjO0FBQUEsTUFDZCxrQkFBa0I7QUFBQSxNQUNsQixVQUFVO0FBQUEsTUFDVixnQkFBZ0I7QUFBQSxNQUNoQixNQUFNO0FBQUEsTUFDTixXQUFXO0FBQUEsTUFDWCxjQUFjO0FBQUEsTUFDZCxPQUFPO0FBQUEsTUFDUCxNQUFNO0FBQUEsTUFDTixVQUFVO0FBQUEsTUFDVixlQUFlO0FBQUEsTUFDZixjQUFjO0FBQUEsTUFDZCxnQkFBZ0I7QUFBQSxNQUNoQixlQUFlO0FBQUEsTUFDZixVQUFVO0FBQUEsTUFDVixXQUFXO0FBQUEsTUFDWCxxQkFBcUI7QUFBQSxNQUNyQixhQUFhO0FBQUEsTUFDYixVQUFVO0FBQUEsTUFDVixNQUFNO0FBQUEsTUFDTixLQUFLO0FBQUEsTUFDTCxRQUFRO0FBQUEsTUFDUixPQUFPO0FBQUEsTUFDUCxNQUFNO0FBQUEsTUFDTixZQUFZO0FBQUEsTUFDWixNQUFNO0FBQUEsTUFDTixzQkFBc0I7QUFBQSxNQUN0QixVQUFVO0FBQUEsTUFDVixNQUFNO0FBQUEsTUFDTixNQUFNO0FBQUEsTUFDTixhQUFhO0FBQUEsTUFDYixlQUFlO0FBQUEsTUFDZixTQUFTO0FBQUEsTUFDVCxRQUFRO0FBQUEsTUFDUixhQUFhO0FBQUEsTUFDYixZQUFZO0FBQUEsTUFDWixhQUFhO0FBQUEsTUFDYixhQUFhO0FBQUEsTUFDYixrQkFBa0I7QUFBQSxNQUNsQixlQUFlO0FBQUEsTUFDZixXQUFXO0FBQUEsTUFDWCxNQUFNO0FBQUEsTUFDTixVQUFVO0FBQUEsTUFDVixXQUFXO0FBQUEsTUFDWCxhQUFhO0FBQUEsTUFDYixRQUFRO0FBQUEsTUFDUixLQUFLO0FBQUEsTUFDTCxlQUFlO0FBQUEsTUFDZixhQUFhO0FBQUEsTUFDYixXQUFXO0FBQUEsTUFDWCxRQUFRO0FBQUEsTUFDUixpQkFBaUI7QUFBQSxNQUNqQixt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akIsY0FBYztBQUNaLFNBQUssU0FBUyw4QkFBc0IsT0FBTyxvQkFBb0I7QUFDL0QsU0FBSyxTQUFTLDhCQUFzQixVQUFVO0FBRTlDLFNBQUssZ0JBQWdCLElBQUksc0JBQWM7QUFBQSxFQUN6QztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBUU8sb0JBQW9CO0FBQ3pCLE1BQWEsYUFBYSxFQUFFLFlBQVksS0FBSztBQUM3QyxTQUFLLE9BQU8sS0FBSyxtQkFBbUI7QUFDcEMsV0FBTztBQUFBLEVBQ1Q7QUFDRjtBQUVBLElBQU8seUJBQVE7OztBQ3pEZixJQUFNLE9BQU8sTUFBTTtBQUNqQixRQUFNLG1CQUFtQixJQUFJLHVCQUFpQjtBQUM5QyxtQkFBaUIsa0JBQWtCO0FBQ25DLFNBQU87QUFDVDtBQUVBLElBQU8sY0FBUTsiLAogICJuYW1lcyI6IFsiZSIsICJyIiwgIk4iLCAiRCIsICJvIiwgImciLCAidyIsICJfIiwgInUiLCAiaSIsICJoIiwgIkUiLCAiUCIsICJpIiwgImUiLCAiZSIsICJyIiwgImUiXQp9Cg== diff --git a/libs/zhi-electron/src/lib/browser-window/index.ts b/libs/zhi-electron/src/lib/browser-window/index.ts index e3627e24..2bdf3143 100644 --- a/libs/zhi-electron/src/lib/browser-window/index.ts +++ b/libs/zhi-electron/src/lib/browser-window/index.ts @@ -36,13 +36,11 @@ import { SiyuanDevice } from "zhi-device" */ class ZhiBrowserWindow { private readonly logger - private readonly common private readonly windowManager constructor() { this.logger = ZhiServerElectronUtil.zhiLog("zhi-browser-window") - this.common = ZhiServerElectronUtil.zhiCommon() this.windowManager = new WindowManager() } diff --git a/libs/zhi-env/.eslintrc.cjs b/libs/zhi-env/.eslintrc.cjs index a147b203..a1993b7b 100644 --- a/libs/zhi-env/.eslintrc.cjs +++ b/libs/zhi-env/.eslintrc.cjs @@ -1,5 +1,4 @@ module.exports = { root: true, - extends: ["./node_modules/@terwer/eslint-config-custom/index.cjs"], - ignorePatterns: ["node_modules/"], + extends: ["./node_modules/@terwer/eslint-config-custom/typescript/index.cjs"], } diff --git a/libs/zhi-env/src/lib/zhi-env.ts b/libs/zhi-env/src/lib/zhi-env.ts index 13ae0563..501d6931 100644 --- a/libs/zhi-env/src/lib/zhi-env.ts +++ b/libs/zhi-env/src/lib/zhi-env.ts @@ -30,6 +30,7 @@ import EnvConstants from "./EnvConstants" * * @public * @author terwer + * @description 跨平台环境变量读取 * @since 0.0.1 */ class Env { diff --git a/libs/zhi-log/.eslintrc.cjs b/libs/zhi-log/.eslintrc.cjs index a147b203..a1993b7b 100644 --- a/libs/zhi-log/.eslintrc.cjs +++ b/libs/zhi-log/.eslintrc.cjs @@ -1,5 +1,4 @@ module.exports = { root: true, - extends: ["./node_modules/@terwer/eslint-config-custom/index.cjs"], - ignorePatterns: ["node_modules/"], + extends: ["./node_modules/@terwer/eslint-config-custom/typescript/index.cjs"], } diff --git a/libs/zhi-siyuan-api/.eslintrc.cjs b/libs/zhi-siyuan-api/.eslintrc.cjs index a147b203..a1993b7b 100644 --- a/libs/zhi-siyuan-api/.eslintrc.cjs +++ b/libs/zhi-siyuan-api/.eslintrc.cjs @@ -1,5 +1,4 @@ module.exports = { root: true, - extends: ["./node_modules/@terwer/eslint-config-custom/index.cjs"], - ignorePatterns: ["node_modules/"], + extends: ["./node_modules/@terwer/eslint-config-custom/typescript/index.cjs"], } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3b9b63a2..8af7628f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -80,28 +80,36 @@ importers: version: registry.npmjs.org/@tsconfig/docusaurus@1.0.5 docusaurus-plugin-typedoc: specifier: ^0.19.2 - version: registry.npmjs.org/docusaurus-plugin-typedoc@0.19.2(typedoc-plugin-markdown@3.15.3)(typedoc@0.24.6) + version: registry.npmjs.org/docusaurus-plugin-typedoc@0.19.2(typedoc-plugin-markdown@3.15.3)(typedoc@0.24.7) typedoc: - specifier: ^0.24.6 - version: registry.npmjs.org/typedoc@0.24.6(typescript@5.0.4) + specifier: ^0.24.7 + version: registry.npmjs.org/typedoc@0.24.7(typescript@5.0.4) typedoc-plugin-markdown: specifier: ^3.15.3 - version: registry.npmjs.org/typedoc-plugin-markdown@3.15.3(typedoc@0.24.6) + version: registry.npmjs.org/typedoc-plugin-markdown@3.15.3(typedoc@0.24.7) typedoc-plugin-rename-defaults: specifier: ^0.6.5 - version: registry.npmjs.org/typedoc-plugin-rename-defaults@0.6.5(typedoc@0.24.6) + version: registry.npmjs.org/typedoc-plugin-rename-defaults@0.6.5(typedoc@0.24.7) typescript: specifier: ^5.0.4 version: registry.npmjs.org/typescript@5.0.4 apps/zhi-docs-vitepress: - dependencies: - vue: - specifier: ^3.3.2 - version: registry.npmjs.org/vue@3.3.2 devDependencies: + typedoc: + specifier: 0.24.7 + version: registry.npmjs.org/typedoc@0.24.7(typescript@5.0.4) + typedoc-plugin-frontmatter: + specifier: ^0.0.2 + version: registry.npmjs.org/typedoc-plugin-frontmatter@0.0.2 + typedoc-plugin-markdown: + specifier: workspace:* + version: link:../../tools/typedoc-plugin-markdown + typedoc-vitepress-theme: + specifier: workspace:* + version: link:../../tools/typedoc-vitepress-theme vitepress: - specifier: 1.0.0-alpha.75 + specifier: ^1.0.0-alpha.75 version: registry.npmjs.org/vitepress@1.0.0-alpha.75(@algolia/client-search@4.17.0) libs/zhi-blog-api: @@ -427,6 +435,21 @@ importers: specifier: ^18.15.11 version: registry.npmjs.org/@types/node@18.15.11 + tools/typedoc-plugin-markdown: + dependencies: + prettier: + specifier: '>=1.8.0' + version: registry.npmjs.org/prettier@2.8.7 + typedoc: + specifier: '>=0.24.0' + version: registry.npmjs.org/typedoc@0.24.7(typescript@5.0.4) + + tools/typedoc-vitepress-theme: + dependencies: + typedoc-plugin-markdown: + specifier: workspace:* + version: link:../typedoc-plugin-markdown + tools/vite-config-custom: dependencies: jsdom: @@ -5810,6 +5833,7 @@ packages: '@vue/shared': registry.npmjs.org/@vue/shared@3.3.2 estree-walker: registry.npmjs.org/estree-walker@2.0.2 source-map-js: registry.npmjs.org/source-map-js@1.0.2 + dev: true registry.npmjs.org/@vue/compiler-dom@3.2.47: resolution: {integrity: sha512-dBBnEHEPoftUiS03a4ggEig74J2YBZ2UIeyfpcRM2tavgMWo4bsEfgCGsu+uJIL/vax9S+JztH8NmQerUo7shQ==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.2.47.tgz} @@ -5827,6 +5851,7 @@ packages: dependencies: '@vue/compiler-core': registry.npmjs.org/@vue/compiler-core@3.3.2 '@vue/shared': registry.npmjs.org/@vue/shared@3.3.2 + dev: true registry.npmjs.org/@vue/compiler-sfc@3.2.47: resolution: {integrity: sha512-rog05W+2IFfxjMcFw10tM9+f7i/+FFpZJJ5XHX72NP9eC2uRD+42M3pYcQqDXVYoj74kHMSEdQ/WmCjt8JFksQ==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.2.47.tgz} @@ -5860,6 +5885,7 @@ packages: magic-string: registry.npmjs.org/magic-string@0.30.0 postcss: registry.npmjs.org/postcss@8.4.23 source-map-js: registry.npmjs.org/source-map-js@1.0.2 + dev: true registry.npmjs.org/@vue/compiler-ssr@3.2.47: resolution: {integrity: sha512-wVXC+gszhulcMD8wpxMsqSOpvDZ6xKXSVWkf50Guf/S+28hTAXPDYRTbLQ3EDkOP5Xz/+SY37YiwDquKbJOgZw==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.2.47.tgz} @@ -5877,6 +5903,7 @@ packages: dependencies: '@vue/compiler-dom': registry.npmjs.org/@vue/compiler-dom@3.3.2 '@vue/shared': registry.npmjs.org/@vue/shared@3.3.2 + dev: true registry.npmjs.org/@vue/devtools-api@6.5.0: resolution: {integrity: sha512-o9KfBeaBmCKl10usN4crU53fYtC1r7jJwdGKjPT24t348rHxgfpZ0xL3Xm/gLUYnc0oTp8LAmrxOeLyu6tbk2Q==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.5.0.tgz} @@ -5906,6 +5933,7 @@ packages: '@vue/shared': registry.npmjs.org/@vue/shared@3.3.2 estree-walker: registry.npmjs.org/estree-walker@2.0.2 magic-string: registry.npmjs.org/magic-string@0.30.0 + dev: true registry.npmjs.org/@vue/reactivity@3.3.2: resolution: {integrity: sha512-yX8C4uTgg2Tdj+512EEMnMKbLveoITl7YdQX35AYgx8vBvQGszKiiCN46g4RY6/deeo/5DLbeUUGxCq1qWMf5g==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.3.2.tgz} @@ -5913,6 +5941,7 @@ packages: version: 3.3.2 dependencies: '@vue/shared': registry.npmjs.org/@vue/shared@3.3.2 + dev: true registry.npmjs.org/@vue/runtime-core@3.3.2: resolution: {integrity: sha512-qSl95qj0BvKfcsO+hICqFEoLhJn6++HtsPxmTkkadFbuhe3uQfJ8HmQwvEr7xbxBd2rcJB6XOJg7nWAn/ymC5A==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.3.2.tgz} @@ -5921,6 +5950,7 @@ packages: dependencies: '@vue/reactivity': registry.npmjs.org/@vue/reactivity@3.3.2 '@vue/shared': registry.npmjs.org/@vue/shared@3.3.2 + dev: true registry.npmjs.org/@vue/runtime-dom@3.3.2: resolution: {integrity: sha512-+drStsJT+0mtgHdarT7cXZReCcTFfm6ptxMrz0kAW5hms6UNBd8Q1pi4JKlncAhu+Ld/TevsSp7pqAZxBBoGng==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.3.2.tgz} @@ -5930,6 +5960,7 @@ packages: '@vue/runtime-core': registry.npmjs.org/@vue/runtime-core@3.3.2 '@vue/shared': registry.npmjs.org/@vue/shared@3.3.2 csstype: registry.npmjs.org/csstype@3.1.2 + dev: true registry.npmjs.org/@vue/server-renderer@3.3.2(vue@3.3.2): resolution: {integrity: sha512-QCwh6OGwJg6GDLE0fbQhRTR6tnU+XDJ1iCsTYHXBiezCXAhqMygFRij7BiLF4ytvvHcg5kX9joX5R5vP85++wg==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.3.2.tgz} @@ -5942,6 +5973,7 @@ packages: '@vue/compiler-ssr': registry.npmjs.org/@vue/compiler-ssr@3.3.2 '@vue/shared': registry.npmjs.org/@vue/shared@3.3.2 vue: registry.npmjs.org/vue@3.3.2 + dev: true registry.npmjs.org/@vue/shared@3.2.47: resolution: {integrity: sha512-BHGyyGN3Q97EZx0taMQ+OLNuZcW3d37ZEVmEAyeoA9ERdGvm9Irc/0Fua8SNyOtV1w6BS4q25wbMzJujO9HIfQ==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@vue/shared/-/shared-3.2.47.tgz} @@ -5953,6 +5985,7 @@ packages: resolution: {integrity: sha512-0rFu3h8JbclbnvvKrs7Fe5FNGV9/5X2rPD7KmOzhLSUAiQH5//Hq437Gv0fR5Mev3u/nbtvmLl8XgwCU20/ZfQ==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@vue/shared/-/shared-3.3.2.tgz} name: '@vue/shared' version: 3.3.2 + dev: true registry.npmjs.org/@vueuse/core@10.1.2(vue@3.3.2): resolution: {integrity: sha512-roNn8WuerI56A5uiTyF/TEYX0Y+VKlhZAF94unUfdhbDUI+NfwQMn4FUnUscIRUhv3344qvAghopU4bzLPNFlA==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@vueuse/core/-/core-10.1.2.tgz} @@ -6414,7 +6447,6 @@ packages: resolution: {integrity: sha512-lEm8mt52to2fT8GhciPCGeCXACSz2UwIN4X2e2LJSnZ5uAbn2/dsYdOmUXq0AtWS5cpAupysIneExOgH0Vd2TQ==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/ansi-sequence-parser/-/ansi-sequence-parser-1.1.0.tgz} name: ansi-sequence-parser version: 1.1.0 - dev: true registry.npmjs.org/ansi-styles@3.2.1: resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz} @@ -8487,7 +8519,7 @@ packages: esutils: registry.npmjs.org/esutils@2.0.3 dev: false - registry.npmjs.org/docusaurus-plugin-typedoc@0.19.2(typedoc-plugin-markdown@3.15.3)(typedoc@0.24.6): + registry.npmjs.org/docusaurus-plugin-typedoc@0.19.2(typedoc-plugin-markdown@3.15.3)(typedoc@0.24.7): resolution: {integrity: sha512-N4B2MOaXIyu+FloFn6zVbGgSqszeFQE/7ZIgFakpkVg5F0rfysiDGac2PHbPf4o8DWdyyviJOAuhXk6U7Febeg==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/docusaurus-plugin-typedoc/-/docusaurus-plugin-typedoc-0.19.2.tgz} id: registry.npmjs.org/docusaurus-plugin-typedoc/0.19.2 name: docusaurus-plugin-typedoc @@ -8496,8 +8528,8 @@ packages: typedoc: '>=0.24.0' typedoc-plugin-markdown: '>=3.15.0' dependencies: - typedoc: registry.npmjs.org/typedoc@0.24.6(typescript@5.0.4) - typedoc-plugin-markdown: registry.npmjs.org/typedoc-plugin-markdown@3.15.3(typedoc@0.24.6) + typedoc: registry.npmjs.org/typedoc@0.24.7(typescript@5.0.4) + typedoc-plugin-markdown: registry.npmjs.org/typedoc-plugin-markdown@3.15.3(typedoc@0.24.7) dev: true registry.npmjs.org/dom-converter@0.2.0: @@ -12561,7 +12593,6 @@ packages: resolution: {integrity: sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz} name: lunr version: 2.3.9 - dev: true registry.npmjs.org/magic-string@0.25.9: resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz} @@ -12641,7 +12672,6 @@ packages: version: 4.3.0 engines: {node: '>= 12'} hasBin: true - dev: true registry.npmjs.org/md5-hex@3.0.1: resolution: {integrity: sha512-BUiRtTtV39LIJwinWBjqVsU9xhdnz7/i889V859IBFpuqGAj6LuOvHv5XLbgZ2R7ptJoJaEcxkv88/h25T7Ciw==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/md5-hex/-/md5-hex-3.0.1.tgz} @@ -15636,7 +15666,6 @@ packages: jsonc-parser: registry.npmjs.org/jsonc-parser@3.2.0 vscode-oniguruma: registry.npmjs.org/vscode-oniguruma@1.7.0 vscode-textmate: registry.npmjs.org/vscode-textmate@8.0.0 - dev: true registry.npmjs.org/showdown@2.1.0: resolution: {integrity: sha512-/6NVYu4U819R2pUIk79n67SYgJHWCce0a5xTP979WbNp0FL9MN1I1QK662IDU1b6JzKTvmhgI7T7JYIxBi3kMQ==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/showdown/-/showdown-2.1.0.tgz} @@ -16853,7 +16882,15 @@ packages: is-typedarray: registry.npmjs.org/is-typedarray@1.0.0 dev: false - registry.npmjs.org/typedoc-plugin-markdown@3.15.3(typedoc@0.24.6): + registry.npmjs.org/typedoc-plugin-frontmatter@0.0.2: + resolution: {integrity: sha512-xPw76L4S4/zbd01Tt89CVsJdPiMxztlmkXaA2Wu/l0KEbIrsqSHPv/sGsPI1O+pkZrSpaFr94qLA3ls1MrpKKw==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/typedoc-plugin-frontmatter/-/typedoc-plugin-frontmatter-0.0.2.tgz} + name: typedoc-plugin-frontmatter + version: 0.0.2 + dependencies: + yaml: registry.npmjs.org/yaml@2.2.2 + dev: true + + registry.npmjs.org/typedoc-plugin-markdown@3.15.3(typedoc@0.24.7): resolution: {integrity: sha512-idntFYu3vfaY3eaD+w9DeRd0PmNGqGuNLKihPU9poxFGnATJYGn9dPtEhn2QrTdishFMg7jPXAhos+2T6YCWRQ==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/typedoc-plugin-markdown/-/typedoc-plugin-markdown-3.15.3.tgz} id: registry.npmjs.org/typedoc-plugin-markdown/3.15.3 name: typedoc-plugin-markdown @@ -16862,10 +16899,10 @@ packages: typedoc: '>=0.24.0' dependencies: handlebars: registry.npmjs.org/handlebars@4.7.7 - typedoc: registry.npmjs.org/typedoc@0.24.6(typescript@5.0.4) + typedoc: registry.npmjs.org/typedoc@0.24.7(typescript@5.0.4) dev: true - registry.npmjs.org/typedoc-plugin-rename-defaults@0.6.5(typedoc@0.24.6): + registry.npmjs.org/typedoc-plugin-rename-defaults@0.6.5(typedoc@0.24.7): resolution: {integrity: sha512-DwkgwRMxgu3UrDR3VUAdnF9jYzM6p7rw6UcVIh4MD7yjEmFDR8WWyOlk6oYgELmRYHxTDx0f0GK6iSgoxSh/Qw==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/typedoc-plugin-rename-defaults/-/typedoc-plugin-rename-defaults-0.6.5.tgz} id: registry.npmjs.org/typedoc-plugin-rename-defaults/0.6.5 name: typedoc-plugin-rename-defaults @@ -16873,14 +16910,14 @@ packages: peerDependencies: typedoc: 0.22.x || 0.23.x || 0.24.x dependencies: - typedoc: registry.npmjs.org/typedoc@0.24.6(typescript@5.0.4) + typedoc: registry.npmjs.org/typedoc@0.24.7(typescript@5.0.4) dev: true - registry.npmjs.org/typedoc@0.24.6(typescript@5.0.4): - resolution: {integrity: sha512-c3y3h45xJv3qYwKDAwU6Cl+26CjT0ZvblHzfHJ+SjQDM4p1mZxtgHky4lhmG0+nNarRht8kADfZlbspJWdZarQ==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/typedoc/-/typedoc-0.24.6.tgz} - id: registry.npmjs.org/typedoc/0.24.6 + registry.npmjs.org/typedoc@0.24.7(typescript@5.0.4): + resolution: {integrity: sha512-zzfKDFIZADA+XRIp2rMzLe9xZ6pt12yQOhCr7cD7/PBTjhPmMyMvGrkZ2lPNJitg3Hj1SeiYFNzCsSDrlpxpKw==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/typedoc/-/typedoc-0.24.7.tgz} + id: registry.npmjs.org/typedoc/0.24.7 name: typedoc - version: 0.24.6 + version: 0.24.7 engines: {node: '>= 14.14'} hasBin: true peerDependencies: @@ -16891,7 +16928,6 @@ packages: minimatch: registry.npmjs.org/minimatch@9.0.0 shiki: registry.npmjs.org/shiki@0.14.2 typescript: registry.npmjs.org/typescript@5.0.4 - dev: true registry.npmjs.org/typescript@4.7.4: resolution: {integrity: sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/typescript/-/typescript-4.7.4.tgz} @@ -17725,13 +17761,11 @@ packages: resolution: {integrity: sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/vscode-oniguruma/-/vscode-oniguruma-1.7.0.tgz} name: vscode-oniguruma version: 1.7.0 - dev: true registry.npmjs.org/vscode-textmate@8.0.0: resolution: {integrity: sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/vscode-textmate/-/vscode-textmate-8.0.0.tgz} name: vscode-textmate version: 8.0.0 - dev: true registry.npmjs.org/vue-demi@0.14.1(vue@3.3.2): resolution: {integrity: sha512-rt+yuCtXvscYot9SQQj3WKZJVSriPNqVkpVBNEHPzSgBv7QIYzsS410VqVgvx8f9AAPgjg+XPKvmV3vOqqkJQQ==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.1.tgz} @@ -17782,6 +17816,7 @@ packages: '@vue/runtime-dom': registry.npmjs.org/@vue/runtime-dom@3.3.2 '@vue/server-renderer': registry.npmjs.org/@vue/server-renderer@3.3.2(vue@3.3.2) '@vue/shared': registry.npmjs.org/@vue/shared@3.3.2 + dev: true registry.npmjs.org/w3c-xmlserializer@4.0.0: resolution: {integrity: sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz} @@ -18336,6 +18371,13 @@ packages: engines: {node: '>= 6'} dev: false + registry.npmjs.org/yaml@2.2.2: + resolution: {integrity: sha512-CBKFWExMn46Foo4cldiChEzn7S7SRV+wqiluAb6xmueD/fGyRHIhX8m14vVGgeFWjN540nKCNVj6P21eQjgTuA==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/yaml/-/yaml-2.2.2.tgz} + name: yaml + version: 2.2.2 + engines: {node: '>= 14'} + dev: true + registry.npmjs.org/yargs-parser@20.2.9: resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz} name: yargs-parser diff --git a/tools/typedoc-plugin-markdown/.markdownlint.yaml b/tools/typedoc-plugin-markdown/.markdownlint.yaml new file mode 100644 index 00000000..28ed03d6 --- /dev/null +++ b/tools/typedoc-plugin-markdown/.markdownlint.yaml @@ -0,0 +1,18 @@ +# MD013/line-length - Line length +MD013: false + +# MD024/no-duplicate-heading/no-duplicate-header - Multiple headings with the same content +MD024: false + +# MD028 - Blank line inside blockquote + +MD028: false + +# MD033/no-inline-html - Inline HTML +MD033: false + +# MD041/first-line-heading/first-line-h1 - First line in a file should be a top-level heading +MD041: false + +# MD052/reference-links-images - Reference links and images should use a label that is defined +MD052: false diff --git a/tools/typedoc-plugin-markdown/CHANGELOG.md b/tools/typedoc-plugin-markdown/CHANGELOG.md new file mode 100644 index 00000000..9d7a381e --- /dev/null +++ b/tools/typedoc-plugin-markdown/CHANGELOG.md @@ -0,0 +1,373 @@ +# Changelog + +## 4.0.0-next.11 (2023-05-13) + +### Patch Changes + +- Simplified fileoutput options - replaced kindsWithOwnFile option with an easier to understand `outputFileStrategy` option (see docs) +- Extract frontmatter logic into seperate TypeDoc plugin +- Fix fileoutput for 'packages' entryPointStrategy +- Tweaked header/breadcrumbs +- Escape angle brackets in comment blocks unless inside backticks ([#276](https://github.com/tgreyuk/typedoc-plugin-markdown/issues/276)) +- UI tweaks to properties display + +## 4.0.0-next.10 + +### Patch Changes + +- Fix pipes not being escaped correctly with union types in properties table +- Exposed navigation object to renderer +- General UI updates and fixes + +## 4.0.0-next.9 + +### Patch Changes + +- Discover prettier config files + +## 4.0.0-next.8 + +### Patch Changes + +- Added `numberPrefixOutput` and `hideKindTag` options +- Support `includeVersion` +- Decoupled renderer methods +- Further refactoring and fixes + +## 4.0.0-next.7 + +### Patch Changes + +- Added `indentifiersAsCodeBlocks`, `propertiesFormat`, `typeDeclarationFormat`, `enumMembersFormat` options. +- Renamed `reflectionsWithOwnFile`=>`kindsWithOwnFile` and `groupByReflections`=>`groupByKinds`. +- General ui tweaks and fixes + +## 4.0.0-next.6 + +### Patch Changes + +- Refactored fileoutput options (renamed symbolsWithOwnFile=>reflectionsWithOwnFile, groupBySymbols=>groupByReflections) + +## 4.0.0-next.5 + +### Patch Changes + +- Fix incorrect heading levels +- Slugify output filenames +- Expose `groupBySymbols` option + +## 4.0.0-next.4 + +### Patch Changes + +- Mark final default parameters as optional ([#396](https://github.com/tgreyuk/typedoc-plugin-markdown/issues/396)) + +- Run prettier on output files ([#398](https://github.com/tgreyuk/typedoc-plugin-markdown/issues/398)) + +- Replace new lines in tables with `
` ([#331](https://github.com/tgreyuk/typedoc-plugin-markdown/issues/331)) + +- TypdeDoc 0.24 compatibility fixes. + +- Escape curly braces in type declarations + +## 4.0.0-next.3 + +### Patch Changes + +- Expose referenced type links on declaration +- UI fixes + +## 4.0.0-next.2 + +### Patch Changes + +- Fix optional declarations in code blocks +- Improve hierarchy output + +## 4.0.0-next.1 + +### Minor Changes + +- Expose Frontmatter options ([#384](https://github.com/tgreyuk/typedoc-plugin-markdown/issues/384)), ([#360](https://github.com/tgreyuk/typedoc-plugin-markdown/issues/360)) +- Convert comment `@tags` to headings +- Export files following module structure as default +- UI improvemements + +### Patch Changes + +- Respect monorepo `readmeFile` configuration ([#383](https://github.com/tgreyuk/typedoc-plugin-markdown/issues/383)) +- Fix incorrect heading levels on project reflections + +## 4.0.0-next.0 + +### Major Changes + +Initial release of next version. In summary includes: + +- Removal of handlebars. +- MDX2 support as standard ([(#305)](https://github.com/tgreyuk/typedoc-plugin-markdown/issues/305), [(#252)](https://github.com/tgreyuk/typedoc-plugin-markdown/issues/252)). +- Exposes additional output file options ([(#353)](https://github.com/tgreyuk/typedoc-plugin-markdown/issues/353), [(#338)](https://github.com/tgreyuk/typedoc-plugin-markdown/issues/338), [(#328)](https://github.com/tgreyuk/typedoc-plugin-markdown/issues/328), [(#307)](https://github.com/tgreyuk/typedoc-plugin-markdown/issues/307)). +- Several UI improvements. + +## [3.13.4](https://github.com/tgreyuk/typedoc-plugin-markdown/compare/typedoc-plugin-markdown@3.13.3...typedoc-plugin-markdown@3.13.4) (2022-07-20) + +### Fixes + +- Support @typeParam comments [(#326)](https://github.com/tgreyuk/typedoc-plugin-markdown/issues/326) + +## [3.13.3](https://github.com/tgreyuk/typedoc-plugin-markdown/compare/typedoc-plugin-markdown@3.13.2...typedoc-plugin-markdown@3.13.3) (2022-07-05) + +### Fixes + +- Remove extraneous whitespace in tag description [(#324)](https://github.com/tgreyuk/typedoc-plugin-markdown/issues/324) + +## [3.13.2](https://github.com/tgreyuk/typedoc-plugin-markdown/compare/typedoc-plugin-markdown@3.13.1...typedoc-plugin-markdown@3.13.2) (2022-06-30) + +### Fixes + +- Correctly display accessors in type declaration [(#320)](https://github.com/tgreyuk/typedoc-plugin-markdown/commit/c7fd71aa13159ee729526bdd9b7688169752da64) +- Add new line after tags [(#324)](https://github.com/tgreyuk/typedoc-plugin-markdown/issues/324) +- Expose values to enums [(#323)](https://github.com/tgreyuk/typedoc-plugin-markdown/issues/323) + +## [3.13.1](https://github.com/tgreyuk/typedoc-plugin-markdown/compare/typedoc-plugin-markdown@3.13.0...typedoc-plugin-markdown@3.13.1) (2022-06-28) + +**Note:** Version bump only for package typedoc-plugin-markdown + +# [3.13.0](https://github.com/tgreyuk/typedoc-plugin-markdown/compare/typedoc-plugin-markdown@3.12.1...typedoc-plugin-markdown@3.13.0) (2022-06-27) + +### Features + +- TypeDoc 0.23 compatibility fixes ([f39318e](https://github.com/tgreyuk/typedoc-plugin-markdown/commit/f39318e1a58943170282b45a6d6cd0545a80cd4a)) + +## [3.12.1](https://github.com/tgreyuk/typedoc-plugin-markdown/compare/typedoc-plugin-markdown@3.12.0...typedoc-plugin-markdown@3.12.1) (2022-04-21) + +### Bug Fixes + +- Handle non-unique anchor ids (update) ([#303](https://github.com/tgreyuk/typedoc-plugin-markdown/issues/303)) ([2deb7b7](https://github.com/tgreyuk/typedoc-plugin-markdown/commit/2deb7b734e6ec837aa403f4a70e01e56ccc47cc9)) + +# [3.12.0](https://github.com/tgreyuk/typedoc-plugin-markdown/compare/typedoc-plugin-markdown@3.11.14...typedoc-plugin-markdown@3.12.0) (2022-04-09) + +### Bug Fixes + +- Handle non-unique anchor ids ([#303](https://github.com/tgreyuk/typedoc-plugin-markdown/issues/303)) ([787748f](https://github.com/tgreyuk/typedoc-plugin-markdown/commit/787748f274d2def8fa4a1e08795a398c5a771f4f)) + +### Features + +- Expose `preserveAnchorCasing` option ([#301](https://github.com/tgreyuk/typedoc-plugin-markdown/issues/301)) ([f51ff45](https://github.com/tgreyuk/typedoc-plugin-markdown/commit/f51ff45d20758a19c851c37561dd2c07e80f0c23)) + +## [3.11.14](https://github.com/tgreyuk/typedoc-plugin-markdown/compare/typedoc-plugin-markdown@3.11.13...typedoc-plugin-markdown@3.11.14) (2022-02-14) + +### Bug Fixes + +- wrap index signature output within back ticks ([#292](https://github.com/tgreyuk/typedoc-plugin-markdown/issues/292)) ([2226322](https://github.com/tgreyuk/typedoc-plugin-markdown/commit/22263229bf2fc9bab4fe61f03cd915f63f8e1aa4)) + +## [3.11.13](https://github.com/tgreyuk/typedoc-plugin-markdown/compare/typedoc-plugin-markdown@3.11.12...typedoc-plugin-markdown@3.11.13) (2022-02-05) + +### Bug Fixes + +- Escape pipes in comments and expand object type in props table ([#286](https://github.com/tgreyuk/typedoc-plugin-markdown/issues/286)) ([b87c250](https://github.com/tgreyuk/typedoc-plugin-markdown/commit/b87c2505a57035d190b8694268e658f1cd1bb426)) + +## [3.11.12](https://github.com/tgreyuk/typedoc-plugin-markdown/compare/typedoc-plugin-markdown@3.11.11...typedoc-plugin-markdown@3.11.12) (2022-01-18) + +### Bug Fixes + +- Fixed external resolution reference ([#283](https://github.com/tgreyuk/typedoc-plugin-markdown/issues/283)) ([ba935c9](https://github.com/tgreyuk/typedoc-plugin-markdown/commit/ba935c9eff51f5ac61a96299c437263daf07d87a)) + +## [3.11.11](https://github.com/tgreyuk/typedoc-plugin-markdown/compare/typedoc-plugin-markdown@3.11.10...typedoc-plugin-markdown@3.11.11) (2022-01-09) + +### Bug Fixes + +- Add comments for function type properties ([#281](https://github.com/tgreyuk/typedoc-plugin-markdown/issues/281)) ([d3441f2](https://github.com/tgreyuk/typedoc-plugin-markdown/commit/d3441f2ab12e7a025cad0fc1d08a42f8d8bc0b91)) + +## [3.11.10](https://github.com/tgreyuk/typedoc-plugin-markdown/compare/typedoc-plugin-markdown@3.11.9...typedoc-plugin-markdown@3.11.10) (2022-01-09) + +### Bug Fixes + +- Add comments for function type properties ([#281](https://github.com/tgreyuk/typedoc-plugin-markdown/issues/281)) ([c38a095](https://github.com/tgreyuk/typedoc-plugin-markdown/commit/c38a095ea5b8d76d1c1657a244cc0d1c33361065)) +- Correctly define theme using TypeDoc `defineTheme` method ([5f2ef42](https://github.com/tgreyuk/typedoc-plugin-markdown/commit/5f2ef422aa1bcce0698e4b923682dbb106730f45)) + +## [3.11.9](https://github.com/tgreyuk/typedoc-plugin-markdown/compare/typedoc-plugin-markdown@3.11.8...typedoc-plugin-markdown@3.11.9) (2022-01-05) + +### Bug Fixes + +- Expose missing namedAnchors option (regression) ([#277](https://github.com/tgreyuk/typedoc-plugin-markdown/issues/277)) ([5353334](https://github.com/tgreyuk/typedoc-plugin-markdown/commit/53533342d0b34230ae344dbe4bf8563e4899da5b)) +- Watch mode compatibility ([#279](https://github.com/tgreyuk/typedoc-plugin-markdown/issues/279)) ([da65f74](https://github.com/tgreyuk/typedoc-plugin-markdown/commit/da65f741c38ca6a5c2fefc58c4d4fd0cbc9a6d25)) + +## [3.11.8](https://github.com/tgreyuk/typedoc-plugin-markdown/compare/typedoc-plugin-markdown@3.11.7...typedoc-plugin-markdown@3.11.8) (2021-12-17) + +### Bug Fixes + +- Fixed linked resolution ([#274](https://github.com/tgreyuk/typedoc-plugin-markdown/issues/274)) + +## [3.11.7](https://github.com/tgreyuk/typedoc-plugin-markdown/compare/typedoc-plugin-markdown@3.11.6...typedoc-plugin-markdown@3.11.7) (2021-11-20) + +### Bug Fixes + +- Expand generic object ([#268](https://github.com/tgreyuk/typedoc-plugin-markdown/issues/268)) ([5029a85](https://github.com/tgreyuk/typedoc-plugin-markdown/commit/5029a8519ad840675eb3772d6c6c154228e5f4b0)) + +## [3.11.6](https://github.com/tgreyuk/typedoc-plugin-markdown/compare/typedoc-plugin-markdown@3.11.5...typedoc-plugin-markdown@3.11.6) (2021-11-14) + +### Bug Fixes + +- Catch all external references ([003cb96](https://github.com/tgreyuk/typedoc-plugin-markdown/commit/003cb96952bbf1c7b1a651fe96903f57aca3c020)) +- Fix type params with default values in params table ([7d73eff](https://github.com/tgreyuk/typedoc-plugin-markdown/commit/7d73eff18cb919a9c1069977ebece3844528dfed)) + +## [3.11.5](https://github.com/tgreyuk/typedoc-plugin-markdown/compare/typedoc-plugin-markdown@3.11.4...typedoc-plugin-markdown@3.11.5) (2021-11-12) + +### Bug Fixes + +- Expose 'includes' and 'media' options (regression) ([#264](https://github.com/tgreyuk/typedoc-plugin-markdown/issues/264)) ([435e0d2](https://github.com/tgreyuk/typedoc-plugin-markdown/commit/435e0d2a3cbedbf3d935059f3f07ab3cd23d4470)) + +## [3.11.4](https://github.com/tgreyuk/typedoc-plugin-markdown/compare/typedoc-plugin-markdown@3.11.3...typedoc-plugin-markdown@3.11.4) (2021-11-12) + +### Bug Fixes + +- Added support for third party symbols ([#263](https://github.com/tgreyuk/typedoc-plugin-markdown/issues/263)) ([e5a40d5](https://github.com/tgreyuk/typedoc-plugin-markdown/commit/e5a40d58050cad370c82fc5ef897f8d7268e1d13)) + +## [3.11.3](https://github.com/tgreyuk/typedoc-plugin-markdown/compare/typedoc-plugin-markdown@3.11.2...typedoc-plugin-markdown@3.11.3) (2021-10-05) + +### Bug Fixes + +- correctly render reference ([#254](https://github.com/tgreyuk/typedoc-plugin-markdown/issues/254)) ([32ce13a](https://github.com/tgreyuk/typedoc-plugin-markdown/commit/32ce13a8f4336279ab60b1992b59ef848624560c)) + +## [3.11.2](https://github.com/tgreyuk/typedoc-plugin-markdown/compare/typedoc-plugin-markdown@3.11.1...typedoc-plugin-markdown@3.11.2) (2021-09-25) + +### Bug Fixes + +- Remove leading underscore from file names ([#248](https://github.com/tgreyuk/typedoc-plugin-markdown/issues/248)) ([bb5e4e3](https://github.com/tgreyuk/typedoc-plugin-markdown/commit/bb5e4e32437c367e03db6b6d4b83487b15698c6b)) + +## [3.11.1](https://github.com/tgreyuk/typedoc-plugin-markdown/compare/typedoc-plugin-markdown@3.11.0...typedoc-plugin-markdown@3.11.1) (2021-09-23) + +### Bug Fixes + +- Fix `allReflectionsHaveOwnDocument` option ([64376e9](https://github.com/tgreyuk/typedoc-plugin-markdown/commit/64376e9bd3beb2e941d0640408ace04786db4c7e)) +- Properly escape chars inside anchors ([d4e5b1d](https://github.com/tgreyuk/typedoc-plugin-markdown/commit/d4e5b1db4dcbc21601cc3a7b6122810f9cbb9152)) + +# [3.11.0](https://github.com/tgreyuk/typedoc-plugin-markdown/compare/typedoc-plugin-markdown@3.10.4...typedoc-plugin-markdown@3.11.0) (2021-09-14) + +### Features + +- TypeDoc 0.22 compatibility fixes ([#249](https://github.com/tgreyuk/typedoc-plugin-markdown/issues/249)) ([963250c](https://github.com/tgreyuk/typedoc-plugin-markdown/commit/963250cbe0b12bc3f413b5138d6d4e33ad2a6353)) + +## [3.10.4](https://github.com/tgreyuk/typedoc-plugin-markdown/compare/typedoc-plugin-markdown@3.10.3...typedoc-plugin-markdown@3.10.4) (2021-07-20) + +### Bug Fixes + +- Fix anonymous function types in params table ([0047faf](https://github.com/tgreyuk/typedoc-plugin-markdown/commit/0047faf1d3e2ec91752cef0603f2838ce1e70be9)) + +## [3.10.3](https://github.com/tgreyuk/typedoc-plugin-markdown/compare/typedoc-plugin-markdown@3.10.2...typedoc-plugin-markdown@3.10.3) (2021-07-12) + +### Bug Fixes + +- Handle TypeDoc 0.21.3 options breaking change ([2d0e7b5](https://github.com/tgreyuk/typedoc-plugin-markdown/commit/2d0e7b507c79d26c762a763bab779796520cd7b4)) + +## [3.10.2](https://github.com/tgreyuk/typedoc-plugin-markdown/compare/typedoc-plugin-markdown@3.10.1...typedoc-plugin-markdown@3.10.2) (2021-06-24) + +### Bug Fixes + +- Fix string escape inside backticks ([3b8ab18](https://github.com/tgreyuk/typedoc-plugin-markdown/commit/3b8ab18adda9023f79aaa6d1e377d710d8a09f38)) + +## [3.10.1](https://github.com/tgreyuk/typedoc-plugin-markdown/compare/typedoc-plugin-markdown@3.10.0...typedoc-plugin-markdown@3.10.1) (2021-06-23) + +### Bug Fixes + +- Improve type params table readability ([52038e2](https://github.com/tgreyuk/typedoc-plugin-markdown/commit/52038e228d0dac557b9c972ab6999389d1d6132a)) +- Use backticks for generics and refernce types to improve consistency ([#239](https://github.com/tgreyuk/typedoc-plugin-markdown/issues/239)) ([1b3395f](https://github.com/tgreyuk/typedoc-plugin-markdown/commit/1b3395f27c7d03d8d1509b9d97dcd06830ff17f5)) + +# [3.10.0](https://github.com/tgreyuk/typedoc-plugin-markdown/compare/typedoc-plugin-markdown@3.9.0...typedoc-plugin-markdown@3.10.0) (2021-06-18) + +### Features + +- TypeDoc 0.21 compatibility ([fa5e913](https://github.com/tgreyuk/typedoc-plugin-markdown/commit/fa5e913ef238c92817761218aa77022bff8d999a)) + +# [3.9.0](https://github.com/tgreyuk/typedoc-plugin-markdown/compare/typedoc-plugin-markdown@3.8.2...typedoc-plugin-markdown@3.9.0) (2021-06-01) + +### Features + +- UI fixes and readability enhancements ([#230](https://github.com/tgreyuk/typedoc-plugin-markdown/issues/230)) ([f4329a9](https://github.com/tgreyuk/typedoc-plugin-markdown/commit/f4329a9c989201d69b0e54497eba4f3e6c095abc)) + +## [3.8.2](https://github.com/tgreyuk/typedoc-plugin-markdown/compare/typedoc-plugin-markdown@3.8.1...typedoc-plugin-markdown@3.8.2) (2021-05-26) + +### Bug Fixes + +- Escape leading quote in front-matter string ([#228](https://github.com/tgreyuk/typedoc-plugin-markdown/issues/228)) ([ec38cbc](https://github.com/tgreyuk/typedoc-plugin-markdown/commit/ec38cbc550de9e6ee319129fda96c17ab342bae5)) + +## [3.8.1](https://github.com/tgreyuk/typedoc-plugin-markdown/compare/typedoc-plugin-markdown@3.8.0...typedoc-plugin-markdown@3.8.1) (2021-05-11) + +### Bug Fixes + +- Escape double quotes inside Front Matter yaml string ([8ce2f2b](https://github.com/tgreyuk/typedoc-plugin-markdown/commit/8ce2f2be03be6cd8d730786d48b5cd484b82ec4e)) +- Fix duplicate source blocks ([616ca4e](https://github.com/tgreyuk/typedoc-plugin-markdown/commit/616ca4e0e28431f4183c60b54fa9682c391dffe9)) + +# [3.8.0](https://github.com/tgreyuk/typedoc-plugin-markdown/compare/typedoc-plugin-markdown@3.7.2...typedoc-plugin-markdown@3.8.0) (2021-05-05) + +### Bug Fixes + +- Add space between 'Const' and signature name ([#220](https://github.com/tgreyuk/typedoc-plugin-markdown/issues/220)) ([9400803](https://github.com/tgreyuk/typedoc-plugin-markdown/commit/9400803a7dd0809d92c01d654e3fa75a01cb747e)) + +### Features + +- Enforce markdownlint standards ([#219](https://github.com/tgreyuk/typedoc-plugin-markdown/issues/219)) ([76a90bb](https://github.com/tgreyuk/typedoc-plugin-markdown/commit/76a90bb052fa289d5b234081e45b9b40e3c7649c)) +- Improve heading structure with disabled inline toc ([#222](https://github.com/tgreyuk/typedoc-plugin-markdown/issues/222)) ([2e898ac](https://github.com/tgreyuk/typedoc-plugin-markdown/commit/2e898ac1ec7b00a610da7d57d90a155f649d64a7)) + +## [3.7.2](https://github.com/tgreyuk/typedoc-plugin-markdown/compare/typedoc-plugin-markdown@3.7.1...typedoc-plugin-markdown@3.7.2) (2021-04-25) + +### Bug Fixes + +- Escape inherited types ([#215](https://github.com/tgreyuk/typedoc-plugin-markdown/issues/215)) ([34c5e7b](https://github.com/tgreyuk/typedoc-plugin-markdown/commit/34c5e7b9265a1825be567c2e89372d63c9b96f79)) + +## [3.7.1](https://github.com/tgreyuk/typedoc-plugin-markdown/compare/typedoc-plugin-markdown@3.7.0...typedoc-plugin-markdown@3.7.1) (2021-04-18) + +### Bug Fixes + +- Remove extraneous whitespace in table description col ([4e56ae4](https://github.com/tgreyuk/typedoc-plugin-markdown/commit/4e56ae4d12be35f94ac0f7294fc67c66df04e3c1)) + +# [3.7.0](https://github.com/tgreyuk/typedoc-plugin-markdown/compare/typedoc-plugin-markdown@3.6.1...typedoc-plugin-markdown@3.7.0) (2021-04-17) + +### Features + +- Prefix table bars to beggining of lines ([064c0db](https://github.com/tgreyuk/typedoc-plugin-markdown/commit/064c0dbecb194039d6a50d02ccc440116448c78a)) +- Use backticks and quote strings for literal types ([#212](https://github.com/tgreyuk/typedoc-plugin-markdown/issues/212)) ([8949be1](https://github.com/tgreyuk/typedoc-plugin-markdown/commit/8949be1608e60169d1f24393bf4257e38045b059)) + +## [3.6.1](https://github.com/tgreyuk/typedoc-plugin-markdown/compare/typedoc-plugin-markdown@3.6.0...typedoc-plugin-markdown@3.6.1) (2021-04-05) + +### Bug Fixes + +- Override section of methods overriding those of classes from node modules ([cb74e83](https://github.com/tgreyuk/typedoc-plugin-markdown/commit/cb74e83116046aebb900f25f8348a74094b03901)) + +# [3.6.0](https://github.com/tgreyuk/typedoc-plugin-markdown/compare/typedoc-plugin-markdown@3.5.0...typedoc-plugin-markdown@3.6.0) (2021-02-27) + +### Bug Fixes + +- Expand signature return types. ([a348f53](https://github.com/tgreyuk/typedoc-plugin-markdown/commit/a348f539ec91944cbb9e5a6a9ac26bf2cff5ec21)) + +### Features + +- Added `--hidePageTitle` option ([0b9588b](https://github.com/tgreyuk/typedoc-plugin-markdown/commit/0b9588b4db764095b9e5e17ce004d494b92e167e)) +- Added Front matter utils ([a530828](https://github.com/tgreyuk/typedoc-plugin-markdown/commit/a5308280662b0efe5d14f03a5854d26c5e42852e)) + +# [3.5.0](https://github.com/tgreyuk/typedoc-plugin-markdown/compare/typedoc-plugin-markdown@3.3.0...typedoc-plugin-markdown@3.5.0) (2021-02-15) + +### Bug Fixes + +- Added missing class accessor labels ([2b04924](https://github.com/tgreyuk/typedoc-plugin-markdown/commit/2b0492431c27d781a9cc869fdd26eea8259894d6)) +- Include missing member type declarations ([84f5703](https://github.com/tgreyuk/typedoc-plugin-markdown/commit/84f5703f6098f89bad7408d1fa1fb4b4d7b5dca6)) +- Remove emphasis inside angle brackets ([20c9605](https://github.com/tgreyuk/typedoc-plugin-markdown/commit/20c9605d24dd9c39b49ff84d1b813bc661bb4c3b)) + +### Features + +- Conditionally display hierarchies ([#192](https://github.com/tgreyuk/typedoc-plugin-markdown/issues/192)) ([099351c](https://github.com/tgreyuk/typedoc-plugin-markdown/commit/099351cfc207718f9f577b6a8035bebe10e3fc34)) +- Flatten nested params ([#191](https://github.com/tgreyuk/typedoc-plugin-markdown/issues/191)) ([9398d5c](https://github.com/tgreyuk/typedoc-plugin-markdown/commit/9398d5c7f51e7b1e646a15d4c06bd3056f660aa8)) +- Left-align table headers ([76012ab](https://github.com/tgreyuk/typedoc-plugin-markdown/commit/76012abb7fbbd972cf8143a03bb48d21898dc5d4)) + +# 3.4.5 (2021-01-26) + +### Bug Fixes + +- Escape pipes properly ([#187](https://github.com/tgreyuk/typedoc-plugin-markdown/issues/191)) + +# 3.4.4 (2021-01-26) + +### Bug Fixes + +Fixed navigation structure when readme=none diff --git a/tools/typedoc-plugin-markdown/LICENSE b/tools/typedoc-plugin-markdown/LICENSE new file mode 100644 index 00000000..f0039e40 --- /dev/null +++ b/tools/typedoc-plugin-markdown/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2016 Thomas Grey + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/tools/typedoc-plugin-markdown/README.md b/tools/typedoc-plugin-markdown/README.md new file mode 100644 index 00000000..ec457f3c --- /dev/null +++ b/tools/typedoc-plugin-markdown/README.md @@ -0,0 +1,104 @@ +# typedoc-plugin-markdown + +A plugin for [TypeDoc](https://typedoc.org) that renders TypeScript API documentation as Markdown. + +[![npm](https://img.shields.io/npm/v/typedoc-plugin-markdown.svg)](https://www.npmjs.com/package/typedoc-plugin-markdown) +[![Build Status](https://github.com/tgreyuk/typedoc-plugin-markdown/actions/workflows/ci.yml/badge.svg?branch=master)](https://github.com/tgreyuk/typedoc-plugin-markdown/actions/workflows/ci.yml) + +## What does it do? + +By default, TypeDoc will render API documentation as a webpage, e.g. HTML files. + +The plugin replaces the default HTML theme with a built-in Markdown theme and exposes some additional options. This is useful if documentation is required to be included in project README files, Wikis and static site generators. + +## Installation + +**Please note this pre-release version may contain breaking changes within the same semantic version.** + +> [TypeDoc](https://typedoc.org) and [Prettier](https://prettier.io/) are both required peer dependencies. + +```bash +npm install typedoc-plugin-markdown@next --save-dev +``` + +## Usage + +```bash +typedoc --plugin typedoc-plugin-markdown +``` + +## Options + +The following options can be used in addition to relevant [TypeDoc options](https://typedoc.org/options/) +(please note that TypeDoc options specific to the HTML theme will be ignored). + +### File output and content organization + +- **`--outputFileStrategy`**
+ Determines how output files are generated. Allowed values `modules` (all symbols hoisted to a single modules file) or `members` (each symbol exported to a seperate file). Default value `members`. +- **`--entryDocument`**
+ The file name of the entry document. Default value `README.md`. +- **`--includeFileNumberPrefixes`**
+ Prefixes generated files and folders with number prefixes. This is useful for auto sidebar generation. Defaults to `false`. +- **`--excludeGroups`**
+ By default members are grouped by kind (eg Classes, Functions etc). This option excludes such groupings so all members are rendered and sorted at the same level. Defaults to `false`. + +Please see [File output and content organization](./docs/file-output-options.md) for further documentation. + +### UI options + +- **`--hidePageHeader`**
+ Do not print the page header. Defaults to `false`. +- **`--hideBreadcrumbs`**
+ Do not print breadcrumbs. Defaults to `false`. +- **`--hideInPageTOC`**
+ Do not print in-page index items. Defaults to `false`. +- **`--hidePageTitle`**
+ Do not print the page title. Defaults to `false`. +- **`--hideKindTag`**
+ Do not print the kind tag identifiers for symbols. Defaults to `false`. +- **`--hideHierarchy`**
+ Do not print reflection hierarchy. Defaults to `false`. +- **`--indexPageTitle`**
+ The title of the main index / modules page. If not set will default to the project name. +- **`--indentifiersAsCodeBlocks`**
+ Format signature and declaration identifiers in code blocks. Note if `true` references will not be linked. Defaults to `false`. +- **`--propertiesFormat`**
+ Specify the render style of properties groups for interfaces, classes and type literals. Expected values [`list`, `table`]. Defaults to `list`. +- **`--enumMembersFormat`**
+ Specify the render style of Enum members. Expected values [`list`, `table`]. Defaults to `list`. +- **`--typeDeclarationFormat`**
+ Specify the render style for type declaration members. Expected values [`list`, `table`]. Defaults to `list`. + +### Utility options + +- **`--baseUrl`**
+ Specifies the base url for internal link. If omitted all urls will be relative. Defaults to `.` +- **`--anchorFormat`**
+ The anchor style to use when linking to internal symbols. Expected values [`lowercase`, `slug`, `none`]. Defaults to `lowercase`. +- **`--anchorPattern`**
+ The anchor pattern to use when linking to internal symbols. e.g customprefix-{{anchor}}. +- **`--namedAnchors`**
+ Use HTML named anchor tags for implementations that do not assign header ids. Defaults to `false`. + +## Frontmatter + +If frontmatter is required for adding further metadata please use [typedoc-plugin-frontmatter](https://github.com/tgreyuk/typedoc-plugin-frontmatter) + +## Output formatting (Prettier) + +Generated Markdown is now parsed with [Prettier](https://prettier.io/) which is backed by the remark-parse package. Parsing documents with Prettier has several benefits: + +- Produces a consistent format. +- Remove unnecessary escape characters. +- Formats code blocks inside comment fenced blocks. + +Any [prettier configuration](https://prettier.io/docs/en/configuration.html) files discovered will be passed as options to the parser. + +## Further Documentation + +- [File output options](./docs/file-output-options.md) + +## License + +[MIT](https://github.com/tgreyuk/typedoc-plugin-markdown/blob/master/LICENSE) diff --git a/tools/typedoc-plugin-markdown/docs/file-output-options.md b/tools/typedoc-plugin-markdown/docs/file-output-options.md new file mode 100644 index 00000000..e04681f4 --- /dev/null +++ b/tools/typedoc-plugin-markdown/docs/file-output-options.md @@ -0,0 +1,115 @@ +# File output and content organization + +TypeDoc creates documentation according to exports. The module structure is drived from the `--entryPoints` configuration. https://typedoc.org/options/input/#entrypoints. + +All TypeDoc organization and sorting options will be adhered to https://typedoc.org/options/organization/. + +In addition, the plugin aims to provide some additional flexibility as to how files are generated. + +## Output folder structure + +By default the file structure is generated as per the project module structure. + +### --outputFileStrategy + +The plugin exposes an additional option `outputFileStrategy` that determines how files are generated. The options are `members` or `modules`. + +#### `members` (default) + +Each member is exported to its own file. This is the standard behaviour of the HTML theme and the plugin default. + +**typedoc.json** + +```js +{ + outputFileStrategy: 'members'; +} +``` + +**Folder structure** + +``` +├── README.md +├── index.md +│ ├── module.moduleA +| ├── index.md +| ├── classes +| ├── class.ClassA.md +│ ├── interfaces +| ├── interface.InterfaceA.md +│ ├── module.moduleB +| ├── index.md +| ├── classes +| ├── class.ClassA.md +│ ├── interfaces +| ├── interface.InterfaceA.md +``` + +#### `modules` + +This mode generates a single file for every Module and Namespace where all module members are hoisted. This creates a flat navigation structure and reduces the amount of files generated. + +**typedoc.json** + +```js +{ + outputFileStrategy: 'modules'; +} +``` + +**Folder structure** + +``` +├── README.md +├── index.md +├── module.moduleA.md +├── module.moduleB.md +``` + +### --includeFileNumberPrefixes + +The `--includeFileNumberPrefixesA` prefixes files and folders with number prefxies. This makes them appear in the file system in the same order when sorted by file name and is useful where auto sidebar generation may be required. + +**Folder structure** + +``` +├── index.md +│ ├── 01-module.moduleA +| ├── index.md +| ├── 01-Classes +| ├── 01-class.ClassA.md +| ├── 02-class.ClassB.md +│ ├── 02-Interfaces +| ├── 01-interface.InterfaceA.md +│ ├── 02-module.moduleB +``` + +### --excludeGroups + +By default members are grouped under their respecitve reflection kind headings: + +```markdown +# SomeModule + +## Classes + +### ClassA + +## Functions + +### FunctionA +``` + +This `excludeGroups` option excludes such grouping so all members are rendered and sorted at same level. + +```markdown +# SomeModule + +## ClassA + +## FunctionA +``` + +The is more relevant when `outputFileStrategy` equals `modules`. When `outputFileStrategy` equals `members` only the index page structure is effected. + +This will also effect the generated file output and remove the respective group folders. diff --git a/tools/typedoc-plugin-markdown/jest.config.js b/tools/typedoc-plugin-markdown/jest.config.js new file mode 100644 index 00000000..7f171502 --- /dev/null +++ b/tools/typedoc-plugin-markdown/jest.config.js @@ -0,0 +1,6 @@ +const base = require('../../jest.config.base.js'); + +module.exports = { + ...base, + displayName: 'typedoc-plugin-markdown', +}; diff --git a/tools/typedoc-plugin-markdown/package.json b/tools/typedoc-plugin-markdown/package.json new file mode 100644 index 00000000..0cc9ef56 --- /dev/null +++ b/tools/typedoc-plugin-markdown/package.json @@ -0,0 +1,47 @@ +{ + "name": "typedoc-plugin-markdown", + "version": "4.0.0-next.11", + "description": "A plugin for TypeDoc that enables TypeScript API documentation to be generated in Markdown.", + "main": "dist/index.js", + "files": [ + "dist/" + ], + "scripts": { + "lint": "npm-run-all lint:*", + "lint:ts": "eslint ./src --ext .ts", + "lint:markdown": "npm run docs && markdownlint ./out/md", + "prepublishOnly": "npm run lint && npm run build && npm run test", + "prebuild": "ts-node scripts/build-resources", + "build": "rm -rf dist && tsc", + "test": "jest --colors --updateSnapshot", + "build-and-test": "npm run build && npm run test", + "docs": "npm run build && npm-run-all docs:*", + "docs:md-1": "typedoc --options ../../stubs/typedoc.1.js --out ./out/md/md-1", + "docs:md-2": "typedoc --options ../../stubs/typedoc.2.js --out ./out/md/md-2", + "docs:md-3": "typedoc --options ../../stubs/typedoc.3.js --out ./out/md/md-3", + "docs:html": "typedoc --options ../../stubs/typedoc.base.js --out ./out/html" + }, + "author": "Thomas Grey", + "license": "MIT", + "bugs": { + "url": "https://github.com/tgreyuk/typedoc-plugin-markdown/issues" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/tgreyuk/typedoc-plugin-markdown.git", + "directory": "packages/typedoc-plugin-markdown" + }, + "homepage": "https://github.com/tgreyuk/typedoc-plugin-markdown/tree/master/packages/typedoc-plugin-markdown", + "keywords": [ + "markdown", + "typescript", + "documentation", + "api", + "typedocplugin", + "typedoc" + ], + "peerDependencies": { + "prettier": ">=1.8.0", + "typedoc": ">=0.24.0" + } +} diff --git a/tools/typedoc-plugin-markdown/scripts/build-resources.ts b/tools/typedoc-plugin-markdown/scripts/build-resources.ts new file mode 100644 index 00000000..def8cc1d --- /dev/null +++ b/tools/typedoc-plugin-markdown/scripts/build-resources.ts @@ -0,0 +1,150 @@ +import * as fs from 'fs'; +import * as path from 'path'; +import { Project } from 'ts-morph'; + +const typedocSymbols = [ + 'ArrayType', + 'ConditionalType', + 'ContainerReflection', + 'Comment', + 'CommentDisplayPart', + 'DeclarationHierarchy', + 'DeclarationReflection', + 'InferredType', + 'IntersectionType', + 'IntrinsicType', + 'IndexedAccessType', + 'LiteralType', + 'PageEvent', + 'ParameterReflection', + 'ProjectReflection', + 'QueryType', + 'ReferenceReflection', + 'ReferenceType', + 'ReflectionType', + 'SignatureReflection', + 'SomeType', + 'TupleType', + 'TypeOperatorType', + 'TypeParameterReflection', + 'UnionType', + 'UnknownType', +]; + +const project = new Project({ + tsConfigFilePath: 'tsconfig.json', +}); + +const resourcesPath = path.join(__dirname, '..', 'src', 'resources'); + +const templateFiles = getFiles('templates'); +const templateSymbols = getSymbols(templateFiles, 'templates'); + +const partialsFiles = getFiles('partials'); +const partialsSymbols = getSymbols(partialsFiles, 'partials'); + +const out = [ + `// THIS FILE IS AUTOGENERATED - DO NOT EDIT DIRECTLY +import { \n ${typedocSymbols.join(',\n ')} } from 'typedoc'; +import { MarkdownThemeRenderContext } from '../theme-render-context'; +import { Collapse, NavigationItem } from '../models';`, +]; + +templateFiles.forEach((file, index) => { + out.push( + `import { ${templateSymbols[index].symbolName} } from './templates/${file}';`, + ); +}); + +partialsFiles.forEach((file, index) => { + out.push( + `import { ${partialsSymbols[index].symbolName} } from './partials/${file}';`, + ); +}); + +out.push(` +function bind(fn: (f: F, ...a: L) => R, first: F) { + return (...r: L) => fn(first, ...r); +}`); + +out.push(`export type Templates = {`); +templateSymbols.forEach((symbol) => { + out.push(writeSymbol(symbol)); +}); +out.push(`};\n`); + +out.push(`export type Partials = {`); +partialsSymbols.forEach((symbol) => { + out.push(writeSymbol(symbol)); +}); +out.push(`};`); + +out.push( + ` +export const templates = (context: MarkdownThemeRenderContext): Templates => ({`, +); +templateSymbols.forEach((symbol) => { + out.push(` ${symbol.symbolName}: bind(${symbol.symbolName}, context),`); +}); +out.push(`});`); + +out.push( + ` +export const partials = (context: MarkdownThemeRenderContext): Partials => ({`, +); +partialsSymbols.forEach((symbol) => { + out.push(` ${symbol.symbolName}: bind(${symbol.symbolName}, context),`); +}); +out.push(`});`); + +fs.writeFileSync( + path.join(resourcesPath, 'resources.ts'), + out.join('\n') + '\n', +); + +function getFiles(type: string) { + const partialsFolder = path.join(resourcesPath, type); + return fs + .readdirSync(partialsFolder) + .map((partialsFile) => path.parse(partialsFile).name); +} + +function getSymbols(files: string[], type: string) { + return files.map((file) => { + const tsFile = project.getSourceFile( + path.join(resourcesPath, type, file + '.ts'), + ); + + const symbolName = tsFile?.getExportSymbols()[0]?.getEscapedName(); + const fn = tsFile?.getFunction(symbolName as string); + + const params = fn + ?.getParameters() + .filter((parameter) => parameter.getName() !== 'context') + .map((parameter) => { + const typeunions = parameter + .getType() + .getText() + .split('|') + .map((unions) => { + const union = unions.split('.'); + if (union[1] && union[1].startsWith('PageEvent')) { + return `PageEvent<${union[union.length - 1]}`; + } + return union[union.length - 1]; + }); + const name = parameter.getName(); + const isOptional = parameter.isOptional(); + return { name, type: typeunions.join('| '), isOptional }; + }); + return { symbolName, params }; + }); +} + +function writeSymbol(symbol: any) { + return ` ${symbol.symbolName}: (${symbol.params + ?.map( + (param) => `${param.name}${param.isOptional ? '?' : ''}: ${param.type}`, + ) + .join(', ')}) => string;`; +} diff --git a/tools/typedoc-plugin-markdown/src/converter/models.ts b/tools/typedoc-plugin-markdown/src/converter/models.ts new file mode 100644 index 00000000..392cc498 --- /dev/null +++ b/tools/typedoc-plugin-markdown/src/converter/models.ts @@ -0,0 +1,7 @@ +export interface UrlOption { + parentUrl?: string; + directory?: string | null; + forceDirectory?: boolean; + directoryPosition: number; + pagePosition: number; +} diff --git a/tools/typedoc-plugin-markdown/src/converter/navigation-builder.ts b/tools/typedoc-plugin-markdown/src/converter/navigation-builder.ts new file mode 100644 index 00000000..a9c4c195 --- /dev/null +++ b/tools/typedoc-plugin-markdown/src/converter/navigation-builder.ts @@ -0,0 +1,77 @@ +import { + DeclarationReflection, + ProjectReflection, + ReflectionGroup, +} from 'typedoc'; + +import { NavigationItem } from '../models'; +import { MarkdownThemeRenderContext } from '../theme-render-context'; + +export class NavigationBuilder { + navigation: NavigationItem[] = []; + + constructor(public context: MarkdownThemeRenderContext) {} + + getNavigation(project: ProjectReflection): NavigationItem[] { + if (project.groups?.length) { + project.groups?.forEach(() => { + project.children?.forEach((child) => { + this.navigation.push({ + title: child.name, + url: child.url, + children: this.getChildrenOrGroups(child) || [], + }); + }); + }); + } else { + project.children?.forEach((child) => { + this.navigation.push({ + title: child.name, + children: this.getChildrenOrGroups(child) || [], + }); + }); + } + + return this.navigation; + } + + getGroupChildren(group: ReflectionGroup) { + if (group.categories) { + return group.categories?.map((category) => { + return { + title: category.title, + children: this.getGroupChildren(category) || [], + }; + }); + } + return group.children + ?.filter((child) => child.hasOwnDocument) + .map((child) => { + return { + title: child.name, + url: child.url, + children: this.getChildrenOrGroups(child) || [], + }; + }); + } + + getChildrenOrGroups(reflection: DeclarationReflection) { + if (this.context.getOption('excludeGroups')) { + return reflection.children + ?.filter((child) => child.hasOwnDocument) + .map((child) => { + return { + title: child.name, + url: child.url, + children: this.getChildrenOrGroups(child), + }; + }); + } + return reflection.groups?.map((group) => { + return { + title: group.title, + children: this.getGroupChildren(group) || [], + }; + }); + } +} diff --git a/tools/typedoc-plugin-markdown/src/converter/url-builder.ts b/tools/typedoc-plugin-markdown/src/converter/url-builder.ts new file mode 100644 index 00000000..5726ca16 --- /dev/null +++ b/tools/typedoc-plugin-markdown/src/converter/url-builder.ts @@ -0,0 +1,429 @@ +import * as path from 'path'; +import { + DeclarationReflection, + EntryPointStrategy, + PageEvent, + ProjectReflection, + Reflection, + ReflectionKind, + UrlMapping, +} from 'typedoc'; +import { OutputFileStrategy, TemplateMapping } from '../models'; +import { slugify } from '../support/utils'; +import { MarkdownThemeRenderContext } from '../theme-render-context'; +import { UrlOption } from './models'; + +export class UrlBuilder { + urls: UrlMapping[] = []; + anchors: string[] = []; + + constructor(public context: MarkdownThemeRenderContext) {} + + readmeTemplate = (pageEvent: PageEvent) => { + return this.context.templates.readmeTemplate(pageEvent); + }; + + projectTemplate = (pageEvent: PageEvent) => { + return this.context.templates.projectTemplate(pageEvent); + }; + + reflectionTemplate = (pageEvent: PageEvent) => { + return this.context.templates.reflectionTemplate(pageEvent); + }; + + memberTemplate = (pageEvent: PageEvent) => { + return this.context.templates.memberTemplate(pageEvent); + }; + + /** + * Map the models of the given project to the desired output files. + * Based on TypeDoc DefaultTheme.getUrls() + * + * @param project The project whose urls should be generated. + */ + getUrls(project: ProjectReflection): UrlMapping[] { + const entryDocument = this.context.getOption('entryDocument'); + const globalsPage = + this.context.getOption('entryPoints')?.length > 1 + ? this.context.modulesFile + : this.context.exportsFile; + if (!this.context.getOption('readme')?.endsWith('none')) { + project.url = this.getPartName(globalsPage, 1); + this.urls.push( + new UrlMapping( + this.context.getOption('entryDocument'), + project, + this.readmeTemplate, + ), + ); + + this.urls.push( + new UrlMapping( + this.getPartName(globalsPage, 1), + project, + this.projectTemplate, + ), + ); + } else { + project.url = entryDocument; + this.urls.push( + new UrlMapping(entryDocument, project, this.projectTemplate), + ); + } + + if ( + (this.context.getOption( + 'entryPointStrategy', + ) as unknown as EntryPointStrategy) === 'packages' + ) { + project.children?.forEach((projectChild, projectChildIndex) => { + const startIndex = !this.context.getOption('readme')?.endsWith('none') + ? 2 + : 1; + const directoryPosition = projectChildIndex + startIndex; + const url = `${this.getPartName( + projectChild.name, + directoryPosition, + )}/${ + Boolean(projectChild.readme) + ? this.getPartName(this.context.indexFile, 1) + : this.context.indexFile + }`; + if (projectChild.readme) { + this.urls.push( + new UrlMapping( + `${path.dirname(url)}/${this.context.readmeFile}`, + projectChild as any, + this.readmeTemplate, + ), + ); + } + this.urls.push( + new UrlMapping(url, projectChild as any, this.projectTemplate), + ); + projectChild.url = url; + this.buildUrlsFromProject(projectChild, url); + }); + } else { + this.buildUrlsFromProject(project); + } + + return this.urls; + } + + /** + * + * @param project + * @param isPackage + */ + private buildUrlsFromProject( + project: ProjectReflection | DeclarationReflection, + parentUrl?: string, + ) { + const startIndex = Boolean(project.readme) ? 2 : 1; + + if (this.context.getOption('excludeGroups')) { + project.children?.forEach((projectGroupChild, projectGroupChildIndex) => { + this.buildUrlsFromGroup(projectGroupChild, { + directoryPosition: projectGroupChildIndex + startIndex, + pagePosition: projectGroupChildIndex + startIndex, + ...(parentUrl && { parentUrl: parentUrl }), + }); + }); + } else { + project.groups?.forEach((projectGroup, projectGroupIndex) => { + projectGroup.children.forEach( + (projectGroupChild, projectGroupChildIndex) => { + this.buildUrlsFromGroup(projectGroupChild, { + directoryPosition: projectGroupIndex + startIndex, + pagePosition: projectGroupChildIndex + startIndex, + ...(parentUrl && { parentUrl: parentUrl }), + }); + }, + ); + }); + } + } + + private buildUrlsFromGroup( + reflection: DeclarationReflection, + options: UrlOption, + ) { + const mapping = this.getTemplateMapping(reflection.kind); + if (mapping) { + const directory = options.directory || mapping.directory; + const url = this.getUrl(reflection, { + ...options, + directory, + }); + + this.urls.push(new UrlMapping(url, reflection, mapping.template)); + + reflection.url = url; + reflection.hasOwnDocument = true; + + if (this.context.getOption('excludeGroups')) { + if (reflection.categories) { + reflection.categories.forEach((category, categoryIndex) => { + category.children.forEach((categoryChild, categoryChildIndex) => { + this.buildUrlsFromGroup(categoryChild, { + parentUrl: url, + directoryPosition: categoryIndex + 1, + directory: category.title, + pagePosition: categoryChildIndex + 1, + forceDirectory: true, + }); + }); + }); + } else { + reflection.children?.forEach((groupChild, groupChildIndex) => { + this.buildUrlsFromGroup(groupChild, { + parentUrl: url, + directoryPosition: groupChildIndex + 1, + directory: null, + pagePosition: groupChildIndex + 1, + }); + }); + } + } else { + reflection.groups?.forEach((group, groupIndex) => { + if (group.categories) { + group.categories.forEach((category, categoryIndex) => { + category.children.forEach((categoryChild, categoryChildIndex) => { + const mapping = this.getTemplateMapping(categoryChild.kind); + this.buildUrlsFromGroup(categoryChild, { + parentUrl: url, + directoryPosition: groupIndex + 1, + directory: `${mapping?.directory}/${this.getPartName( + category.title, + categoryIndex + 1, + )}`, + pagePosition: categoryChildIndex + 1, + }); + }); + }); + } else { + group.children.forEach((groupChild, groupChildIndex) => { + const mapping = this.getTemplateMapping(groupChild.kind); + this.buildUrlsFromGroup(groupChild, { + parentUrl: url, + directoryPosition: groupIndex + 1, + directory: mapping?.directory || null, + pagePosition: groupChildIndex + 1, + }); + }); + } + }); + } + } else if (reflection.parent) { + this.applyAnchorUrl(reflection, reflection.parent); + } + } + + private getUrl(reflection: DeclarationReflection, options: UrlOption) { + if (this.context.getOption('flattenOutputFiles')) { + const kindAlias = ReflectionKind.singularString(reflection.kind).split( + ' ', + )[0]; + if (options.parentUrl) { + return `${path + .dirname(options.parentUrl.split('.').join('/')) + .split('/') + .join('.')}.${kindAlias}.${reflection.name.replace(/\//, '_')}.md`; + } + const friendlyName = `${reflection.name.replace(/\//, '_')}.md`; + return reflection.kindOf(ReflectionKind.Module) + ? friendlyName + : `${kindAlias}.${friendlyName}`; + } + + // remove leading underscores + const alias = reflection.getAlias().replace(/^_/, ''); + + const parentDir = options.parentUrl + ? path.dirname(options.parentUrl) + : null; + + const dir = () => { + if (reflection.kindOf(ReflectionKind.Namespace)) { + if (!this.context.getOption('excludeGroups')) { + return this.getPartName( + `${options.directory}/${this.getPartName( + 'namespace.' + alias, + options.pagePosition, + )}`, + options.directoryPosition, + ); + } + return this.getPartName(alias, options.pagePosition); + } + + if ( + options.directory && + this.context.getOption('excludeGroups') && + !options.forceDirectory + ) { + return null; + } + + return options.directory + ? this.getPartName(options.directory, options.directoryPosition) + : `${this.getPartName( + slugify(ReflectionKind.singularString(reflection.kind)), + options.pagePosition, + )}.${alias}`; + }; + + const filename = () => { + if ( + reflection.kindOf([ReflectionKind.Module, ReflectionKind.Namespace]) && + this.context.getOption('outputFileStrategy') === + OutputFileStrategy.Modules && + !this.childrenIncludeNamespaces(reflection) + ) { + return null; + } + if ( + reflection.kindOf([ReflectionKind.Module, ReflectionKind.Namespace]) + ) { + return path.parse(this.context.indexFile).name; + } + return `${this.getPartName( + slugify(ReflectionKind.singularString(reflection.kind)), + options.pagePosition, + )}.${alias}`; + }; + + return ( + [parentDir, dir(), filename()].filter((part) => Boolean(part)).join('/') + + '.md' + ); + } + + private applyAnchorUrl( + reflection: DeclarationReflection, + container: Reflection, + ) { + if (container.url && !reflection.url) { + if (!reflection.kindOf(ReflectionKind.TypeLiteral)) { + const anchorPattern = this.context.getOption('anchorPattern'); + const anchorId = anchorPattern + ? anchorPattern.replace('{{anchor}}', this.getAnchorId(reflection)) + : this.getAnchorId(reflection); + + const count = this.anchors[container.url]?.filter( + (id) => id === anchorId, + )?.length; + + const anchor = + anchorId + (count > 1 ? '-' + (count - 1).toString() : ''); + this.anchors.push(anchorId); + + reflection.url = container.url + '#' + anchor; + reflection.anchor = anchor; + } + reflection.hasOwnDocument = false; + } + reflection.traverse((child) => { + if (child instanceof DeclarationReflection) { + this.applyAnchorUrl(child, container); + } + }); + } + + private getAnchorId(reflection: DeclarationReflection) { + const anchorFormat = this.context.getOption('anchorFormat'); + if (anchorFormat.toLowerCase() === 'lowercase') { + return reflection.name.toLowerCase(); + } + if (anchorFormat.toLowerCase() === 'slug') { + return slugify(reflection.name); + } + return reflection.name; + } + + private getPartName(part: string, position: number) { + return this.context.getOption('includeFileNumberPrefixes') + ? `${String(position).padStart(2, '0')}-${part}` + : part; + } + + private childrenIncludeNamespaces(reflection: DeclarationReflection) { + return reflection.children?.some((child) => + child.kindOf(ReflectionKind.Namespace), + ); + } + + /** + * Returns the template mapping for a given reflection kind + * @param kind + */ + private getTemplateMapping(kind: ReflectionKind): TemplateMapping { + const getDirectoryName = (reflectionKind: ReflectionKind) => { + const pluralString = ReflectionKind.pluralString(reflectionKind); + return this.context.getOption('includeFileNumberPrefixes') + ? pluralString + : slugify(pluralString); + }; + + const outputFileStrategy = this.context.getOption('outputFileStrategy'); + + const mappings = { + [ReflectionKind.Module]: { + template: this.reflectionTemplate, + directory: null, + kind: ReflectionKind.Module, + }, + [ReflectionKind.Namespace]: { + template: this.reflectionTemplate, + directory: getDirectoryName(ReflectionKind.Namespace), + kind: ReflectionKind.Namespace, + }, + }; + + if (outputFileStrategy === OutputFileStrategy.Members) { + mappings[ReflectionKind.Class] = { + template: this.reflectionTemplate, + directory: getDirectoryName(ReflectionKind.Class), + kind: ReflectionKind.Class, + }; + } + if (outputFileStrategy === OutputFileStrategy.Members) { + mappings[ReflectionKind.Interface] = { + isLeaf: false, + template: this.reflectionTemplate, + directory: getDirectoryName(ReflectionKind.Interface), + kind: ReflectionKind.Interface, + }; + } + if (outputFileStrategy === OutputFileStrategy.Members) { + mappings[ReflectionKind.Enum] = { + template: this.reflectionTemplate, + directory: getDirectoryName(ReflectionKind.Enum), + kind: ReflectionKind.Enum, + }; + } + if (outputFileStrategy === OutputFileStrategy.Members) { + mappings[ReflectionKind.Function] = { + template: this.memberTemplate, + directory: getDirectoryName(ReflectionKind.Function), + kind: ReflectionKind.Function, + }; + } + if (outputFileStrategy === OutputFileStrategy.Members) { + mappings[ReflectionKind.TypeAlias] = { + template: this.memberTemplate, + directory: getDirectoryName(ReflectionKind.TypeAlias), + kind: ReflectionKind.TypeAlias, + }; + } + if (outputFileStrategy === OutputFileStrategy.Members) { + mappings[ReflectionKind.Variable] = { + template: this.memberTemplate, + directory: getDirectoryName(ReflectionKind.Variable), + kind: ReflectionKind.Variable, + }; + } + return mappings[kind]; + } +} diff --git a/tools/typedoc-plugin-markdown/src/index.ts b/tools/typedoc-plugin-markdown/src/index.ts new file mode 100644 index 00000000..52619752 --- /dev/null +++ b/tools/typedoc-plugin-markdown/src/index.ts @@ -0,0 +1,35 @@ +import { Application } from 'typedoc'; +import { declareOptions } from './options/options'; +import { generateMarkdown, renderMarkdown } from './renderer/renderer'; +import { MarkdownTheme } from './theme'; + +export function load(app: Application) { + /** + * Exposes markdown and bootstrap the markdown theme to the renderer + */ + app.renderer.defineTheme('markdown', MarkdownTheme); + + /** + * Defines all plugin options + */ + declareOptions(app); + + /** + * Decouple HTML logic from the renderer (there should probably be a better solution to this) + */ + Object.defineProperty(app, 'generateDocs', { value: generateMarkdown }); + Object.defineProperty(app.renderer, 'render', { + value: renderMarkdown, + configurable: true, + }); +} + +/** + * Expose global entrypoints + */ +export * from './models'; +export * from './options/options-reader'; +export { MarkdownRendererEvent } from './renderer/renderer'; +export { partials } from './resources/resources'; +export { MarkdownTheme } from './theme'; +export { MarkdownThemeRenderContext } from './theme-render-context'; diff --git a/tools/typedoc-plugin-markdown/src/models.ts b/tools/typedoc-plugin-markdown/src/models.ts new file mode 100644 index 00000000..5cea976a --- /dev/null +++ b/tools/typedoc-plugin-markdown/src/models.ts @@ -0,0 +1,79 @@ +import { ReflectionKind, TypeDocOptionMap } from 'typedoc'; + +/** + * Defines outputFileStrategy options + * @enum + */ +export const OutputFileStrategy = { + Modules: 'modules', + Members: 'members', +} as const; + +export type OutputFileStrategy = + (typeof OutputFileStrategy)[keyof typeof OutputFileStrategy]; + +/** + * Defines format style options + * @enum + */ +export const FormatStyle = { + List: 'list', + Table: 'table', +} as const; + +export type FormatStyle = (typeof FormatStyle)[keyof typeof FormatStyle]; + +/** + * Defines format style options + * @enum + */ +export const AnchorFormat = { + Lowercase: 'lowercase', + Slug: 'slug', + None: 'none', +} as const; + +export type AnchorFormat = (typeof AnchorFormat)[keyof typeof AnchorFormat]; + +export interface TypedocPluginMarkdownOptions extends TypeDocOptionMap { + anchorFormat: AnchorFormat; + anchorPattern: string; + baseUrl: string; + entryDocument: string; + enumMembersFormat: FormatStyle; + excludeGroups: boolean; + flattenOutputFiles: boolean; + hideBreadcrumbs: boolean; + hideInPageTOC: boolean; + hideKindTag: boolean; + hidePageHeader: boolean; + hidePageTitle: boolean; + hideHierarchy: boolean; + includeFileNumberPrefixes: boolean; + indentifiersAsCodeBlocks: boolean; + indexPageTitle: string; + namedAnchors: boolean; + outputFileStrategy: OutputFileStrategy; + propertiesFormat: FormatStyle; + typeDeclarationFormat: FormatStyle; +} + +export interface TemplateMapping { + directory: string | null; + template: any; + kind: ReflectionKind; +} + +export type Collapse = 'object' | 'function' | 'all' | 'none'; + +export type FrontmatterGlobals = + | string + | Record; + +export interface NavigationItem { + title: string; + url?: string; + children?: NavigationItem[]; + isReadme?: boolean; + isGroup?: boolean; +} diff --git a/tools/typedoc-plugin-markdown/src/options/options-reader.ts b/tools/typedoc-plugin-markdown/src/options/options-reader.ts new file mode 100644 index 00000000..240649ea --- /dev/null +++ b/tools/typedoc-plugin-markdown/src/options/options-reader.ts @@ -0,0 +1,35 @@ +import { Options, OptionsReader } from 'typedoc'; +import { TypedocPluginMarkdownOptions } from '../models'; + +export class MarkdownPluginOptionsReader + implements OptionsReader +{ + options: Partial; + + name = 'custom-options'; + order = 1000; + readonly supportsPackages = false; + + constructor(options: Partial) { + this.options = options; + } + + read(container: Options) { + if (this.options) { + Object.entries(this.options).forEach(([key, value]) => { + if (key === 'plugin') { + const plugins = container.getValue('plugin'); + const defaultPlugins = value as string[]; + defaultPlugins.forEach((defaultPlugin) => { + if (!plugins.includes(defaultPlugin)) { + plugins.push(defaultPlugin); + } + }); + container.setValue('plugin', plugins); + } else { + container.setValue(key, value); + } + }); + } + } +} diff --git a/tools/typedoc-plugin-markdown/src/options/options.ts b/tools/typedoc-plugin-markdown/src/options/options.ts new file mode 100644 index 00000000..e988c0a9 --- /dev/null +++ b/tools/typedoc-plugin-markdown/src/options/options.ts @@ -0,0 +1,190 @@ +import { Application, Options, OptionsReader, ParameterType } from 'typedoc'; +import { AnchorFormat, FormatStyle, OutputFileStrategy } from '../models'; + +export function declareOptions(app: Application) { + app.options.addReader( + new (class implements OptionsReader { + name = 'markdown-theme'; + readonly order = 900; + readonly supportsPackages = false; + read(container: Options) { + if (container.getValue('theme') === 'default') { + container.setValue('theme', 'markdown'); + } + + if (container.getValue('excludeGroups')) { + container.setValue('categorizeByGroup', false); + } + } + })(), + ); + /** + * file output options + */ + + app.options.addDeclaration({ + name: 'outputFileStrategy', + help: 'Determines how files are rendered.', + type: ParameterType.Map, + map: OutputFileStrategy, + defaultValue: OutputFileStrategy.Members, + }); + + app.options.addDeclaration({ + name: 'entryDocument', + help: '[Markdown Plugin] The file name of the entry document.', + type: ParameterType.String, + defaultValue: 'README.md', + }); + + app.options.addDeclaration({ + name: 'flattenOutputFiles', + help: '[Markdown Plugin] Flatten output files without folders.', + type: ParameterType.Boolean, + defaultValue: false, + }); + + app.options.addDeclaration({ + name: 'includeFileNumberPrefixes', + help: '[Markdown Plugin] Prefixes docs and folders by number prefixes if applicable.', + type: ParameterType.Boolean, + defaultValue: false, + }); + + app.options.addDeclaration({ + name: 'excludeGroups', + help: '[Markdown Plugin] Groups reflection kinds by headings if applicable e.g Classes, Functions. If set to false all symbols will render on the same level. Defaults to `true`', + type: ParameterType.Boolean, + defaultValue: false, + }); + + /** + * ui options + */ + + app.options.addDeclaration({ + name: 'hidePageHeader', + help: '[Markdown Plugin] Do not print page header.', + type: ParameterType.Boolean, + defaultValue: false, + }); + + app.options.addDeclaration({ + name: 'hidePageTitle', + help: '[Markdown Plugin] Do not print page title.', + type: ParameterType.Boolean, + defaultValue: false, + }); + + app.options.addDeclaration({ + name: 'hideKindTag', + help: '[Markdown Plugin] Do not print the kind tag beneath the page title.', + type: ParameterType.Boolean, + defaultValue: false, + }); + + app.options.addDeclaration({ + name: 'hideBreadcrumbs', + help: '[Markdown Plugin] Do not print breadcrumbs.', + type: ParameterType.Boolean, + defaultValue: false, + }); + + app.options.addDeclaration({ + name: 'hideInPageTOC', + help: '[Markdown Plugin] Do not render in-page table of contents items.', + type: ParameterType.Boolean, + defaultValue: false, + }); + + app.options.addDeclaration({ + name: 'hideHierarchy', + help: '[Markdown Plugin] Do not print reflection hierarchy.', + type: ParameterType.Boolean, + defaultValue: false, + }); + + app.options.addDeclaration({ + name: 'indexPageTitle', + help: '[Markdown Plugin] The title of the main index / modules page.', + type: ParameterType.String, + }); + + app.options.addDeclaration({ + name: 'indentifiersAsCodeBlocks', + help: '[Markdown Plugin] Format signature and declaration identifiers in code blocks.', + type: ParameterType.Boolean, + defaultValue: false, + }); + + app.options.addDeclaration({ + name: 'propertiesFormat', + help: '[Markdown Plugin] Specify the render style of properties.', + type: ParameterType.Map, + map: FormatStyle, + defaultValue: FormatStyle.List, + }); + + app.options.addDeclaration({ + name: 'enumMembersFormat', + help: '[Markdown Plugin] Specify the render style of enum members.', + type: ParameterType.Map, + map: FormatStyle, + defaultValue: FormatStyle.List, + }); + + app.options.addDeclaration({ + name: 'typeDeclarationFormat', + help: '[Markdown Plugin] Specify the render style of type declration members.', + type: ParameterType.Map, + map: FormatStyle, + defaultValue: FormatStyle.List, + }); + + /** + * Frontmatter options (TO BE DELETED) + */ + app.options.addDeclaration({ + name: 'enableFrontmatter', + help: '[Markdown Plugin] Removed (please use typedoc-plugin-fronmatter)', + type: ParameterType.Boolean, + defaultValue: false, + }); + + /** + * Utility options + */ + app.options.addDeclaration({ + help: '[Markdown Plugin] Specifies the base url for internal link. If omitted all urls will be relative.', + name: 'baseUrl', + type: ParameterType.String, + }); + + app.options.addDeclaration({ + name: 'anchorFormat', + help: '[Markdown Plugin] The anchor format to use when linking to internal symbols.', + type: ParameterType.Map, + map: AnchorFormat, + defaultValue: AnchorFormat.Lowercase, + }); + + app.options.addDeclaration({ + name: 'anchorPattern', + help: '[Markdown Plugin] The anchor pattern to use when linking to internal symbols. e.g customprefix-{{anchor}}.', + type: ParameterType.String, + }); + + app.options.addDeclaration({ + name: 'namedAnchors', + help: '[Markdown Plugin] Use HTML named anchors as fragment identifiers for engines that do not automatically assign header ids. Should be set for Bitbucket Server docs.', + type: ParameterType.Boolean, + defaultValue: false, + }); + + app.options.addDeclaration({ + name: 'preserveAnchorCasing', + help: '[Markdown Plugin] Preserve anchor casing when generating links.', + type: ParameterType.Boolean, + defaultValue: false, + }); +} diff --git a/tools/typedoc-plugin-markdown/src/renderer/renderer.ts b/tools/typedoc-plugin-markdown/src/renderer/renderer.ts new file mode 100644 index 00000000..38ded8e2 --- /dev/null +++ b/tools/typedoc-plugin-markdown/src/renderer/renderer.ts @@ -0,0 +1,108 @@ +import * as fs from 'fs'; +import * as path from 'path'; +import { + DeclarationReflection, + ProjectReflection, + RendererEvent, +} from 'typedoc'; +import { NavigationItem } from '../models'; + +export class MarkdownRendererEvent extends RendererEvent { + navigation: NavigationItem[]; +} + +export async function generateMarkdown( + project: ProjectReflection, + out: string, +) { + const start = Date.now(); + + out = path.resolve(out); + + await this.renderer.render(project, out); + + if (this.logger.hasErrors()) { + this.logger.error( + 'Documentation could not be generated due to the errors above.', + ); + } else { + this.logger.info(`Documentation generated at ${out}`); + + this.logger.verbose(`Markdown rendering took ${Date.now() - start}ms`); + } +} + +export async function renderMarkdown( + project: ProjectReflection, + outputDirectory: string, +): Promise { + this.renderStartTime = Date.now(); + + if (this.cleanOutputDir) { + try { + fs.rmSync(outputDirectory, { recursive: true, force: true }); + } catch (error) { + this.application.logger.warn('Could not empty the output directory.'); + return; + } + } + + try { + fs.mkdirSync(outputDirectory, { recursive: true }); + } catch (error) { + this.application.l.error( + `Could not create output directory ${outputDirectory}.`, + ); + return; + } + + if (this.githubPages) { + try { + const text = + 'TypeDoc added this file to prevent GitHub Pages from ' + + 'using Jekyll. You can turn off this behavior by setting ' + + 'the `githubPages` option to false.'; + + fs.writeFileSync(path.join(outputDirectory, '.nojekyll'), text); + } catch (error) { + this.application.warn('Could not create .nojekyll file.'); + return; + } + } + + this.prepareTheme(); + + const output = new MarkdownRendererEvent( + RendererEvent.BEGIN, + outputDirectory, + project, + ); + + output.urls = this.theme!.getUrls(project); + output.navigation = this.theme!.getNavigation(project); + + this.trigger(output); + + await Promise.all(this.preRenderAsyncJobs.map((job) => job(output))); + this.preRenderAsyncJobs = []; + + this.application.logger.verbose( + `There are ${output.urls?.length} pages to write.`, + ); + output.urls + ?.filter( + (urlMapping) => + urlMapping.model instanceof ProjectReflection || + urlMapping.model instanceof DeclarationReflection, + ) + .forEach((urlMapping) => { + this.renderDocument(...output.createPageEvent(urlMapping)); + }); + + await Promise.all(this.postRenderAsyncJobs.map((job) => job(output))); + this.postRenderAsyncJobs = []; + + this.trigger(RendererEvent.END, output); + + this.theme = void 0; +} diff --git a/tools/typedoc-plugin-markdown/src/resources/partials/breadcrumbs.ts b/tools/typedoc-plugin-markdown/src/resources/partials/breadcrumbs.ts new file mode 100644 index 00000000..6351323d --- /dev/null +++ b/tools/typedoc-plugin-markdown/src/resources/partials/breadcrumbs.ts @@ -0,0 +1,46 @@ +import { DeclarationReflection, PageEvent, ProjectReflection } from 'typedoc'; +import { link } from '../../support/els'; +import { escapeChars } from '../../support/utils'; +import { MarkdownThemeRenderContext } from '../../theme-render-context'; + +export function breadcrumbs( + context: MarkdownThemeRenderContext, + page: PageEvent, +) { + const md: string[] = []; + + if (page.url === page.project.url || page.url === context.indexFile) { + return ''; + } + + md.push( + link( + Boolean(page.project.groups) + ? context.getOption('entryPoints').length > 1 + ? 'Modules' + : 'Exports' + : 'Packages', + context.relativeURL(page.project.url), + ), + ); + + const breadcrumb = (model: any) => { + if (model?.parent?.parent) { + breadcrumb(model.parent); + } + md.push(link(model.name, context.relativeURL(model?.url))); + }; + + const pageName = escapeChars(page.model.name); + + if ( + page.model?.parent?.parent && + (page.url !== page.project.url || page.url !== context.indexFile) + ) { + breadcrumb(page.model.parent); + } + + md.push(pageName); + + return md.length > 1 ? `${md.join(' > ')}` : ''; +} diff --git a/tools/typedoc-plugin-markdown/src/resources/partials/comment.parts.ts b/tools/typedoc-plugin-markdown/src/resources/partials/comment.parts.ts new file mode 100644 index 00000000..98136a20 --- /dev/null +++ b/tools/typedoc-plugin-markdown/src/resources/partials/comment.parts.ts @@ -0,0 +1,45 @@ +import { CommentDisplayPart } from 'typedoc'; +import { MarkdownThemeRenderContext } from '../../theme-render-context'; + +export function commentParts( + context: MarkdownThemeRenderContext, + parts: CommentDisplayPart[], +) { + const md: string[] = []; + for (const part of parts) { + switch (part.kind) { + case 'text': + case 'code': + md.push(part.text); + break; + case 'inline-tag': + switch (part.tag) { + case '@label': + case '@inheritdoc': + break; + case '@link': + case '@linkcode': + case '@linkplain': { + if (part.target) { + const url = + typeof part.target === 'string' + ? part.target + : context.relativeURL((part.target as any).url); + const wrap = part.tag === '@linkcode' ? '`' : ''; + md.push(url ? `[${wrap}${part.text}${wrap}](${url})` : part.text); + } else { + md.push(part.text); + } + break; + } + default: + md.push(`{${part.tag} ${part.text}}`); + break; + } + break; + default: + md.push(''); + } + } + return md.join(''); +} diff --git a/tools/typedoc-plugin-markdown/src/resources/partials/comment.ts b/tools/typedoc-plugin-markdown/src/resources/partials/comment.ts new file mode 100644 index 00000000..fc1ca270 --- /dev/null +++ b/tools/typedoc-plugin-markdown/src/resources/partials/comment.ts @@ -0,0 +1,34 @@ +import { Comment } from 'typedoc'; +import { backTicks, heading } from '../../support/els'; +import { getTagName } from '../../support/helpers'; +import { camelToTitleCase, escapeAngleBrackets } from '../../support/utils'; +import { MarkdownThemeRenderContext } from '../../theme-render-context'; + +export function comment( + context: MarkdownThemeRenderContext, + comment: Comment, + headingLevel?: number, +) { + const md: string[] = []; + + if (comment.summary?.length > 0) { + md.push(context.partials.commentParts(comment.summary)); + } + + if (comment.blockTags?.length) { + const tags = comment.blockTags + .filter((tag) => tag.tag !== '@returns') + .map((tag) => { + const tagName = getTagName(tag); + const tagText = camelToTitleCase(tagName); + const tagMd = [ + headingLevel ? heading(headingLevel, tagText) : backTicks(tagText), + ]; + tagMd.push(context.partials.commentParts(tag.content)); + return tagMd.join('\n\n'); + }); + md.push(tags.join('\n\n')); + } + + return escapeAngleBrackets(md.join('\n\n')); +} diff --git a/tools/typedoc-plugin-markdown/src/resources/partials/hierarchy.ts b/tools/typedoc-plugin-markdown/src/resources/partials/hierarchy.ts new file mode 100644 index 00000000..aec62f65 --- /dev/null +++ b/tools/typedoc-plugin-markdown/src/resources/partials/hierarchy.ts @@ -0,0 +1,48 @@ +import { DeclarationHierarchy, SomeType, Type } from 'typedoc'; +import { backTicks, bold, unorderedList } from '../../support/els'; +import { MarkdownThemeRenderContext } from '../../theme-render-context'; + +export function hierarchy( + context: MarkdownThemeRenderContext, + declarationHierarchy: DeclarationHierarchy, +) { + const md: string[] = []; + const parent = !declarationHierarchy.isTarget + ? declarationHierarchy.types + .map((hierarchyType) => { + return getHierarchyType( + hierarchyType, + declarationHierarchy.isTarget || false, + context, + ); + }) + .join('.') + : null; + if (declarationHierarchy.next) { + declarationHierarchy.next.types.forEach((hierarchyType) => { + const line: string[] = []; + if (parent) { + line.push(parent); + } + line.push( + getHierarchyType( + hierarchyType, + declarationHierarchy.next?.isTarget || false, + context, + ), + ); + md.push(line.join('.')); + }); + } + return unorderedList(md); +} + +function getHierarchyType( + hierarchyType: Type, + isTarget: boolean, + context: MarkdownThemeRenderContext, +) { + return isTarget + ? bold(backTicks(hierarchyType.toString())) + : context.partials.someType(hierarchyType as SomeType); +} diff --git a/tools/typedoc-plugin-markdown/src/resources/partials/member.declaration.identifier.ts b/tools/typedoc-plugin-markdown/src/resources/partials/member.declaration.identifier.ts new file mode 100644 index 00000000..d17bc304 --- /dev/null +++ b/tools/typedoc-plugin-markdown/src/resources/partials/member.declaration.identifier.ts @@ -0,0 +1,64 @@ +import { DeclarationReflection, ReflectionKind } from 'typedoc'; +import { backTicks } from '../../support/els'; +import { getDeclarationType } from '../../support/helpers'; +import { stripComments, stripLineBreaks } from '../../support/utils'; +import { MarkdownThemeRenderContext } from '../../theme-render-context'; + +export function declarationMemberIdentifier( + context: MarkdownThemeRenderContext, + reflection: DeclarationReflection, +) { + const md: string[] = []; + + const declarationType = getDeclarationType(reflection); + + if ( + reflection.flags?.length && + !reflection.flags.isRest && + !reflection.flags.isOptional + ) { + md.push( + reflection.flags.map((flag) => backTicks(flag.toLowerCase())).join(' '), + ); + } + + if (reflection.kindOf(ReflectionKind.Variable) && !reflection.flags.isConst) { + md.push(backTicks('let')); + } + + if (reflection.flags.isRest) { + md.push('...'); + } + + const name: string[] = [context.partials.declarationMemberName(reflection)]; + + if (reflection.flags.isOptional) { + name.push('?'); + } + + if (declarationType) { + name.push(':'); + } + + md.push(name.join('')); + + if (reflection.typeParameters) { + md.push( + `\\<${reflection.typeParameters + ?.map((typeParameter) => backTicks(typeParameter.name)) + .join(', ')}\\>`, + ); + } + + if (declarationType) { + md.push(`${context.partials.someType(declarationType, 'all')}`); + } + + if (reflection.defaultValue && reflection.defaultValue !== '...') { + md.push( + ` = \`${stripLineBreaks(stripComments(reflection.defaultValue))}\``, + ); + } + + return md.join(' '); +} diff --git a/tools/typedoc-plugin-markdown/src/resources/partials/member.declaration.name.ts b/tools/typedoc-plugin-markdown/src/resources/partials/member.declaration.name.ts new file mode 100644 index 00000000..b991d69f --- /dev/null +++ b/tools/typedoc-plugin-markdown/src/resources/partials/member.declaration.name.ts @@ -0,0 +1,39 @@ +import { DeclarationReflection } from 'typedoc'; +import { bold } from '../../support/els'; +import { escapeChars } from '../../support/utils'; +import { MarkdownThemeRenderContext } from '../../theme-render-context'; + +export function declarationMemberName( + context: MarkdownThemeRenderContext, + declaration: DeclarationReflection, + emphasis = true, +) { + if (Boolean(declaration.getSignature || Boolean(declaration.setSignature))) { + if (declaration.getSignature) { + return `${'get'} ${getName( + `${declaration.getSignature.name}()`, + emphasis, + )}`; + } else if (declaration.setSignature) { + return `${'set'} ${getName( + declaration.setSignature.name, + emphasis, + )}(${declaration.setSignature.parameters?.map((parameter) => { + return parameter.type + ? `${parameter.name}: ${context.partials.someType( + parameter.type, + 'all', + )}` + : ''; + })})`; + } + } + return getName(declaration.name, emphasis); +} + +function getName(name: string, emphasis: boolean) { + if (emphasis) { + return bold(escapeChars(name)); + } + return escapeChars(name); +} diff --git a/tools/typedoc-plugin-markdown/src/resources/partials/member.declaration.ts b/tools/typedoc-plugin-markdown/src/resources/partials/member.declaration.ts new file mode 100644 index 00000000..8e23a755 --- /dev/null +++ b/tools/typedoc-plugin-markdown/src/resources/partials/member.declaration.ts @@ -0,0 +1,89 @@ +import { DeclarationReflection, ReflectionKind } from 'typedoc'; +import { blockQuoteBlock, codeBlock, heading } from '../../support/els'; +import { MarkdownThemeRenderContext } from '../../theme-render-context'; + +export function declarationMember( + context: MarkdownThemeRenderContext, + declaration: DeclarationReflection, + headingLevel: number, +) { + const md: string[] = []; + + const typeDeclaration = (declaration.type as any) + ?.declaration as DeclarationReflection; + + if (context.getOption('indentifiersAsCodeBlocks')) { + md.push( + codeBlock(context.partials.declarationMemberIdentifier(declaration)), + ); + } else { + md.push(`> ${context.partials.declarationMemberIdentifier(declaration)}`); + } + + if (declaration.comment) { + md.push(context.partials.comment(declaration.comment, headingLevel)); + } + + if (declaration.sources) { + md.push(context.partials.sources(declaration)); + } + + if (declaration.typeParameters) { + md.push(heading(headingLevel, `Type parameters`)); + md.push(context.partials.typeParametersTable(declaration.typeParameters)); + } + + if (typeDeclaration) { + if (typeDeclaration?.indexSignature) { + md.push(heading(headingLevel, `Index signature`)); + md.push( + context.partials.indexSignatureTitle(typeDeclaration.indexSignature), + ); + } + + if ( + typeDeclaration?.signatures?.length || + typeDeclaration?.children?.length + ) { + if (typeDeclaration?.parent?.kindOf(ReflectionKind.Property)) { + md.push( + heading( + headingLevel, + `Type declaration (${typeDeclaration.parent?.name})`, + ), + ); + } else { + md.push(heading(headingLevel, `Type declaration`)); + } + + if (typeDeclaration?.signatures?.length) { + typeDeclaration.signatures.forEach((signature) => { + if (typeDeclaration?.parent?.kindOf(ReflectionKind.Property)) { + md.push( + blockQuoteBlock( + context.partials.signatureMember(signature, headingLevel + 1), + ), + ); + } else { + md.push( + context.partials.signatureMember(signature, headingLevel + 1), + ); + } + }); + } + + if (typeDeclaration?.children?.length) { + md.push( + context.partials.typeDeclarationMember( + typeDeclaration, + headingLevel + 1, + ), + ); + } + } + } + + md.push(context.partials.inheritance(declaration, headingLevel)); + + return md.join('\n\n'); +} diff --git a/tools/typedoc-plugin-markdown/src/resources/partials/member.indexsignature.title.ts b/tools/typedoc-plugin-markdown/src/resources/partials/member.indexsignature.title.ts new file mode 100644 index 00000000..2ad225f6 --- /dev/null +++ b/tools/typedoc-plugin-markdown/src/resources/partials/member.indexsignature.title.ts @@ -0,0 +1,25 @@ +import { SignatureReflection } from 'typedoc'; +import { backTicks } from '../../support/els'; +import { MarkdownThemeRenderContext } from '../../theme-render-context'; + +export function indexSignatureTitle( + context: MarkdownThemeRenderContext, + signature: SignatureReflection, +) { + const md = ['']; + const params = signature.parameters + ? signature.parameters.map((parameter) => { + return parameter.type + ? `${backTicks(parameter.name)}: ${context.partials.someType( + parameter.type, + )}` + : ''; + }) + : []; + if (signature.type) { + md.push( + `\\[${params.join('')}\\]: ${context.partials.someType(signature.type)}`, + ); + } + return md.join(' '); +} diff --git a/tools/typedoc-plugin-markdown/src/resources/partials/member.inheritance.ts b/tools/typedoc-plugin-markdown/src/resources/partials/member.inheritance.ts new file mode 100644 index 00000000..a8584a61 --- /dev/null +++ b/tools/typedoc-plugin-markdown/src/resources/partials/member.inheritance.ts @@ -0,0 +1,84 @@ +import { + ArrayType, + DeclarationReflection, + ReferenceType, + SignatureReflection, +} from 'typedoc'; +import { backTicks, heading, link } from '../../support/els'; +import { MarkdownThemeRenderContext } from '../../theme-render-context'; + +import { escapeChars } from '../../support/utils'; + +export function inheritance( + context: MarkdownThemeRenderContext, + reflection: DeclarationReflection | SignatureReflection, + headingLevel: number, +) { + const md: string[] = []; + + if (reflection.implementationOf) { + md.push(heading(headingLevel, 'Implementation of')); + md.push(typeAndParent(context, reflection.implementationOf)); + } + + if (reflection.inheritedFrom) { + md.push(heading(headingLevel, 'Inherited from')); + md.push(typeAndParent(context, reflection.inheritedFrom)); + } + + if (reflection.overwrites) { + md.push(heading(headingLevel, 'Overrides')); + md.push(typeAndParent(context, reflection.overwrites)); + } + + return md.join('\n\n'); +} + +const typeAndParent = ( + context: MarkdownThemeRenderContext, + props: ArrayType | ReferenceType, +) => { + const getUrl = (name: string, url: string) => + link(backTicks(name), context.relativeURL(url)); + + if (props) { + if ('elementType' in props) { + return typeAndParent(context, props.elementType as any) + '[]'; + } else { + if (props.reflection) { + const md: string[] = []; + if (props.reflection instanceof SignatureReflection) { + if (props.reflection.parent?.parent?.url) { + md.push( + getUrl( + props.reflection.parent.parent.name, + props.reflection.parent.parent.url, + ), + ); + if (props.reflection.parent.url) { + md.push( + getUrl( + props.reflection.parent.name, + props.reflection.parent.url, + ), + ); + } + } + } else { + if (props.reflection.parent?.url) { + md.push( + getUrl(props.reflection.parent.name, props.reflection.parent.url), + ); + if (props.reflection.url) { + md.push(getUrl(props.reflection.name, props.reflection.url)); + } + } + } + return md.length > 0 ? md.join('.') : props.name; + } else { + return escapeChars(props.toString()); + } + } + } + return 'void'; +}; diff --git a/tools/typedoc-plugin-markdown/src/resources/partials/member.kind-tag.ts b/tools/typedoc-plugin-markdown/src/resources/partials/member.kind-tag.ts new file mode 100644 index 00000000..4f39cec7 --- /dev/null +++ b/tools/typedoc-plugin-markdown/src/resources/partials/member.kind-tag.ts @@ -0,0 +1,14 @@ +import { DeclarationReflection, ReflectionKind } from 'typedoc'; +import { SYMBOLS_WITH_DOCUMENTS } from '../../support/constants'; +import { backTicks, bold } from '../../support/els'; +import { MarkdownThemeRenderContext } from '../../theme-render-context'; + +export function memberKindTag( + context: MarkdownThemeRenderContext, + reflection: DeclarationReflection, +) { + if (reflection.kindOf(SYMBOLS_WITH_DOCUMENTS)) { + return bold(backTicks(ReflectionKind.singularString(reflection.kind))); + } + return ''; +} diff --git a/tools/typedoc-plugin-markdown/src/resources/partials/member.reference.ts b/tools/typedoc-plugin-markdown/src/resources/partials/member.reference.ts new file mode 100644 index 00000000..c18c95d4 --- /dev/null +++ b/tools/typedoc-plugin-markdown/src/resources/partials/member.reference.ts @@ -0,0 +1,21 @@ +import { ReferenceReflection } from 'typedoc'; +import { MarkdownThemeRenderContext } from '../../theme-render-context'; + +export function referenceMember( + context: MarkdownThemeRenderContext, + props: ReferenceReflection, +) { + const referenced = props.tryGetTargetReflectionDeep(); + + if (!referenced) { + return `Re-exports ${props.name}`; + } + + if (props.name === referenced.name) { + return `Re-exports [${referenced.name}](${context.urlTo(referenced)})`; + } + + return `Renames and re-exports [${referenced.name}](${context.urlTo( + referenced, + )})`; +} diff --git a/tools/typedoc-plugin-markdown/src/resources/partials/member.reflection.ts b/tools/typedoc-plugin-markdown/src/resources/partials/member.reflection.ts new file mode 100644 index 00000000..efe9b32d --- /dev/null +++ b/tools/typedoc-plugin-markdown/src/resources/partials/member.reflection.ts @@ -0,0 +1,72 @@ +import { DeclarationReflection, ReflectionKind } from 'typedoc'; +import { heading, unorderedList } from '../../support/els'; +import { MarkdownThemeRenderContext } from '../../theme-render-context'; + +/** + * Represents a top level reflection + * @param context + * @param reflection + * @returns + */ +export function reflectionMember( + context: MarkdownThemeRenderContext, + reflection: DeclarationReflection, + headingLevel: number, +) { + const md: string[] = []; + + if (reflection.comment) { + md.push(context.partials.comment(reflection.comment, headingLevel)); + } + + if ( + !reflection.kindOf([ + ReflectionKind.Module, + ReflectionKind.Project, + ReflectionKind.Namespace, + ]) && + reflection.sources + ) { + md.push(context.partials.sources(reflection)); + } + + if (reflection.typeParameters) { + md.push(heading(headingLevel, 'Type parameters')); + md.push(context.partials.typeParametersTable(reflection.typeParameters)); + } + + if (!context.getOption('hideHierarchy') && reflection.typeHierarchy?.next) { + md.push(heading(headingLevel, 'Hierarchy')); + md.push(context.partials.hierarchy(reflection.typeHierarchy)); + } + + if (reflection.implementedTypes) { + md.push(heading(headingLevel, 'Implements')); + md.push( + unorderedList( + reflection.implementedTypes.map((implementedType) => + context.partials.someType(implementedType), + ), + ), + ); + } + + if ('signatures' in reflection && reflection.signatures) { + reflection.signatures.forEach((signature) => { + md.push(context.partials.signatureMember(signature, headingLevel)); + }); + } + + if ('indexSignature' in reflection && reflection.indexSignature) { + md.push(heading(headingLevel, 'Indexable')); + md.push(context.partials.indexSignatureTitle(reflection.indexSignature)); + } + + if (reflection.kindOf([ReflectionKind.Module, ReflectionKind.Namespace])) { + md.push(context.partials.toc(reflection)); + } + + md.push(context.partials.members(reflection, headingLevel)); + + return md.join('\n\n'); +} diff --git a/tools/typedoc-plugin-markdown/src/resources/partials/member.signature.identifier.ts b/tools/typedoc-plugin-markdown/src/resources/partials/member.signature.identifier.ts new file mode 100644 index 00000000..d52f729b --- /dev/null +++ b/tools/typedoc-plugin-markdown/src/resources/partials/member.signature.identifier.ts @@ -0,0 +1,66 @@ +import { ParameterReflection, SignatureReflection, SomeType } from 'typedoc'; +import { backTicks, bold } from '../../support/els'; +import { escapeChars } from '../../support/utils'; +import { MarkdownThemeRenderContext } from '../../theme-render-context'; + +export function signatureMemberIdentifier( + context: MarkdownThemeRenderContext, + signature: SignatureReflection, +) { + const md: string[] = []; + + if (signature.parent && signature.parent.flags?.length > 0) { + md.push( + signature.parent.flags.map((flag) => `\`${flag}\``).join(' ') + ' ', + ); + } + + if (!['__call', '__type'].includes(signature.name)) { + md.push(bold(escapeChars(signature.name))); + } + + if (signature.typeParameters) { + md.push( + `\\<${signature.typeParameters + .map((typeParameter) => typeParameter.name) + .join(', ')}\\>`, + ); + } + + const getParameters = (parameters: ParameterReflection[] = []) => { + const firstOptionalParamIndex = parameters.findIndex( + (parameter) => parameter.flags.isOptional, + ); + return parameters + .map((param, i) => { + const paramsmd: string[] = [parameters.length > 2 ? '\n ' : '']; + if (param.flags.isRest) { + paramsmd.push('...'); + } + const paramItem = `${escapeChars(param.name)}${ + param.flags.isOptional || + (firstOptionalParamIndex !== -1 && i > firstOptionalParamIndex) + ? '?' + : '' + }: ${context.partials.someType(param.type as SomeType, 'all')}`; + paramsmd.push(paramItem); + if (param.defaultValue) { + paramsmd.push(` = ${backTicks(param.defaultValue)}`); + } + return paramsmd.join(''); + }) + .join(`, `); + }; + + md.push( + signature.parameters && signature.parameters?.length > 0 + ? `(${getParameters(signature.parameters)})` + : '()', + ); + + if (signature.type) { + md.push(`: ${context.partials.someType(signature.type, 'all')}`); + } + + return md.join(''); +} diff --git a/tools/typedoc-plugin-markdown/src/resources/partials/member.signature.ts b/tools/typedoc-plugin-markdown/src/resources/partials/member.signature.ts new file mode 100644 index 00000000..4d52ff83 --- /dev/null +++ b/tools/typedoc-plugin-markdown/src/resources/partials/member.signature.ts @@ -0,0 +1,73 @@ +import { DeclarationReflection, SignatureReflection } from 'typedoc'; +import { blockQuoteBlock, codeBlock, heading } from '../../support/els'; +import { MarkdownThemeRenderContext } from '../../theme-render-context'; + +export function signatureMember( + context: MarkdownThemeRenderContext, + signature: SignatureReflection, + headingLevel: number, +) { + const md: string[] = []; + + if (context.getOption('indentifiersAsCodeBlocks')) { + md.push(codeBlock(context.partials.signatureMemberIdentifier(signature))); + } else { + md.push(`> ${context.partials.signatureMemberIdentifier(signature)}`); + } + + if (signature.comment) { + md.push(context.partials.comment(signature.comment, headingLevel)); + } + + if (signature.sources) { + md.push(context.partials.sources(signature)); + } + + const typeDeclaration = (signature.type as any) + ?.declaration as DeclarationReflection; + + if (signature.typeParameters?.length) { + md.push(heading(headingLevel, 'Type parameters')); + md.push(context.partials.typeParametersTable(signature.typeParameters)); + } + + if (signature.parameters?.length) { + md.push(heading(headingLevel, 'Parameters')); + md.push(context.partials.parametersTable(signature.parameters)); + } + + if (signature.type) { + md.push(heading(headingLevel, 'Returns')); + md.push(context.partials.someType(signature.type, 'all')); + + if (signature.comment?.blockTags.length) { + const tags = signature.comment.blockTags + .filter((tag) => tag.tag === '@returns') + .map((tag) => context.partials.commentParts(tag.content)); + md.push(tags.join('\n\n')); + } + + if (typeDeclaration?.signatures) { + typeDeclaration.signatures.forEach((signature) => { + md.push( + blockQuoteBlock( + context.partials.signatureMember(signature, headingLevel + 1), + ), + ); + }); + } + + if (typeDeclaration?.children) { + md.push( + context.partials.typeDeclarationMember( + typeDeclaration, + headingLevel + 1, + ), + ); + } + + md.push(context.partials.inheritance(signature, headingLevel)); + } + + return md.join('\n\n'); +} diff --git a/tools/typedoc-plugin-markdown/src/resources/partials/member.sources.ts b/tools/typedoc-plugin-markdown/src/resources/partials/member.sources.ts new file mode 100644 index 00000000..4b49a842 --- /dev/null +++ b/tools/typedoc-plugin-markdown/src/resources/partials/member.sources.ts @@ -0,0 +1,22 @@ +import { DeclarationReflection, SignatureReflection } from 'typedoc'; +import { bold, link } from '../../support/els'; +import { MarkdownThemeRenderContext } from '../../theme-render-context'; + +import { escapeChars } from '../../support/utils'; + +export function sources( + context: MarkdownThemeRenderContext, + reflection: DeclarationReflection | SignatureReflection, +) { + const md = [bold('Source:')]; + reflection.sources?.forEach((source) => { + if (source.url) { + md.push( + link(`${escapeChars(source.fileName)}:${source.line}`, source.url), + ); + } else { + md.push(`${escapeChars(source.fileName)}:${source.line}`); + } + }); + return md.join(' '); +} diff --git a/tools/typedoc-plugin-markdown/src/resources/partials/member.title.ts b/tools/typedoc-plugin-markdown/src/resources/partials/member.title.ts new file mode 100644 index 00000000..6d61e192 --- /dev/null +++ b/tools/typedoc-plugin-markdown/src/resources/partials/member.title.ts @@ -0,0 +1,22 @@ +import { DeclarationReflection } from 'typedoc'; +import { backTicks } from '../../support/els'; +import { escapeChars } from '../../support/utils'; +import { MarkdownThemeRenderContext } from '../../theme-render-context'; + +export function memberTitle( + context: MarkdownThemeRenderContext, + reflection: DeclarationReflection, + typeParams = false, +) { + const md = [escapeChars(reflection.name)]; + if (reflection.signatures?.length) { + md.push('()'); + } + if (typeParams && reflection.typeParameters) { + const typeParameters = reflection.typeParameters + .map((typeParameter) => typeParameter.name) + .join(', '); + md.push(`${backTicks(`<${typeParameters}>`)}`); + } + return md.join(''); +} diff --git a/tools/typedoc-plugin-markdown/src/resources/partials/member.ts b/tools/typedoc-plugin-markdown/src/resources/partials/member.ts new file mode 100644 index 00000000..b146296a --- /dev/null +++ b/tools/typedoc-plugin-markdown/src/resources/partials/member.ts @@ -0,0 +1,55 @@ +import { + DeclarationReflection, + ReferenceReflection, + ReflectionKind, +} from 'typedoc'; +import { heading } from '../../support/els'; +import { MarkdownThemeRenderContext } from '../../theme-render-context'; + +export function member( + context: MarkdownThemeRenderContext, + reflection: DeclarationReflection, + headingLevel: number, +) { + const md: string[] = []; + + if (context.getOption('namedAnchors')) { + md.push(``); + } + + if (!reflection.hasOwnDocument) { + md.push(heading(headingLevel, context.partials.memberTitle(reflection))); + } + + if (!context.getOption('hideKindTag')) { + md.push(context.partials.memberKindTag(reflection)); + } + + if ( + [ + ReflectionKind.Class, + ReflectionKind.Interface, + ReflectionKind.Enum, + ].includes(reflection.kind) + ) { + md.push(context.partials.reflectionMember(reflection, headingLevel + 1)); + } else { + if (reflection.signatures) { + reflection.signatures.forEach((signature) => { + md.push(context.partials.signatureMember(signature, headingLevel + 1)); + }); + } else { + if (reflection instanceof ReferenceReflection) { + md.push(context.partials.referenceMember(reflection)); + } + + if (reflection instanceof DeclarationReflection) { + md.push( + context.partials.declarationMember(reflection, headingLevel + 1), + ); + } + } + } + + return md.join('\n\n'); +} diff --git a/tools/typedoc-plugin-markdown/src/resources/partials/member.type-declaration.ts b/tools/typedoc-plugin-markdown/src/resources/partials/member.type-declaration.ts new file mode 100644 index 00000000..af7b9c9c --- /dev/null +++ b/tools/typedoc-plugin-markdown/src/resources/partials/member.type-declaration.ts @@ -0,0 +1,32 @@ +import { DeclarationReflection, ReflectionKind } from 'typedoc'; +import { FormatStyle } from '../../models'; +import { blockQuoteBlock } from '../../support/els'; +import { MarkdownThemeRenderContext } from '../../theme-render-context'; + +export function typeDeclarationMember( + context: MarkdownThemeRenderContext, + typeDeclaration: DeclarationReflection, + headingLevel: number, +) { + const md: string[] = []; + if (typeDeclaration.children) { + if (context.getOption('typeDeclarationFormat') === FormatStyle.Table) { + md.push( + context.partials.propertiesTable(typeDeclaration.children, 'Member'), + ); + } else { + const list = typeDeclaration.children.map((declarationChild) => { + return context.partials.declarationMember( + declarationChild, + headingLevel, + ); + }); + if (typeDeclaration?.parent?.kindOf(ReflectionKind.Property)) { + md.push(blockQuoteBlock(list.join('\n'))); + } else { + md.push(list.join('\n')); + } + } + } + return md.join('\n'); +} diff --git a/tools/typedoc-plugin-markdown/src/resources/partials/members.ts b/tools/typedoc-plugin-markdown/src/resources/partials/members.ts new file mode 100644 index 00000000..5bfd357b --- /dev/null +++ b/tools/typedoc-plugin-markdown/src/resources/partials/members.ts @@ -0,0 +1,96 @@ +import { + ContainerReflection, + DeclarationReflection, + ReflectionCategory, + ReflectionKind, +} from 'typedoc'; +import { FormatStyle } from '../../models'; +import { SYMBOLS_WITH_DOCUMENTS } from '../../support/constants'; +import { heading, horizontalRule } from '../../support/els'; +import { MarkdownThemeRenderContext } from '../../theme-render-context'; + +export function members( + context: MarkdownThemeRenderContext, + container: ContainerReflection, + headingLevel: number, +) { + const md: string[] = []; + + const pushCategories = ( + categories: ReflectionCategory[], + headingLevel: number, + ) => { + categories + ?.filter((category) => !category.allChildrenHaveOwnDocument()) + .forEach((item) => { + md.push(heading(headingLevel, item.title)); + pushChildren(item.children, headingLevel + 1); + }); + }; + + const pushChildren = ( + children?: DeclarationReflection[], + memberHeadingLevel?: number, + ) => { + children + ?.filter((item) => !item.hasOwnDocument) + .forEach((item) => { + md.push( + context.partials.member(item, memberHeadingLevel || headingLevel), + ); + if (SYMBOLS_WITH_DOCUMENTS.includes(item.kind)) { + md.push(horizontalRule()); + } + }); + }; + + if (container.categories?.length) { + pushCategories(container.categories, headingLevel); + } else { + if ( + context.getOption('excludeGroups') && + container.kindOf([ReflectionKind.Module, ReflectionKind.Namespace]) + ) { + if (container.categories?.length) { + pushCategories(container.categories, headingLevel); + } else { + pushChildren(container.children, headingLevel); + } + } else { + container.groups + ?.filter((group) => !group.allChildrenHaveOwnDocument()) + .forEach((group) => { + if (group.categories) { + md.push(heading(headingLevel, group.title)); + pushCategories(group.categories, headingLevel + 1); + } else { + md.push(heading(headingLevel, group.title)); + + const isPropertiesGroup = group.children.every((child) => + child.kindOf(ReflectionKind.Property), + ); + + const isEnumGroup = group.children.every((child) => + child.kindOf(ReflectionKind.EnumMember), + ); + + if ( + isPropertiesGroup && + context.getOption('propertiesFormat') === FormatStyle.Table + ) { + md.push(context.partials.propertiesTable(group.children)); + } else if ( + isEnumGroup && + context.getOption('enumMembersFormat') === FormatStyle.Table + ) { + md.push(context.partials.enumMembersTable(group.children)); + } else { + pushChildren(group.children, headingLevel + 1); + } + } + }); + } + } + + return md.join('\n\n'); +} diff --git a/tools/typedoc-plugin-markdown/src/resources/partials/navigation.ts b/tools/typedoc-plugin-markdown/src/resources/partials/navigation.ts new file mode 100644 index 00000000..3adb6131 --- /dev/null +++ b/tools/typedoc-plugin-markdown/src/resources/partials/navigation.ts @@ -0,0 +1,19 @@ +import { NavigationItem } from '../../models'; +import { MarkdownThemeRenderContext } from '../../theme-render-context'; + +export function navigation( + context: MarkdownThemeRenderContext, + navigationItems: NavigationItem[], +) { + const title = + context.getOption('entryPoints')?.length > 1 ? 'Modules' : 'Exports'; + const md: string[] = [`## ${title}\n`]; + navigationItems.forEach((navigationItem) => { + if (navigationItem.url) { + md.push( + `- [${navigationItem.title}](${context.parseUrl(navigationItem.url)})`, + ); + } + }); + return md.join('\n'); +} diff --git a/tools/typedoc-plugin-markdown/src/resources/partials/page.header.ts b/tools/typedoc-plugin-markdown/src/resources/partials/page.header.ts new file mode 100644 index 00000000..0b7e1ced --- /dev/null +++ b/tools/typedoc-plugin-markdown/src/resources/partials/page.header.ts @@ -0,0 +1,97 @@ +import * as path from 'path'; +import { + DeclarationReflection, + PageEvent, + ProjectReflection, + ReflectionKind, +} from 'typedoc'; +import { bold, link } from '../../support/els'; +import { getProjectDisplayName } from '../../support/helpers'; +import { MarkdownThemeRenderContext } from '../../theme-render-context'; + +export function pageHeader( + context: MarkdownThemeRenderContext, + page: PageEvent, +) { + const isMonoRepo = !Boolean(page.project.groups); + if (isMonoRepo) { + const packageItem = findPackage(page.model); + if (packageItem) { + return packageHeader(context, page); + } + } + return projectHeader(context, page); +} + +function projectHeader( + context: MarkdownThemeRenderContext, + page: PageEvent, +) { + const projectName = getProjectDisplayName( + page.project, + context.getOption('includeVersion'), + ); + + const hasReadme = !context.getOption('readme').endsWith('none'); + + const md = [ + `${link( + bold(projectName), + context.relativeURL(context.getOption('entryDocument')), + )}`, + ]; + + if (hasReadme) { + md.push( + `(${link( + bold( + page.project.groups + ? context.getOption('entryPoints').length > 1 + ? 'Modules' + : 'Exports' + : 'Packages', + ), + context.relativeURL(page.project.url), + )})`, + ); + } + + return `${md.join(' ')}\n***\n`; +} + +export function packageHeader( + context: MarkdownThemeRenderContext, + page: PageEvent, +) { + const packageItem = findPackage(page.model); + if (!packageItem) { + return ''; + } + + const hasReadme = Boolean(packageItem.readme); + + const readmeUrl = `${path.dirname(packageItem.url)}/${context.readmeFile}`; + + const md = [ + `${link( + bold(packageItem.name), + context.relativeURL(hasReadme ? readmeUrl : packageItem.url), + )}`, + ]; + + if (hasReadme) { + md.push(`(${link(bold('Exports'), context.relativeURL(packageItem.url))})`); + } + + return `${md.join(' ')}\n***\n`; +} + +function findPackage(model: DeclarationReflection | ProjectReflection) { + if (model.kindOf(ReflectionKind.Module)) { + return model; + } + if (model.parent) { + return findPackage(model.parent as DeclarationReflection); + } + return null; +} diff --git a/tools/typedoc-plugin-markdown/src/resources/partials/page.title.ts b/tools/typedoc-plugin-markdown/src/resources/partials/page.title.ts new file mode 100644 index 00000000..d80cc6a7 --- /dev/null +++ b/tools/typedoc-plugin-markdown/src/resources/partials/page.title.ts @@ -0,0 +1,24 @@ +import { DeclarationReflection, PageEvent, ProjectReflection } from 'typedoc'; +import { getProjectDisplayName } from '../../support/helpers'; +import { MarkdownThemeRenderContext } from '../../theme-render-context'; + +export function pageTitle( + context: MarkdownThemeRenderContext, + page: PageEvent, +) { + const md: string[] = []; + if (page.model?.url === page.project.url) { + md.push( + context.getOption('indexPageTitle') || + getProjectDisplayName( + page.project, + context.getOption('includeVersion'), + ), + ); + } else { + md.push( + context.partials.memberTitle(page.model as DeclarationReflection, true), + ); + } + return md.join(' '); +} diff --git a/tools/typedoc-plugin-markdown/src/resources/partials/table.enum-members.ts b/tools/typedoc-plugin-markdown/src/resources/partials/table.enum-members.ts new file mode 100644 index 00000000..150ec278 --- /dev/null +++ b/tools/typedoc-plugin-markdown/src/resources/partials/table.enum-members.ts @@ -0,0 +1,65 @@ +import { DeclarationReflection, ReflectionType } from 'typedoc'; +import { getDeclarationType } from '../../support/helpers'; +import { escapeChars, stripLineBreaks } from '../../support/utils'; +import { MarkdownThemeRenderContext } from '../../theme-render-context'; + +export function enumMembersTable( + context: MarkdownThemeRenderContext, + props: DeclarationReflection[], +) { + const comments = props.map((param) => !!param.comment?.hasVisibleComponent()); + const hasComments = comments.some((value) => Boolean(value)); + + const headers = ['Member', 'Value']; + + if (hasComments) { + headers.push('Description'); + } + + const rows = props.map((property: DeclarationReflection) => { + const propertyType = getDeclarationType(property); + const row: string[] = []; + row.push(escapeChars(property.name)); + if (propertyType) { + row.push( + stripLineBreaks( + context.partials + .someType(propertyType, 'object') + .replace(/(? ':------') + .join(' | ')} |\n${rows.join('')}`; + + return output; +} + +function getComments(property: DeclarationReflection) { + if (property.type instanceof ReflectionType) { + if (property.type?.declaration?.signatures) { + return property.type?.declaration.signatures[0].comment; + } + } + if (property.signatures) { + return property.signatures[0].comment; + } + return property.comment; +} diff --git a/tools/typedoc-plugin-markdown/src/resources/partials/table.parameters.ts b/tools/typedoc-plugin-markdown/src/resources/partials/table.parameters.ts new file mode 100644 index 00000000..d42893f3 --- /dev/null +++ b/tools/typedoc-plugin-markdown/src/resources/partials/table.parameters.ts @@ -0,0 +1,106 @@ +import { ParameterReflection, ReflectionKind } from 'typedoc'; + +import { table } from '../../support/els'; +import { tableComments } from '../../support/helpers'; +import { escapeChars, stripLineBreaks } from '../../support/utils'; +import { MarkdownThemeRenderContext } from '../../theme-render-context'; + +export function parametersTable( + context: MarkdownThemeRenderContext, + parameters: ParameterReflection[], +) { + const flattenParams = (current: any) => { + return current.type?.declaration?.children?.reduce( + (acc: any, child: any) => { + const childObj = { + ...child, + name: `${current.name}.${child.name}`, + }; + return parseParams(childObj, acc); + }, + [], + ); + }; + + const parseParams = (current: any, acc: any) => { + const shouldFlatten = + current.type?.declaration?.kind === ReflectionKind.TypeLiteral && + current.type?.declaration?.children; + return shouldFlatten + ? [...acc, current, ...flattenParams(current)] + : [...acc, current]; + }; + const showDefaults = hasDefaultValues(parameters); + + const comments = parameters.map( + (param) => !!param.comment?.hasVisibleComponent(), + ); + const hasComments = !comments.every((value) => !value); + + const headers = ['Parameter', 'Type']; + + if (showDefaults) { + headers.push('Default value'); + } + + if (hasComments) { + headers.push('Description'); + } + + const firstOptionalParamIndex = parameters.findIndex( + (parameter) => parameter.flags.isOptional, + ); + + const rows: string[][] = []; + + parameters.forEach((parameter, i) => { + const row: string[] = []; + + const isOptional = + parameter.flags.isOptional || + (firstOptionalParamIndex !== -1 && i > firstOptionalParamIndex); + + const rest = parameter.flags.isRest ? '...' : ''; + + const optional = isOptional ? '?' : ''; + + row.push(`${rest}${escapeChars(parameter.name)}${optional}`); + + if (parameter.type) { + row.push( + stripLineBreaks(context.partials.someType(parameter.type, 'object')), + ); + } + + if (showDefaults) { + row.push(getDefaultValue(parameter)); + } + if (hasComments) { + if (parameter.comment) { + row.push(tableComments(context.partials.comment(parameter.comment))); + } else { + row.push('-'); + } + } + rows.push(row); + }); + + return table(headers, rows); +} + +function getDefaultValue(parameter: ParameterReflection) { + return parameter.defaultValue && parameter.defaultValue !== '...' + ? escapeChars(parameter.defaultValue) + : 'undefined'; +} + +function hasDefaultValues(parameters: ParameterReflection[]) { + const defaultValues = (parameters as ParameterReflection[]).map( + (param) => + param.defaultValue !== '{}' && + param.defaultValue !== '...' && + !!param.defaultValue, + ); + + return !defaultValues.every((value) => !value); +} diff --git a/tools/typedoc-plugin-markdown/src/resources/partials/table.properties.ts b/tools/typedoc-plugin-markdown/src/resources/partials/table.properties.ts new file mode 100644 index 00000000..5266dae0 --- /dev/null +++ b/tools/typedoc-plugin-markdown/src/resources/partials/table.properties.ts @@ -0,0 +1,98 @@ +import { DeclarationReflection, ReflectionType } from 'typedoc'; +import { backTicks, table } from '../../support/els'; +import { getDeclarationType, tableComments } from '../../support/helpers'; +import { MarkdownThemeRenderContext } from '../../theme-render-context'; + +export function propertiesTable( + context: MarkdownThemeRenderContext, + props: DeclarationReflection[], + nameCol = 'Property', +) { + const comments = props.map((param) => !!param.comment?.hasVisibleComponent()); + const hasComments = comments.some((value) => Boolean(value)); + + const headers = [nameCol]; + + headers.push('Type'); + + if (hasComments) { + headers.push('Description'); + } + + const flattenParams = (current: any) => { + return current.type?.declaration?.children?.reduce( + (acc: any, child: any) => { + const childObj = { + ...child, + name: `${current.name}.${child.name}`, + }; + return parseParams(childObj, acc); + }, + [], + ); + }; + + const parseParams = (current: any, acc: any) => { + const shouldFlatten = current.type?.declaration?.children; + + return shouldFlatten + ? [...acc, current, ...flattenParams(current)] + : [...acc, current]; + }; + + const properties = props.reduce( + (acc: any, current: any) => parseParams(current, acc), + [], + ); + + const rows: string[][] = []; + + properties.forEach((property: DeclarationReflection) => { + const propertyType = getDeclarationType(property); + const row: string[] = []; + + const nameColumn: string[] = []; + + if (property.flags.length && !property.flags.isOptional) { + nameColumn.push( + property.flags.map((flag) => backTicks(flag.toLowerCase())).join(' '), + ); + } + + nameColumn.push( + `${context.partials.declarationMemberName(property, false)}${ + property.flags.isOptional ? '?' : '' + }`, + ); + + row.push(nameColumn.join(' ')); + + if (propertyType) { + row.push(context.partials.someType(propertyType, 'object')); + } + + if (hasComments) { + const comments = getComments(property); + if (comments) { + row.push(tableComments(context.partials.comment(comments))); + } else { + row.push('-'); + } + } + rows.push(row); + }); + + return table(headers, rows); +} + +function getComments(property: DeclarationReflection) { + if (property.type instanceof ReflectionType) { + if (property.type?.declaration?.signatures) { + return property.type?.declaration.signatures[0].comment; + } + } + if (property.signatures) { + return property.signatures[0].comment; + } + return property.comment; +} diff --git a/tools/typedoc-plugin-markdown/src/resources/partials/table.typeparameters.ts b/tools/typedoc-plugin-markdown/src/resources/partials/table.typeparameters.ts new file mode 100644 index 00000000..f04df4f8 --- /dev/null +++ b/tools/typedoc-plugin-markdown/src/resources/partials/table.typeparameters.ts @@ -0,0 +1,65 @@ +import { TypeParameterReflection } from 'typedoc'; +import { italic, table } from '../../support/els'; +import { tableComments } from '../../support/helpers'; +import { MarkdownThemeRenderContext } from '../../theme-render-context'; + +export function typeParametersTable( + context: MarkdownThemeRenderContext, + typeParameters: TypeParameterReflection[], +) { + const hasDefault = typeParameters.some((typeParameter) => + Boolean(typeParameter.default), + ); + + const hasComments = typeParameters.some((typeParameter) => + Boolean(typeParameter.comment), + ); + + const headers = ['Parameter']; + + if (hasDefault) { + headers.push('Default'); + } + + if (hasComments) { + headers.push('Description'); + } + + const rows: string[][] = []; + typeParameters?.forEach((typeParameter) => { + const row: string[] = []; + + const nameCol: string[] = []; + + nameCol.push(typeParameter.name); + + if (typeParameter.type) { + nameCol.push( + `${italic('extends')} ${context.partials.someType(typeParameter.type)}`, + ); + } + + row.push(nameCol.join(' ')); + + if (hasDefault) { + if (typeParameter.default) { + row.push(context.partials.someType(typeParameter.default)); + } else { + row.push('-'); + } + } + + if (hasComments) { + if (typeParameter.comment) { + row.push( + tableComments(context.partials.comment(typeParameter.comment)), + ); + } else { + row.push('-'); + } + } + rows.push(row); + }); + + return table(headers, rows); +} diff --git a/tools/typedoc-plugin-markdown/src/resources/partials/toc.ts b/tools/typedoc-plugin-markdown/src/resources/partials/toc.ts new file mode 100644 index 00000000..a340e2e5 --- /dev/null +++ b/tools/typedoc-plugin-markdown/src/resources/partials/toc.ts @@ -0,0 +1,107 @@ +import { + DeclarationReflection, + ProjectReflection, + ReflectionGroup, + ReflectionKind, +} from 'typedoc'; +import { backTicks, heading } from '../../support/els'; + +import { escapeChars } from '../../support/utils'; +import { MarkdownThemeRenderContext } from '../../theme-render-context'; + +export function toc( + context: MarkdownThemeRenderContext, + reflection: ProjectReflection | DeclarationReflection, +) { + const md: string[] = []; + + const hideInPageTOC = context.getOption('hideInPageTOC'); + + const isVisible = reflection.groups?.some((group) => + group.allChildrenHaveOwnDocument(), + ); + + if ( + (!hideInPageTOC && reflection.groups) || + (isVisible && reflection.groups) + ) { + const headingLevel = getIndexHeadingLevel(reflection); + const subHeadingLevel = headingLevel + 1; + + md.push(heading(headingLevel, 'Index\n')); + + if (reflection.categories?.length) { + reflection.categories.forEach((item) => { + md.push(heading(subHeadingLevel, item.title) + '\n'); + md.push(getGroup(context, item) + '\n'); + }); + } else { + if (context.getOption('excludeGroups') && reflection.children) { + md.push( + reflection.children + .map((child) => { + return getTocItem(context, child); + }) + .join('\n'), + ); + } else { + reflection.groups?.forEach((reflectionGroup) => { + if (reflectionGroup.categories) { + md.push(heading(subHeadingLevel, reflectionGroup.title) + '\n'); + reflectionGroup.categories.forEach((item2) => { + md.push(heading(subHeadingLevel + 1, item2.title) + '\n'); + md.push(getGroup(context, reflectionGroup) + '\n'); + }); + } else { + if ( + !hideInPageTOC || + reflectionGroup.allChildrenHaveOwnDocument() + ) { + md.push(heading(subHeadingLevel, reflectionGroup.title) + '\n'); + md.push(getGroup(context, reflectionGroup) + '\n'); + } + } + }); + } + } + } + return md.length > 0 ? md.join('\n') : ''; +} + +function getGroup(context: MarkdownThemeRenderContext, group: ReflectionGroup) { + const children = group.children.map((child) => getTocItem(context, child)); + return children.join('\n'); +} + +function getTocItem( + context: MarkdownThemeRenderContext, + reflection: DeclarationReflection, +) { + const showKindTag = + !reflection.kindOf(ReflectionKind.Module) && + !context.getOption('hideKindTag') && + context.getOption('excludeGroups'); + return `- ${ + showKindTag + ? backTicks( + Array.from(ReflectionKind.singularString(reflection.kind))[0], + ) + ' ' + : '' + }[${escapeChars(reflection.name)}](${context.relativeURL(reflection.url)})`; +} + +function getIndexHeadingLevel( + reflection: DeclarationReflection | ProjectReflection, +) { + if ( + reflection.kindOf([ + ReflectionKind.Project, + ReflectionKind.Module, + ReflectionKind.Namespace, + ]) || + reflection.hasOwnDocument + ) { + return 2; + } + return 4; +} diff --git a/tools/typedoc-plugin-markdown/src/resources/partials/type.array.ts b/tools/typedoc-plugin-markdown/src/resources/partials/type.array.ts new file mode 100644 index 00000000..658ea38c --- /dev/null +++ b/tools/typedoc-plugin-markdown/src/resources/partials/type.array.ts @@ -0,0 +1,12 @@ +import { ArrayType } from 'typedoc'; +import { MarkdownThemeRenderContext } from '../../theme-render-context'; + +export function arrayType( + context: MarkdownThemeRenderContext, + arrayType: ArrayType, +) { + const theType = context.partials.someType(arrayType.elementType, 'none'); + return arrayType.elementType.type === 'union' + ? `(${theType})[]` + : `${theType}[]`; +} diff --git a/tools/typedoc-plugin-markdown/src/resources/partials/type.conditional.ts b/tools/typedoc-plugin-markdown/src/resources/partials/type.conditional.ts new file mode 100644 index 00000000..db39ddac --- /dev/null +++ b/tools/typedoc-plugin-markdown/src/resources/partials/type.conditional.ts @@ -0,0 +1,26 @@ +import { ConditionalType } from 'typedoc'; +import { italic } from '../../support/els'; +import { MarkdownThemeRenderContext } from '../../theme-render-context'; + +export function conditionalType( + context: MarkdownThemeRenderContext, + conditionalType: ConditionalType, +) { + const md: string[] = []; + if (conditionalType.checkType) { + md.push(context.partials.someType(conditionalType.checkType)); + } + md.push(italic('extends')); + if (conditionalType.extendsType) { + md.push(context.partials.someType(conditionalType.extendsType)); + } + md.push('?'); + if (conditionalType.trueType) { + md.push(context.partials.someType(conditionalType.trueType)); + } + md.push(':'); + if (conditionalType.falseType) { + md.push(context.partials.someType(conditionalType.falseType)); + } + return md.join(' '); +} diff --git a/tools/typedoc-plugin-markdown/src/resources/partials/type.declaration.ts b/tools/typedoc-plugin-markdown/src/resources/partials/type.declaration.ts new file mode 100644 index 00000000..755f39e0 --- /dev/null +++ b/tools/typedoc-plugin-markdown/src/resources/partials/type.declaration.ts @@ -0,0 +1,44 @@ +import { DeclarationReflection, SomeType } from 'typedoc'; +import { Collapse } from '../../models'; +import { backTicks } from '../../support/els'; +import { getDeclarationType } from '../../support/helpers'; +import { MarkdownThemeRenderContext } from '../../theme-render-context'; + +export function declarationType( + context: MarkdownThemeRenderContext, + declarationReflection: DeclarationReflection, + collapse: Collapse = 'none', +) { + if (collapse === 'object' || collapse === 'all') { + return backTicks('object'); + } + + if (declarationReflection.indexSignature || declarationReflection.children) { + let indexSignature = ''; + const declarationIndexSignature = declarationReflection.indexSignature; + if (declarationIndexSignature) { + const key = declarationIndexSignature.parameters + ? declarationIndexSignature.parameters.map( + (param) => `\`[${param.name}: ${param.type}]\``, + ) + : ''; + const obj = context.partials.someType( + declarationIndexSignature.type as SomeType, + ); + indexSignature = `${key}: ${obj}; `; + } + const types = + declarationReflection.children && + declarationReflection.children.map((obj) => { + return `${context.partials.declarationMemberName( + obj, + false, + )}: ${context.partials.someType(getDeclarationType(obj) as SomeType)};`; + }); + if (indexSignature) { + types?.unshift(indexSignature); + } + return types ? `\\{${types.join(' ')}}` : '\\{}'; + } + return '\\{}'; +} diff --git a/tools/typedoc-plugin-markdown/src/resources/partials/type.function.ts b/tools/typedoc-plugin-markdown/src/resources/partials/type.function.ts new file mode 100644 index 00000000..70e39664 --- /dev/null +++ b/tools/typedoc-plugin-markdown/src/resources/partials/type.function.ts @@ -0,0 +1,25 @@ +import { SignatureReflection, SomeType } from 'typedoc'; +import { MarkdownThemeRenderContext } from '../../theme-render-context'; + +export function functionType( + context: MarkdownThemeRenderContext, + modelSignatures: SignatureReflection[], +) { + const functions = modelSignatures.map((fn) => { + const typeParams = fn.typeParameters + ? `\\<${fn.typeParameters + .map((typeParameter) => typeParameter.name) + .join(', ')}\\>` + : []; + const params = fn.parameters + ? fn.parameters.map((param) => { + return `${param.flags.isRest ? '...' : ''}${param.name}${ + param.flags.isOptional ? '?' : '' + }: ${context.partials.someType(param.type as SomeType)}`; + }) + : []; + const returns = context.partials.someType(fn.type as SomeType); + return typeParams + `(${params.join(', ')}) => ${returns}`; + }); + return functions.join(''); +} diff --git a/tools/typedoc-plugin-markdown/src/resources/partials/type.index-access.ts b/tools/typedoc-plugin-markdown/src/resources/partials/type.index-access.ts new file mode 100644 index 00000000..24645273 --- /dev/null +++ b/tools/typedoc-plugin-markdown/src/resources/partials/type.index-access.ts @@ -0,0 +1,16 @@ +import { IndexedAccessType } from 'typedoc'; +import { MarkdownThemeRenderContext } from '../../theme-render-context'; + +export function indexAccessType( + context: MarkdownThemeRenderContext, + model: IndexedAccessType, +) { + const md: string[] = []; + if (model.objectType) { + md.push(context.partials.someType(model.objectType)); + } + if (model.indexType) { + md.push(`[${context.partials.someType(model.indexType)}]`); + } + return md.join(''); +} diff --git a/tools/typedoc-plugin-markdown/src/resources/partials/type.inferred.ts b/tools/typedoc-plugin-markdown/src/resources/partials/type.inferred.ts new file mode 100644 index 00000000..dc8d4287 --- /dev/null +++ b/tools/typedoc-plugin-markdown/src/resources/partials/type.inferred.ts @@ -0,0 +1,10 @@ +import { InferredType } from 'typedoc'; +import { escapeChars } from '../../support/utils'; +import { MarkdownThemeRenderContext } from '../../theme-render-context'; + +export function inferredType( + context: MarkdownThemeRenderContext, + model: InferredType, +) { + return `infer ${escapeChars(model.name)}`; +} diff --git a/tools/typedoc-plugin-markdown/src/resources/partials/type.intersection.ts b/tools/typedoc-plugin-markdown/src/resources/partials/type.intersection.ts new file mode 100644 index 00000000..aec5d043 --- /dev/null +++ b/tools/typedoc-plugin-markdown/src/resources/partials/type.intersection.ts @@ -0,0 +1,13 @@ +import { IntersectionType } from 'typedoc'; +import { MarkdownThemeRenderContext } from '../../theme-render-context'; + +export function intersectionType( + context: MarkdownThemeRenderContext, + model: IntersectionType, +) { + return model.types + .map((intersectionType) => + context.partials.someType(intersectionType, 'none'), + ) + .join(' & '); +} diff --git a/tools/typedoc-plugin-markdown/src/resources/partials/type.intrinsic.ts b/tools/typedoc-plugin-markdown/src/resources/partials/type.intrinsic.ts new file mode 100644 index 00000000..ec2b0e63 --- /dev/null +++ b/tools/typedoc-plugin-markdown/src/resources/partials/type.intrinsic.ts @@ -0,0 +1,10 @@ +import { IntrinsicType } from 'typedoc'; +import { backTicks } from '../../support/els'; +import { MarkdownThemeRenderContext } from '../../theme-render-context'; + +export function intrinsicType( + context: MarkdownThemeRenderContext, + model: IntrinsicType, +) { + return backTicks(model.name); +} diff --git a/tools/typedoc-plugin-markdown/src/resources/partials/type.literal.ts b/tools/typedoc-plugin-markdown/src/resources/partials/type.literal.ts new file mode 100644 index 00000000..f518ef27 --- /dev/null +++ b/tools/typedoc-plugin-markdown/src/resources/partials/type.literal.ts @@ -0,0 +1,12 @@ +import { LiteralType } from 'typedoc'; +import { MarkdownThemeRenderContext } from '../../theme-render-context'; + +export function literalType( + context: MarkdownThemeRenderContext, + literalType: LiteralType, +) { + if (typeof literalType.value === 'bigint') { + return `\`${literalType.value}n\``; + } + return `\`\`${JSON.stringify(literalType.value)}\`\``; +} diff --git a/tools/typedoc-plugin-markdown/src/resources/partials/type.query.ts b/tools/typedoc-plugin-markdown/src/resources/partials/type.query.ts new file mode 100644 index 00000000..39f822a0 --- /dev/null +++ b/tools/typedoc-plugin-markdown/src/resources/partials/type.query.ts @@ -0,0 +1,12 @@ +import { QueryType } from 'typedoc'; +import { italic } from '../../support/els'; +import { MarkdownThemeRenderContext } from '../../theme-render-context'; + +export function queryType( + context: MarkdownThemeRenderContext, + queryType: QueryType, +) { + return `${italic('typeof')} ${context.partials.someType( + queryType.queryType, + )}`; +} diff --git a/tools/typedoc-plugin-markdown/src/resources/partials/type.reference.ts b/tools/typedoc-plugin-markdown/src/resources/partials/type.reference.ts new file mode 100644 index 00000000..82f543ba --- /dev/null +++ b/tools/typedoc-plugin-markdown/src/resources/partials/type.reference.ts @@ -0,0 +1,40 @@ +import { ReferenceType } from 'typedoc'; +import { backTicks } from '../../support/els'; +import { MarkdownThemeRenderContext } from '../../theme-render-context'; + +export function referenceType( + context: MarkdownThemeRenderContext, + referenceType: ReferenceType, +) { + if ( + referenceType.reflection || + (referenceType.name && referenceType.typeArguments) + ) { + const reflection: string[] = []; + + if (referenceType.reflection?.url) { + reflection.push( + `[${backTicks(referenceType.reflection.name)}](${context.relativeURL( + referenceType.reflection.url, + )})`, + ); + } else { + reflection.push( + referenceType.externalUrl + ? `[${backTicks(referenceType.name)}]( ${referenceType.externalUrl} )` + : backTicks(referenceType.name), + ); + } + if (referenceType.typeArguments && referenceType.typeArguments.length > 0) { + reflection.push( + `\\<${referenceType.typeArguments + .map((typeArgument) => context.partials.someType(typeArgument)) + .join(', ')}\\>`, + ); + } + return reflection.join(''); + } + return referenceType.externalUrl + ? `[${backTicks(referenceType.name)}]( ${referenceType.externalUrl} )` + : backTicks(referenceType.name); +} diff --git a/tools/typedoc-plugin-markdown/src/resources/partials/type.reflection.ts b/tools/typedoc-plugin-markdown/src/resources/partials/type.reflection.ts new file mode 100644 index 00000000..9577582a --- /dev/null +++ b/tools/typedoc-plugin-markdown/src/resources/partials/type.reflection.ts @@ -0,0 +1,23 @@ +import { ReflectionType } from 'typedoc'; +import { Collapse } from '../../models'; +import { backTicks } from '../../support/els'; +import { MarkdownThemeRenderContext } from '../../theme-render-context'; + +export function reflectionType( + context: MarkdownThemeRenderContext, + reflectionType: ReflectionType, + collapse: Collapse, +) { + const root = + reflectionType instanceof ReflectionType + ? reflectionType.declaration + : reflectionType; + if (root.signatures) { + return collapse === 'function' || collapse === 'all' + ? backTicks('Function') + : context.partials.functionType(root.signatures); + } + return (collapse === 'object' && !root.indexSignature) || collapse === 'all' + ? backTicks('object') + : context.partials.declarationType(root); +} diff --git a/tools/typedoc-plugin-markdown/src/resources/partials/type.some.ts b/tools/typedoc-plugin-markdown/src/resources/partials/type.some.ts new file mode 100644 index 00000000..f5bd8d76 --- /dev/null +++ b/tools/typedoc-plugin-markdown/src/resources/partials/type.some.ts @@ -0,0 +1,88 @@ +import { + ArrayType, + ConditionalType, + IndexedAccessType, + InferredType, + IntersectionType, + IntrinsicType, + QueryType, + ReferenceType, + ReflectionType, + SomeType, + TupleType, + TypeOperatorType, + UnionType, + UnknownType, +} from 'typedoc'; +import { Collapse } from '../../models'; +import { backTicks } from '../../support/els'; +import { escapeChars } from '../../support/utils'; +import { MarkdownThemeRenderContext } from '../../theme-render-context'; + +export function someType( + context: MarkdownThemeRenderContext, + someType: SomeType, + collapse: Collapse = 'none', +) { + if (!someType) { + return ''; + } + + if (someType instanceof ArrayType) { + return '' + context.partials.arrayType(someType); + } + + if (someType instanceof ConditionalType) { + return '' + context.partials.conditionalType(someType); + } + + if (someType instanceof IndexedAccessType) { + return '' + context.partials.indexAccessType(someType); + } + + if (someType instanceof InferredType) { + return '' + context.partials.inferredType(someType); + } + + if (someType instanceof IntersectionType && someType.types) { + return '' + context.partials.intersectionType(someType); + } + + if (someType instanceof IntrinsicType && someType.name) { + return '' + context.partials.intrinsicType(someType); + } + + if (someType instanceof QueryType) { + return '' + context.partials.queryType(someType); + } + + if (someType instanceof ReferenceType) { + return '' + context.partials.referenceType(someType); + } + + if (someType instanceof ReflectionType) { + return '' + context.partials.reflectionType(someType, collapse); + } + + if (someType instanceof TypeOperatorType) { + return '' + context.partials.typeOperatorType(someType); + } + + if (someType instanceof TupleType && someType.elements) { + return '' + context.partials.tupleType(someType); + } + + if (someType instanceof UnionType && someType.types) { + return '' + context.partials.unionType(someType); + } + + if (someType instanceof UnknownType) { + return '' + context.partials.unknownType(someType); + } + + if (someType.toString() == 'null') { + return backTicks('null'); + } + + return escapeChars(someType?.toString()); +} diff --git a/tools/typedoc-plugin-markdown/src/resources/partials/type.tuple.ts b/tools/typedoc-plugin-markdown/src/resources/partials/type.tuple.ts new file mode 100644 index 00000000..cffcb7ac --- /dev/null +++ b/tools/typedoc-plugin-markdown/src/resources/partials/type.tuple.ts @@ -0,0 +1,11 @@ +import { TupleType } from 'typedoc'; +import { MarkdownThemeRenderContext } from '../../theme-render-context'; + +export function tupleType( + context: MarkdownThemeRenderContext, + tupleType: TupleType, +) { + return `[${tupleType.elements + .map((element) => context.partials.someType(element)) + .join(', ')}]`; +} diff --git a/tools/typedoc-plugin-markdown/src/resources/partials/type.type-operator.ts b/tools/typedoc-plugin-markdown/src/resources/partials/type.type-operator.ts new file mode 100644 index 00000000..bd299e51 --- /dev/null +++ b/tools/typedoc-plugin-markdown/src/resources/partials/type.type-operator.ts @@ -0,0 +1,10 @@ +import { TypeOperatorType } from 'typedoc'; +import { italic } from '../../support/els'; +import { MarkdownThemeRenderContext } from '../../theme-render-context'; + +export function typeOperatorType( + context: MarkdownThemeRenderContext, + model: TypeOperatorType, +) { + return `${italic(model.operator)} ${context.partials.someType(model.target)}`; +} diff --git a/tools/typedoc-plugin-markdown/src/resources/partials/type.union.ts b/tools/typedoc-plugin-markdown/src/resources/partials/type.union.ts new file mode 100644 index 00000000..b09d567a --- /dev/null +++ b/tools/typedoc-plugin-markdown/src/resources/partials/type.union.ts @@ -0,0 +1,11 @@ +import { UnionType } from 'typedoc'; +import { MarkdownThemeRenderContext } from '../../theme-render-context'; + +export function unionType( + context: MarkdownThemeRenderContext, + unionType: UnionType, +) { + return unionType.types + .map((unionType) => context.partials.someType(unionType, 'none')) + .join(` \\| `); +} diff --git a/tools/typedoc-plugin-markdown/src/resources/partials/type.unknown.ts b/tools/typedoc-plugin-markdown/src/resources/partials/type.unknown.ts new file mode 100644 index 00000000..b3cde3b8 --- /dev/null +++ b/tools/typedoc-plugin-markdown/src/resources/partials/type.unknown.ts @@ -0,0 +1,10 @@ +import { UnknownType } from 'typedoc'; +import { backTicks } from '../../support/els'; +import { MarkdownThemeRenderContext } from '../../theme-render-context'; + +export function unknownType( + context: MarkdownThemeRenderContext, + model: UnknownType, +) { + return backTicks(model.name); +} diff --git a/tools/typedoc-plugin-markdown/src/resources/resources.ts b/tools/typedoc-plugin-markdown/src/resources/resources.ts new file mode 100644 index 00000000..dd6da94e --- /dev/null +++ b/tools/typedoc-plugin-markdown/src/resources/resources.ts @@ -0,0 +1,189 @@ +// THIS FILE IS AUTOGENERATED - DO NOT EDIT DIRECTLY +import { + ArrayType, + ConditionalType, + ContainerReflection, + Comment, + CommentDisplayPart, + DeclarationHierarchy, + DeclarationReflection, + InferredType, + IntersectionType, + IntrinsicType, + IndexedAccessType, + LiteralType, + PageEvent, + ParameterReflection, + ProjectReflection, + QueryType, + ReferenceReflection, + ReferenceType, + ReflectionType, + SignatureReflection, + SomeType, + TupleType, + TypeOperatorType, + TypeParameterReflection, + UnionType, + UnknownType } from 'typedoc'; +import { MarkdownThemeRenderContext } from '../theme-render-context'; +import { Collapse, NavigationItem } from '../models'; +import { memberTemplate } from './templates/member'; +import { projectTemplate } from './templates/project'; +import { readmeTemplate } from './templates/readme'; +import { reflectionTemplate } from './templates/reflection'; +import { breadcrumbs } from './partials/breadcrumbs'; +import { commentParts } from './partials/comment.parts'; +import { comment } from './partials/comment'; +import { hierarchy } from './partials/hierarchy'; +import { declarationMemberIdentifier } from './partials/member.declaration.identifier'; +import { declarationMemberName } from './partials/member.declaration.name'; +import { declarationMember } from './partials/member.declaration'; +import { indexSignatureTitle } from './partials/member.indexsignature.title'; +import { inheritance } from './partials/member.inheritance'; +import { memberKindTag } from './partials/member.kind-tag'; +import { referenceMember } from './partials/member.reference'; +import { reflectionMember } from './partials/member.reflection'; +import { signatureMemberIdentifier } from './partials/member.signature.identifier'; +import { signatureMember } from './partials/member.signature'; +import { sources } from './partials/member.sources'; +import { memberTitle } from './partials/member.title'; +import { member } from './partials/member'; +import { typeDeclarationMember } from './partials/member.type-declaration'; +import { members } from './partials/members'; +import { navigation } from './partials/navigation'; +import { pageHeader } from './partials/page.header'; +import { pageTitle } from './partials/page.title'; +import { enumMembersTable } from './partials/table.enum-members'; +import { parametersTable } from './partials/table.parameters'; +import { propertiesTable } from './partials/table.properties'; +import { typeParametersTable } from './partials/table.typeparameters'; +import { toc } from './partials/toc'; +import { arrayType } from './partials/type.array'; +import { conditionalType } from './partials/type.conditional'; +import { declarationType } from './partials/type.declaration'; +import { functionType } from './partials/type.function'; +import { indexAccessType } from './partials/type.index-access'; +import { inferredType } from './partials/type.inferred'; +import { intersectionType } from './partials/type.intersection'; +import { intrinsicType } from './partials/type.intrinsic'; +import { literalType } from './partials/type.literal'; +import { queryType } from './partials/type.query'; +import { referenceType } from './partials/type.reference'; +import { reflectionType } from './partials/type.reflection'; +import { someType } from './partials/type.some'; +import { tupleType } from './partials/type.tuple'; +import { typeOperatorType } from './partials/type.type-operator'; +import { unionType } from './partials/type.union'; +import { unknownType } from './partials/type.unknown'; + +function bind(fn: (f: F, ...a: L) => R, first: F) { + return (...r: L) => fn(first, ...r); +} +export type Templates = { + memberTemplate: (page: PageEvent) => string; + projectTemplate: (page: PageEvent) => string; + readmeTemplate: (page: PageEvent) => string; + reflectionTemplate: (page: PageEvent) => string; +}; + +export type Partials = { + breadcrumbs: (page: PageEvent) => string; + commentParts: (parts: CommentDisplayPart[]) => string; + comment: (comment: Comment, headingLevel?: number | undefined) => string; + hierarchy: (declarationHierarchy: DeclarationHierarchy) => string; + declarationMemberIdentifier: (reflection: DeclarationReflection) => string; + declarationMemberName: (declaration: DeclarationReflection, emphasis?: boolean) => string; + declarationMember: (declaration: DeclarationReflection, headingLevel: number) => string; + indexSignatureTitle: (signature: SignatureReflection) => string; + inheritance: (reflection: DeclarationReflection | SignatureReflection, headingLevel: number) => string; + memberKindTag: (reflection: DeclarationReflection) => string; + referenceMember: (props: ReferenceReflection) => string; + reflectionMember: (reflection: DeclarationReflection, headingLevel: number) => string; + signatureMemberIdentifier: (signature: SignatureReflection) => string; + signatureMember: (signature: SignatureReflection, headingLevel: number) => string; + sources: (reflection: DeclarationReflection | SignatureReflection) => string; + memberTitle: (reflection: DeclarationReflection, typeParams?: boolean) => string; + member: (reflection: DeclarationReflection, headingLevel: number) => string; + typeDeclarationMember: (typeDeclaration: DeclarationReflection, headingLevel: number) => string; + members: (container: ContainerReflection, headingLevel: number) => string; + navigation: (navigationItems: NavigationItem[]) => string; + pageHeader: (page: PageEvent) => string; + pageTitle: (page: PageEvent) => string; + enumMembersTable: (props: DeclarationReflection[]) => string; + parametersTable: (parameters: ParameterReflection[]) => string; + propertiesTable: (props: DeclarationReflection[], nameCol?: string) => string; + typeParametersTable: (typeParameters: TypeParameterReflection[]) => string; + toc: (reflection: DeclarationReflection | ProjectReflection) => string; + arrayType: (arrayType: ArrayType) => string; + conditionalType: (conditionalType: ConditionalType) => string; + declarationType: (declarationReflection: DeclarationReflection, collapse?: Collapse) => string; + functionType: (modelSignatures: SignatureReflection[]) => string; + indexAccessType: (model: IndexedAccessType) => string; + inferredType: (model: InferredType) => string; + intersectionType: (model: IntersectionType) => string; + intrinsicType: (model: IntrinsicType) => string; + literalType: (literalType: LiteralType) => string; + queryType: (queryType: QueryType) => string; + referenceType: (referenceType: ReferenceType) => string; + reflectionType: (reflectionType: ReflectionType, collapse: Collapse) => string; + someType: (someType: SomeType, collapse?: Collapse) => string; + tupleType: (tupleType: TupleType) => string; + typeOperatorType: (model: TypeOperatorType) => string; + unionType: (unionType: UnionType) => string; + unknownType: (model: UnknownType) => string; +}; + +export const templates = (context: MarkdownThemeRenderContext): Templates => ({ + memberTemplate: bind(memberTemplate, context), + projectTemplate: bind(projectTemplate, context), + readmeTemplate: bind(readmeTemplate, context), + reflectionTemplate: bind(reflectionTemplate, context), +}); + +export const partials = (context: MarkdownThemeRenderContext): Partials => ({ + breadcrumbs: bind(breadcrumbs, context), + commentParts: bind(commentParts, context), + comment: bind(comment, context), + hierarchy: bind(hierarchy, context), + declarationMemberIdentifier: bind(declarationMemberIdentifier, context), + declarationMemberName: bind(declarationMemberName, context), + declarationMember: bind(declarationMember, context), + indexSignatureTitle: bind(indexSignatureTitle, context), + inheritance: bind(inheritance, context), + memberKindTag: bind(memberKindTag, context), + referenceMember: bind(referenceMember, context), + reflectionMember: bind(reflectionMember, context), + signatureMemberIdentifier: bind(signatureMemberIdentifier, context), + signatureMember: bind(signatureMember, context), + sources: bind(sources, context), + memberTitle: bind(memberTitle, context), + member: bind(member, context), + typeDeclarationMember: bind(typeDeclarationMember, context), + members: bind(members, context), + navigation: bind(navigation, context), + pageHeader: bind(pageHeader, context), + pageTitle: bind(pageTitle, context), + enumMembersTable: bind(enumMembersTable, context), + parametersTable: bind(parametersTable, context), + propertiesTable: bind(propertiesTable, context), + typeParametersTable: bind(typeParametersTable, context), + toc: bind(toc, context), + arrayType: bind(arrayType, context), + conditionalType: bind(conditionalType, context), + declarationType: bind(declarationType, context), + functionType: bind(functionType, context), + indexAccessType: bind(indexAccessType, context), + inferredType: bind(inferredType, context), + intersectionType: bind(intersectionType, context), + intrinsicType: bind(intrinsicType, context), + literalType: bind(literalType, context), + queryType: bind(queryType, context), + referenceType: bind(referenceType, context), + reflectionType: bind(reflectionType, context), + someType: bind(someType, context), + tupleType: bind(tupleType, context), + typeOperatorType: bind(typeOperatorType, context), + unionType: bind(unionType, context), + unknownType: bind(unknownType, context), +}); diff --git a/tools/typedoc-plugin-markdown/src/resources/templates/member.ts b/tools/typedoc-plugin-markdown/src/resources/templates/member.ts new file mode 100644 index 00000000..9ea2c1c2 --- /dev/null +++ b/tools/typedoc-plugin-markdown/src/resources/templates/member.ts @@ -0,0 +1,26 @@ +import { DeclarationReflection, PageEvent } from 'typedoc'; +import { heading } from '../../support/els'; +import { MarkdownThemeRenderContext } from '../../theme-render-context'; + +export function memberTemplate( + context: MarkdownThemeRenderContext, + page: PageEvent, +) { + const md: string[] = []; + + if (!context.getOption('hidePageHeader')) { + md.push(context.partials.pageHeader(page)); + } + + if (!context.getOption('hideBreadcrumbs')) { + md.push(context.partials.breadcrumbs(page)); + } + + if (!context.getOption('hidePageTitle')) { + md.push(heading(1, context.partials.pageTitle(page))); + } + + md.push(context.partials.member(page.model, 1)); + + return md.join('\n\n'); +} diff --git a/tools/typedoc-plugin-markdown/src/resources/templates/project.ts b/tools/typedoc-plugin-markdown/src/resources/templates/project.ts new file mode 100644 index 00000000..8930497e --- /dev/null +++ b/tools/typedoc-plugin-markdown/src/resources/templates/project.ts @@ -0,0 +1,47 @@ +import * as path from 'path'; +import { PageEvent, ProjectReflection } from 'typedoc'; +import { heading } from '../../support/els'; +import { escapeChars } from '../../support/utils'; +import { MarkdownThemeRenderContext } from '../../theme-render-context'; + +export function projectTemplate( + context: MarkdownThemeRenderContext, + page: PageEvent, +) { + const md: string[] = []; + + if (!context.getOption('hidePageHeader')) { + md.push(context.partials.pageHeader(page)); + } + + if (!context.getOption('hideBreadcrumbs')) { + md.push(context.partials.breadcrumbs(page)); + } + + if (!context.getOption('hidePageTitle')) { + md.push(heading(1, context.partials.pageTitle(page))); + } + + if (page.model.comment) { + md.push(context.partials.comment(page.model.comment, 2)); + } + + if (page.model.groups) { + md.push(context.partials.toc(page.model)); + } else { + md.push(heading(2, 'Packages')); + + const packagesList = page.model.children?.map((projectPackage) => { + return `- [${escapeChars(projectPackage.name)}](${context.relativeURL( + Boolean(projectPackage.readme) + ? `${path.dirname(projectPackage.url || '')}/${context.readmeFile}` + : projectPackage.url, + )})`; + }); + md.push(packagesList?.join('\n') || ''); + } + + md.push(context.partials.members(page.model, 2)); + + return md.join('\n\n'); +} diff --git a/tools/typedoc-plugin-markdown/src/resources/templates/readme.ts b/tools/typedoc-plugin-markdown/src/resources/templates/readme.ts new file mode 100644 index 00000000..b7e9811b --- /dev/null +++ b/tools/typedoc-plugin-markdown/src/resources/templates/readme.ts @@ -0,0 +1,19 @@ +import { DeclarationReflection, PageEvent, ProjectReflection } from 'typedoc'; +import { MarkdownThemeRenderContext } from '../../theme-render-context'; + +export function readmeTemplate( + context: MarkdownThemeRenderContext, + page: PageEvent, +) { + const md: string[] = []; + + if (!context.getOption('hidePageHeader')) { + md.push(context.partials.pageHeader(page)); + } + + if (page.model.readme) { + md.push(context.partials.commentParts(page.model.readme)); + } + + return md.join('\n\n'); +} diff --git a/tools/typedoc-plugin-markdown/src/resources/templates/reflection.ts b/tools/typedoc-plugin-markdown/src/resources/templates/reflection.ts new file mode 100644 index 00000000..65485bc0 --- /dev/null +++ b/tools/typedoc-plugin-markdown/src/resources/templates/reflection.ts @@ -0,0 +1,30 @@ +import { DeclarationReflection, PageEvent } from 'typedoc'; +import { heading } from '../../support/els'; +import { MarkdownThemeRenderContext } from '../../theme-render-context'; + +export function reflectionTemplate( + context: MarkdownThemeRenderContext, + page: PageEvent, +) { + const md: string[] = []; + + if (!context.getOption('hidePageHeader')) { + md.push(context.partials.pageHeader(page)); + } + + if (!context.getOption('hideBreadcrumbs')) { + md.push(context.partials.breadcrumbs(page)); + } + + if (!context.getOption('hidePageTitle')) { + md.push(heading(1, context.partials.pageTitle(page))); + } + + if (!context.getOption('hideKindTag')) { + md.push(context.partials.memberKindTag(page.model)); + } + + md.push(context.partials.reflectionMember(page.model, 2)); + + return md.join('\n\n'); +} diff --git a/tools/typedoc-plugin-markdown/src/support/constants.ts b/tools/typedoc-plugin-markdown/src/support/constants.ts new file mode 100644 index 00000000..b3f934f2 --- /dev/null +++ b/tools/typedoc-plugin-markdown/src/support/constants.ts @@ -0,0 +1,21 @@ +import { ReflectionKind } from 'typedoc'; + +export const URL_PREFIX = /^(http|ftp)s?:\/\//; + +export const SYMBOLS_WITH_DOCUMENTS = [ + ReflectionKind.Class, + ReflectionKind.Interface, + ReflectionKind.Enum, + ReflectionKind.Function, + ReflectionKind.Variable, + ReflectionKind.TypeAlias, +]; + +export const VALID_KINDS_WITH_OWN_FILE: string[] = [ + ReflectionKind[ReflectionKind.Class], + ReflectionKind[ReflectionKind.Interface], + ReflectionKind[ReflectionKind.Enum], + ReflectionKind[ReflectionKind.Function], + ReflectionKind[ReflectionKind.TypeAlias], + ReflectionKind[ReflectionKind.Variable], +]; diff --git a/tools/typedoc-plugin-markdown/src/support/els.ts b/tools/typedoc-plugin-markdown/src/support/els.ts new file mode 100644 index 00000000..a88e2ae8 --- /dev/null +++ b/tools/typedoc-plugin-markdown/src/support/els.ts @@ -0,0 +1,43 @@ +import { unEscapeChars } from './utils'; + +export const heading = (level: number, text: string) => { + level = level > 6 ? 6 : level; + return `${[...Array(level)].map(() => '#').join('')} ${text}`; +}; + +export const link = (label: string, url: string | null) => + url ? `[${label}](${url})` : ''; + +export const bold = (text: string) => `**${text}**`; + +export const italic = (text: string) => `*${text}*`; + +export const backTicks = (text: string) => `\`${text}\``; + +export const unorderedList = (items: T[]) => + items.map((item) => `- ${item}`).join('\n'); + +export const horizontalRule = () => '\n\n---'; + +export const codeBlock = (content: string) => + '```ts\n' + unEscapeChars(content) + '\n```'; + +export const table = (headers: string[], rows: string[][]) => + `\n| ${headers.join(' | ')} |\n| ${headers + .map(() => ':------') + .join(' | ')} |\n${rows.map((row) => `| ${row.join(' | ')} |\n`).join('')}`; + +export const blockQuoteBlock = (content: string) => { + const lines = content.split('\n'); + return lines + .map((line) => (line.length ? `> ${line.trim()}` : '>')) + .join('\n'); +}; + +export const indentBlock = (content: string) => { + const lines = content.split('\n'); + return lines + .filter((line) => Boolean(line.length)) + .map((line) => ` ${line}`) + .join('\n'); +}; diff --git a/tools/typedoc-plugin-markdown/src/support/helpers.ts b/tools/typedoc-plugin-markdown/src/support/helpers.ts new file mode 100644 index 00000000..dd3b1482 --- /dev/null +++ b/tools/typedoc-plugin-markdown/src/support/helpers.ts @@ -0,0 +1,46 @@ +import { CommentTag, DeclarationReflection, ProjectReflection } from 'typedoc'; +import { backTicks } from './els'; +import { stripLineBreaks } from './utils'; + +export function getTypeParameters(reflection: DeclarationReflection) { + if (reflection.typeParameters) { + const typeParameters = reflection.typeParameters + .map((typeParameter) => typeParameter.name) + .join(', '); + return `\\<${typeParameters}\\>`; + } + return ''; +} + +export function getFlags(reflection: DeclarationReflection) { + if (reflection.flags?.length > 0 && !reflection.flags.isRest) { + return reflection.flags.map((flag) => backTicks(flag)).join(' '); + } + return null; +} + +export function tableComments(str: string) { + return stripLineBreaks(str).replace(/\|/g, '\\|'); +} + +export function getTagName(tag: CommentTag) { + return tag.tag.substring(1); +} + +export function getDeclarationType(declaration: DeclarationReflection) { + if (declaration.getSignature) { + return declaration.getSignature.type; + } + if (declaration.setSignature) { + return declaration.setSignature.type; + } + return declaration.type; +} + +export function getProjectDisplayName( + project: ProjectReflection, + includeVersion: boolean, +): string { + const version = includeVersion ? ` - v${project.packageVersion}` : ''; + return `${project.name}${version}`; +} diff --git a/tools/typedoc-plugin-markdown/src/support/utils.ts b/tools/typedoc-plugin-markdown/src/support/utils.ts new file mode 100644 index 00000000..8d21314f --- /dev/null +++ b/tools/typedoc-plugin-markdown/src/support/utils.ts @@ -0,0 +1,58 @@ +export function escapeChars(str: string) { + return str + .replace(/>/g, '\\>') + .replace(/(?=(?:[^`]*`[^`]*`)*[^`]*$)/gi, '\\>'); +} + +export function escapeTableCol(str: string) { + return str.replace(/(?/g, '>') + .replace(/\\_/g, '_') + .replace(/\\{/g, '{') + .replace(/`/g, '') + .replace(/\*/g, '') + .replace(/\\\|/g, '|') + .replace(/\[([^\[\]]*)\]\((.*?)\)/gm, '$1'); +} + +export function stripComments(str: string) { + return str + .replace(/(?:\/\*(?:[\s\S]*?)\*\/)|(?:^\s*\/\/(?:.*)$)/g, ' ') + .replace(/\n/g, '') + .replace(/^\s+|\s+$|(\s)+/g, '$1'); +} + +export function stripLineBreaks(str: string, includeHTML = true) { + return str ? str.replace(/\n/g, includeHTML ? '
' : ' ').trim() : ''; +} + +export function camelToTitleCase(text: string) { + return ( + text.substring(0, 1).toUpperCase() + + text.substring(1).replace(/[a-z][A-Z]/g, (x) => `${x[0]} ${x[1]}`) + ); +} + +export function slugify(str: string) { + return str + .toLowerCase() + .trim() + .replace(/[^\w\s-]/g, '') + .replace(/[\s_-]+/g, '-') + .replace(/^-+|-+$/g, ''); +} diff --git a/tools/typedoc-plugin-markdown/src/theme-render-context.ts b/tools/typedoc-plugin-markdown/src/theme-render-context.ts new file mode 100644 index 00000000..aba94885 --- /dev/null +++ b/tools/typedoc-plugin-markdown/src/theme-render-context.ts @@ -0,0 +1,66 @@ +import * as path from 'path'; +import { Options, Reflection } from 'typedoc'; +import { TypedocPluginMarkdownOptions } from './models'; +import { partials, templates } from './resources/resources'; +import { URL_PREFIX } from './support/constants'; +import { MarkdownTheme } from './theme'; + +export class MarkdownThemeRenderContext { + public readmeFile = 'README.md'; + public indexFile = 'index.md'; + public modulesFile = 'modules.md'; + public exportsFile = 'exports.md'; + + private _activeLocation = '.'; + + set activeLocation(activeLocation: string) { + this._activeLocation = activeLocation; + } + + get activeLocation() { + return this._activeLocation; + } + + constructor(public theme: MarkdownTheme, public options: Options) {} + + getOption(name: K) { + return this.options.getValue(name) as TypedocPluginMarkdownOptions[K]; + } + + getRelativeUrl(url: string | undefined) { + if (!url) { + return null; + } + if (URL_PREFIX.test(url)) { + return url; + } else { + if (this.getOption('baseUrl')) { + return this.getOption('baseUrl') + url.replace(/\\/g, '/'); + } + + const relative = path.relative( + path.dirname(this.activeLocation), + path.dirname(url), + ); + + return this.parseUrl( + path.join(relative, path.basename(url)).replace(/\\/g, '/'), + ); + } + } + + urlTo(reflection: Reflection) { + return this.relativeURL(reflection.url); + } + + parseUrl(url: string) { + return encodeURI(url); + } + + relativeURL(url: string | undefined) { + return this.getRelativeUrl(url); + } + + templates = templates(this); + partials = partials(this); +} diff --git a/tools/typedoc-plugin-markdown/src/theme.ts b/tools/typedoc-plugin-markdown/src/theme.ts new file mode 100644 index 00000000..d01efd02 --- /dev/null +++ b/tools/typedoc-plugin-markdown/src/theme.ts @@ -0,0 +1,80 @@ +import * as prettier from 'prettier'; +import { + PageEvent, + ProjectReflection, + Reflection, + RenderTemplate, + Renderer, + Theme, +} from 'typedoc'; +import { NavigationBuilder } from './converter/navigation-builder'; +import { UrlBuilder } from './converter/url-builder'; +import { MarkdownThemeRenderContext } from './theme-render-context'; + +export class MarkdownTheme extends Theme { + private _renderContext: MarkdownThemeRenderContext; + private _prettierOptions: prettier.Options | null; + + constructor(renderer: Renderer) { + super(renderer); + + // Warnings + if (this.application.options.getValue('enableFrontmatter')) { + this.application.logger.warn( + '[typedoc-plugin-markdown] `enableFrontmatter` has been removed. Please use plugin-typedoc-frontmatter instead', + ); + } + + this.listenTo(this.owner, { + [PageEvent.BEGIN]: this.onBeginPage, + }); + } + + getRenderContext() { + if (!this._renderContext) { + this._renderContext = new MarkdownThemeRenderContext( + this, + this.application.options, + ); + } + return this._renderContext; + } + + getPrettierOptions() { + if (!this._prettierOptions) { + this._prettierOptions = this.resolvePrettierOptions(); + } + return this._prettierOptions; + } + + resolvePrettierOptions() { + const prettierFile = prettier.resolveConfigFile.sync(); + return prettierFile ? prettier.resolveConfig.sync(prettierFile) : null; + } + + render( + page: PageEvent, + template: RenderTemplate>, + ): string { + return prettier.format(template(page) as string, { + ...this.getPrettierOptions(), + parser: 'markdown', + }); + } + + getUrls(project: ProjectReflection) { + const urls = new UrlBuilder(this.getRenderContext()).getUrls(project); + return urls; + } + + getNavigation(project: ProjectReflection) { + const navigation = new NavigationBuilder( + this.getRenderContext(), + ).getNavigation(project); + return navigation; + } + + protected onBeginPage(page: PageEvent) { + this.getRenderContext().activeLocation = page.url; + } +} diff --git a/tools/typedoc-plugin-markdown/test/specs/__snapshots__/breadcrumbs.spec.ts.snap b/tools/typedoc-plugin-markdown/test/specs/__snapshots__/breadcrumbs.spec.ts.snap new file mode 100644 index 00000000..ae47de1d --- /dev/null +++ b/tools/typedoc-plugin-markdown/test/specs/__snapshots__/breadcrumbs.spec.ts.snap @@ -0,0 +1,11 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Breadcrumbs: (with readme) should compile class breadcrumbs' 1`] = `"[Exports](exports.md) > Breadcrumbs"`; + +exports[`Breadcrumbs: (with readme) should compile entryPoint (globals) breadcrumbs' 1`] = `"[Exports](exports.md) > typedoc-plugin-markdown"`; + +exports[`Breadcrumbs: (with readme) should compile module breadcrumbs' 1`] = `"[Exports](exports.md) > Breadcrumbs"`; + +exports[`Breadcrumbs: (without readme) should compile class breadcrumbs' 1`] = `"[Exports](README.md) > Breadcrumbs"`; + +exports[`Breadcrumbs: (without readme) should compile module breadcrumbs' 1`] = `"[Exports](README.md) > Breadcrumbs"`; diff --git a/tools/typedoc-plugin-markdown/test/specs/__snapshots__/categories.spec.ts.snap b/tools/typedoc-plugin-markdown/test/specs/__snapshots__/categories.spec.ts.snap new file mode 100644 index 00000000..07e900b1 --- /dev/null +++ b/tools/typedoc-plugin-markdown/test/specs/__snapshots__/categories.spec.ts.snap @@ -0,0 +1,507 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Categories: (categorizeByGroup=false) should render category TOC' 1`] = ` +"## Index + +### CategoryA + +- [CategoryInterfaceA1](exports.md#categoryinterfacea1) +- [CategoryInterfaceA2](exports.md#categoryinterfacea2) +- [categoryVariableA1](exports.md#categoryvariablea1) +- [categoryVariableA2](exports.md#categoryvariablea2) +- [categoryFunctionA1](exports.md#categoryfunctiona1) +- [categoryFunctionA2](exports.md#categoryfunctiona2) +- [categoryFunctionA3](exports.md#categoryfunctiona3) + +### CategoryB + +- [categoryVariableB1](exports.md#categoryvariableb1) +- [categoryFunctionB2](exports.md#categoryfunctionb2) + +### Other + +- [OtherInterfaceA](exports.md#otherinterfacea) +- [otherVariableA](exports.md#othervariablea) +- [otherVariableB](exports.md#othervariableb) +- [otherFunctionA](exports.md#otherfunctiona) +- [otherFunctionB](exports.md#otherfunctionb) +" +`; + +exports[`Categories: (categorizeByGroup=false) should render category members' 1`] = ` +"## CategoryA + +### CategoryInterfaceA1 + +[partial: reflectionMember] + + + +--- + +### CategoryInterfaceA2 + +[partial: reflectionMember] + + + +--- + +### categoryVariableA1 + +[partial: declarationMember] + + + +--- + +### categoryVariableA2 + +[partial: declarationMember] + + + +--- + +### categoryFunctionA1() + +[partial: signatureMember] + + + +--- + +### categoryFunctionA2() + +[partial: signatureMember] + + + +--- + +### categoryFunctionA3() + +[partial: signatureMember] + + + +--- + +## CategoryB + +### categoryVariableB1 + +[partial: declarationMember] + + + +--- + +### categoryFunctionB2() + +[partial: signatureMember] + + + +--- + +## Other + +### OtherInterfaceA + +[partial: reflectionMember] + + + +--- + +### otherVariableA + +[partial: declarationMember] + + + +--- + +### otherVariableB + +[partial: declarationMember] + + + +--- + +### otherFunctionA() + +[partial: signatureMember] + + + +--- + +### otherFunctionB() + +[partial: signatureMember] + + + +---" +`; + +exports[`Categories: (excludeGroups=false) should render category TOC' 1`] = ` +"## Index + +### Interfaces + +#### CategoryA + +- [CategoryInterfaceA1](exports.md#categoryinterfacea1) +- [CategoryInterfaceA2](exports.md#categoryinterfacea2) +- [OtherInterfaceA](exports.md#otherinterfacea) + +#### Other + +- [CategoryInterfaceA1](exports.md#categoryinterfacea1) +- [CategoryInterfaceA2](exports.md#categoryinterfacea2) +- [OtherInterfaceA](exports.md#otherinterfacea) + +### Variables + +#### CategoryA + +- [categoryVariableA1](exports.md#categoryvariablea1) +- [categoryVariableA2](exports.md#categoryvariablea2) +- [categoryVariableB1](exports.md#categoryvariableb1) +- [otherVariableA](exports.md#othervariablea) +- [otherVariableB](exports.md#othervariableb) + +#### CategoryB + +- [categoryVariableA1](exports.md#categoryvariablea1) +- [categoryVariableA2](exports.md#categoryvariablea2) +- [categoryVariableB1](exports.md#categoryvariableb1) +- [otherVariableA](exports.md#othervariablea) +- [otherVariableB](exports.md#othervariableb) + +#### Other + +- [categoryVariableA1](exports.md#categoryvariablea1) +- [categoryVariableA2](exports.md#categoryvariablea2) +- [categoryVariableB1](exports.md#categoryvariableb1) +- [otherVariableA](exports.md#othervariablea) +- [otherVariableB](exports.md#othervariableb) + +### Functions + +#### CategoryA + +- [categoryFunctionA1](exports.md#categoryfunctiona1) +- [categoryFunctionA2](exports.md#categoryfunctiona2) +- [categoryFunctionA3](exports.md#categoryfunctiona3) +- [categoryFunctionB2](exports.md#categoryfunctionb2) +- [otherFunctionA](exports.md#otherfunctiona) +- [otherFunctionB](exports.md#otherfunctionb) + +#### CategoryB + +- [categoryFunctionA1](exports.md#categoryfunctiona1) +- [categoryFunctionA2](exports.md#categoryfunctiona2) +- [categoryFunctionA3](exports.md#categoryfunctiona3) +- [categoryFunctionB2](exports.md#categoryfunctionb2) +- [otherFunctionA](exports.md#otherfunctiona) +- [otherFunctionB](exports.md#otherfunctionb) + +#### Other + +- [categoryFunctionA1](exports.md#categoryfunctiona1) +- [categoryFunctionA2](exports.md#categoryfunctiona2) +- [categoryFunctionA3](exports.md#categoryfunctiona3) +- [categoryFunctionB2](exports.md#categoryfunctionb2) +- [otherFunctionA](exports.md#otherfunctiona) +- [otherFunctionB](exports.md#otherfunctionb) +" +`; + +exports[`Categories: (excludeGroups=false) should render category members' 1`] = ` +"## Interfaces + +### CategoryA + +#### CategoryInterfaceA1 + +[partial: reflectionMember] + + + +--- + +#### CategoryInterfaceA2 + +[partial: reflectionMember] + + + +--- + +### Other + +#### OtherInterfaceA + +[partial: reflectionMember] + + + +--- + +## Variables + +### CategoryA + +#### categoryVariableA1 + +[partial: declarationMember] + + + +--- + +#### categoryVariableA2 + +[partial: declarationMember] + + + +--- + +### CategoryB + +#### categoryVariableB1 + +[partial: declarationMember] + + + +--- + +### Other + +#### otherVariableA + +[partial: declarationMember] + + + +--- + +#### otherVariableB + +[partial: declarationMember] + + + +--- + +## Functions + +### CategoryA + +#### categoryFunctionA1() + +[partial: signatureMember] + + + +--- + +#### categoryFunctionA2() + +[partial: signatureMember] + + + +--- + +#### categoryFunctionA3() + +[partial: signatureMember] + + + +--- + +### CategoryB + +#### categoryFunctionB2() + +[partial: signatureMember] + + + +--- + +### Other + +#### otherFunctionA() + +[partial: signatureMember] + + + +--- + +#### otherFunctionB() + +[partial: signatureMember] + + + +---" +`; + +exports[`Categories: (excludeGroups=true) should render category TOC' 1`] = ` +"## Index + +### CategoryA + +- [CategoryInterfaceA1](exports.md#categoryinterfacea1) +- [CategoryInterfaceA2](exports.md#categoryinterfacea2) +- [categoryVariableA1](exports.md#categoryvariablea1) +- [categoryVariableA2](exports.md#categoryvariablea2) +- [categoryFunctionA1](exports.md#categoryfunctiona1) +- [categoryFunctionA2](exports.md#categoryfunctiona2) +- [categoryFunctionA3](exports.md#categoryfunctiona3) + +### CategoryB + +- [categoryVariableB1](exports.md#categoryvariableb1) +- [categoryFunctionB2](exports.md#categoryfunctionb2) + +### Other + +- [OtherInterfaceA](exports.md#otherinterfacea) +- [otherVariableA](exports.md#othervariablea) +- [otherVariableB](exports.md#othervariableb) +- [otherFunctionA](exports.md#otherfunctiona) +- [otherFunctionB](exports.md#otherfunctionb) +" +`; + +exports[`Categories: (excludeGroups=true) should render category members' 1`] = ` +"## CategoryA + +### CategoryInterfaceA1 + +[partial: reflectionMember] + + + +--- + +### CategoryInterfaceA2 + +[partial: reflectionMember] + + + +--- + +### categoryVariableA1 + +[partial: declarationMember] + + + +--- + +### categoryVariableA2 + +[partial: declarationMember] + + + +--- + +### categoryFunctionA1() + +[partial: signatureMember] + + + +--- + +### categoryFunctionA2() + +[partial: signatureMember] + + + +--- + +### categoryFunctionA3() + +[partial: signatureMember] + + + +--- + +## CategoryB + +### categoryVariableB1 + +[partial: declarationMember] + + + +--- + +### categoryFunctionB2() + +[partial: signatureMember] + + + +--- + +## Other + +### OtherInterfaceA + +[partial: reflectionMember] + + + +--- + +### otherVariableA + +[partial: declarationMember] + + + +--- + +### otherVariableB + +[partial: declarationMember] + + + +--- + +### otherFunctionA() + +[partial: signatureMember] + + + +--- + +### otherFunctionB() + +[partial: signatureMember] + + + +---" +`; diff --git a/tools/typedoc-plugin-markdown/test/specs/__snapshots__/comments.spec.ts.snap b/tools/typedoc-plugin-markdown/test/specs/__snapshots__/comments.spec.ts.snap new file mode 100644 index 00000000..f8d91524 --- /dev/null +++ b/tools/typedoc-plugin-markdown/test/specs/__snapshots__/comments.spec.ts.snap @@ -0,0 +1,52 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Comments: should convert comments with fenced block' 1`] = ` +"Some comments with fence blocks + +\`\`\`typescript +someFunction() +\`\`\` + +\`\`\`js +anotherFunction() +\`\`\`" +`; + +exports[`Comments: should convert comments with tags' 1`] = ` +"\`Description\` + +Tag description on new line + +- Tag description on another line + +\`Deprecated\` + +Another tag description + +Gets the application version. + +\`Example\` + +\`\`\`typescript +import { getVersion } from '@tauri-apps/api/app'; +const appVersion = await getVersion(); +\`\`\`" +`; + +exports[`Comments: should convert symbols brackets to symbol links' 1`] = ` +"See [\`CommentClass\`](classes/class.CommentClass.md) and CommentClass's [comment](classes/class.CommentClass.md#comment) property. +Also, check out [Google](https://www.google.com) and +[GitHub](https://github.com). + +Taken from [JsDoc](http://usejsdoc.org/tags-inline-link.html)." +`; + +exports[`Comments: should escape angle brackets inside comments' 1`] = ` +"A \\\\ in comments + +A \`\` in backticks + +\`\`\`html +A in a code block +\`\`\`" +`; diff --git a/tools/typedoc-plugin-markdown/test/specs/__snapshots__/declarations.spec.ts.snap b/tools/typedoc-plugin-markdown/test/specs/__snapshots__/declarations.spec.ts.snap new file mode 100644 index 00000000..a0e38dcb --- /dev/null +++ b/tools/typedoc-plugin-markdown/test/specs/__snapshots__/declarations.spec.ts.snap @@ -0,0 +1,379 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Declarations: should compile a const with default value 1`] = ` +"> \`const\` **stringConstWithDefaultValue**: "hello" = \`'hello'\` + +[partial: sources] + +" +`; + +exports[`Declarations: should compile a let with default value 1`] = ` +"> \`let\` **stringLetWithDefaultValue**: \`string\` = \`'hello'\` + +[partial: sources] + +" +`; + +exports[`Declarations: should compile an undefined declaration 1`] = ` +"> \`let\` **undefinedNumberDeclaration**: \`number\` + +[partial: sources] + +" +`; + +exports[`Declarations: should compile any function type 1`] = ` +"> **AnyFunctionType**: \\<\`A\`\\> \`Function\` + +[partial: sources] + +## Type parameters + + +| Parameter | Default | +| :------ | :------ | +| A | \`any\` | + + +## Type declaration + +> (...input: \`any\`[]): \`A\` + +### Parameters + + +| Parameter | Type | +| :------ | :------ | +| ...input | \`any\`[] | + + +### Returns + +\`A\` + + + +" +`; + +exports[`Declarations: should compile declaration with accessors 1`] = ` +"> \`let\` **getterAndSetter**: \`object\` + +[partial: sources] + +## Type declaration + +> **prop**: \`string\` + +[partial: sources] + + +> get **getMe()**: [\`Promise\`]( https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise )\\<\`string\`\\> + +[partial: sources] + + +> set **setMe**(x: \`string\`): \`void\` + +[partial: sources] + + + +" +`; + +exports[`Declarations: should compile declaration with double underscores in name and value 1`] = ` +"> \`const\` **\\_\\_DOUBLE\\_UNDERSCORES\\_DECLARATION\\_\\_**: *typeof* [\`__DOUBLE_UNDERSCORES_DECLARATION__\`](variables/variable._DOUBLE_UNDERSCORES_DECLARATION__.md) + +Comments + +[partial: sources] + +" +`; + +exports[`Declarations: should compile enum declaration 1`] = ` +"> **Down**: 1 + +[partial: sources] + +" +`; + +exports[`Declarations: should compile enum declaration with defaults 1`] = ` +"> **East**: "East" + +[partial: sources] + +" +`; + +exports[`Declarations: should compile function declaration 1`] = ` +"> **functionDeclaration** + +[partial: sources] + +" +`; + +exports[`Declarations: should compile indexable declaration 1`] = ` +"> \`let\` **indexableDeclaration**: \`object\` + +[partial: sources] + +## Index signature + + \\[\`index\`: \`number\`\\]: \`string\` + +## Type declaration + +> **arg1**: \`string\` + +[partial: sources] + + + +" +`; + +exports[`Declarations: should compile object literal cast as a const 1`] = ` +"> \`const\` **objectLiteralAsConstDeclaration**: \`object\` + +[partial: sources] + +## Type declaration + +> \`readonly\` **Prop1**: "Prop1" = \`'Prop1'\` + +[partial: sources] + + +> \`readonly\` **Prop2**: "Prop2" = \`'Prop2'\` + +[partial: sources] + + +> \`readonly\` **Prop3**: "Prop3" = \`'Prop3'\` + +[partial: sources] + + + +" +`; + +exports[`Declarations: should compile object literal declaration 1`] = ` +"> \`const\` **objectLiteralDeclaration**: \`object\` + +Comments for object literal + +[partial: sources] + +## Type declaration + +> **valueA**: \`number\` = \`100\` + +Comment for valueA + +[partial: sources] + + +> **valueB**: \`boolean\` = \`true\` + +[partial: sources] + + +> **valueC**: \`object\` = \`{}\` + +[partial: sources] + + +> **valueX**: \`object\` + +Comment for valueX + +[partial: sources] + +### Type declaration (valueX) + +> > **valueA**: \`number\`[] +> +> Comment for valueA +> +> [partial: sources] +> +> +> > **valueB**: \`object\` +> +> [partial: sources] +> +> #### Type declaration (valueB) +> +> > > **valueB1**: \`number\` = \`1\` +> > +> > [partial: sources] +> > +> > +> > > **valueB2**: \`number\` = \`2\` +> > +> > [partial: sources] +> > +> > +> +> +> > **valueZ**: \`string\` = \`'foo'\` +> +> Comment for valueZ +> +> [partial: sources] +> +> + + +> **valueY**: \`Function\` + +[partial: sources] + +### Type declaration (valueY) + +> > (): \`string\` +> +> Comment for value Y +> +> [partial: sources] +> +> #### Returns +> +> \`string\` +> +> + + +> **valueZ**: \`string\` = \`'foo'\` + +Comment for valueZ + +[partial: sources] + + + +" +`; + +exports[`Declarations: should compile type literal declaration 1`] = ` +"> \`let\` **typeLiteralDeclaration**: \`object\` + +[partial: sources] + +## Type declaration + +> **valueA**?: \`number\` + +Comments for valueA + +[partial: sources] + + +> **valueB**?: \`boolean\` + +[partial: sources] + + +> **valueC**: \`object\` + +[partial: sources] + +### Index signature + + \\[\`dataId\`: \`string\`\\]: "ok" \\| "ko" + + +> **valueX**: \`object\` + +Comment for valueX + +[partial: sources] + +### Type declaration (valueX) + +> > **valueA**: \`number\`[] +> +> [partial: sources] +> +> +> > **valueY**: \`Function\` +> +> [partial: sources] +> +> #### Type declaration (valueY) +> +> > > (z: \`string\`): \`object\` +> > +> > Nested comment for valueX.valueY +> > +> > [partial: sources] +> > +> > ##### Parameters +> > +> > +> > | Parameter | Type | +> > | :------ | :------ | +> > | z | \`string\` | +> > +> > +> > ##### Returns +> > +> > \`object\` +> > +> > > **a**: \`string\` +> > +> > [partial: sources] +> > +> > +> > > **b**: \`string\` +> > +> > [partial: sources] +> > +> > +> > +> > +> +> +> > **valueZ**: \`string\` +> +> Nested comment for valueX.valueZ +> +> [partial: sources] +> +> + + +> **valueY**: \`Function\` + +[partial: sources] + +### Type declaration (valueY) + +> > (): \`string\` +> +> [partial: sources] +> +> #### Returns +> +> \`string\` +> +> + + +> **valueZ**: \`string\` + +Comment for valueZ + +[partial: sources] + + + +" +`; diff --git a/tools/typedoc-plugin-markdown/test/specs/__snapshots__/generics.spec.ts.snap b/tools/typedoc-plugin-markdown/test/specs/__snapshots__/generics.spec.ts.snap new file mode 100644 index 00000000..506a47ee --- /dev/null +++ b/tools/typedoc-plugin-markdown/test/specs/__snapshots__/generics.spec.ts.snap @@ -0,0 +1,87 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Generics: should compile class with type params 1`] = ` +"[partial: pageHeader] + +[partial: breadcrumbs] + +# ClassWithTypeParams\`\` + +**\`Class\`** + +[partial: comment] + +[partial: sources] + +## Type parameters + + +| Parameter | +| :------ | +| T | +| V | + + +[partial: members]" +`; + +exports[`Generics: should compile function with a simple type param' 1`] = ` +"> **functionWithTypeParam**\\(): \`boolean\` + +[partial: sources] + +## Type parameters + + +| Parameter | +| :------ | +| A | + + +## Returns + +\`boolean\` + +" +`; + +exports[`Generics: should compile function with complex type params' 1`] = ` +"> **functionWithTypeParams**\\(): \`boolean\` + +[partial: comment] + +[partial: sources] + +## Type parameters + + +| Parameter | Default | Description | +| :------ | :------ | :------ | +| A | - | [partial: comment] | +| B *extends* [\`ClassWithTypeParams\`](classes/class.ClassWithTypeParams.md)\\<\`string\`, \`number\`, \`B\`\\> | - | [partial: comment] | +| C | \`string\` \\| \`boolean\` | - | +| D | \`string\` | - | + + +## Returns + +\`boolean\` + +" +`; + +exports[`Generics: should compile generics with defaults' 1`] = ` +"> **genericsWithDefaults** + +[partial: sources] + +" +`; + +exports[`Generics: should compile type with nested generics' 1`] = ` +"> **nestedGenerics**: [\`Generic1\`](type-aliases/type-alias.Generic1.md)\\<[\`Generic2\`](type-aliases/type-alias.Generic2.md)\\<[\`Generic3\`](type-aliases/type-alias.Generic3.md)\\<\`string\`\\>\\>\\> + +[partial: sources] + +" +`; diff --git a/tools/typedoc-plugin-markdown/test/specs/__snapshots__/groups.spec.ts.snap b/tools/typedoc-plugin-markdown/test/specs/__snapshots__/groups.spec.ts.snap new file mode 100644 index 00000000..5e07ebc8 --- /dev/null +++ b/tools/typedoc-plugin-markdown/test/specs/__snapshots__/groups.spec.ts.snap @@ -0,0 +1,273 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Groups: (excludeGroups=false) should render group TOC' 1`] = ` +"## Index + +### Enumerations + +- [EnumA](exports.md#enuma) +- [EnumB](exports.md#enumb) + +### Classes + +- [ClassA](exports.md#classa) +- [ClassB](exports.md#classb) + +### Interfaces + +- [InterfaceA](exports.md#interfacea) +- [InterfaceB](exports.md#interfaceb) + +### Type Aliases + +- [typeA](exports.md#typea) +- [typeB](exports.md#typeb) + +### Variables + +- [variableA](exports.md#variablea) +- [variableB](exports.md#variableb) + +### Functions + +- [functionA](exports.md#functiona) +- [functionB](exports.md#functionb) +" +`; + +exports[`Groups: (excludeGroups=false) should render group members' 1`] = ` +"## Enumerations + +### EnumA + +[partial: reflectionMember] + + + +--- + +### EnumB + +[partial: reflectionMember] + + + +--- + +## Classes + +### ClassA + +[partial: reflectionMember] + + + +--- + +### ClassB + +[partial: reflectionMember] + + + +--- + +## Interfaces + +### InterfaceA + +[partial: reflectionMember] + + + +--- + +### InterfaceB + +[partial: reflectionMember] + + + +--- + +## Type Aliases + +### typeA + +[partial: declarationMember] + + + +--- + +### typeB + +[partial: declarationMember] + + + +--- + +## Variables + +### variableA + +[partial: declarationMember] + + + +--- + +### variableB + +[partial: declarationMember] + + + +--- + +## Functions + +### functionA() + +[partial: signatureMember] + + + +--- + +### functionB() + +[partial: signatureMember] + + + +---" +`; + +exports[`Groups: (excludeGroups=true) should render group TOC' 1`] = ` +"## Index + +- [EnumA](exports.md#enuma) +- [EnumB](exports.md#enumb) +- [ClassA](exports.md#classa) +- [ClassB](exports.md#classb) +- [InterfaceA](exports.md#interfacea) +- [InterfaceB](exports.md#interfaceb) +- [typeA](exports.md#typea) +- [typeB](exports.md#typeb) +- [variableA](exports.md#variablea) +- [variableB](exports.md#variableb) +- [functionA](exports.md#functiona) +- [functionB](exports.md#functionb)" +`; + +exports[`Groups: (excludeGroups=true) should render group members' 1`] = ` +"## Enumerations + +### EnumA + +[partial: reflectionMember] + + + +--- + +### EnumB + +[partial: reflectionMember] + + + +--- + +## Classes + +### ClassA + +[partial: reflectionMember] + + + +--- + +### ClassB + +[partial: reflectionMember] + + + +--- + +## Interfaces + +### InterfaceA + +[partial: reflectionMember] + + + +--- + +### InterfaceB + +[partial: reflectionMember] + + + +--- + +## Type Aliases + +### typeA + +[partial: declarationMember] + + + +--- + +### typeB + +[partial: declarationMember] + + + +--- + +## Variables + +### variableA + +[partial: declarationMember] + + + +--- + +### variableB + +[partial: declarationMember] + + + +--- + +## Functions + +### functionA() + +[partial: signatureMember] + + + +--- + +### functionB() + +[partial: signatureMember] + + + +---" +`; diff --git a/tools/typedoc-plugin-markdown/test/specs/__snapshots__/hierarchy.spec.ts.snap b/tools/typedoc-plugin-markdown/test/specs/__snapshots__/hierarchy.spec.ts.snap new file mode 100644 index 00000000..7b148c4d --- /dev/null +++ b/tools/typedoc-plugin-markdown/test/specs/__snapshots__/hierarchy.spec.ts.snap @@ -0,0 +1,8 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Hierarchy: should compile nested type hierarchy 1`] = `"- [\`ParentClass\`](classes/class.ParentClass.md).**\`ChildClassA\`**"`; + +exports[`Hierarchy: should compile type hierarchy 1`] = ` +"- [\`ChildClassA\`](classes/class.ChildClassA.md) +- [\`ChildClassB\`](classes/class.ChildClassB.md)" +`; diff --git a/tools/typedoc-plugin-markdown/test/specs/__snapshots__/navigation.spec.ts.snap b/tools/typedoc-plugin-markdown/test/specs/__snapshots__/navigation.spec.ts.snap new file mode 100644 index 00000000..db466ccc --- /dev/null +++ b/tools/typedoc-plugin-markdown/test/specs/__snapshots__/navigation.spec.ts.snap @@ -0,0 +1,1758 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Navigation: (Monorepo) should get urls (entryPointStrategy=packages) 1`] = ` +[ + { + "children": [ + { + "children": [ + { + "children": [ + { + "children": [ + { + "children": [], + "title": "numberRegexp", + "url": "child-package/namespaces/namespace.Validation/variables/variable.numberRegexp.md", + }, + ], + "title": "Variables", + }, + ], + "title": "Validation", + "url": "child-package/namespaces/namespace.Validation/index.md", + }, + ], + "title": "Namespaces", + }, + { + "children": [ + { + "children": [], + "title": "hello", + "url": "child-package/variables/variable.hello.md", + }, + ], + "title": "Variables", + }, + ], + "title": "child-package", + }, + { + "children": [ + { + "children": [ + { + "children": [], + "title": "hello", + "url": "child-package-2/variables/variable.hello-1.md", + }, + ], + "title": "Variables", + }, + ], + "title": "child-package-2", + }, +] +`; + +exports[`Navigation: (Monorepo) should get urls (entryPointStrategy=packages, includeFileNumberPrefixes=true) 1`] = ` +[ + { + "children": [ + { + "children": [ + { + "children": [ + { + "children": [ + { + "children": [], + "title": "numberRegexp", + "url": "02-child-package/02-Namespaces/02-namespace.Validation/01-Variables/01-variable.numberRegexp.md", + }, + ], + "title": "Variables", + }, + ], + "title": "Validation", + "url": "02-child-package/02-Namespaces/02-namespace.Validation/index.md", + }, + ], + "title": "Namespaces", + }, + { + "children": [ + { + "children": [], + "title": "hello", + "url": "02-child-package/03-Variables/02-variable.hello.md", + }, + ], + "title": "Variables", + }, + ], + "title": "child-package", + }, + { + "children": [ + { + "children": [ + { + "children": [], + "title": "hello", + "url": "03-child-package-2/01-Variables/01-variable.hello-1.md", + }, + ], + "title": "Variables", + }, + ], + "title": "child-package-2", + }, +] +`; + +exports[`Navigation: (Multiple entrypoints) should get urls (excludeGroups=false) 1`] = ` +[ + { + "children": [ + { + "children": [ + { + "children": [ + { + "children": [ + { + "children": [], + "title": "Properties", + }, + ], + "title": "CategoryInterfaceA1", + "url": "module.categories/interfaces/CategoryA/interface.CategoryInterfaceA1.md", + }, + { + "children": [ + { + "children": [], + "title": "Properties", + }, + ], + "title": "CategoryInterfaceA2", + "url": "module.categories/interfaces/CategoryA/interface.CategoryInterfaceA2.md", + }, + ], + "title": "CategoryA", + }, + { + "children": [ + { + "children": [ + { + "children": [], + "title": "Properties", + }, + ], + "title": "OtherInterfaceA", + "url": "module.categories/interfaces/Other/interface.OtherInterfaceA.md", + }, + ], + "title": "Other", + }, + ], + "title": "Interfaces", + }, + { + "children": [ + { + "children": [ + { + "children": [], + "title": "categoryVariableA1", + "url": "module.categories/variables/CategoryA/variable.categoryVariableA1.md", + }, + { + "children": [], + "title": "categoryVariableA2", + "url": "module.categories/variables/CategoryA/variable.categoryVariableA2.md", + }, + ], + "title": "CategoryA", + }, + { + "children": [ + { + "children": [], + "title": "categoryVariableB1", + "url": "module.categories/variables/CategoryB/variable.categoryVariableB1.md", + }, + ], + "title": "CategoryB", + }, + { + "children": [ + { + "children": [], + "title": "otherVariableA", + "url": "module.categories/variables/Other/variable.otherVariableA.md", + }, + { + "children": [], + "title": "otherVariableB", + "url": "module.categories/variables/Other/variable.otherVariableB.md", + }, + ], + "title": "Other", + }, + ], + "title": "Variables", + }, + { + "children": [ + { + "children": [ + { + "children": [], + "title": "categoryFunctionA1", + "url": "module.categories/functions/CategoryA/function.categoryFunctionA1.md", + }, + { + "children": [], + "title": "categoryFunctionA2", + "url": "module.categories/functions/CategoryA/function.categoryFunctionA2.md", + }, + { + "children": [], + "title": "categoryFunctionA3", + "url": "module.categories/functions/CategoryA/function.categoryFunctionA3.md", + }, + ], + "title": "CategoryA", + }, + { + "children": [ + { + "children": [], + "title": "categoryFunctionB2", + "url": "module.categories/functions/CategoryB/function.categoryFunctionB2.md", + }, + ], + "title": "CategoryB", + }, + { + "children": [ + { + "children": [], + "title": "otherFunctionA", + "url": "module.categories/functions/Other/function.otherFunctionA.md", + }, + { + "children": [], + "title": "otherFunctionB", + "url": "module.categories/functions/Other/function.otherFunctionB.md", + }, + ], + "title": "Other", + }, + ], + "title": "Functions", + }, + ], + "title": "categories", + "url": "module.categories/index.md", + }, + { + "children": [ + { + "children": [ + { + "children": [ + { + "children": [ + { + "children": [ + { + "children": [ + { + "children": [], + "title": "nestedNamespaceVariable", + "url": "module.modules_module_1/namespaces/namespace.someNameSpace/namespaces/namespace.nestedNamespace/variables/variable.nestedNamespaceVariable.md", + }, + ], + "title": "Variables", + }, + ], + "title": "_nestedNamespace", + "url": "module.modules_module_1/namespaces/namespace.someNameSpace/namespaces/namespace.nestedNamespace/index.md", + }, + ], + "title": "Namespaces", + }, + { + "children": [ + { + "children": [ + { + "children": [], + "title": "Enumeration Members", + }, + ], + "title": "NamespaceEnum", + "url": "module.modules_module_1/namespaces/namespace.someNameSpace/enumerations/enumeration.NamespaceEnum.md", + }, + ], + "title": "Enumerations", + }, + { + "children": [ + { + "children": [ + { + "children": [], + "title": "Constructors", + }, + ], + "title": "NameSpaceClassA", + "url": "module.modules_module_1/namespaces/namespace.someNameSpace/classes/class.NameSpaceClassA.md", + }, + ], + "title": "Classes", + }, + { + "children": [ + { + "children": [ + { + "children": [], + "title": "Properties", + }, + ], + "title": "NamespaceInterface", + "url": "module.modules_module_1/namespaces/namespace.someNameSpace/interfaces/interface.NamespaceInterface.md", + }, + ], + "title": "Interfaces", + }, + { + "children": [ + { + "children": [], + "title": "NamespaceTypeLiteral", + "url": "module.modules_module_1/namespaces/namespace.someNameSpace/type-aliases/type-alias.NamespaceTypeLiteral.md", + }, + ], + "title": "Type Aliases", + }, + { + "children": [ + { + "children": [], + "title": "namespaceVariableA", + "url": "module.modules_module_1/namespaces/namespace.someNameSpace/variables/variable.namespaceVariableA.md", + }, + { + "children": [], + "title": "namespaceVariableB", + "url": "module.modules_module_1/namespaces/namespace.someNameSpace/variables/variable.namespaceVariableB.md", + }, + ], + "title": "Variables", + }, + ], + "title": "someNameSpace", + "url": "module.modules_module_1/namespaces/namespace.someNameSpace/index.md", + }, + { + "children": [], + "title": "someNameSpaceB", + "url": "module.modules_module_1/namespaces/namespace.someNameSpaceB/index.md", + }, + ], + "title": "Namespaces", + }, + { + "children": [ + { + "children": [ + { + "children": [], + "title": "Enumeration Members", + }, + ], + "title": "Module1EnumA", + "url": "module.modules_module_1/enumerations/enumeration.Module1EnumA.md", + }, + { + "children": [ + { + "children": [], + "title": "Enumeration Members", + }, + ], + "title": "Module1EnumB", + "url": "module.modules_module_1/enumerations/enumeration.Module1EnumB.md", + }, + ], + "title": "Enumerations", + }, + { + "children": [ + { + "children": [ + { + "children": [], + "title": "Constructors", + }, + { + "children": [], + "title": "Properties", + }, + { + "children": [], + "title": "Methods", + }, + ], + "title": "Module1ClassA", + "url": "module.modules_module_1/classes/class.Module1ClassA.md", + }, + { + "children": [ + { + "children": [], + "title": "Constructors", + }, + { + "children": [], + "title": "Properties", + }, + { + "children": [], + "title": "Methods", + }, + ], + "title": "Module1ClassB", + "url": "module.modules_module_1/classes/class.Module1ClassB.md", + }, + ], + "title": "Classes", + }, + { + "children": [ + { + "children": [ + { + "children": [], + "title": "Properties", + }, + ], + "title": "Module1InterfaceA", + "url": "module.modules_module_1/interfaces/interface.Module1InterfaceA.md", + }, + { + "children": [ + { + "children": [], + "title": "Properties", + }, + ], + "title": "Module1InterfaceB", + "url": "module.modules_module_1/interfaces/interface.Module1InterfaceB.md", + }, + ], + "title": "Interfaces", + }, + { + "children": [ + { + "children": [], + "title": "Module1TypeLiteralA", + "url": "module.modules_module_1/type-aliases/type-alias.Module1TypeLiteralA.md", + }, + { + "children": [], + "title": "Module1TypeLiteralB", + "url": "module.modules_module_1/type-aliases/type-alias.Module1TypeLiteralB.md", + }, + ], + "title": "Type Aliases", + }, + { + "children": [ + { + "children": [], + "title": "module1VariableA", + "url": "module.modules_module_1/variables/variable.module1VariableA.md", + }, + { + "children": [], + "title": "module1VariableB", + "url": "module.modules_module_1/variables/variable.module1VariableB.md", + }, + ], + "title": "Variables", + }, + { + "children": [ + { + "children": [], + "title": "module1FunctionA", + "url": "module.modules_module_1/functions/function.module1FunctionA.md", + }, + { + "children": [], + "title": "module1FunctionB", + "url": "module.modules_module_1/functions/function.module1FunctionB.md", + }, + ], + "title": "Functions", + }, + ], + "title": "modules/module-1", + "url": "module.modules_module_1/index.md", + }, +] +`; + +exports[`Navigation: (Multiple entrypoints) should get urls (excludeGroups=false, includeFileNumberPrefixes: true) 1`] = ` +[ + { + "children": [ + { + "children": [ + { + "children": [ + { + "children": [ + { + "children": [], + "title": "Properties", + }, + ], + "title": "CategoryInterfaceA1", + "url": "02-module.categories/01-Interfaces/01-CategoryA/01-interface.CategoryInterfaceA1.md", + }, + { + "children": [ + { + "children": [], + "title": "Properties", + }, + ], + "title": "CategoryInterfaceA2", + "url": "02-module.categories/01-Interfaces/01-CategoryA/02-interface.CategoryInterfaceA2.md", + }, + ], + "title": "CategoryA", + }, + { + "children": [ + { + "children": [ + { + "children": [], + "title": "Properties", + }, + ], + "title": "OtherInterfaceA", + "url": "02-module.categories/01-Interfaces/02-Other/01-interface.OtherInterfaceA.md", + }, + ], + "title": "Other", + }, + ], + "title": "Interfaces", + }, + { + "children": [ + { + "children": [ + { + "children": [], + "title": "categoryVariableA1", + "url": "02-module.categories/02-Variables/01-CategoryA/01-variable.categoryVariableA1.md", + }, + { + "children": [], + "title": "categoryVariableA2", + "url": "02-module.categories/02-Variables/01-CategoryA/02-variable.categoryVariableA2.md", + }, + ], + "title": "CategoryA", + }, + { + "children": [ + { + "children": [], + "title": "categoryVariableB1", + "url": "02-module.categories/02-Variables/02-CategoryB/01-variable.categoryVariableB1.md", + }, + ], + "title": "CategoryB", + }, + { + "children": [ + { + "children": [], + "title": "otherVariableA", + "url": "02-module.categories/02-Variables/03-Other/01-variable.otherVariableA.md", + }, + { + "children": [], + "title": "otherVariableB", + "url": "02-module.categories/02-Variables/03-Other/02-variable.otherVariableB.md", + }, + ], + "title": "Other", + }, + ], + "title": "Variables", + }, + { + "children": [ + { + "children": [ + { + "children": [], + "title": "categoryFunctionA1", + "url": "02-module.categories/03-Functions/01-CategoryA/01-function.categoryFunctionA1.md", + }, + { + "children": [], + "title": "categoryFunctionA2", + "url": "02-module.categories/03-Functions/01-CategoryA/02-function.categoryFunctionA2.md", + }, + { + "children": [], + "title": "categoryFunctionA3", + "url": "02-module.categories/03-Functions/01-CategoryA/03-function.categoryFunctionA3.md", + }, + ], + "title": "CategoryA", + }, + { + "children": [ + { + "children": [], + "title": "categoryFunctionB2", + "url": "02-module.categories/03-Functions/02-CategoryB/01-function.categoryFunctionB2.md", + }, + ], + "title": "CategoryB", + }, + { + "children": [ + { + "children": [], + "title": "otherFunctionA", + "url": "02-module.categories/03-Functions/03-Other/01-function.otherFunctionA.md", + }, + { + "children": [], + "title": "otherFunctionB", + "url": "02-module.categories/03-Functions/03-Other/02-function.otherFunctionB.md", + }, + ], + "title": "Other", + }, + ], + "title": "Functions", + }, + ], + "title": "categories", + "url": "02-module.categories/index.md", + }, + { + "children": [ + { + "children": [ + { + "children": [ + { + "children": [ + { + "children": [ + { + "children": [ + { + "children": [], + "title": "nestedNamespaceVariable", + "url": "03-module.modules_module_1/01-Namespaces/01-namespace.someNameSpace/01-Namespaces/01-namespace.nestedNamespace/01-Variables/01-variable.nestedNamespaceVariable.md", + }, + ], + "title": "Variables", + }, + ], + "title": "_nestedNamespace", + "url": "03-module.modules_module_1/01-Namespaces/01-namespace.someNameSpace/01-Namespaces/01-namespace.nestedNamespace/index.md", + }, + ], + "title": "Namespaces", + }, + { + "children": [ + { + "children": [ + { + "children": [], + "title": "Enumeration Members", + }, + ], + "title": "NamespaceEnum", + "url": "03-module.modules_module_1/01-Namespaces/01-namespace.someNameSpace/02-Enumerations/01-enumeration.NamespaceEnum.md", + }, + ], + "title": "Enumerations", + }, + { + "children": [ + { + "children": [ + { + "children": [], + "title": "Constructors", + }, + ], + "title": "NameSpaceClassA", + "url": "03-module.modules_module_1/01-Namespaces/01-namespace.someNameSpace/03-Classes/01-class.NameSpaceClassA.md", + }, + ], + "title": "Classes", + }, + { + "children": [ + { + "children": [ + { + "children": [], + "title": "Properties", + }, + ], + "title": "NamespaceInterface", + "url": "03-module.modules_module_1/01-Namespaces/01-namespace.someNameSpace/04-Interfaces/01-interface.NamespaceInterface.md", + }, + ], + "title": "Interfaces", + }, + { + "children": [ + { + "children": [], + "title": "NamespaceTypeLiteral", + "url": "03-module.modules_module_1/01-Namespaces/01-namespace.someNameSpace/05-Type Aliases/01-type-alias.NamespaceTypeLiteral.md", + }, + ], + "title": "Type Aliases", + }, + { + "children": [ + { + "children": [], + "title": "namespaceVariableA", + "url": "03-module.modules_module_1/01-Namespaces/01-namespace.someNameSpace/06-Variables/01-variable.namespaceVariableA.md", + }, + { + "children": [], + "title": "namespaceVariableB", + "url": "03-module.modules_module_1/01-Namespaces/01-namespace.someNameSpace/06-Variables/02-variable.namespaceVariableB.md", + }, + ], + "title": "Variables", + }, + ], + "title": "someNameSpace", + "url": "03-module.modules_module_1/01-Namespaces/01-namespace.someNameSpace/index.md", + }, + { + "children": [], + "title": "someNameSpaceB", + "url": "03-module.modules_module_1/01-Namespaces/02-namespace.someNameSpaceB/index.md", + }, + ], + "title": "Namespaces", + }, + { + "children": [ + { + "children": [ + { + "children": [], + "title": "Enumeration Members", + }, + ], + "title": "Module1EnumA", + "url": "03-module.modules_module_1/02-Enumerations/01-enumeration.Module1EnumA.md", + }, + { + "children": [ + { + "children": [], + "title": "Enumeration Members", + }, + ], + "title": "Module1EnumB", + "url": "03-module.modules_module_1/02-Enumerations/02-enumeration.Module1EnumB.md", + }, + ], + "title": "Enumerations", + }, + { + "children": [ + { + "children": [ + { + "children": [], + "title": "Constructors", + }, + { + "children": [], + "title": "Properties", + }, + { + "children": [], + "title": "Methods", + }, + ], + "title": "Module1ClassA", + "url": "03-module.modules_module_1/03-Classes/01-class.Module1ClassA.md", + }, + { + "children": [ + { + "children": [], + "title": "Constructors", + }, + { + "children": [], + "title": "Properties", + }, + { + "children": [], + "title": "Methods", + }, + ], + "title": "Module1ClassB", + "url": "03-module.modules_module_1/03-Classes/02-class.Module1ClassB.md", + }, + ], + "title": "Classes", + }, + { + "children": [ + { + "children": [ + { + "children": [], + "title": "Properties", + }, + ], + "title": "Module1InterfaceA", + "url": "03-module.modules_module_1/04-Interfaces/01-interface.Module1InterfaceA.md", + }, + { + "children": [ + { + "children": [], + "title": "Properties", + }, + ], + "title": "Module1InterfaceB", + "url": "03-module.modules_module_1/04-Interfaces/02-interface.Module1InterfaceB.md", + }, + ], + "title": "Interfaces", + }, + { + "children": [ + { + "children": [], + "title": "Module1TypeLiteralA", + "url": "03-module.modules_module_1/05-Type Aliases/01-type-alias.Module1TypeLiteralA.md", + }, + { + "children": [], + "title": "Module1TypeLiteralB", + "url": "03-module.modules_module_1/05-Type Aliases/02-type-alias.Module1TypeLiteralB.md", + }, + ], + "title": "Type Aliases", + }, + { + "children": [ + { + "children": [], + "title": "module1VariableA", + "url": "03-module.modules_module_1/06-Variables/01-variable.module1VariableA.md", + }, + { + "children": [], + "title": "module1VariableB", + "url": "03-module.modules_module_1/06-Variables/02-variable.module1VariableB.md", + }, + ], + "title": "Variables", + }, + { + "children": [ + { + "children": [], + "title": "module1FunctionA", + "url": "03-module.modules_module_1/07-Functions/01-function.module1FunctionA.md", + }, + { + "children": [], + "title": "module1FunctionB", + "url": "03-module.modules_module_1/07-Functions/02-function.module1FunctionB.md", + }, + ], + "title": "Functions", + }, + ], + "title": "modules/module-1", + "url": "03-module.modules_module_1/index.md", + }, +] +`; + +exports[`Navigation: (Multiple entrypoints) should get urls (excludeGroups=false, outputFileStrategy=modules, includeFileNumberPrefixes: true) 1`] = ` +[ + { + "children": [ + { + "children": [ + { + "children": [], + "title": "CategoryA", + }, + { + "children": [], + "title": "Other", + }, + ], + "title": "Interfaces", + }, + { + "children": [ + { + "children": [], + "title": "CategoryA", + }, + { + "children": [], + "title": "CategoryB", + }, + { + "children": [], + "title": "Other", + }, + ], + "title": "Variables", + }, + { + "children": [ + { + "children": [], + "title": "CategoryA", + }, + { + "children": [], + "title": "CategoryB", + }, + { + "children": [], + "title": "Other", + }, + ], + "title": "Functions", + }, + ], + "title": "categories", + "url": "02-module.categories.md", + }, + { + "children": [ + { + "children": [ + { + "children": [ + { + "children": [ + { + "children": [ + { + "children": [], + "title": "Variables", + }, + ], + "title": "_nestedNamespace", + "url": "03-module.modules_module_1/01-Namespaces/01-namespace.someNameSpace/01-Namespaces/01-namespace.nestedNamespace.md", + }, + ], + "title": "Namespaces", + }, + { + "children": [], + "title": "Enumerations", + }, + { + "children": [], + "title": "Classes", + }, + { + "children": [], + "title": "Interfaces", + }, + { + "children": [], + "title": "Type Aliases", + }, + { + "children": [], + "title": "Variables", + }, + ], + "title": "someNameSpace", + "url": "03-module.modules_module_1/01-Namespaces/01-namespace.someNameSpace/index.md", + }, + { + "children": [], + "title": "someNameSpaceB", + "url": "03-module.modules_module_1/01-Namespaces/02-namespace.someNameSpaceB.md", + }, + ], + "title": "Namespaces", + }, + { + "children": [], + "title": "Enumerations", + }, + { + "children": [], + "title": "Classes", + }, + { + "children": [], + "title": "Interfaces", + }, + { + "children": [], + "title": "Type Aliases", + }, + { + "children": [], + "title": "Variables", + }, + { + "children": [], + "title": "Functions", + }, + ], + "title": "modules/module-1", + "url": "03-module.modules_module_1/index.md", + }, +] +`; + +exports[`Navigation: (Multiple entrypoints) should get urls (excludeGroups=true, includeFileNumberPrefixes: true) 1`] = ` +[ + { + "children": [ + { + "children": [], + "title": "CategoryInterfaceA1", + "url": "02-module.categories/01-CategoryA/01-interface.CategoryInterfaceA1.md", + }, + { + "children": [], + "title": "CategoryInterfaceA2", + "url": "02-module.categories/01-CategoryA/02-interface.CategoryInterfaceA2.md", + }, + { + "children": [], + "title": "OtherInterfaceA", + "url": "02-module.categories/03-Other/01-interface.OtherInterfaceA.md", + }, + { + "children": undefined, + "title": "categoryVariableA1", + "url": "02-module.categories/01-CategoryA/03-variable.categoryVariableA1.md", + }, + { + "children": undefined, + "title": "categoryVariableA2", + "url": "02-module.categories/01-CategoryA/04-variable.categoryVariableA2.md", + }, + { + "children": undefined, + "title": "categoryVariableB1", + "url": "02-module.categories/02-CategoryB/01-variable.categoryVariableB1.md", + }, + { + "children": undefined, + "title": "otherVariableA", + "url": "02-module.categories/03-Other/02-variable.otherVariableA.md", + }, + { + "children": undefined, + "title": "otherVariableB", + "url": "02-module.categories/03-Other/03-variable.otherVariableB.md", + }, + { + "children": undefined, + "title": "categoryFunctionA1", + "url": "02-module.categories/01-CategoryA/05-function.categoryFunctionA1.md", + }, + { + "children": undefined, + "title": "categoryFunctionA2", + "url": "02-module.categories/01-CategoryA/06-function.categoryFunctionA2.md", + }, + { + "children": undefined, + "title": "categoryFunctionA3", + "url": "02-module.categories/01-CategoryA/07-function.categoryFunctionA3.md", + }, + { + "children": undefined, + "title": "categoryFunctionB2", + "url": "02-module.categories/02-CategoryB/02-function.categoryFunctionB2.md", + }, + { + "children": undefined, + "title": "otherFunctionA", + "url": "02-module.categories/03-Other/04-function.otherFunctionA.md", + }, + { + "children": undefined, + "title": "otherFunctionB", + "url": "02-module.categories/03-Other/05-function.otherFunctionB.md", + }, + ], + "title": "categories", + "url": "02-module.categories/index.md", + }, + { + "children": [ + { + "children": [ + { + "children": [ + { + "children": undefined, + "title": "nestedNamespaceVariable", + "url": "03-module.modules_module_1/01-someNameSpace/01-nestedNamespace/01-variable.nestedNamespaceVariable.md", + }, + ], + "title": "_nestedNamespace", + "url": "03-module.modules_module_1/01-someNameSpace/01-nestedNamespace/index.md", + }, + { + "children": [], + "title": "NamespaceEnum", + "url": "03-module.modules_module_1/01-someNameSpace/02-enumeration.NamespaceEnum.md", + }, + { + "children": [], + "title": "NameSpaceClassA", + "url": "03-module.modules_module_1/01-someNameSpace/03-class.NameSpaceClassA.md", + }, + { + "children": [], + "title": "NamespaceInterface", + "url": "03-module.modules_module_1/01-someNameSpace/04-interface.NamespaceInterface.md", + }, + { + "children": undefined, + "title": "NamespaceTypeLiteral", + "url": "03-module.modules_module_1/01-someNameSpace/05-type-alias.NamespaceTypeLiteral.md", + }, + { + "children": undefined, + "title": "namespaceVariableA", + "url": "03-module.modules_module_1/01-someNameSpace/06-variable.namespaceVariableA.md", + }, + { + "children": undefined, + "title": "namespaceVariableB", + "url": "03-module.modules_module_1/01-someNameSpace/07-variable.namespaceVariableB.md", + }, + ], + "title": "someNameSpace", + "url": "03-module.modules_module_1/01-someNameSpace/index.md", + }, + { + "children": undefined, + "title": "someNameSpaceB", + "url": "03-module.modules_module_1/02-someNameSpaceB/index.md", + }, + { + "children": [], + "title": "Module1EnumA", + "url": "03-module.modules_module_1/03-enumeration.Module1EnumA.md", + }, + { + "children": [], + "title": "Module1EnumB", + "url": "03-module.modules_module_1/04-enumeration.Module1EnumB.md", + }, + { + "children": [], + "title": "Module1ClassA", + "url": "03-module.modules_module_1/05-class.Module1ClassA.md", + }, + { + "children": [], + "title": "Module1ClassB", + "url": "03-module.modules_module_1/06-class.Module1ClassB.md", + }, + { + "children": [], + "title": "Module1InterfaceA", + "url": "03-module.modules_module_1/07-interface.Module1InterfaceA.md", + }, + { + "children": [], + "title": "Module1InterfaceB", + "url": "03-module.modules_module_1/08-interface.Module1InterfaceB.md", + }, + { + "children": undefined, + "title": "Module1TypeLiteralA", + "url": "03-module.modules_module_1/09-type-alias.Module1TypeLiteralA.md", + }, + { + "children": undefined, + "title": "Module1TypeLiteralB", + "url": "03-module.modules_module_1/10-type-alias.Module1TypeLiteralB.md", + }, + { + "children": undefined, + "title": "module1VariableA", + "url": "03-module.modules_module_1/11-variable.module1VariableA.md", + }, + { + "children": undefined, + "title": "module1VariableB", + "url": "03-module.modules_module_1/12-variable.module1VariableB.md", + }, + { + "children": undefined, + "title": "module1FunctionA", + "url": "03-module.modules_module_1/13-function.module1FunctionA.md", + }, + { + "children": undefined, + "title": "module1FunctionB", + "url": "03-module.modules_module_1/14-function.module1FunctionB.md", + }, + ], + "title": "modules/module-1", + "url": "03-module.modules_module_1/index.md", + }, +] +`; + +exports[`Navigation: (Multiple entrypoints) should get urls (excludeGroups=true, outputFileStrategy=modules, includeFileNumberPrefixes: true, readme=none) 1`] = ` +[ + { + "children": [], + "title": "categories", + "url": "01-module.categories.md", + }, + { + "children": [ + { + "children": [ + { + "children": [], + "title": "_nestedNamespace", + "url": "02-module.modules_module_1/01-someNameSpace/01-nestedNamespace.md", + }, + ], + "title": "someNameSpace", + "url": "02-module.modules_module_1/01-someNameSpace/index.md", + }, + { + "children": undefined, + "title": "someNameSpaceB", + "url": "02-module.modules_module_1/02-someNameSpaceB.md", + }, + ], + "title": "modules/module-1", + "url": "02-module.modules_module_1/index.md", + }, +] +`; + +exports[`Navigation: (Single entrypoint) should get urls (excludeGroups=false, includeFileNumberPrefixes=true) 1`] = ` +[ + { + "children": [ + { + "children": [], + "title": "Properties", + }, + ], + "title": "CategoryInterfaceA1", + "url": "02-Interfaces/02-interface.CategoryInterfaceA1.md", + }, + { + "children": [ + { + "children": [], + "title": "Properties", + }, + ], + "title": "CategoryInterfaceA2", + "url": "02-Interfaces/03-interface.CategoryInterfaceA2.md", + }, + { + "children": [ + { + "children": [], + "title": "Properties", + }, + ], + "title": "OtherInterfaceA", + "url": "02-Interfaces/04-interface.OtherInterfaceA.md", + }, + { + "children": [], + "title": "categoryVariableA1", + "url": "03-Variables/02-variable.categoryVariableA1.md", + }, + { + "children": [], + "title": "categoryVariableA2", + "url": "03-Variables/03-variable.categoryVariableA2.md", + }, + { + "children": [], + "title": "categoryVariableB1", + "url": "03-Variables/04-variable.categoryVariableB1.md", + }, + { + "children": [], + "title": "otherVariableA", + "url": "03-Variables/05-variable.otherVariableA.md", + }, + { + "children": [], + "title": "otherVariableB", + "url": "03-Variables/06-variable.otherVariableB.md", + }, + { + "children": [], + "title": "categoryFunctionA1", + "url": "04-Functions/02-function.categoryFunctionA1.md", + }, + { + "children": [], + "title": "categoryFunctionA2", + "url": "04-Functions/03-function.categoryFunctionA2.md", + }, + { + "children": [], + "title": "categoryFunctionA3", + "url": "04-Functions/04-function.categoryFunctionA3.md", + }, + { + "children": [], + "title": "categoryFunctionB2", + "url": "04-Functions/05-function.categoryFunctionB2.md", + }, + { + "children": [], + "title": "otherFunctionA", + "url": "04-Functions/06-function.otherFunctionA.md", + }, + { + "children": [], + "title": "otherFunctionB", + "url": "04-Functions/07-function.otherFunctionB.md", + }, + { + "children": [ + { + "children": [], + "title": "Properties", + }, + ], + "title": "CategoryInterfaceA1", + "url": "02-Interfaces/02-interface.CategoryInterfaceA1.md", + }, + { + "children": [ + { + "children": [], + "title": "Properties", + }, + ], + "title": "CategoryInterfaceA2", + "url": "02-Interfaces/03-interface.CategoryInterfaceA2.md", + }, + { + "children": [ + { + "children": [], + "title": "Properties", + }, + ], + "title": "OtherInterfaceA", + "url": "02-Interfaces/04-interface.OtherInterfaceA.md", + }, + { + "children": [], + "title": "categoryVariableA1", + "url": "03-Variables/02-variable.categoryVariableA1.md", + }, + { + "children": [], + "title": "categoryVariableA2", + "url": "03-Variables/03-variable.categoryVariableA2.md", + }, + { + "children": [], + "title": "categoryVariableB1", + "url": "03-Variables/04-variable.categoryVariableB1.md", + }, + { + "children": [], + "title": "otherVariableA", + "url": "03-Variables/05-variable.otherVariableA.md", + }, + { + "children": [], + "title": "otherVariableB", + "url": "03-Variables/06-variable.otherVariableB.md", + }, + { + "children": [], + "title": "categoryFunctionA1", + "url": "04-Functions/02-function.categoryFunctionA1.md", + }, + { + "children": [], + "title": "categoryFunctionA2", + "url": "04-Functions/03-function.categoryFunctionA2.md", + }, + { + "children": [], + "title": "categoryFunctionA3", + "url": "04-Functions/04-function.categoryFunctionA3.md", + }, + { + "children": [], + "title": "categoryFunctionB2", + "url": "04-Functions/05-function.categoryFunctionB2.md", + }, + { + "children": [], + "title": "otherFunctionA", + "url": "04-Functions/06-function.otherFunctionA.md", + }, + { + "children": [], + "title": "otherFunctionB", + "url": "04-Functions/07-function.otherFunctionB.md", + }, + { + "children": [ + { + "children": [], + "title": "Properties", + }, + ], + "title": "CategoryInterfaceA1", + "url": "02-Interfaces/02-interface.CategoryInterfaceA1.md", + }, + { + "children": [ + { + "children": [], + "title": "Properties", + }, + ], + "title": "CategoryInterfaceA2", + "url": "02-Interfaces/03-interface.CategoryInterfaceA2.md", + }, + { + "children": [ + { + "children": [], + "title": "Properties", + }, + ], + "title": "OtherInterfaceA", + "url": "02-Interfaces/04-interface.OtherInterfaceA.md", + }, + { + "children": [], + "title": "categoryVariableA1", + "url": "03-Variables/02-variable.categoryVariableA1.md", + }, + { + "children": [], + "title": "categoryVariableA2", + "url": "03-Variables/03-variable.categoryVariableA2.md", + }, + { + "children": [], + "title": "categoryVariableB1", + "url": "03-Variables/04-variable.categoryVariableB1.md", + }, + { + "children": [], + "title": "otherVariableA", + "url": "03-Variables/05-variable.otherVariableA.md", + }, + { + "children": [], + "title": "otherVariableB", + "url": "03-Variables/06-variable.otherVariableB.md", + }, + { + "children": [], + "title": "categoryFunctionA1", + "url": "04-Functions/02-function.categoryFunctionA1.md", + }, + { + "children": [], + "title": "categoryFunctionA2", + "url": "04-Functions/03-function.categoryFunctionA2.md", + }, + { + "children": [], + "title": "categoryFunctionA3", + "url": "04-Functions/04-function.categoryFunctionA3.md", + }, + { + "children": [], + "title": "categoryFunctionB2", + "url": "04-Functions/05-function.categoryFunctionB2.md", + }, + { + "children": [], + "title": "otherFunctionA", + "url": "04-Functions/06-function.otherFunctionA.md", + }, + { + "children": [], + "title": "otherFunctionB", + "url": "04-Functions/07-function.otherFunctionB.md", + }, +] +`; + +exports[`Navigation: (Single entrypoint) should get urls (excludeGroups=true, includeFileNumberPrefixes=true, readme=none) 1`] = ` +[ + { + "children": [], + "title": "CategoryInterfaceA1", + "url": "01-interface.CategoryInterfaceA1.md", + }, + { + "children": [], + "title": "CategoryInterfaceA2", + "url": "02-interface.CategoryInterfaceA2.md", + }, + { + "children": [], + "title": "OtherInterfaceA", + "url": "03-interface.OtherInterfaceA.md", + }, + { + "children": [], + "title": "categoryVariableA1", + "url": "04-variable.categoryVariableA1.md", + }, + { + "children": [], + "title": "categoryVariableA2", + "url": "05-variable.categoryVariableA2.md", + }, + { + "children": [], + "title": "categoryVariableB1", + "url": "06-variable.categoryVariableB1.md", + }, + { + "children": [], + "title": "otherVariableA", + "url": "07-variable.otherVariableA.md", + }, + { + "children": [], + "title": "otherVariableB", + "url": "08-variable.otherVariableB.md", + }, + { + "children": [], + "title": "categoryFunctionA1", + "url": "09-function.categoryFunctionA1.md", + }, + { + "children": [], + "title": "categoryFunctionA2", + "url": "10-function.categoryFunctionA2.md", + }, + { + "children": [], + "title": "categoryFunctionA3", + "url": "11-function.categoryFunctionA3.md", + }, + { + "children": [], + "title": "categoryFunctionB2", + "url": "12-function.categoryFunctionB2.md", + }, + { + "children": [], + "title": "otherFunctionA", + "url": "13-function.otherFunctionA.md", + }, + { + "children": [], + "title": "otherFunctionB", + "url": "14-function.otherFunctionB.md", + }, + { + "children": [], + "title": "CategoryInterfaceA1", + "url": "01-interface.CategoryInterfaceA1.md", + }, + { + "children": [], + "title": "CategoryInterfaceA2", + "url": "02-interface.CategoryInterfaceA2.md", + }, + { + "children": [], + "title": "OtherInterfaceA", + "url": "03-interface.OtherInterfaceA.md", + }, + { + "children": [], + "title": "categoryVariableA1", + "url": "04-variable.categoryVariableA1.md", + }, + { + "children": [], + "title": "categoryVariableA2", + "url": "05-variable.categoryVariableA2.md", + }, + { + "children": [], + "title": "categoryVariableB1", + "url": "06-variable.categoryVariableB1.md", + }, + { + "children": [], + "title": "otherVariableA", + "url": "07-variable.otherVariableA.md", + }, + { + "children": [], + "title": "otherVariableB", + "url": "08-variable.otherVariableB.md", + }, + { + "children": [], + "title": "categoryFunctionA1", + "url": "09-function.categoryFunctionA1.md", + }, + { + "children": [], + "title": "categoryFunctionA2", + "url": "10-function.categoryFunctionA2.md", + }, + { + "children": [], + "title": "categoryFunctionA3", + "url": "11-function.categoryFunctionA3.md", + }, + { + "children": [], + "title": "categoryFunctionB2", + "url": "12-function.categoryFunctionB2.md", + }, + { + "children": [], + "title": "otherFunctionA", + "url": "13-function.otherFunctionA.md", + }, + { + "children": [], + "title": "otherFunctionB", + "url": "14-function.otherFunctionB.md", + }, + { + "children": [], + "title": "CategoryInterfaceA1", + "url": "01-interface.CategoryInterfaceA1.md", + }, + { + "children": [], + "title": "CategoryInterfaceA2", + "url": "02-interface.CategoryInterfaceA2.md", + }, + { + "children": [], + "title": "OtherInterfaceA", + "url": "03-interface.OtherInterfaceA.md", + }, + { + "children": [], + "title": "categoryVariableA1", + "url": "04-variable.categoryVariableA1.md", + }, + { + "children": [], + "title": "categoryVariableA2", + "url": "05-variable.categoryVariableA2.md", + }, + { + "children": [], + "title": "categoryVariableB1", + "url": "06-variable.categoryVariableB1.md", + }, + { + "children": [], + "title": "otherVariableA", + "url": "07-variable.otherVariableA.md", + }, + { + "children": [], + "title": "otherVariableB", + "url": "08-variable.otherVariableB.md", + }, + { + "children": [], + "title": "categoryFunctionA1", + "url": "09-function.categoryFunctionA1.md", + }, + { + "children": [], + "title": "categoryFunctionA2", + "url": "10-function.categoryFunctionA2.md", + }, + { + "children": [], + "title": "categoryFunctionA3", + "url": "11-function.categoryFunctionA3.md", + }, + { + "children": [], + "title": "categoryFunctionB2", + "url": "12-function.categoryFunctionB2.md", + }, + { + "children": [], + "title": "otherFunctionA", + "url": "13-function.otherFunctionA.md", + }, + { + "children": [], + "title": "otherFunctionB", + "url": "14-function.otherFunctionB.md", + }, +] +`; diff --git a/tools/typedoc-plugin-markdown/test/specs/__snapshots__/signatures.spec.ts.snap b/tools/typedoc-plugin-markdown/test/specs/__snapshots__/signatures.spec.ts.snap new file mode 100644 index 00000000..364fef6c --- /dev/null +++ b/tools/typedoc-plugin-markdown/test/specs/__snapshots__/signatures.spec.ts.snap @@ -0,0 +1,403 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Signatures: should compile a promise that returns a symbol' 1`] = ` +"> **promiseReturningASymbol**(): [\`Promise\`]( https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise )\\<\`any\`\\> + +[partial: sources] + +## Returns + +[\`Promise\`]( https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise )\\<\`any\`\\> + +" +`; + +exports[`Signatures: should compile a promise that returns an object' 1`] = ` +"> **promiseReturningAnObject**(): [\`Promise\`]( https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise )\\<\\{data: \`string\`; id: \`string\`;}\\> + +[partial: sources] + +## Returns + +[\`Promise\`]( https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise )\\<\\{data: \`string\`; id: \`string\`;}\\> + +" +`; + +exports[`Signatures: should compile callable signature' 1`] = ` +"> **CallableSignature**(): \`string\` + +[partial: sources] + +## Returns + +\`string\` + +" +`; + +exports[`Signatures: should compile class with constructor' 1`] = ` +"> **new ClassWithConstructor**(x: \`string\`, y: \`string\`): [\`ClassWithConstructor\`](classes/class.ClassWithConstructor.md) + +[partial: sources] + +## Parameters + + +| Parameter | Type | +| :------ | :------ | +| x | \`string\` | +| y | \`string\` | + + +## Returns + +[\`ClassWithConstructor\`](classes/class.ClassWithConstructor.md) + +" +`; + +exports[`Signatures: should compile function that returns a function' 1`] = ` +"> **functionReturningAFunction**(): \`Function\` + +Comments for function + + + +[partial: sources] + +## Returns + +\`Function\` + +Return comments + +> > \\(x: \`string\`): \`boolean\` +> +> [partial: sources] +> +> ### Type parameters +> +> +> | Parameter | +> | :------ | +> | T | +> +> +> ### Parameters +> +> +> | Parameter | Type | +> | :------ | :------ | +> | x | \`string\` | +> +> +> ### Returns +> +> \`boolean\` +> +> + +" +`; + +exports[`Signatures: should compile function that returns an object' 1`] = ` +"> **functionReturningAnObject**(): \`object\` + +Comments for function + + + +[partial: sources] + +## Returns + +\`object\` + +Return comments + +> **x**: \`number\` = \`1\` + +[partial: sources] + + +> **y**: \`number\` = \`2\` + +[partial: sources] + + + +" +`; + +exports[`Signatures: should compile function with nested typen params' 1`] = ` +"> **functionWithNestedParams**(params: \`object\`, context: \`any\`): \`boolean\` + +Some nested params. + +[partial: sources] + +## Parameters + + +| Parameter | Type | Description | +| :------ | :------ | :------ | +| params | \`object\` | The parameters passed to the method. | +| context | \`any\` | The context of the method call. | + + +## Returns + +\`boolean\` + +" +`; + +exports[`Signatures: should compile function with reference type' 1`] = ` +"> **functionWithReferenceType**(descriptor: \`TypedPropertyDescriptor\`\\<\`any\`\\>): \`boolean\` + +[partial: sources] + +## Parameters + + +| Parameter | Type | +| :------ | :------ | +| descriptor | \`TypedPropertyDescriptor\`\\<\`any\`\\> | + + +## Returns + +\`boolean\` + +" +`; + +exports[`Signatures: should compile named parameters with comments' 1`] = ` +"> **functionWithNamedParamsAndComments**(\\_\\_namedParameters: \`object\` = \`{}\`, anotherParam: \`string\`): \`void\` + +FOO + +[partial: sources] + +## Parameters + + +| Parameter | Type | Description | +| :------ | :------ | :------ | +| \\_\\_namedParameters | \`object\` | various options | +| anotherParam | \`string\` | Another param comment | + + +## Returns + +\`void\` + +" +`; + +exports[`Signatures: should compile named parameters' 1`] = ` +"> **functionWithNamedParams**(\\_\\_namedParameters: \`Object\`): \`string\` + +[partial: sources] + +## Parameters + + +| Parameter | Type | +| :------ | :------ | +| \\_\\_namedParameters | \`Object\` | + + +## Returns + +\`string\` + +" +`; + +exports[`Signatures: should compile pipes in params and comments' 1`] = ` +"> **functionWithPipesInParamsAndComments**(n: \`number\`): \`number\` \\| \`null\` + + + +[partial: sources] + +## Parameters + + +| Parameter | Type | Description | +| :------ | :------ | :------ | +| n | \`number\` | a\\|b | + + +## Returns + +\`number\` \\| \`null\` + +" +`; + +exports[`Signatures: should compile signature with @return comments' 1`] = ` +"> **commentsInReturn**(): \`boolean\` + +Comments with a return definition + + + +[partial: sources] + +## Returns + +\`boolean\` + +Return comments + +" +`; + +exports[`Signatures: should compile signature with a flag' 1`] = ` +"> \`Private\` **privateFunction**(): \`string\` + + + +[partial: sources] + +## Returns + +\`string\` + +" +`; + +exports[`Signatures: should compile signature with default values' 1`] = ` +"> **functionWithDefaults**( + valueA: \`string\` = \`'defaultValue'\`, + valueB: \`number\` = \`100\`, + valueC: \`number\` = \`Number.NaN\`, + valueD: \`boolean\` = \`true\`, + valueE: \`boolean\` = \`null\`, + valueF: \`string\` = \`''\`): \`string\` + +This is a function with a parameter that has a default value. + +[partial: sources] + +## Parameters + + +| Parameter | Type | Default value | Description | +| :------ | :------ | :------ | :------ | +| valueA | \`string\` | 'defaultValue' | A parameter with a default string value. | +| valueB | \`number\` | 100 | A parameter with a default numeric value. | +| valueC | \`number\` | Number.NaN | A parameter with a default NaN value. | +| valueD | \`boolean\` | true | A parameter with a default boolean value. | +| valueE | \`boolean\` | null | A parameter with a default null value. | +| valueF | \`string\` | '\\' | - | + + +## Returns + +\`string\` + +" +`; + +exports[`Signatures: should compile signature with optional params' 1`] = ` +"> **functionWithOptionalParam**( + firstParamWithDefault: \`boolean\` = \`true\`, + requiredParam: \`string\`, + optionalParam?: \`string\`, + paramWithDefault?: \`number\` = \`0\`): \`void\` + +This is a function with a parameter that is optional. + +[partial: sources] + +## Parameters + + +| Parameter | Type | Default value | Description | +| :------ | :------ | :------ | :------ | +| firstParamWithDefault | \`boolean\` | true | - | +| requiredParam | \`string\` | undefined | A normal parameter. | +| optionalParam? | \`string\` | undefined | An optional parameter. | +| paramWithDefault? | \`number\` | 0 | - | + + +## Returns + +\`void\` + +" +`; + +exports[`Signatures: should compile signature with params' 1`] = ` +"> **functionWithParameters**( + paramZ: \`string\`, + paramG: \\{prop: \`string\`;} & \\{prop: \`number\`;}, + paramA: [\`PropInterface\`](interfaces/interface.PropInterface.md)): \`number\` + +This is a function with multiple arguments and a return value. + +[partial: sources] + +## Parameters + + +| Parameter | Type | Description | +| :------ | :------ | :------ | +| paramZ | \`string\` | This is a string parameter. | +| paramG | \\{prop: \`string\`;} & \\{prop: \`number\`;} | This is a parameter with intersection type literal. | +| paramA | [\`PropInterface\`](interfaces/interface.PropInterface.md) | This is a **parameter** pointing to an interface. | + + +## Returns + +\`number\` + +" +`; + +exports[`Signatures: should compile signature with rest params' 1`] = ` +"> **functionWithRest**(...rest: \`string\`[]): \`string\` + +This is a function with rest parameter. + +[partial: sources] + +## Parameters + + +| Parameter | Type | Description | +| :------ | :------ | :------ | +| ...rest | \`string\`[] | The rest parameter. | + + +## Returns + +\`string\` + +" +`; + +exports[`Signatures: should compile signature with union types' 1`] = ` +"> **functionWithUnionTypes**(arg: \`number\` \\| \`boolean\`[], ...args: (\`string\` \\| \`number\`)[]): \`any\` + +[partial: sources] + +## Parameters + + +| Parameter | Type | +| :------ | :------ | +| arg | \`number\` \\| \`boolean\`[] | +| ...args | (\`string\` \\| \`number\`)[] | + + +## Returns + +\`any\` + +" +`; diff --git a/tools/typedoc-plugin-markdown/test/specs/__snapshots__/types.spec.ts.snap b/tools/typedoc-plugin-markdown/test/specs/__snapshots__/types.spec.ts.snap new file mode 100644 index 00000000..7ec46253 --- /dev/null +++ b/tools/typedoc-plugin-markdown/test/specs/__snapshots__/types.spec.ts.snap @@ -0,0 +1,37 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Types: should compile 'array' type' 1`] = `"\`string\`[]"`; + +exports[`Types: should compile 'intersection' type' 1`] = `"[\`IntersectionClassA\`](classes/class.IntersectionClassA.md) & [\`IntersectionClassB\`](classes/class.IntersectionClassB.md)"`; + +exports[`Types: should compile 'stringLiteral' type' 1`] = `""blue""`; + +exports[`Types: should compile 'tuple' type' 1`] = `"[\`string\`, \`number\`]"`; + +exports[`Types: should compile 'typeOperator' type ' 1`] = `"*unique* \`symbol\`"`; + +exports[`Types: should compile 'union' of literal declarations 1`] = `"\\{bar: " " \\| "string" \\| "strong\\|with\\|pipes" \\| "type\\\`with\\\`backticks" \\| "\\" \\| "*";}"`; + +exports[`Types: should compile 'union' of string literals types' 1`] = `""ease-in" \\| "ease-out""`; + +exports[`Types: should compile collapsed 'function' type ' 1`] = `""`; + +exports[`Types: should compile collapsed 'literal' type' 1`] = `"\`object\`"`; + +exports[`Types: should compile collapsed 'objectLiteralType' type' 1`] = `"\`object\`"`; + +exports[`Types: should compile conditional type ' 1`] = `"\`T\` *extends* \`string\` ? "string" : \`T\` *extends* \`number\` ? "number" : \`T\` *extends* \`boolean\` ? "boolean" : \`T\` *extends* \`undefined\` ? "undefined" : "object""`; + +exports[`Types: should compile expanded 'function' type ' 1`] = `""`; + +exports[`Types: should compile expanded 'literal' type' 1`] = `"\\{valueA: \`number\`; valueB: \`boolean\`; valueX: \\{valueA: \`number\`[]; valueY: (z: \`string\`) => \\{a: \`string\`; b: \`string\`;}; valueZ: \`string\`;}; valueY: () => \`string\`; valueZ: \`string\`;}"`; + +exports[`Types: should compile expanded 'objectLiteralType' type' 1`] = `"\\{}"`; + +exports[`Types: should compile intrinsic type' 1`] = `"\`string\`"`; + +exports[`Types: should compile unionType with object literal type ' 1`] = `"\`string\` \\| \\{z: \`string\`;}"`; + +exports[`Types: should resolve external refs with type params' 1`] = `"\`ClassWithTypeParams\`\\<[\`HTMLElement\`]( https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement ), [\`Error\`]( https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error )\\>"`; + +exports[`Types: should resolve external refs' 1`] = `"[\`HTMLElement\`]( https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement )"`; diff --git a/tools/typedoc-plugin-markdown/test/specs/__snapshots__/urls.spec.ts.snap b/tools/typedoc-plugin-markdown/test/specs/__snapshots__/urls.spec.ts.snap new file mode 100644 index 00000000..7d620e7b --- /dev/null +++ b/tools/typedoc-plugin-markdown/test/specs/__snapshots__/urls.spec.ts.snap @@ -0,0 +1,282 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Urls: (Monorepo) should get urls (entryPointStrategy=packages) 1`] = ` +[ + "README.md", + "exports.md", + "child-package/README.md", + "child-package/index.md", + "child-package/namespaces/namespace.Validation/index.md", + "child-package/namespaces/namespace.Validation/variables/variable.numberRegexp.md", + "child-package/variables/variable.hello.md", + "child-package-2/index.md", + "child-package-2/variables/variable.hello-1.md", +] +`; + +exports[`Urls: (Monorepo) should get urls (entryPointStrategy=packages, includeFileNumberPrefixes=true) 1`] = ` +[ + "README.md", + "01-exports.md", + "02-child-package/README.md", + "02-child-package/01-index.md", + "02-child-package/02-Namespaces/02-namespace.Validation/index.md", + "02-child-package/02-Namespaces/02-namespace.Validation/01-Variables/01-variable.numberRegexp.md", + "02-child-package/03-Variables/02-variable.hello.md", + "03-child-package-2/index.md", + "03-child-package-2/01-Variables/01-variable.hello-1.md", +] +`; + +exports[`Urls: (Multiple entrypoints) should get urls (excludeGroups=false) 1`] = ` +[ + "README.md", + "modules.md", + "module.categories/index.md", + "module.categories/interfaces/CategoryA/interface.CategoryInterfaceA1.md", + "module.categories/interfaces/CategoryA/interface.CategoryInterfaceA2.md", + "module.categories/interfaces/Other/interface.OtherInterfaceA.md", + "module.categories/variables/CategoryA/variable.categoryVariableA1.md", + "module.categories/variables/CategoryA/variable.categoryVariableA2.md", + "module.categories/variables/CategoryB/variable.categoryVariableB1.md", + "module.categories/variables/Other/variable.otherVariableA.md", + "module.categories/variables/Other/variable.otherVariableB.md", + "module.categories/functions/CategoryA/function.categoryFunctionA1.md", + "module.categories/functions/CategoryA/function.categoryFunctionA2.md", + "module.categories/functions/CategoryA/function.categoryFunctionA3.md", + "module.categories/functions/CategoryB/function.categoryFunctionB2.md", + "module.categories/functions/Other/function.otherFunctionA.md", + "module.categories/functions/Other/function.otherFunctionB.md", + "module.modules_module_1/index.md", + "module.modules_module_1/namespaces/namespace.someNameSpace/index.md", + "module.modules_module_1/namespaces/namespace.someNameSpace/namespaces/namespace.nestedNamespace/index.md", + "module.modules_module_1/namespaces/namespace.someNameSpace/namespaces/namespace.nestedNamespace/variables/variable.nestedNamespaceVariable.md", + "module.modules_module_1/namespaces/namespace.someNameSpace/enumerations/enumeration.NamespaceEnum.md", + "module.modules_module_1/namespaces/namespace.someNameSpace/classes/class.NameSpaceClassA.md", + "module.modules_module_1/namespaces/namespace.someNameSpace/interfaces/interface.NamespaceInterface.md", + "module.modules_module_1/namespaces/namespace.someNameSpace/type-aliases/type-alias.NamespaceTypeLiteral.md", + "module.modules_module_1/namespaces/namespace.someNameSpace/variables/variable.namespaceVariableA.md", + "module.modules_module_1/namespaces/namespace.someNameSpace/variables/variable.namespaceVariableB.md", + "module.modules_module_1/namespaces/namespace.someNameSpaceB/index.md", + "module.modules_module_1/enumerations/enumeration.Module1EnumA.md", + "module.modules_module_1/enumerations/enumeration.Module1EnumB.md", + "module.modules_module_1/classes/class.Module1ClassA.md", + "module.modules_module_1/classes/class.Module1ClassB.md", + "module.modules_module_1/interfaces/interface.Module1InterfaceA.md", + "module.modules_module_1/interfaces/interface.Module1InterfaceB.md", + "module.modules_module_1/type-aliases/type-alias.Module1TypeLiteralA.md", + "module.modules_module_1/type-aliases/type-alias.Module1TypeLiteralB.md", + "module.modules_module_1/variables/variable.module1VariableA.md", + "module.modules_module_1/variables/variable.module1VariableB.md", + "module.modules_module_1/functions/function.module1FunctionA.md", + "module.modules_module_1/functions/function.module1FunctionB.md", +] +`; + +exports[`Urls: (Multiple entrypoints) should get urls (excludeGroups=false, includeFileNumberPrefixes: true) 1`] = ` +[ + "README.md", + "01-modules.md", + "02-module.categories/index.md", + "02-module.categories/01-Interfaces/01-CategoryA/01-interface.CategoryInterfaceA1.md", + "02-module.categories/01-Interfaces/01-CategoryA/02-interface.CategoryInterfaceA2.md", + "02-module.categories/01-Interfaces/02-Other/01-interface.OtherInterfaceA.md", + "02-module.categories/02-Variables/01-CategoryA/01-variable.categoryVariableA1.md", + "02-module.categories/02-Variables/01-CategoryA/02-variable.categoryVariableA2.md", + "02-module.categories/02-Variables/02-CategoryB/01-variable.categoryVariableB1.md", + "02-module.categories/02-Variables/03-Other/01-variable.otherVariableA.md", + "02-module.categories/02-Variables/03-Other/02-variable.otherVariableB.md", + "02-module.categories/03-Functions/01-CategoryA/01-function.categoryFunctionA1.md", + "02-module.categories/03-Functions/01-CategoryA/02-function.categoryFunctionA2.md", + "02-module.categories/03-Functions/01-CategoryA/03-function.categoryFunctionA3.md", + "02-module.categories/03-Functions/02-CategoryB/01-function.categoryFunctionB2.md", + "02-module.categories/03-Functions/03-Other/01-function.otherFunctionA.md", + "02-module.categories/03-Functions/03-Other/02-function.otherFunctionB.md", + "03-module.modules_module_1/index.md", + "03-module.modules_module_1/01-Namespaces/01-namespace.someNameSpace/index.md", + "03-module.modules_module_1/01-Namespaces/01-namespace.someNameSpace/01-Namespaces/01-namespace.nestedNamespace/index.md", + "03-module.modules_module_1/01-Namespaces/01-namespace.someNameSpace/01-Namespaces/01-namespace.nestedNamespace/01-Variables/01-variable.nestedNamespaceVariable.md", + "03-module.modules_module_1/01-Namespaces/01-namespace.someNameSpace/02-Enumerations/01-enumeration.NamespaceEnum.md", + "03-module.modules_module_1/01-Namespaces/01-namespace.someNameSpace/03-Classes/01-class.NameSpaceClassA.md", + "03-module.modules_module_1/01-Namespaces/01-namespace.someNameSpace/04-Interfaces/01-interface.NamespaceInterface.md", + "03-module.modules_module_1/01-Namespaces/01-namespace.someNameSpace/05-Type Aliases/01-type-alias.NamespaceTypeLiteral.md", + "03-module.modules_module_1/01-Namespaces/01-namespace.someNameSpace/06-Variables/01-variable.namespaceVariableA.md", + "03-module.modules_module_1/01-Namespaces/01-namespace.someNameSpace/06-Variables/02-variable.namespaceVariableB.md", + "03-module.modules_module_1/01-Namespaces/02-namespace.someNameSpaceB/index.md", + "03-module.modules_module_1/02-Enumerations/01-enumeration.Module1EnumA.md", + "03-module.modules_module_1/02-Enumerations/02-enumeration.Module1EnumB.md", + "03-module.modules_module_1/03-Classes/01-class.Module1ClassA.md", + "03-module.modules_module_1/03-Classes/02-class.Module1ClassB.md", + "03-module.modules_module_1/04-Interfaces/01-interface.Module1InterfaceA.md", + "03-module.modules_module_1/04-Interfaces/02-interface.Module1InterfaceB.md", + "03-module.modules_module_1/05-Type Aliases/01-type-alias.Module1TypeLiteralA.md", + "03-module.modules_module_1/05-Type Aliases/02-type-alias.Module1TypeLiteralB.md", + "03-module.modules_module_1/06-Variables/01-variable.module1VariableA.md", + "03-module.modules_module_1/06-Variables/02-variable.module1VariableB.md", + "03-module.modules_module_1/07-Functions/01-function.module1FunctionA.md", + "03-module.modules_module_1/07-Functions/02-function.module1FunctionB.md", +] +`; + +exports[`Urls: (Multiple entrypoints) should get urls (excludeGroups=false, outputFileStrategy=modules, includeFileNumberPrefixes: true) 1`] = ` +[ + "README.md", + "01-modules.md", + "02-module.categories.md", + "03-module.modules_module_1/index.md", + "03-module.modules_module_1/01-Namespaces/01-namespace.someNameSpace/index.md", + "03-module.modules_module_1/01-Namespaces/01-namespace.someNameSpace/01-Namespaces/01-namespace.nestedNamespace.md", + "03-module.modules_module_1/01-Namespaces/02-namespace.someNameSpaceB.md", +] +`; + +exports[`Urls: (Multiple entrypoints) should get urls (excludeGroups=true, includeFileNumberPrefixes: true) 1`] = ` +[ + "README.md", + "01-modules.md", + "02-module.categories/index.md", + "02-module.categories/01-CategoryA/01-interface.CategoryInterfaceA1.md", + "02-module.categories/01-CategoryA/02-interface.CategoryInterfaceA2.md", + "02-module.categories/01-CategoryA/03-variable.categoryVariableA1.md", + "02-module.categories/01-CategoryA/04-variable.categoryVariableA2.md", + "02-module.categories/01-CategoryA/05-function.categoryFunctionA1.md", + "02-module.categories/01-CategoryA/06-function.categoryFunctionA2.md", + "02-module.categories/01-CategoryA/07-function.categoryFunctionA3.md", + "02-module.categories/02-CategoryB/01-variable.categoryVariableB1.md", + "02-module.categories/02-CategoryB/02-function.categoryFunctionB2.md", + "02-module.categories/03-Other/01-interface.OtherInterfaceA.md", + "02-module.categories/03-Other/02-variable.otherVariableA.md", + "02-module.categories/03-Other/03-variable.otherVariableB.md", + "02-module.categories/03-Other/04-function.otherFunctionA.md", + "02-module.categories/03-Other/05-function.otherFunctionB.md", + "03-module.modules_module_1/index.md", + "03-module.modules_module_1/01-someNameSpace/index.md", + "03-module.modules_module_1/01-someNameSpace/01-nestedNamespace/index.md", + "03-module.modules_module_1/01-someNameSpace/01-nestedNamespace/01-variable.nestedNamespaceVariable.md", + "03-module.modules_module_1/01-someNameSpace/02-enumeration.NamespaceEnum.md", + "03-module.modules_module_1/01-someNameSpace/03-class.NameSpaceClassA.md", + "03-module.modules_module_1/01-someNameSpace/04-interface.NamespaceInterface.md", + "03-module.modules_module_1/01-someNameSpace/05-type-alias.NamespaceTypeLiteral.md", + "03-module.modules_module_1/01-someNameSpace/06-variable.namespaceVariableA.md", + "03-module.modules_module_1/01-someNameSpace/07-variable.namespaceVariableB.md", + "03-module.modules_module_1/02-someNameSpaceB/index.md", + "03-module.modules_module_1/03-enumeration.Module1EnumA.md", + "03-module.modules_module_1/04-enumeration.Module1EnumB.md", + "03-module.modules_module_1/05-class.Module1ClassA.md", + "03-module.modules_module_1/06-class.Module1ClassB.md", + "03-module.modules_module_1/07-interface.Module1InterfaceA.md", + "03-module.modules_module_1/08-interface.Module1InterfaceB.md", + "03-module.modules_module_1/09-type-alias.Module1TypeLiteralA.md", + "03-module.modules_module_1/10-type-alias.Module1TypeLiteralB.md", + "03-module.modules_module_1/11-variable.module1VariableA.md", + "03-module.modules_module_1/12-variable.module1VariableB.md", + "03-module.modules_module_1/13-function.module1FunctionA.md", + "03-module.modules_module_1/14-function.module1FunctionB.md", +] +`; + +exports[`Urls: (Multiple entrypoints) should get urls (excludeGroups=true, outputFileStrategy=modules, includeFileNumberPrefixes: true, readme=none) 1`] = ` +[ + "README.md", + "01-module.categories.md", + "02-module.modules_module_1/index.md", + "02-module.modules_module_1/01-someNameSpace/index.md", + "02-module.modules_module_1/01-someNameSpace/01-nestedNamespace.md", + "02-module.modules_module_1/02-someNameSpaceB.md", +] +`; + +exports[`Urls: (Multiple entrypoints) should get urls (flattenOutputFiles=true) 1`] = ` +[ + "README.md", + "modules.md", + "modules_module-1.md", + "modules_module-1.Namespace.someNameSpace.md", + "modules_module-1.Namespace.someNameSpace.Namespace._nestedNamespace.md", + "modules_module-1.Namespace.someNameSpace.Namespace._nestedNamespace.Variable.nestedNamespaceVariable.md", + "modules_module-1.Namespace.someNameSpace.Enumeration.NamespaceEnum.md", + "modules_module-1.Namespace.someNameSpace.Class.NameSpaceClassA.md", + "modules_module-1.Namespace.someNameSpace.Interface.NamespaceInterface.md", + "modules_module-1.Namespace.someNameSpace.Type.NamespaceTypeLiteral.md", + "modules_module-1.Namespace.someNameSpace.Variable.namespaceVariableA.md", + "modules_module-1.Namespace.someNameSpace.Variable.namespaceVariableB.md", + "modules_module-1.Namespace.someNameSpaceB.md", + "modules_module-1.Enumeration.Module1EnumA.md", + "modules_module-1.Enumeration.Module1EnumB.md", + "modules_module-1.Class.Module1ClassA.md", + "modules_module-1.Class.Module1ClassB.md", + "modules_module-1.Interface.Module1InterfaceA.md", + "modules_module-1.Interface.Module1InterfaceB.md", + "modules_module-1.Type.Module1TypeLiteralA.md", + "modules_module-1.Type.Module1TypeLiteralB.md", + "modules_module-1.Variable.module1VariableA.md", + "modules_module-1.Variable.module1VariableB.md", + "modules_module-1.Function.module1FunctionA.md", + "modules_module-1.Function.module1FunctionB.md", + "reflections.md", + "reflections.Namespace.Duck.md", + "reflections.Namespace.Duck.Type.Age.md", + "reflections.Enumeration.EnumReflection.md", + "reflections.Class.Duck.md", + "reflections.Class.ImplementedClass.md", + "reflections.Class.ReflectionClass.md", + "reflections.Interface.CallableReflection.md", + "reflections.Interface.IndexableReflection.md", +] +`; + +exports[`Urls: (Single entrypoint) should get urls (excludeGroups=false, includeFileNumberPrefixes=true) 1`] = ` +[ + "README.md", + "01-exports.md", + "02-Interfaces/02-interface.CategoryInterfaceA1.md", + "02-Interfaces/03-interface.CategoryInterfaceA2.md", + "02-Interfaces/04-interface.OtherInterfaceA.md", + "03-Variables/02-variable.categoryVariableA1.md", + "03-Variables/03-variable.categoryVariableA2.md", + "03-Variables/04-variable.categoryVariableB1.md", + "03-Variables/05-variable.otherVariableA.md", + "03-Variables/06-variable.otherVariableB.md", + "04-Functions/02-function.categoryFunctionA1.md", + "04-Functions/03-function.categoryFunctionA2.md", + "04-Functions/04-function.categoryFunctionA3.md", + "04-Functions/05-function.categoryFunctionB2.md", + "04-Functions/06-function.otherFunctionA.md", + "04-Functions/07-function.otherFunctionB.md", +] +`; + +exports[`Urls: (Single entrypoint) should get urls (excludeGroups=true, includeFileNumberPrefixes=true, readme=none) 1`] = ` +[ + "README.md", + "01-interface.CategoryInterfaceA1.md", + "02-interface.CategoryInterfaceA2.md", + "03-interface.OtherInterfaceA.md", + "04-variable.categoryVariableA1.md", + "05-variable.categoryVariableA2.md", + "06-variable.categoryVariableB1.md", + "07-variable.otherVariableA.md", + "08-variable.otherVariableB.md", + "09-function.categoryFunctionA1.md", + "10-function.categoryFunctionA2.md", + "11-function.categoryFunctionA3.md", + "12-function.categoryFunctionB2.md", + "13-function.otherFunctionA.md", + "14-function.otherFunctionB.md", +] +`; + +exports[`Urls: (Single entrypoint) should get urls (flattenOutputFiles=true) 1`] = ` +[ + "README.md", + "exports.md", + "Namespace.Duck.md", + "Namespace.Duck.Type.Age.md", + "Enumeration.EnumReflection.md", + "Class.Duck.md", + "Class.ImplementedClass.md", + "Class.ReflectionClass.md", + "Interface.CallableReflection.md", + "Interface.IndexableReflection.md", +] +`; diff --git a/tools/typedoc-plugin-markdown/test/specs/breadcrumbs.spec.ts b/tools/typedoc-plugin-markdown/test/specs/breadcrumbs.spec.ts new file mode 100644 index 00000000..09c490da --- /dev/null +++ b/tools/typedoc-plugin-markdown/test/specs/breadcrumbs.spec.ts @@ -0,0 +1,79 @@ +import { ProjectReflection, Reflection } from 'typedoc'; + +import { MarkdownThemeRenderContext } from '../../src/theme-render-context'; + +describe(`Breadcrumbs:`, () => { + let moduleReflection: Reflection; + let classReflection: Reflection; + + describe(`(with readme)`, () => { + let project: ProjectReflection; + let context: MarkdownThemeRenderContext; + beforeAll(async () => { + ({ project, context } = await global.bootstrap(['breadcrumbs.ts'])); + moduleReflection = (project.children as any)[0]; + classReflection = project.getChildByName('Breadcrumbs') as Reflection; + context.activeLocation = 'breadcrumbs.md'; + }); + + test(`should compile entryPoint (globals) breadcrumbs'`, () => { + expect( + context.partials.breadcrumbs({ + project: project, + model: project, + url: 'globals.md', + } as any), + ).toMatchSnapshot(); + }); + + test(`should compile module breadcrumbs'`, () => { + expect( + context.partials.breadcrumbs({ + project: project, + model: moduleReflection, + url: moduleReflection.url, + } as any), + ).toMatchSnapshot(); + }); + test(`should compile class breadcrumbs'`, () => { + expect( + context.partials.breadcrumbs({ + project: project, + model: classReflection, + url: classReflection.url, + } as any), + ).toMatchSnapshot(); + }); + }); + describe(`(without readme)`, () => { + let project: ProjectReflection; + let context: MarkdownThemeRenderContext; + beforeAll(async () => { + ({ project, context } = await global.bootstrap(['breadcrumbs.ts'], { + options: { readme: 'none' }, + })); + moduleReflection = (project.children as any)[0]; + classReflection = project.getChildByName('Breadcrumbs') as Reflection; + context.activeLocation = 'breadcrumbs.md'; + }); + + test(`should compile module breadcrumbs'`, () => { + expect( + context.partials.breadcrumbs({ + project: project, + model: moduleReflection, + url: moduleReflection.url, + } as any), + ).toMatchSnapshot(); + }); + test(`should compile class breadcrumbs'`, () => { + expect( + context.partials.breadcrumbs({ + project: project, + model: classReflection, + url: classReflection.url, + } as any), + ).toMatchSnapshot(); + }); + }); +}); diff --git a/tools/typedoc-plugin-markdown/test/specs/categories.spec.ts b/tools/typedoc-plugin-markdown/test/specs/categories.spec.ts new file mode 100644 index 00000000..ff98104b --- /dev/null +++ b/tools/typedoc-plugin-markdown/test/specs/categories.spec.ts @@ -0,0 +1,79 @@ +import { ProjectReflection } from 'typedoc'; +import { MarkdownThemeRenderContext } from '../../src/theme-render-context'; + +describe(`Categories:`, () => { + let project: ProjectReflection; + let context: MarkdownThemeRenderContext; + + const baseOptions = { + hideKindTag: true, + disableSources: true, + outputFileStrategy: 'modules', + }; + + const stubbedPartials = [ + 'declarationMember', + 'reflectionMember', + 'signatureMember', + ]; + + describe(`(excludeGroups=false)`, () => { + beforeAll(async () => { + ({ project, context } = await global.bootstrap(['categories.ts'], { + options: { + ...baseOptions, + excludeGroups: false, + }, + stubPartials: stubbedPartials, + })); + }); + + test(`should render category members'`, () => { + expect(context.partials.members(project, 2)).toMatchSnapshot(); + }); + + test(`should render category TOC'`, () => { + expect(context.partials.toc(project)).toMatchSnapshot(); + }); + }); + + describe(`(excludeGroups=true)`, () => { + beforeAll(async () => { + ({ project, context } = await global.bootstrap(['categories.ts'], { + options: { + ...baseOptions, + excludeGroups: true, + }, + stubPartials: stubbedPartials, + })); + }); + + test(`should render category members'`, () => { + expect(context.partials.members(project, 2)).toMatchSnapshot(); + }); + + test(`should render category TOC'`, () => { + expect(context.partials.toc(project)).toMatchSnapshot(); + }); + }); + + describe(`(categorizeByGroup=false)`, () => { + beforeAll(async () => { + ({ project, context } = await global.bootstrap(['categories.ts'], { + options: { + ...baseOptions, + categorizeByGroup: false, + }, + stubPartials: stubbedPartials, + })); + }); + + test(`should render category members'`, () => { + expect(context.partials.members(project, 2)).toMatchSnapshot(); + }); + + test(`should render category TOC'`, () => { + expect(context.partials.toc(project)).toMatchSnapshot(); + }); + }); +}); diff --git a/tools/typedoc-plugin-markdown/test/specs/comments.spec.ts b/tools/typedoc-plugin-markdown/test/specs/comments.spec.ts new file mode 100644 index 00000000..67b1f910 --- /dev/null +++ b/tools/typedoc-plugin-markdown/test/specs/comments.spec.ts @@ -0,0 +1,48 @@ +import { Comment, ProjectReflection } from 'typedoc'; + +import { MarkdownThemeRenderContext } from '../../src/theme-render-context'; + +describe(`Comments:`, () => { + let project: ProjectReflection; + let context: MarkdownThemeRenderContext; + + beforeAll(async () => { + ({ project, context } = await global.bootstrap(['comments.ts'], { + includes: './test/stubs/inc', + media: './test/stubs/media', + })); + }); + + test(`should convert symbols brackets to symbol links'`, () => { + context.activeLocation = 'comment.md'; + expect( + context.partials.comment( + project.getChildByName('commentsWithSymbolLinks')?.comment as Comment, + ), + ).toMatchSnapshot(); + }); + + test(`should convert comments with fenced block'`, () => { + expect( + context.partials.comment( + project.getChildByName('commentsWithFencedBlock')?.comment as Comment, + ), + ).toMatchSnapshot(); + }); + + test(`should convert comments with tags'`, () => { + expect( + context.partials.comment( + project.getChildByName('commentsWithTags')?.comment as Comment, + ), + ).toMatchSnapshot(); + }); + + test(`should escape angle brackets inside comments'`, () => { + expect( + context.partials.comment( + project.getChildByName('commentsWithMarkup')?.comment as Comment, + ), + ).toMatchSnapshot(); + }); +}); diff --git a/tools/typedoc-plugin-markdown/test/specs/declarations.spec.ts b/tools/typedoc-plugin-markdown/test/specs/declarations.spec.ts new file mode 100644 index 00000000..50c0ff8a --- /dev/null +++ b/tools/typedoc-plugin-markdown/test/specs/declarations.spec.ts @@ -0,0 +1,132 @@ +import { ProjectReflection } from 'typedoc'; +import { MarkdownThemeRenderContext } from '../../src/theme-render-context'; + +describe(`Declarations:`, () => { + let project: ProjectReflection; + let context: MarkdownThemeRenderContext; + + beforeAll(async () => { + ({ project, context } = await global.bootstrap(['declarations.ts'], { + stubPartials: ['sources'], + })); + context.activeLocation = 'declarations.md'; + }); + + test(`should compile a const with default value`, () => { + expect( + context.partials.declarationMember( + project.getChildByName('stringConstWithDefaultValue') as any, + 2, + ), + ).toMatchSnapshot(); + }); + + test(`should compile a let with default value`, () => { + expect( + context.partials.declarationMember( + project.getChildByName('stringLetWithDefaultValue') as any, + 2, + ), + ).toMatchSnapshot(); + }); + + test(`should compile an undefined declaration`, () => { + expect( + context.partials.declarationMember( + project.getChildByName('undefinedNumberDeclaration') as any, + 2, + ), + ).toMatchSnapshot(); + }); + + test(`should compile object literal declaration`, () => { + expect( + context.partials.declarationMember( + project.getChildByName('objectLiteralDeclaration') as any, + 2, + ), + ).toMatchSnapshot(); + }); + + test(`should compile object literal cast as a const`, () => { + expect( + context.partials.declarationMember( + project.getChildByName('objectLiteralAsConstDeclaration') as any, + 2, + ), + ).toMatchSnapshot(); + }); + + test(`should compile type literal declaration`, () => { + expect( + context.partials.declarationMember( + project.getChildByName('typeLiteralDeclaration') as any, + 2, + ), + ).toMatchSnapshot(); + }); + + test(`should compile declaration with double underscores in name and value`, () => { + expect( + context.partials.declarationMember( + project.getChildByName('__DOUBLE_UNDERSCORES_DECLARATION__') as any, + 2, + ), + ).toMatchSnapshot(); + }); + + test(`should compile any function type`, () => { + expect( + context.partials.declarationMember( + project.getChildByName('AnyFunctionType') as any, + 2, + ), + ).toMatchSnapshot(); + }); + + test(`should compile function declaration`, () => { + expect( + context.partials.declarationMember( + project.getChildByName('functionDeclaration') as any, + 2, + ), + ).toMatchSnapshot(); + }); + + test(`should compile indexable declaration`, () => { + expect( + context.partials.declarationMember( + project.getChildByName('indexableDeclaration') as any, + 2, + ), + ).toMatchSnapshot(); + }); + + test(`should compile enum declaration`, () => { + expect( + context.partials.declarationMember( + (project.getChildByName('EnumDeclarations') as any).children[0], + 2, + ), + ).toMatchSnapshot(); + }); + + test(`should compile enum declaration with defaults`, () => { + expect( + context.partials.declarationMember( + (project.getChildByName('EnumDeclarationsWithDefaults') as any) + .children[0], + 2, + ), + ).toMatchSnapshot(); + }); + + test(`should compile declaration with accessors`, () => { + expect( + context.partials.declarationMember( + project.getChildByName('getterAndSetter') as any, + 2, + ), + ).toMatchSnapshot(); + }); +}); diff --git a/tools/typedoc-plugin-markdown/test/specs/generics.spec.ts b/tools/typedoc-plugin-markdown/test/specs/generics.spec.ts new file mode 100644 index 00000000..55183c7e --- /dev/null +++ b/tools/typedoc-plugin-markdown/test/specs/generics.spec.ts @@ -0,0 +1,68 @@ +import { ProjectReflection, SignatureReflection } from 'typedoc'; +import { MarkdownThemeRenderContext } from '../../src/theme-render-context'; + +describe(`Generics:`, () => { + let project: ProjectReflection; + let context: MarkdownThemeRenderContext; + + beforeAll(async () => { + ({ project, context } = await global.bootstrap(['generics.ts'], { + stubPartials: [ + 'breadcrumbs', + 'comment', + 'members', + 'sources', + 'toc', + 'pageHeader', + ], + })); + context.activeLocation = 'generics.md'; + }); + + test(`should compile class with type params`, () => { + expect( + context.templates.reflectionTemplate({ + model: project.getChildByName('ClassWithTypeParams'), + project: project, + } as any), + ).toMatchSnapshot(); + }); + + test(`should compile function with a simple type param'`, () => { + expect( + context.partials.signatureMember( + (project.getChildByName('functionWithTypeParam') as any) + .signatures[0] as SignatureReflection, + 2, + ), + ).toMatchSnapshot(); + }); + + test(`should compile function with complex type params'`, () => { + expect( + context.partials.signatureMember( + (project.getChildByName('functionWithTypeParams') as any) + .signatures[0] as SignatureReflection, + 2, + ), + ).toMatchSnapshot(); + }); + + test(`should compile type with nested generics'`, () => { + expect( + context.partials.declarationMember( + project.getChildByName('nestedGenerics') as any, + 2, + ), + ).toMatchSnapshot(); + }); + + test(`should compile generics with defaults'`, () => { + expect( + context.partials.declarationMember( + project.getChildByName('genericsWithDefaults') as any, + 2, + ), + ).toMatchSnapshot(); + }); +}); diff --git a/tools/typedoc-plugin-markdown/test/specs/groups.spec.ts b/tools/typedoc-plugin-markdown/test/specs/groups.spec.ts new file mode 100644 index 00000000..80dad727 --- /dev/null +++ b/tools/typedoc-plugin-markdown/test/specs/groups.spec.ts @@ -0,0 +1,57 @@ +import { ProjectReflection } from 'typedoc'; +import { MarkdownThemeRenderContext } from '../../src/theme-render-context'; + +describe(`Groups:`, () => { + let project: ProjectReflection; + let context: MarkdownThemeRenderContext; + + const baseOptions = { + hideKindTag: true, + disableSources: true, + outputFileStrategy: 'modules', + }; + + const stubbedPartials = [ + 'declarationMember', + 'reflectionMember', + 'signatureMember', + ]; + + describe(`(excludeGroups=false)`, () => { + beforeAll(async () => { + ({ project, context } = await global.bootstrap(['groups.ts'], { + options: { + ...baseOptions, + excludeGroups: false, + }, + stubPartials: stubbedPartials, + })); + }); + test(`should render group members'`, () => { + expect(context.partials.members(project, 2)).toMatchSnapshot(); + }); + + test(`should render group TOC'`, () => { + expect(context.partials.toc(project)).toMatchSnapshot(); + }); + }); + + describe(`(excludeGroups=true)`, () => { + beforeAll(async () => { + ({ project, context } = await global.bootstrap(['groups.ts'], { + options: { + ...baseOptions, + excludeGroups: true, + }, + stubPartials: stubbedPartials, + })); + }); + test(`should render group members'`, () => { + expect(context.partials.members(project, 2)).toMatchSnapshot(); + }); + + test(`should render group TOC'`, () => { + expect(context.partials.toc(project)).toMatchSnapshot(); + }); + }); +}); diff --git a/tools/typedoc-plugin-markdown/test/specs/hierarchy.spec.ts b/tools/typedoc-plugin-markdown/test/specs/hierarchy.spec.ts new file mode 100644 index 00000000..17921a5f --- /dev/null +++ b/tools/typedoc-plugin-markdown/test/specs/hierarchy.spec.ts @@ -0,0 +1,27 @@ +import { ProjectReflection } from 'typedoc'; +import { MarkdownThemeRenderContext } from '../../src/theme-render-context'; + +describe(`Hierarchy:`, () => { + let project: ProjectReflection; + let context: MarkdownThemeRenderContext; + + beforeAll(async () => { + ({ project, context } = await global.bootstrap(['hierarchy.ts'], { + stubPartials: ['breadcrumbs', 'comment', 'members', 'sources', 'toc'], + })); + context.activeLocation = 'hierarchy.md'; + }); + test(`should compile type hierarchy`, () => { + const reflection = project.getChildByName('ParentClass'); + expect( + context.partials.hierarchy((reflection as any).typeHierarchy), + ).toMatchSnapshot(); + }); + + test(`should compile nested type hierarchy`, () => { + const reflection = project.getChildByName('ChildClassA'); + expect( + context.partials.hierarchy((reflection as any).typeHierarchy), + ).toMatchSnapshot(); + }); +}); diff --git a/tools/typedoc-plugin-markdown/test/specs/navigation.spec.ts b/tools/typedoc-plugin-markdown/test/specs/navigation.spec.ts new file mode 100644 index 00000000..2816db89 --- /dev/null +++ b/tools/typedoc-plugin-markdown/test/specs/navigation.spec.ts @@ -0,0 +1,119 @@ +describe(`Navigation:`, () => { + describe(`(Multiple entrypoints)`, () => { + test(`should get urls (excludeGroups=false)`, async () => { + const { project, context } = await global.bootstrap( + ['categories.ts', 'modules/module-1'], + { + options: { + excludeGroups: false, + }, + }, + ); + expect(context.theme.getNavigation(project)).toMatchSnapshot(); + }); + + test(`should get urls (excludeGroups=false, includeFileNumberPrefixes: true)`, async () => { + const { project, context } = await global.bootstrap( + ['modules/module-1', 'categories.ts'], + { + options: { + excludeGroups: false, + includeFileNumberPrefixes: true, + }, + }, + ); + expect(context.theme.getNavigation(project)).toMatchSnapshot(); + }); + + test(`should get urls (excludeGroups=false, outputFileStrategy=modules, includeFileNumberPrefixes: true)`, async () => { + const { project, context } = await global.bootstrap( + ['categories.ts', 'modules/module-1'], + { + options: { + excludeGroups: false, + outputFileStrategy: 'modules', + includeFileNumberPrefixes: true, + }, + }, + ); + expect(context.theme.getNavigation(project)).toMatchSnapshot(); + }); + + test(`should get urls (excludeGroups=true, includeFileNumberPrefixes: true)`, async () => { + const { project, context } = await global.bootstrap( + ['modules/module-1', 'categories.ts'], + { + options: { + excludeGroups: true, + includeFileNumberPrefixes: true, + }, + }, + ); + expect(context.theme.getNavigation(project)).toMatchSnapshot(); + }); + + test(`should get urls (excludeGroups=true, outputFileStrategy=modules, includeFileNumberPrefixes: true, readme=none)`, async () => { + const { project, context } = await global.bootstrap( + ['categories.ts', 'modules/module-1'], + { + options: { + readme: 'none', + excludeGroups: true, + outputFileStrategy: 'modules', + includeFileNumberPrefixes: true, + }, + }, + ); + expect(context.theme.getNavigation(project)).toMatchSnapshot(); + }); + }); + + describe(`(Single entrypoint)`, () => { + test(`should get urls (excludeGroups=false, includeFileNumberPrefixes=true)`, async () => { + const { project, context } = await global.bootstrap(['categories.ts'], { + options: { + excludeGroups: false, + includeFileNumberPrefixes: true, + }, + }); + expect(context.theme.getNavigation(project)).toMatchSnapshot(); + }); + test(`should get urls (excludeGroups=true, includeFileNumberPrefixes=true, readme=none)`, async () => { + const { project, context } = await global.bootstrap(['categories.ts'], { + options: { + readme: 'none', + excludeGroups: true, + includeFileNumberPrefixes: true, + }, + }); + expect(context.theme.getNavigation(project)).toMatchSnapshot(); + }); + }); + + describe(`(Monorepo)`, () => { + test(`should get urls (entryPointStrategy=packages)`, async () => { + const { project, context } = await global.bootstrap( + ['monorepo/packages/*'], + { + options: { + entryPointStrategy: 'packages', + }, + }, + ); + expect(context.theme.getNavigation(project)).toMatchSnapshot(); + }); + + test(`should get urls (entryPointStrategy=packages, includeFileNumberPrefixes=true)`, async () => { + const { project, context } = await global.bootstrap( + ['monorepo/packages/*'], + { + options: { + entryPointStrategy: 'packages', + includeFileNumberPrefixes: true, + }, + }, + ); + expect(context.theme.getNavigation(project)).toMatchSnapshot(); + }); + }); +}); diff --git a/tools/typedoc-plugin-markdown/test/specs/signatures.spec.ts b/tools/typedoc-plugin-markdown/test/specs/signatures.spec.ts new file mode 100644 index 00000000..0588245a --- /dev/null +++ b/tools/typedoc-plugin-markdown/test/specs/signatures.spec.ts @@ -0,0 +1,193 @@ +import { ProjectReflection, SignatureReflection } from 'typedoc'; +import { MarkdownThemeRenderContext } from '../../src/theme-render-context'; + +describe(`Signatures:`, () => { + let project: ProjectReflection; + let context: MarkdownThemeRenderContext; + + beforeAll(async () => { + ({ project, context } = await global.bootstrap(['signatures.ts'], { + stubPartials: ['sources'], + })); + context.activeLocation = 'signatures.md'; + }); + + test(`should compile callable signature'`, () => { + expect( + context.partials.signatureMember( + (project.getChildByName('CallableSignature') as any).signatures[0], + 2, + ), + ).toMatchSnapshot(); + }); + + test(`should compile signature with a flag'`, () => { + expect( + context.partials.signatureMember( + (project.getChildByName('privateFunction') as any) + .signatures[0] as SignatureReflection, + 2, + ), + ).toMatchSnapshot(); + }); + + test(`should compile signature with params'`, () => { + expect( + context.partials.signatureMember( + (project.getChildByName('functionWithParameters') as any) + .signatures[0] as SignatureReflection, + 2, + ), + ).toMatchSnapshot(); + }); + + test(`should compile function that returns an object'`, () => { + expect( + context.partials.signatureMember( + (project.getChildByName('functionReturningAnObject') as any) + .signatures[0] as SignatureReflection, + 2, + ), + ).toMatchSnapshot(); + }); + + test(`should compile a promise that returns an object'`, () => { + expect( + context.partials.signatureMember( + (project.getChildByName('promiseReturningAnObject') as any) + .signatures[0] as SignatureReflection, + 2, + ), + ).toMatchSnapshot(); + }); + + test(`should compile a promise that returns a symbol'`, () => { + expect( + context.partials.signatureMember( + (project.getChildByName('promiseReturningASymbol') as any) + .signatures[0] as SignatureReflection, + 2, + ), + ).toMatchSnapshot(); + }); + + test(`should compile function that returns a function'`, () => { + expect( + context.partials.signatureMember( + (project.getChildByName('functionReturningAFunction') as any) + .signatures[0] as SignatureReflection, + 2, + ), + ).toMatchSnapshot(); + }); + + test(`should compile signature with rest params'`, () => { + expect( + context.partials.signatureMember( + (project.getChildByName('functionWithRest') as any) + .signatures[0] as SignatureReflection, + 2, + ), + ).toMatchSnapshot(); + }); + + test(`should compile signature with optional params'`, () => { + expect( + context.partials.signatureMember( + (project.getChildByName('functionWithOptionalParam') as any) + .signatures[0] as SignatureReflection, + 2, + ), + ).toMatchSnapshot(); + }); + + test(`should compile signature with union types'`, () => { + expect( + context.partials.signatureMember( + (project.getChildByName('functionWithUnionTypes') as any) + .signatures[0] as SignatureReflection, + 2, + ), + ).toMatchSnapshot(); + }); + + test(`should compile signature with default values'`, () => { + expect( + context.partials.signatureMember( + (project.getChildByName('functionWithDefaults') as any) + .signatures[0] as SignatureReflection, + 2, + ), + ).toMatchSnapshot(); + }); + + test(`should compile signature with @return comments'`, () => { + expect( + context.partials.signatureMember( + (project.getChildByName('commentsInReturn') as any) + .signatures[0] as SignatureReflection, + 2, + ), + ).toMatchSnapshot(); + }); + + test(`should compile named parameters'`, () => { + expect( + context.partials.signatureMember( + (project.getChildByName('functionWithNamedParams') as any) + .signatures[0] as SignatureReflection, + 2, + ), + ).toMatchSnapshot(); + }); + + test(`should compile named parameters with comments'`, () => { + expect( + context.partials.signatureMember( + (project.getChildByName('functionWithNamedParamsAndComments') as any) + .signatures[0] as SignatureReflection, + 2, + ), + ).toMatchSnapshot(); + }); + + test(`should compile pipes in params and comments'`, () => { + expect( + context.partials.signatureMember( + (project.getChildByName('functionWithPipesInParamsAndComments') as any) + .signatures[0] as SignatureReflection, + 2, + ), + ).toMatchSnapshot(); + }); + + test(`should compile function with reference type'`, () => { + expect( + context.partials.signatureMember( + (project.getChildByName('functionWithReferenceType') as any) + .signatures[0] as SignatureReflection, + 2, + ), + ).toMatchSnapshot(); + }); + + test(`should compile function with nested typen params'`, () => { + expect( + context.partials.signatureMember( + (project.getChildByName('functionWithNestedParams') as any) + .signatures[0] as SignatureReflection, + 2, + ), + ).toMatchSnapshot(); + }); + + test(`should compile class with constructor'`, () => { + expect( + context.partials.signatureMember( + (project.getChildByName('ClassWithConstructor') as any).children[0] + .signatures[0] as SignatureReflection, + 2, + ), + ).toMatchSnapshot(); + }); +}); diff --git a/tools/typedoc-plugin-markdown/test/specs/types.spec.ts b/tools/typedoc-plugin-markdown/test/specs/types.spec.ts new file mode 100644 index 00000000..c93a6a00 --- /dev/null +++ b/tools/typedoc-plugin-markdown/test/specs/types.spec.ts @@ -0,0 +1,161 @@ +import { ProjectReflection } from 'typedoc'; +import { MarkdownThemeRenderContext } from '../../src/theme-render-context'; + +describe(`Types:`, () => { + let project: ProjectReflection; + let context: MarkdownThemeRenderContext; + + beforeAll(async () => { + ({ project, context } = await global.bootstrap(['types.ts'])); + context.activeLocation = 'types.md'; + }); + + test(`should compile 'array' type'`, () => { + expect( + context.partials.someType( + (project.getChildByName('arrayType') as any).type, + ), + ).toMatchSnapshot(); + }); + + test(`should compile 'stringLiteral' type'`, () => { + expect( + context.partials.someType( + (project.getChildByName('stringLiteralType') as any).type, + ), + ).toMatchSnapshot(); + }); + + test(`should compile 'union' of string literals types'`, () => { + expect( + context.partials.someType( + (project.getChildByName('unionType') as any).type, + ), + ).toMatchSnapshot(); + }); + + test(`should compile 'union' of literal declarations`, () => { + expect( + context.partials.someType( + (project.getChildByName('unionTypeWithSymbolsDeclarations') as any) + .type, + ), + ).toMatchSnapshot(); + }); + + test(`should compile intrinsic type'`, () => { + expect( + context.partials.someType( + (project.getChildByName('stringType') as any).type, + ), + ).toMatchSnapshot(); + }); + + test(`should compile collapsed 'literal' type'`, () => { + expect( + context.partials.someType( + (project.getChildByName('literalType') as any).type, + 'all', + ), + ).toMatchSnapshot(); + }); + + test(`should compile expanded 'literal' type'`, () => { + expect( + context.partials.someType( + (project.getChildByName('literalType') as any).type, + ), + ).toMatchSnapshot(); + }); + + test(`should compile collapsed 'objectLiteralType' type'`, () => { + expect( + context.partials.declarationType( + project.getChildByName('objectLiteralType') as any, + 'object', + ), + ).toMatchSnapshot(); + }); + + test(`should compile expanded 'objectLiteralType' type'`, () => { + expect( + context.partials.declarationType( + project.getChildByName('objectLiteralType') as any, + ), + ).toMatchSnapshot(); + }); + + test(`should compile 'tuple' type'`, () => { + expect( + context.partials.someType( + (project.getChildByName('tupleType') as any).type, + ), + ).toMatchSnapshot(); + }); + + test(`should compile 'intersection' type'`, () => { + expect( + context.partials.someType( + (project.getChildByName('intersectionType') as any).type, + ), + ).toMatchSnapshot(); + }); + + test(`should compile collapsed 'function' type '`, () => { + expect( + context.partials.someType( + (project.getChildByName('functionReflectionType') as any).type, + 'function', + ), + ).toMatchSnapshot(); + }); + + test(`should compile expanded 'function' type '`, () => { + expect( + context.partials.someType( + (project.getChildByName('functionReflectionType') as any).type, + ), + ).toMatchSnapshot(); + }); + + test(`should compile 'typeOperator' type '`, () => { + expect( + context.partials.someType( + (project.getChildByName('typeOperatorType') as any).type, + ), + ).toMatchSnapshot(); + }); + + test(`should compile unionType with object literal type '`, () => { + expect( + context.partials.someType( + (project.getChildByName('objectLiteralUnionType') as any).type, + ), + ).toMatchSnapshot(); + }); + + test(`should compile conditional type '`, () => { + expect( + context.partials.someType( + (project.getChildByName('ConditionalType') as any).type, + ), + ).toMatchSnapshot(); + }); + + test(`should resolve external refs'`, () => { + expect( + context.partials.someType( + (project.getChildByName('externalReference') as any).type, + ), + ).toMatchSnapshot(); + }); + + test(`should resolve external refs with type params'`, () => { + expect( + context.partials.someType( + (project.getChildByName('externalReferenceInsideTypeParams') as any) + .type, + ), + ).toMatchSnapshot(); + }); +}); diff --git a/tools/typedoc-plugin-markdown/test/specs/urls.spec.ts b/tools/typedoc-plugin-markdown/test/specs/urls.spec.ts new file mode 100644 index 00000000..5b8c54c9 --- /dev/null +++ b/tools/typedoc-plugin-markdown/test/specs/urls.spec.ts @@ -0,0 +1,163 @@ +describe(`Urls:`, () => { + describe(`(Multiple entrypoints)`, () => { + test(`should get urls (excludeGroups=false)`, async () => { + const { project, context } = await global.bootstrap( + ['categories.ts', 'modules/module-1'], + { + options: { + excludeGroups: false, + }, + }, + ); + expect( + context.theme.getUrls(project).map((url) => url.url), + ).toMatchSnapshot(); + }); + + test(`should get urls (flattenOutputFiles=true)`, async () => { + const { project, context } = await global.bootstrap( + ['reflections.ts', 'modules/module-1'], + { + options: { + flattenOutputFiles: true, + }, + }, + ); + expect( + context.theme.getUrls(project).map((url) => url.url), + ).toMatchSnapshot(); + }); + + test(`should get urls (excludeGroups=false, includeFileNumberPrefixes: true)`, async () => { + const { project, context } = await global.bootstrap( + ['modules/module-1', 'categories.ts'], + { + options: { + excludeGroups: false, + includeFileNumberPrefixes: true, + }, + }, + ); + expect( + context.theme.getUrls(project).map((url) => url.url), + ).toMatchSnapshot(); + }); + + test(`should get urls (excludeGroups=false, outputFileStrategy=modules, includeFileNumberPrefixes: true)`, async () => { + const { project, context } = await global.bootstrap( + ['categories.ts', 'modules/module-1'], + { + options: { + excludeGroups: false, + outputFileStrategy: 'modules', + includeFileNumberPrefixes: true, + }, + }, + ); + expect( + context.theme.getUrls(project).map((url) => url.url), + ).toMatchSnapshot(); + }); + + test(`should get urls (excludeGroups=true, includeFileNumberPrefixes: true)`, async () => { + const { project, context } = await global.bootstrap( + ['modules/module-1', 'categories.ts'], + { + options: { + excludeGroups: true, + includeFileNumberPrefixes: true, + }, + }, + ); + expect( + context.theme.getUrls(project).map((url) => url.url), + ).toMatchSnapshot(); + }); + + test(`should get urls (excludeGroups=true, outputFileStrategy=modules, includeFileNumberPrefixes: true, readme=none)`, async () => { + const { project, context } = await global.bootstrap( + ['categories.ts', 'modules/module-1'], + { + options: { + readme: 'none', + excludeGroups: true, + outputFileStrategy: 'modules', + includeFileNumberPrefixes: true, + }, + }, + ); + expect( + context.theme.getUrls(project).map((url) => url.url), + ).toMatchSnapshot(); + }); + }); + + describe(`(Single entrypoint)`, () => { + test(`should get urls (excludeGroups=false, includeFileNumberPrefixes=true)`, async () => { + const { project, context } = await global.bootstrap(['categories.ts'], { + options: { + excludeGroups: false, + includeFileNumberPrefixes: true, + }, + }); + expect( + context.theme.getUrls(project).map((url) => url.url), + ).toMatchSnapshot(); + }); + + test(`should get urls (flattenOutputFiles=true)`, async () => { + const { project, context } = await global.bootstrap(['reflections.ts'], { + options: { + flattenOutputFiles: true, + }, + }); + expect( + context.theme.getUrls(project).map((url) => url.url), + ).toMatchSnapshot(); + }); + + test(`should get urls (excludeGroups=true, includeFileNumberPrefixes=true, readme=none)`, async () => { + const { project, context } = await global.bootstrap(['categories.ts'], { + options: { + readme: 'none', + excludeGroups: true, + includeFileNumberPrefixes: true, + }, + }); + expect( + context.theme.getUrls(project).map((url) => url.url), + ).toMatchSnapshot(); + }); + }); + + describe(`(Monorepo)`, () => { + test(`should get urls (entryPointStrategy=packages)`, async () => { + const { project, context } = await global.bootstrap( + ['monorepo/packages/*'], + { + options: { + entryPointStrategy: 'packages', + }, + }, + ); + expect( + context.theme.getUrls(project).map((url) => url.url), + ).toMatchSnapshot(); + }); + + test(`should get urls (entryPointStrategy=packages, includeFileNumberPrefixes=true)`, async () => { + const { project, context } = await global.bootstrap( + ['monorepo/packages/*'], + { + options: { + entryPointStrategy: 'packages', + includeFileNumberPrefixes: true, + }, + }, + ); + expect( + context.theme.getUrls(project).map((url) => url.url), + ).toMatchSnapshot(); + }); + }); +}); diff --git a/tools/typedoc-plugin-markdown/tsconfig.json b/tools/typedoc-plugin-markdown/tsconfig.json new file mode 100644 index 00000000..95fa80e6 --- /dev/null +++ b/tools/typedoc-plugin-markdown/tsconfig.json @@ -0,0 +1,7 @@ +{ + "extends": "../../tools/typedoc-tsconfig/tsconfig.json", + "compilerOptions": { + "outDir": "./dist" + }, + "exclude": ["./dist", "./test", "./scripts", "**/*.spec.ts"] +} diff --git a/tools/typedoc-plugin-markdown/tsconfig.test.json b/tools/typedoc-plugin-markdown/tsconfig.test.json new file mode 100644 index 00000000..e8b15862 --- /dev/null +++ b/tools/typedoc-plugin-markdown/tsconfig.test.json @@ -0,0 +1,3 @@ +{ + "extends": "../../tools/typedoc-tsconfig/tsconfig.test.json" +} diff --git a/tools/typedoc-tsconfig/tsconfig.json b/tools/typedoc-tsconfig/tsconfig.json new file mode 100644 index 00000000..3b58b8c1 --- /dev/null +++ b/tools/typedoc-tsconfig/tsconfig.json @@ -0,0 +1,16 @@ +{ + "compilerOptions": { + "declaration": true, + "experimentalDecorators": true, + "esModuleInterop": true, + "lib": ["es2018", "dom"], + "module": "commonjs", + "moduleResolution": "node", + "noImplicitAny": false, + "noUnusedLocals": true, + "removeComments": true, + "sourceMap": false, + "strictNullChecks": true, + "target": "es2018" + } +} diff --git a/tools/typedoc-tsconfig/tsconfig.test.json b/tools/typedoc-tsconfig/tsconfig.test.json new file mode 100644 index 00000000..803fbf87 --- /dev/null +++ b/tools/typedoc-tsconfig/tsconfig.test.json @@ -0,0 +1,7 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "noUnusedLocals": false, + "strictNullChecks": false + } +} diff --git a/tools/typedoc-vitepress-theme/.gitignore b/tools/typedoc-vitepress-theme/.gitignore new file mode 100644 index 00000000..5069cfc1 --- /dev/null +++ b/tools/typedoc-vitepress-theme/.gitignore @@ -0,0 +1 @@ +docs/api \ No newline at end of file diff --git a/tools/typedoc-vitepress-theme/CHANGELOG.md b/tools/typedoc-vitepress-theme/CHANGELOG.md new file mode 100644 index 00000000..ef6bd09b --- /dev/null +++ b/tools/typedoc-vitepress-theme/CHANGELOG.md @@ -0,0 +1,12 @@ +# typedoc-vitepress-theme + +## 1.0.0-next.0 (2023-05-13) + +### Major Changes + +- Initial commit + +### Patch Changes + +- Updated peer dependencies + - typedoc-plugin-markdown@4.0.0-next.11 diff --git a/tools/typedoc-vitepress-theme/LICENSE b/tools/typedoc-vitepress-theme/LICENSE new file mode 100644 index 00000000..a5e32ed9 --- /dev/null +++ b/tools/typedoc-vitepress-theme/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2020 Thomas Grey + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/tools/typedoc-vitepress-theme/README.md b/tools/typedoc-vitepress-theme/README.md new file mode 100644 index 00000000..b0c45710 --- /dev/null +++ b/tools/typedoc-vitepress-theme/README.md @@ -0,0 +1,165 @@ +# typedoc-vitepress-theme + +A [typedoc-plugin-markdown](https://github.com/tgreyuk/typedoc-plugin-markdown/blob/master/packages/typedoc-plugin-markdown/README.md) theme that publishes Markdown pages compatible with [VitePress](https://vitepress.dev/). + +[![npm](https://img.shields.io/npm/v/typedoc-vitepress-theme.svg)](https://www.npmjs.com/package/typedoc-vitepress-theme) +![CI](https://github.com/tgreyuk/typedoc-plugin-markdown/actions/workflows/ci.yml/badge.svg?branch=master) + +## What does it do? + +- Presets relevant options of [typedoc-plugin-markdown](https://github.com/tgreyuk/typedoc-plugin-markdown/tree/master/packages/typedoc-plugin-markdown#readme) targetting VitePress Markdown. +- Auto generates a VitePress sidebar that can be referenced from the VitePress config. + +## What about VuePress? + +This theme is also compatible with VuePress and the configuration is almost identical. However this theme supersedes previous VuePress TypeDoc plugins and is specifically targetted for VitePress. + +See https://vitepress.dev/guide/what-is-vitepress#what-about-vuepress. + +## Installation + +### 1. Install VitePress + +https://vitepress.dev/guide/getting-started + +### 2. Install plugin + +> Install the plugin in the same location as your VitePress installation. + +> [typedoc](https://github.com/TypeStrong/typedoc) and [typedoc-plugin-markdown](https://github.com/tgreyuk/typedoc-plugin-markdown) are required peer dependencies. + +```shell +npm install typedoc typedoc-plugin-markdown@next typedoc-vitepress-theme@next --save-dev +``` + +### Typical file structure + +``` +. +├─ docs +│ ├─ .vitepress +│ │ └─ config.js +│ └─ api (default out dir containing generated TypeDoc pages and typedoc-sidebar.json file) +└─ package.json (package.json project root) +``` + +## Usage + +Create a script that builds TypeDoc pages before bootstraping VitePress. The following is a guideline only and can be tailored as required. + +### 1. Create a script to publish TypeDoc pages + +```js +"publish-typedoc": "typedoc --options typedoc.json" +``` + +**typedoc.json** + +```json +{ + "plugin": ["typedoc-plugin-markdown", "typedoc-vitepress-theme"] +} +``` + +### 2. Run the script before bootstrapping VitePress + +```json +"docs:dev": "npm run publish-typedoc && vitepress dev docs", +"docs:build": "npm run publish-typedoc && vitepress build docs" +``` + +### 3. Configure Navbar and Sidebar + +A sidebar named `typedoc-sidebar.json` is auto-generated to the out directory. This can then be referenced in the config file to configure the sidebar. + +**docs/.vitepress/config.ts** + +```js +import typedocSidebar from '../api/typedoc-sidebar.json'; + +module.exports = { + themeConfig: { + nav: [{ text: 'API', link: '/api/' }], + sidebar: [ + { + text: 'API', + items: typedocSidebar, + }, + ], + }, +}; +``` + +## Options + +Options can be declared: + +- Passing arguments via the command line. +- Using a `typedoc.json` file. +- Under the `typedocOptions` key in `tsconfig.json`. + +Please see https://typedoc.org/options/configuration for general TypeDoc option configuration. + +### TypeDoc options + +The following TypeDoc / Markdown plugin options can be passed to config: + +- [typedoc options](https://typedoc.org/options) (HTML specific output options that will be ignored). +- [typedoc-plugin-markdown options](https://typedoc.org/options) (Some options are already preset to target VitePress). + +The following typedoc-plugin-markdown options are preset with the theme. + +```json +{ + "anchorFormat": "slug", + "entryDocument": "index.md", + "hideBreadcrumbs": true, + "hidePageHeader": true, + "out": "./docs/api" +} +``` + +### Theme options + +The following theme options are also exposed, but the defaults should work for most use cases. + +#### `--sidebar` + +`sidebar.autoConfiguration` + +Set to `false` to disable sidebar generation. Defaults to `true`. + +`sidebar.format` + +The format of the sidebar. This option is exposed to enable backward compatibility with VuePress sidebars. Available options [`vitepress` `vuepress1`, `vuepress2`]. Defaults to `vitepress`. + +```json +{ + "sidebar": { + "autoConfiguration": true, + "format": "vitepress" + } +} +``` + +#### `--docsRoot` + +The VitePress docs folder root. Use `./` if no root folder specified. Defaults to `./docs`. + +```shell +--docsRoot +``` + +## Frontmatter + +Frontmatter can be added to pages by installing [typedoc-plugin-frontmatter](https://github.com/tgreyuk/typedoc-plugin-frontmatter#typedoc-plugin-frontmatter) and adding to the plugin list. + +```json +{ + "plugin": [..., "typedoc-plugin-frontmatter"] +} +``` + +## License + +[MIT](https://github.com/tgreyuk/typedoc-plugin-markdown/blob/master/packages/vuepress-plugin-typedoc/LICENSE) diff --git a/tools/typedoc-vitepress-theme/jest.config.js b/tools/typedoc-vitepress-theme/jest.config.js new file mode 100644 index 00000000..350d0e4a --- /dev/null +++ b/tools/typedoc-vitepress-theme/jest.config.js @@ -0,0 +1,7 @@ +const base = require('../../jest.config.base.js'); + +module.exports = { + ...base, + name: 'vuepress-plugin-typedoc', + displayName: 'vuepress-plugin-typedoc', +}; diff --git a/tools/typedoc-vitepress-theme/package.json b/tools/typedoc-vitepress-theme/package.json new file mode 100644 index 00000000..d94f9ff2 --- /dev/null +++ b/tools/typedoc-vitepress-theme/package.json @@ -0,0 +1,37 @@ +{ + "name": "typedoc-vitepress-theme", + "version": "1.0.0-next.0", + "description": "A typedoc-plugin-markdown theme that publishes Markdown pages compatible with VitePress.", + "main": "./dist/index.js", + "files": [ + "dist/" + ], + "bugs": { + "url": "https://github.com/tgreyuk/typedoc-plugin-markdown/issues" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/tgreyuk/typedoc-vitepress-theme.git", + "directory": "packages/typedoc-vuepress-theme" + }, + "homepage": "https://github.com/tgreyuk/typedoc-plugin-markdown/tree/master/packages/typedoc-vitepress-theme", + "author": "Thomas Grey", + "scripts": { + "lint": "eslint ./src --ext .ts", + "prepublishOnly": "npm run lint && npm run build", + "build": "rm -rf ./dist && tsc", + "predocs": "npm run build", + "docs": "typedoc --options ../../stubs/typedoc.1.js --plugin typedoc-plugin-markdown --plugin ./dist --out docs", + "docs:dev": "vitepress dev docs", + "docs:build": "vitepress build docs", + "docs:preview": "vitepress preview docs" + }, + "peerDependencies": { + "typedoc-plugin-markdown": "workspace:*" + }, + "license": "MIT", + "keywords": [ + "vuepress", + "typedoc" + ] +} diff --git a/tools/typedoc-vitepress-theme/src/index.ts b/tools/typedoc-vitepress-theme/src/index.ts new file mode 100644 index 00000000..51c21461 --- /dev/null +++ b/tools/typedoc-vitepress-theme/src/index.ts @@ -0,0 +1,57 @@ +import * as fs from 'fs'; +import * as path from 'path'; +import { Application, ParameterType } from 'typedoc'; +import { + MarkdownPluginOptionsReader, + MarkdownRendererEvent, +} from 'typedoc-plugin-markdown'; +import { SidebarOptions } from './model'; +import { DEFAULT_SIDEBAR_OPTIONS } from './options'; +import { getSidebar } from './sidebars/sidebars'; + +export function load(app: Application) { + app.options.addDeclaration({ + name: 'docsRoot', + help: '', + type: ParameterType.Path, + defaultValue: './docs', + }); + + app.options.addDeclaration({ + name: 'sidebar', + help: '', + type: ParameterType.Mixed, + defaultValue: DEFAULT_SIDEBAR_OPTIONS, + }); + + app.options.addReader( + new MarkdownPluginOptionsReader({ + anchorFormat: 'slug', + entryDocument: 'index.md', + hideBreadcrumbs: true, + hidePageHeader: true, + out: './docs/api', + }), + ); + + app.renderer.postRenderAsyncJobs.push( + async (output: MarkdownRendererEvent) => { + const sidebarOptions = { + ...DEFAULT_SIDEBAR_OPTIONS, + ...(app.options.getValue('sidebar') as SidebarOptions), + }; + if (sidebarOptions.autoConfiguration) { + const outDir = app.options.getValue('out') as string; + const sourceDir = app.options.getValue('docsRoot') as string; + const sidebarPath = path.resolve(outDir, 'typedoc-sidebar.json'); + const basePath = path.relative(sourceDir, outDir); + const sidebarJson = getSidebar( + output.navigation, + basePath, + sidebarOptions, + ); + fs.writeFileSync(sidebarPath, JSON.stringify(sidebarJson)); + } + }, + ); +} diff --git a/tools/typedoc-vitepress-theme/src/model.ts b/tools/typedoc-vitepress-theme/src/model.ts new file mode 100644 index 00000000..8ad1a312 --- /dev/null +++ b/tools/typedoc-vitepress-theme/src/model.ts @@ -0,0 +1,4 @@ +export interface SidebarOptions { + autoConfiguration: boolean; + format: 'vitepress' | 'vuepress1' | 'vuepress2'; +} diff --git a/tools/typedoc-vitepress-theme/src/options.ts b/tools/typedoc-vitepress-theme/src/options.ts new file mode 100644 index 00000000..872c9ee7 --- /dev/null +++ b/tools/typedoc-vitepress-theme/src/options.ts @@ -0,0 +1,4 @@ +export const DEFAULT_SIDEBAR_OPTIONS = { + autoConfiguration: true, + format: 'vitepress', +}; diff --git a/tools/typedoc-vitepress-theme/src/sidebars/sidebar.vitepress.ts b/tools/typedoc-vitepress-theme/src/sidebars/sidebar.vitepress.ts new file mode 100644 index 00000000..cd0d7a15 --- /dev/null +++ b/tools/typedoc-vitepress-theme/src/sidebars/sidebar.vitepress.ts @@ -0,0 +1,18 @@ +import { NavigationItem } from 'typedoc-plugin-markdown'; + +export = (navigation: NavigationItem[], basePath: string) => { + return navigation.map((navigationItem) => { + return getNavigationItem(navigationItem, basePath); + }); +}; + +function getNavigationItem(navigationItem: NavigationItem, basePath: string) { + return { + text: navigationItem.title, + link: navigationItem.url ? `/${basePath}/${navigationItem.url}` : null, + collapsed: true, + items: navigationItem.children?.map((group) => { + return getNavigationItem(group, basePath); + }), + }; +} diff --git a/tools/typedoc-vitepress-theme/src/sidebars/sidebar.vuepress1.ts b/tools/typedoc-vitepress-theme/src/sidebars/sidebar.vuepress1.ts new file mode 100644 index 00000000..4ccbf4ec --- /dev/null +++ b/tools/typedoc-vitepress-theme/src/sidebars/sidebar.vuepress1.ts @@ -0,0 +1,24 @@ +import { NavigationItem } from 'typedoc-plugin-markdown'; + +export = (navigation: NavigationItem[], basePath: string) => { + return navigation?.map((navigationItem) => { + return getNavigationItem(navigationItem, basePath); + }); +}; + +function getNavigationItem(navigationItem: NavigationItem, basePath: string) { + return { + title: navigationItem.title, + sidebarDepth: 0, + path: navigationItem.url + ? `/${basePath}/${getUrlKey(navigationItem.url as string)}` + : null, + children: navigationItem.children?.map((groupChild) => { + return getNavigationItem(groupChild, basePath); + }), + }; +} + +function getUrlKey(url: string) { + return url.replace('.md', ''); +} diff --git a/tools/typedoc-vitepress-theme/src/sidebars/sidebar.vuepress2.ts b/tools/typedoc-vitepress-theme/src/sidebars/sidebar.vuepress2.ts new file mode 100644 index 00000000..2a39a19d --- /dev/null +++ b/tools/typedoc-vitepress-theme/src/sidebars/sidebar.vuepress2.ts @@ -0,0 +1,18 @@ +import { NavigationItem } from 'typedoc-plugin-markdown'; + +export = (navigation: NavigationItem[], basePath: string) => { + return navigation.map((navigationItem) => { + return getNavigationItem(navigationItem, basePath); + }); +}; + +function getNavigationItem(navigationItem: NavigationItem, basePath: string) { + return { + text: navigationItem.title, + link: navigationItem.url ? `/${basePath}/${navigationItem.url}` : null, + collapsible: true, + children: navigationItem.children?.map((group) => { + return getNavigationItem(group, basePath); + }), + }; +} diff --git a/tools/typedoc-vitepress-theme/src/sidebars/sidebars.ts b/tools/typedoc-vitepress-theme/src/sidebars/sidebars.ts new file mode 100644 index 00000000..40d90fae --- /dev/null +++ b/tools/typedoc-vitepress-theme/src/sidebars/sidebars.ts @@ -0,0 +1,19 @@ +import { NavigationItem } from 'typedoc-plugin-markdown'; +import { SidebarOptions } from '../model'; +import sidebarVitepress from './sidebar.vitepress'; +import sidebarVuepress1 from './sidebar.vuepress1'; +import sidebarVuepress2 from './sidebar.vuepress2'; + +export function getSidebar( + navigation: NavigationItem[], + basePath: string, + options: SidebarOptions, +) { + if (options.format === 'vuepress1') { + return sidebarVuepress1(navigation, basePath); + } + if (options.format === 'vuepress2') { + return sidebarVuepress2(navigation, basePath); + } + return sidebarVitepress(navigation, basePath); +} diff --git a/tools/typedoc-vitepress-theme/tsconfig.json b/tools/typedoc-vitepress-theme/tsconfig.json new file mode 100644 index 00000000..c222f726 --- /dev/null +++ b/tools/typedoc-vitepress-theme/tsconfig.json @@ -0,0 +1,8 @@ +{ + "extends": "../../tools/typedoc-tsconfig/tsconfig.json", + "compilerOptions": { + "outDir": "./dist", + "esModuleInterop": true + }, + "exclude": ["./dist", "./test", "**/*.spec.ts"] +} diff --git a/tools/typedoc-vitepress-theme/typedoc.json b/tools/typedoc-vitepress-theme/typedoc.json new file mode 100644 index 00000000..de947507 --- /dev/null +++ b/tools/typedoc-vitepress-theme/typedoc.json @@ -0,0 +1,9 @@ +{ + "entryPoints": [ + "../../../stubs/src/classes.ts", + "../../stubs/src/comments.ts" + ], + "tsconfig": "../../../stubs/tsconfig.json", + "plugin": ["typedoc-plugin-markdown", "../dist"], + "sidebar": { "version": "v1" } +}