diff --git a/libs/.gitkeep b/libs/.gitkeep
new file mode 100644
index 0000000..e69de29
diff --git a/libs/zhi-picgo-core/.eslintignore b/libs/zhi-picgo-core/.eslintignore
deleted file mode 100644
index f06235c..0000000
--- a/libs/zhi-picgo-core/.eslintignore
+++ /dev/null
@@ -1,2 +0,0 @@
-node_modules
-dist
diff --git a/libs/zhi-picgo-core/.eslintrc.cjs b/libs/zhi-picgo-core/.eslintrc.cjs
deleted file mode 100644
index a1993b7..0000000
--- a/libs/zhi-picgo-core/.eslintrc.cjs
+++ /dev/null
@@ -1,4 +0,0 @@
-module.exports = {
- root: true,
- extends: ["./node_modules/@terwer/eslint-config-custom/typescript/index.cjs"],
-}
diff --git a/libs/zhi-picgo-core/CHANGELOG.md b/libs/zhi-picgo-core/CHANGELOG.md
deleted file mode 100644
index 33e2220..0000000
--- a/libs/zhi-picgo-core/CHANGELOG.md
+++ /dev/null
@@ -1,401 +0,0 @@
-# zhi-picgo-core
-
-## 1.7.0
-
-### Minor Changes
-
-- feat: fit latest siyuan note
-
-## 1.6.1
-
-### Patch Changes
-
-- chore: format code
-
-# :tada: 1.5.0 (2022-11-13)
-
-# :tada: 1.5.0-alpha.17 (2022-11-13)
-
-### :sparkles: Features
-
-- update picgo.use ([e19bb6e](https://github.com/PicGo/PicGo-Core/commit/e19bb6e))
-
-### :bug: Bug Fixes
-
-- some case will cause proxy not work ([6272303](https://github.com/PicGo/PicGo-Core/commit/6272303))
-
-# :tada: 1.5.0-alpha.16 (2022-11-09)
-
-### :bug: Bug Fixes
-
-- upyun url-options is not required ([9736a11](https://github.com/PicGo/PicGo-Core/commit/9736a11))
-
-# :tada: 1.5.0-alpha.15 (2022-10-24)
-
-### :bug: Bug Fixes
-
-- tencent cos url encode bug ([eafb70f](https://github.com/PicGo/PicGo-Core/commit/eafb70f))
-
-# :tada: 1.5.0-alpha.14 (2022-10-24)
-
-### :bug: Bug Fixes
-
-- url encode bug ([4c70e9b](https://github.com/PicGo/PicGo-Core/commit/4c70e9b))
-
-# :tada: 1.5.0-alpha.13 (2022-10-19)
-
-### :bug: Bug Fixes
-
-- type error ([b934e8a](https://github.com/PicGo/PicGo-Core/commit/b934e8a))
-
-### :package: Chore
-
-- create oldRequest types ([749359a](https://github.com/PicGo/PicGo-Core/commit/749359a))
-
-# :tada: 1.5.0-alpha.12 (2022-10-14)
-
-### :bug: Bug Fixes
-
-- types bug ([d77e6f3](https://github.com/PicGo/PicGo-Core/commit/d77e6f3))
-
-# :tada: 1.5.0-alpha.11 (2022-10-13)
-
-# :tada: 1.5.0-alpha.10 (2022-09-25)
-
-### :sparkles: Features
-
-- add zh-TW ([#135](https://github.com/PicGo/PicGo-Core/issues/135)) ([d111d6a](https://github.com/PicGo/PicGo-Core/commit/d111d6a))
-- update linux.sh ([#134](https://github.com/PicGo/PicGo-Core/issues/134)) ([2910c20](https://github.com/PicGo/PicGo-Core/commit/2910c20))
-
-### :bug: Bug Fixes
-
-- some texts in zh-TW ([#136](https://github.com/PicGo/PicGo-Core/issues/136)) ([907e6c9](https://github.com/PicGo/PicGo-Core/commit/907e6c9))
-- url image download bug & tencent cos url encode bug ([53d54f8](https://github.com/PicGo/PicGo-Core/commit/53d54f8))
-
-# :tada: 1.5.0-alpha.9 (2022-09-03)
-
-### :sparkles: Features
-
-- finish request -> axios ([b89cf1e](https://github.com/PicGo/PicGo-Core/commit/b89cf1e))
-
-### :bug: Bug Fixes
-
-- qiniu error msg can't show ([0e4661b](https://github.com/PicGo/PicGo-Core/commit/0e4661b))
-- sm.ms backupDomain message text ([45424d1](https://github.com/PicGo/PicGo-Core/commit/45424d1))
-- when request-options resolveWithFullResponse is false bug ([eb8217a](https://github.com/PicGo/PicGo-Core/commit/eb8217a))
-
-# :tada: 1.5.0-alpha.8 (2022-08-27)
-
-### :sparkles: Features
-
-- add backupDomain for sm.ms ([c6d54f1](https://github.com/PicGo/PicGo-Core/commit/c6d54f1))
-- add debug logger type ([4342268](https://github.com/PicGo/PicGo-Core/commit/4342268))
-- add picgo.use for easily using plugin ([c0107f1](https://github.com/PicGo/PicGo-Core/commit/c0107f1))
-
-### :bug: Bug Fixes
-
-- sometime tencent-cloud error message is empty ([6355e1b](https://github.com/PicGo/PicGo-Core/commit/6355e1b))
-
-# :tada: 1.5.0-alpha.7 (2022-08-20)
-
-### :sparkles: Features
-
-- finish i18n text ([11b3197](https://github.com/PicGo/PicGo-Core/commit/11b3197))
-
-### :bug: Bug Fixes
-
-- aliyun content-type -> Content-Type ([a649fcc](https://github.com/PicGo/PicGo-Core/commit/a649fcc))
-
-# :tada: 1.5.0-alpha.6 (2022-08-17)
-
-### :bug: Bug Fixes
-
-- tencent cos upload error ([61df53a](https://github.com/PicGo/PicGo-Core/commit/61df53a))
-
-# :tada: 1.5.0-alpha.5 (2022-07-31)
-
-### :sparkles: Features
-
-- add log file size limit ([158be01](https://github.com/PicGo/PicGo-Core/commit/158be01))
-- change inner db to @picgo/store ([0e90af3](https://github.com/PicGo/PicGo-Core/commit/0e90af3))
-
-### :bug: Bug Fixes
-
-- build error ([674a6b5](https://github.com/PicGo/PicGo-Core/commit/674a6b5))
-
-# :tada: 1.5.0-alpha.4 (2022-05-26)
-
-### :sparkles: Features
-
-- add userAgent for tencent cloud COS ([acac59a](https://github.com/PicGo/PicGo-Core/commit/acac59a))
-
-# :tada: 1.5.0-alpha.3 (2022-04-04)
-
-### :bug: Bug Fixes
-
-- picgo-gui clipboard image uploading error ([1302f76](https://github.com/PicGo/PicGo-Core/commit/1302f76))
-
-# :tada: 1.5.0-alpha.2 (2022-04-03)
-
-### :sparkles: Features
-
-- add wayland support for linux ([#119](https://github.com/PicGo/PicGo-Core/issues/119)) ([28905f2](https://github.com/PicGo/PicGo-Core/commit/28905f2))
-
-### :bug: Bug Fixes
-
-- qiniu && upyun errors ([587dd3f](https://github.com/PicGo/PicGo-Core/commit/587dd3f))
-
-# :tada: 1.5.0-alpha.1 (2022-03-08)
-
-### :sparkles: Features
-
-- add options for tencent cos ([1fccdcc](https://github.com/PicGo/PicGo-Core/commit/1fccdcc)), closes [#117](https://github.com/PicGo/PicGo-Core/issues/117)
-- **i18n:** add i18n for picgo ([4b93a76](https://github.com/PicGo/PicGo-Core/commit/4b93a76))
-
-### :bug: Bug Fixes
-
-- build error in windows ([5616fb9](https://github.com/PicGo/PicGo-Core/commit/5616fb9))
-
-### :package: Chore
-
-- add alpha branch for alpha version ([6882022](https://github.com/PicGo/PicGo-Core/commit/6882022)), closes [#106](https://github.com/PicGo/PicGo-Core/issues/106)
-
-# :tada: 1.5.0-alpha.0 (2021-10-26)
-
-### :package: Chore
-
-- **build:** migrate to esbuild and change export assignment to esm export ([#102](https://github.com/PicGo/PicGo-Core/issues/102)) ([2a6cd18](https://github.com/PicGo/PicGo-Core/commit/2a6cd18))
-
-## :tada: 1.4.26 (2021-08-23)
-
-### :bug: Bug Fixes
-
-- engine bug in package.json ([1c65144](https://github.com/PicGo/PicGo-Core/commit/1c65144))
-
-## :tada: 1.4.25 (2021-08-21)
-
-### :bug: Bug Fixes
-
-- handle clipboard file path error ([ff4ec86](https://github.com/PicGo/PicGo-Core/commit/ff4ec86)), closes [#97](https://github.com/PicGo/PicGo-Core/issues/97)
-- **error:** throw error when transform failed ([#96](https://github.com/PicGo/PicGo-Core/issues/96)) ([57fce75](https://github.com/PicGo/PicGo-Core/commit/57fce75))
-- clipboard path contains space ([#95](https://github.com/PicGo/PicGo-Core/issues/95)) ([d2b73c1](https://github.com/PicGo/PicGo-Core/commit/d2b73c1))
-
-## :tada: 1.4.24 (2021-08-01)
-
-### :sparkles: Features
-
-- uploaded now can be modified since picgo will not use this value ([b6a8b58](https://github.com/PicGo/PicGo-Core/commit/b6a8b58))
-
-## :tada: 1.4.23 (2021-07-27)
-
-### :bug: Bug Fixes
-
-- cases when clipboard of wsl contain image file ([#91](https://github.com/PicGo/PicGo-Core/issues/91)) ([adfc55e](https://github.com/PicGo/PicGo-Core/commit/adfc55e))
-
-### :package: Chore
-
-- add github actions for publishing ([caae80e](https://github.com/PicGo/PicGo-Core/commit/caae80e))
-
-## :tada: 1.4.22 (2021-07-27)
-
-### :sparkles: Features
-
-- **smms:** smms now supports image without token ([#89](https://github.com/PicGo/PicGo-Core/issues/89)) ([456b81c](https://github.com/PicGo/PicGo-Core/commit/456b81c))
-- add support for clipboard in wsl ([#87](https://github.com/PicGo/PicGo-Core/issues/87)) ([3e230de](https://github.com/PicGo/PicGo-Core/commit/3e230de))
-
-## :tada: 1.4.21 (2021-05-09)
-
-### :bug: Bug Fixes
-
-- output empty after uploading when using isolate context ([79c228b](https://github.com/PicGo/PicGo-Core/commit/79c228b))
-
-## :tada: 1.4.20 (2021-05-09)
-
-### :sparkles: Features
-
-- add createContext for each upload process ([ecde023](https://github.com/PicGo/PicGo-Core/commit/ecde023))
-
-### :package: Chore
-
-- add debug launch.json ([9950259](https://github.com/PicGo/PicGo-Core/commit/9950259))
-
-## :tada: 1.4.19 (2021-04-04)
-
-### :sparkles: Features
-
-- add current uploader && transformer log ([67b2bb1](https://github.com/PicGo/PicGo-Core/commit/67b2bb1))
-- limit some of config's capabilities ([f901505](https://github.com/PicGo/PicGo-Core/commit/f901505))
-
-## :tada: 1.4.18 (2021-03-06)
-
-### :bug: Bug Fixes
-
-- unregister plugin delete pluginMap ([85228d8](https://github.com/PicGo/PicGo-Core/commit/85228d8))
-
-## :tada: 1.4.17 (2021-02-09)
-
-### :bug: Bug Fixes
-
-- **type:** type error in index.d.ts ([f617658](https://github.com/PicGo/PicGo-Core/commit/f617658)), closes [#69](https://github.com/PicGo/PicGo-Core/issues/69)
-
-## :tada: 1.4.16 (2021-02-08)
-
-### :sparkles: Features
-
-- add proxy & registry options for pluginHandler ([b10b963](https://github.com/PicGo/PicGo-Core/commit/b10b963))
-- dynamic proxy getter with ctx.Request.request ([687805f](https://github.com/PicGo/PicGo-Core/commit/687805f)), closes [#64](https://github.com/PicGo/PicGo-Core/issues/64)
-- supporting install specific version of plugin ([35e15b0](https://github.com/PicGo/PicGo-Core/commit/35e15b0))
-
-## :tada: 1.4.15 (2021-01-24)
-
-### :sparkles: Features
-
-- add local plugin install/uninstall/update support & imporve plugin name handler ([f8ec464](https://github.com/PicGo/PicGo-Core/commit/f8ec464))
-
-## :tada: 1.4.14 (2020-12-19)
-
-### :bug: Bug Fixes
-
-- types error ([303a4ec](https://github.com/PicGo/PicGo-Core/commit/303a4ec))
-
-## :tada: 1.4.13 (2020-12-19)
-
-### :sparkles: Features
-
-- new addPlugin api for node projects ([5a18432](https://github.com/PicGo/PicGo-Core/commit/5a18432))
-
-### :bug: Bug Fixes
-
-- **type:** some type error ([233a6ca](https://github.com/PicGo/PicGo-Core/commit/233a6ca))
-- pluginLoader can't get the full plugin list ([83535b9](https://github.com/PicGo/PicGo-Core/commit/83535b9)), closes [#60](https://github.com/PicGo/PicGo-Core/issues/60)
-
-## :tada: 1.4.12 (2020-11-04)
-
-### :bug: Bug Fixes
-
-- let tcyun error info more detail ([ddf645f](https://github.com/PicGo/PicGo-Core/commit/ddf645f))
-- not encode before uploading an image with url ([c0aee32](https://github.com/PicGo/PicGo-Core/commit/c0aee32))
-- qiniu error handler ([de94212](https://github.com/PicGo/PicGo-Core/commit/de94212))
-
-## :tada: 1.4.11 (2020-07-12)
-
-### :bug: Bug Fixes
-
-- initailize db function error ([df7d526](https://github.com/PicGo/PicGo-Core/commit/df7d526))
-
-## :tada: 1.4.10 (2020-06-28)
-
-### :bug: Bug Fixes
-
-- url image hash bug ([e405221](https://github.com/PicGo/PicGo-Core/commit/e405221))
-
-## :tada: 1.4.9 (2020-06-27)
-
-### :sparkles: Features
-
-- add plugin running && error logs ([6adc070](https://github.com/PicGo/PicGo-Core/commit/6adc070))
-- **transformer:** add fallback to support more image formats such as HEIC ([0f5d2a9](https://github.com/PicGo/PicGo-Core/commit/0f5d2a9)), closes [#13](https://github.com/PicGo/PicGo-Core/issues/13)
-
-### :bug: Bug Fixes
-
-- multiline logs format ([444a42f](https://github.com/PicGo/PicGo-Core/commit/444a42f))
-- the issue of lost logs ([daa7508](https://github.com/PicGo/PicGo-Core/commit/daa7508))
-- the order of the uploaded list may not be the same as the order entered ([2bf1ed9](https://github.com/PicGo/PicGo-Core/commit/2bf1ed9)), closes [#40](https://github.com/PicGo/PicGo-Core/issues/40)
-- unregisterPlugin's bug ([966bfd8](https://github.com/PicGo/PicGo-Core/commit/966bfd8))
-
-### :package: Chore
-
-- add vscode workspace settings & migrate tslint to eslint ([50a4842](https://github.com/PicGo/PicGo-Core/commit/50a4842))
-
-## :tada: 1.4.8 (2020-04-04)
-
-### :bug: Bug Fixes
-
-- encode url before finishing ([7a6b39c](https://github.com/PicGo/PicGo-Core/commit/7a6b39c))
-- return true if decodeURI throw error to avoid crash ([d09d77a](https://github.com/PicGo/PicGo-Core/commit/d09d77a))
-- win10 cmd crash bug when "picgo upload" ([#35](https://github.com/PicGo/PicGo-Core/issues/35)) ([deec252](https://github.com/PicGo/PicGo-Core/commit/deec252))
-
-## :tada: 1.4.7 (2020-03-07)
-
-### :sparkles: Features
-
-- add smms-v2 support ([7e10655](https://github.com/PicGo/PicGo-Core/commit/7e10655))
-- remove weibo support ([96b2b3a](https://github.com/PicGo/PicGo-Core/commit/96b2b3a))
-
-### :pencil: Documentation
-
-- update README ([aff6326](https://github.com/PicGo/PicGo-Core/commit/aff6326))
-
-## :tada: 1.4.6 (2020-02-23)
-
-### :bug: Bug Fixes
-
-- auto generate a local png bug ([c54ac67](https://github.com/PicGo/PicGo-Core/commit/c54ac67))
-
-## :tada: 1.4.5 (2020-02-23)
-
-### :sparkles: Features
-
-- add upload image from URL support ([0d87342](https://github.com/PicGo/PicGo-Core/commit/0d87342))
-
-### :package: Chore
-
-- travis-ci deploy option ([a2a89cd](https://github.com/PicGo/PicGo-Core/commit/a2a89cd))
-
-## :tada: 1.4.4 (2019-12-30)
-
-### :bug: Bug Fixes
-
-- image_repeated error from smms ([#28](https://github.com/PicGo/PicGo-Core/issues/28)) ([f246b8d](https://github.com/PicGo/PicGo-Core/commit/f246b8d))
-
-## :tada: 1.4.3 (2019-12-27)
-
-### :sparkles: Features
-
-- add aliyun optionUrl option ([0a3bdea](https://github.com/PicGo/PicGo-Core/commit/0a3bdea))
-
-## :tada: 1.4.2 (2019-12-26)
-
-### :bug: Bug Fixes
-
-- cli source ([be6cdcc](https://github.com/PicGo/PicGo-Core/commit/be6cdcc))
-
-## :tada: 1.4.1 (2019-12-26)
-
-# :tada: 1.4.0 (2019-12-26)
-
-### :sparkles: Features
-
-- add config methods && pluginHandler to ctx ([f9bb9fb](https://github.com/PicGo/PicGo-Core/commit/f9bb9fb))
-- **plugin:** passing environment variables ([50467c7](https://github.com/PicGo/PicGo-Core/commit/50467c7))
-
-### :bug: Bug Fixes
-
-- correct sm.ms err msg ([#18](https://github.com/PicGo/PicGo-Core/issues/18)) ([f0a4e8a](https://github.com/PicGo/PicGo-Core/commit/f0a4e8a))
-- pluginHandler args length error ([e15eac2](https://github.com/PicGo/PicGo-Core/commit/e15eac2))
-
-### :package: Chore
-
-- **types:** added typings field to export type inform… ([#23](https://github.com/PicGo/PicGo-Core/issues/23)) ([8bb16e7](https://github.com/PicGo/PicGo-Core/commit/8bb16e7))
-
-## :tada: 1.3.7 (2019-05-12)
-
-### :bug: Bug Fixes
-
-- **clipboard:** clipboard image getter error in macOS ([8314604](https://github.com/PicGo/PicGo-Core/commit/8314604))
-
-## :tada: 1.3.6 (2019-04-20)
-
-### :bug: Bug Fixes
-
-- clipboard image upload under win10 ([48b72ed](https://github.com/PicGo/PicGo-Core/commit/48b72ed))
-
-## :tada: 1.3.5 (2019-04-15)
-
-### :bug: Bug Fixes
-
-- writing log sometimes disappeared ([d36c0ae](https://github.com/PicGo/PicGo-Core/commit/d36c0ae))
-
-### :package: Chore
-
-- add picgo bump version ([c312302](https://github.com/PicGo/PicGo-Core/commit/c312302))
diff --git a/libs/zhi-picgo-core/README.md b/libs/zhi-picgo-core/README.md
deleted file mode 100644
index 4edf102..0000000
--- a/libs/zhi-picgo-core/README.md
+++ /dev/null
@@ -1,45 +0,0 @@
-# zhi-picgo-core
-
-A tool for picture uploading forked from [PicGO-Core](https://github.com/PicGo/PicGo-Core), for electron usage.
-
-![picgo-core](https://cdn.jsdelivr.net/gh/Molunerfinn/test/picgo/picgo-core-fix.jpg)
-
-## Usage
-
-### Use in node project
-
-#### Common JS
-
-```js
-const { PicGo } = require("picgo")
-```
-
-#### ES Module
-
-```js
-import { PicGo } from "picgo"
-```
-
-#### API usage example
-
-```js
-const picgo = new PicGo()
-
-// upload a picture from path
-picgo.upload(["/xxx/xxx.jpg"])
-
-// upload a picture from clipboard
-picgo.upload()
-```
-
-### Use in electron
-
-```js
-const { PicGo } = require("/Users/terwer/Documents/mydocs/zhi-framework/zhi/libs/zhi-picgo-core/dist/index.cjs.js")
-const picgo = new PicGo()
-console.log(picgo)
-```
-
-## Documentation
-
-For more details, you can checkout [documentation](https://picgo.github.io/PicGo-Core-Doc/).
diff --git a/libs/zhi-picgo-core/dist/core/Lifecycle.d.ts b/libs/zhi-picgo-core/dist/core/Lifecycle.d.ts
deleted file mode 100644
index d05bbbe..0000000
--- a/libs/zhi-picgo-core/dist/core/Lifecycle.d.ts
+++ /dev/null
@@ -1,15 +0,0 @@
-///
-import { EventEmitter } from "events";
-import { IPicGo } from "../types";
-export declare class Lifecycle extends EventEmitter {
- private readonly ctx;
- constructor(ctx: IPicGo);
- start(input: any[]): Promise;
- private beforeTransform;
- private doTransform;
- private beforeUpload;
- private doUpload;
- private afterUpload;
- private handlePlugins;
-}
-export default Lifecycle;
diff --git a/libs/zhi-picgo-core/dist/core/PicGo.d.ts b/libs/zhi-picgo-core/dist/core/PicGo.d.ts
deleted file mode 100644
index a0f9692..0000000
--- a/libs/zhi-picgo-core/dist/core/PicGo.d.ts
+++ /dev/null
@@ -1,49 +0,0 @@
-///
-import { EventEmitter } from "events";
-import Commander from "../lib/Commander";
-import { Logger } from "../lib/Logger";
-import { IHelper, IImgInfo, IPicGo, IStringKeyMap, IPluginLoader, II18nManager, IPicGoPlugin, IPicGoPluginInterface, IRequest } from "../types";
-import Request from "../lib/Request";
-import PluginHandler from "../lib/PluginHandler";
-export declare class PicGo extends EventEmitter implements IPicGo {
- private _config;
- private lifecycle;
- private db;
- private _pluginLoader;
- configPath: string;
- baseDir: string;
- helper: IHelper;
- log: Logger;
- cmd: Commander;
- output: IImgInfo[];
- input: any[];
- pluginHandler: PluginHandler;
- /**
- * @deprecated will be removed in v1.5.0+
- *
- * use request instead
- */
- Request: Request;
- i18n: II18nManager;
- VERSION: string;
- GUI_VERSION?: string;
- get pluginLoader(): IPluginLoader;
- constructor(configPath?: string);
- private initConfigPath;
- private initConfig;
- private init;
- /**
- * easily mannually load a plugin
- * if provide plugin name, will register plugin by name
- * or just instantiate a plugin
- */
- use(plugin: IPicGoPlugin, name?: string): IPicGoPluginInterface;
- registerCommands(): void;
- getConfig(name?: string): T;
- saveConfig(config: IStringKeyMap): void;
- removeConfig(key: string, propName: string): void;
- setConfig(config: IStringKeyMap): void;
- unsetConfig(key: string, propName: string): void;
- get request(): IRequest["request"];
- upload(input?: any[]): Promise;
-}
diff --git a/libs/zhi-picgo-core/dist/i18n/en.d.ts b/libs/zhi-picgo-core/dist/i18n/en.d.ts
deleted file mode 100644
index 8150461..0000000
--- a/libs/zhi-picgo-core/dist/i18n/en.d.ts
+++ /dev/null
@@ -1,2 +0,0 @@
-import { ILocales } from "./zh-CN";
-export declare const EN: ILocales;
diff --git a/libs/zhi-picgo-core/dist/i18n/index.d.ts b/libs/zhi-picgo-core/dist/i18n/index.d.ts
deleted file mode 100644
index d7c103d..0000000
--- a/libs/zhi-picgo-core/dist/i18n/index.d.ts
+++ /dev/null
@@ -1,18 +0,0 @@
-import { ILocalesKey } from "./zh-CN";
-import { IPicGo } from "../types";
-import { IStringKeyMap, II18nManager } from "../types/index";
-import { ILocale } from "@picgo/i18n/dist/types";
-declare class I18nManager implements II18nManager {
- private readonly i18n;
- private readonly objectAdapter;
- private readonly ctx;
- constructor(ctx: IPicGo);
- private loadOutterI18n;
- private getOutterI18nFolder;
- translate(key: ILocalesKey | T, args?: IStringKeyMap): string;
- setLanguage(language: string): void;
- addLocale(language: string, locales: ILocale): boolean;
- addLanguage(language: string, locales: ILocale): boolean;
- getLanguageList(): string[];
-}
-export { I18nManager };
diff --git a/libs/zhi-picgo-core/dist/i18n/zh-CN.d.ts b/libs/zhi-picgo-core/dist/i18n/zh-CN.d.ts
deleted file mode 100644
index 4d9e3ed..0000000
--- a/libs/zhi-picgo-core/dist/i18n/zh-CN.d.ts
+++ /dev/null
@@ -1,91 +0,0 @@
-export declare const ZH_CN: {
- UPLOAD_FAILED: string;
- CHECK_SETTINGS: string;
- CHECK_SETTINGS_AND_NETWORK: string;
- UPLOAD_FAILED_REASON: string;
- SERVER_ERROR: string;
- AUTH_FAILED: string;
- PICBED_SMMS: string;
- PICBED_SMMS_TOKEN: string;
- PICBED_SMMS_BACKUP_DOMAIN: string;
- PICBED_SMMS_MESSAGE_BACKUP_DOMAIN: string;
- PICBED_ALICLOUD: string;
- PICBED_ALICLOUD_ACCESSKEYID: string;
- PICBED_ALICLOUD_ACCESSKEYSECRET: string;
- PICBED_ALICLOUD_BUCKET: string;
- PICBED_ALICLOUD_AREA: string;
- PICBED_ALICLOUD_PATH: string;
- PICBED_ALICLOUD_CUSTOMURL: string;
- PICBED_ALICLOUD_OPTIONS: string;
- PICBED_ALICLOUD_MESSAGE_AREA: string;
- PICBED_ALICLOUD_MESSAGE_PATH: string;
- PICBED_ALICLOUD_MESSAGE_OPTIONS: string;
- PICBED_ALICLOUD_MESSAGE_CUSTOMURL: string;
- PICBED_TENCENTCLOUD: string;
- PICBED_TENCENTCLOUD_VERSION: string;
- PICBED_TENCENTCLOUD_SECRETID: string;
- PICBED_TENCENTCLOUD_SECRETKEY: string;
- PICBED_TENCENTCLOUD_APPID: string;
- PICBED_TENCENTCLOUD_BUCKET: string;
- PICBED_TENCENTCLOUD_AREA: string;
- PICBED_TENCENTCLOUD_PATH: string;
- PICBED_TENCENTCLOUD_OPTIONS: string;
- PICBED_TENCENTCLOUD_CUSTOMURL: string;
- PICBED_TENCENTCLOUD_MESSAGE_APPID: string;
- PICBED_TENCENTCLOUD_MESSAGE_AREA: string;
- PICBED_TENCENTCLOUD_MESSAGE_PATH: string;
- PICBED_TENCENTCLOUD_MESSAGE_CUSTOMURL: string;
- PICBED_TENCENTCLOUD_MESSAGE_OPTIONS: string;
- PICBED_GITHUB: string;
- PICBED_GITHUB_TOKEN: string;
- PICBED_GITHUB_REPO: string;
- PICBED_GITHUB_PATH: string;
- PICBED_GITHUB_BRANCH: string;
- PICBED_GITHUB_CUSTOMURL: string;
- PICBED_GITHUB_MESSAGE_REPO: string;
- PICBED_GITHUB_MESSAGE_BRANCH: string;
- PICBED_GITHUB_MESSAGE_PATH: string;
- PICBED_GITHUB_MESSAGE_CUSTOMURL: string;
- PICBED_QINIU: string;
- PICBED_QINIU_ACCESSKEY: string;
- PICBED_QINIU_SECRETKEY: string;
- PICBED_QINIU_BUCKET: string;
- PICBED_QINIU_PATH: string;
- PICBED_QINIU_URL: string;
- PICBED_QINIU_OPTIONS: string;
- PICBED_QINIU_AREA: string;
- PICBED_QINIU_MESSAGE_PATH: string;
- PICBED_QINIU_MESSAGE_AREA: string;
- PICBED_QINIU_MESSAGE_OPTIONS: string;
- PICBED_QINIU_MESSAGE_URL: string;
- PICBED_IMGUR: string;
- PICBED_IMGUR_CLIENTID: string;
- PICBED_IMGUR_PROXY: string;
- PICBED_IMGUR_MESSAGE_PROXY: string;
- PICBED_UPYUN: string;
- PICBED_UPYUN_BUCKET: string;
- PICBED_UPYUN_OPERATOR: string;
- PICBED_UPYUN_PASSWORD: string;
- PICBED_UPYUN_PATH: string;
- PICBED_UPYUN_URL: string;
- PICBED_UPYUN_OPTIONS: string;
- PICBED_UPYUN_MESSAGE_OPERATOR: string;
- PICBED_UPYUN_MESSAGE_PASSWORD: string;
- PICBED_UPYUN_MESSAGE_URL: string;
- PICBED_UPYUN_MESSAGE_OPTIONS: string;
- PICBED_UPYUN_MESSAGE_PATH: string;
- PLUGIN_HANDLER_PLUGIN_INSTALL_SUCCESS: string;
- PLUGIN_HANDLER_PLUGIN_INSTALL_FAILED: string;
- PLUGIN_HANDLER_PLUGIN_INSTALL_FAILED_REASON: string;
- PLUGIN_HANDLER_PLUGIN_INSTALL_FAILED_PATH: string;
- PLUGIN_HANDLER_PLUGIN_UNINSTALL_SUCCESS: string;
- PLUGIN_HANDLER_PLUGIN_UNINSTALL_FAILED: string;
- PLUGIN_HANDLER_PLUGIN_UNINSTALL_FAILED_REASON: string;
- PLUGIN_HANDLER_PLUGIN_UNINSTALL_FAILED_VALID: string;
- PLUGIN_HANDLER_PLUGIN_UPDATE_SUCCESS: string;
- PLUGIN_HANDLER_PLUGIN_UPDATE_FAILED: string;
- PLUGIN_HANDLER_PLUGIN_UPDATE_FAILED_REASON: string;
- PLUGIN_HANDLER_PLUGIN_UPDATE_FAILED_VALID: string;
-};
-export type ILocalesKey = keyof typeof ZH_CN;
-export type ILocales = typeof ZH_CN;
diff --git a/libs/zhi-picgo-core/dist/i18n/zh-TW.d.ts b/libs/zhi-picgo-core/dist/i18n/zh-TW.d.ts
deleted file mode 100644
index 45f1c0e..0000000
--- a/libs/zhi-picgo-core/dist/i18n/zh-TW.d.ts
+++ /dev/null
@@ -1,2 +0,0 @@
-import { ILocales } from "./zh-CN";
-export declare const ZH_TW: ILocales;
diff --git a/libs/zhi-picgo-core/dist/index.cjs.js b/libs/zhi-picgo-core/dist/index.cjs.js
deleted file mode 100644
index 7c7cfc9..0000000
--- a/libs/zhi-picgo-core/dist/index.cjs.js
+++ /dev/null
@@ -1,2 +0,0 @@
-"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("fs-extra"),t=require("path"),n=require("events"),r=require("os"),i=require("commander"),s=require("inquirer"),a=require("image-size"),o=require("url"),l=require("chalk"),u=require("minimatch"),c=require("globby"),d=require("ejs"),p=require("download-git-repo"),g=require("rimraf"),E=require("dayjs"),_=require("util"),I=require("crypto"),f=require("mime-types"),h=require("qiniu"),P=require("ali-oss"),C=require("stream"),m=require("arraybuffer-to-buffer"),U=require("md5"),N=require("upyun"),L=require("resolve"),S=require("lodash"),D=require("child_process"),A=require("is-wsl"),T=require("axios"),y=require("form-data"),O=require("https"),B=require("tunnel"),b=require("@picgo/store"),x=require("cross-spawn"),w=require("js-yaml"),R=require("@picgo/i18n");function G(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var $=G(e),v=G(t),M=G(r),H=G(s),F=G(l),q=G(u),k=G(c),K=G(d),Y=G(p),j=G(g),Q=G(E),W=G(_),z=G(I),V=G(f),J=G(h),X=G(P),Z=G(m),ee=G(U),te=G(N),ne=G(L),re=G(A),ie=G(T),se=G(y),ae=G(O),oe=G(B),le=G(x),ue=G(w);const ce={handle:e=>{const t=e.cmd;t.program.command("install ").description("install picgo plugin").alias("add").option("-p, --proxy ","Add proxy for installing").option("-r, --registry ","Choose a registry for installing").action(((t,n)=>{const{proxy:r,registry:i}=n,s={proxy:r,registry:i};e.pluginHandler.install(t,s).catch((t=>{e.log.error(t)}))})),t.program.command("uninstall ").alias("rm").description("uninstall picgo plugin").action((t=>{e.pluginHandler.uninstall(t).catch((t=>{e.log.error(t)}))})),t.program.command("update ").description("update picgo plugin").option("-p, --proxy ","Add proxy for installing").option("-r, --registry ","Choose a registry for installing").action(((t,n)=>{const{proxy:r,registry:i}=n,s={proxy:r,registry:i};e.pluginHandler.update(t,s).catch((t=>{e.log.error(t)}))}))}},de={handle:e=>{e.cmd.program.option("-c, --config ","set config path")}},pe=e=>e.startsWith("http://")||e.startsWith("https://"),ge=e=>((e=>{e=e||"";try{return e!==decodeURI(e)}catch(e){return!0}})(e)||(e=encodeURI(e)),e),Ee=e=>{try{const{width:t=0,height:n=0}=a.imageSize(e);return{real:!0,width:t,height:n}}catch(e){return{real:!1,width:200,height:200}}},_e=e=>/^@[^/]+\/picgo-plugin-/.test(e)?"scope":e.startsWith("picgo-plugin-")?"normal":Ie(e)?"simple":"unknown",Ie=e=>{if(v.default.isAbsolute(e))return!1;const t=v.default.join(process.cwd(),e);return!$.default.existsSync(t)&&(!e.includes("/")&&!e.includes("\\"))},fe=(e,t="")=>t?`@${t}/picgo-plugin-${e}`:`picgo-plugin-${e}`,he=e=>e.split(v.default.sep).join("/"),Pe=(e,t=!1)=>{if(e.includes("@")){let n=/(.+\/)?(picgo-plugin-\w+)(@.+)*/;t&&(n=/(.+\/)?(^@[^/]+\/picgo-plugin-\w+)(@.+)*/);const r=e.match(n);return r?r[2]:(console.warn("can not remove plugin version"),e)}return e},Ce=[],me=e=>Ce.some((t=>e.startsWith(t))),Ue=e=>"object"==typeof e&&!Array.isArray(e)&&Object.keys(e).length>0;function Ne(e){try{return JSON.parse(e)}catch(t){return e}}const Le={handle:e=>{e.cmd.program.command("upload").description("upload, go go go").arguments("[input...]").alias("u").action((t=>{(async()=>{const n=t.map((e=>pe(e)?e:v.default.resolve(e))).filter((t=>{const n=$.default.existsSync(t)||pe(t);return n||e.log.warn(`${t} does not exist.`),n}));await e.upload(n)})().catch((t=>{e.log.error(t)}))}))}},Se=async(e,t,n,r)=>{const i=await e.cmd.inquirer.prompt(t),s="uploader"===n?`picBed.${r}`:"transformer"===n?`transformer.${r}`:r;e.saveConfig({[s]:i})},De={handle:e=>{e.cmd.program.command("set").alias("config").arguments(" [name]").description("configure config of picgo modules").action(((t,n)=>{(async()=>{var r,i;try{switch(t){case"uploader":case"transformer":if(n){const r=e.helper[t].get(n);if(!r)return e.log.error(`No ${t} named ${n}`);r.config&&await Se(e,r.config(e),t,n)}else{const n=[{type:"list",name:`${t}`,choices:e.helper[t].getIdList(),message:`Choose a(n) ${t}`}],r=await e.cmd.inquirer.prompt(n),i=e.helper[t].get(r[t]);(null==i?void 0:i.config)&&await Se(e,i.config(e),t,r[t])}break;case"plugin":if(n){if(n.includes("picgo-plugin-")||(n=`picgo-plugin-${n}`),!Object.keys(e.getConfig("picgoPlugins")).includes(n))return e.log.error(`No plugin named ${n}`);(null===(r=e.pluginLoader.getPlugin(n))||void 0===r?void 0:r.config)&&await Se(e,e.pluginLoader.getPlugin(n).config(e),"plugin",n)}else{const t=[{type:"list",name:"plugin",choices:e.pluginLoader.getFullList(),message:"Choose a plugin"}],n=await e.cmd.inquirer.prompt(t);(null===(i=e.pluginLoader.getPlugin(n.plugin))||void 0===i?void 0:i.config)&&await Se(e,e.pluginLoader.getPlugin(n.plugin).config(e),"plugin",n.plugin)}break;default:return e.log.warn(`No module named ${t}`),e.log.warn("Available modules are uploader|transformer|plugin")}const s="plugin"===t?"plugins":t;e.log.success("Configure config successfully!"),e.log.info(`If you want to use this config, please run 'picgo use ${s}'`)}catch(t){if(e.log.error(t),process.argv.includes("--debug"))throw t}})().catch((t=>{e.log.error(t)}))}))}},Ae={handle:async e=>{const t=e.cmd;t.program.command("use").arguments("[module]").description("use modules of picgo").action((n=>{(async()=>{try{let r=[];const i={uploader:{type:"list",name:"uploader",message:"Use an uploader",choices:e.helper.uploader.getIdList(),default:e.getConfig("picBed.uploader")||e.getConfig("picBed.current")||"github"},transformer:{type:"list",name:"transformer",message:"Use a transformer",choices:e.helper.transformer.getIdList(),default:e.getConfig("picBed.transformer")||"path"},plugins:{type:"checkbox",name:"plugins",message:"Use plugins",choices:e.pluginLoader.getFullList(),default:Object.keys(e.getConfig("picgoPlugins")).filter((t=>e.getConfig(`picgoPlugins.${t}`)))}};if(n){if(!i[n])return e.log.warn(`No module named ${n}`),e.log.warn("Available modules are uploader|transformer|plugins");r.push(i[n])}else r=Object.keys(i).map((e=>i[e]));const s=await t.inquirer.prompt(r);if(s.plugins){const t=e.getConfig("picgoPlugins");Object.keys(t).map((e=>{s.plugins.includes(e)?t[e]=!0:t[e]=!1})),e.saveConfig({picgoPlugins:t})}e.saveConfig({"picBed.current":s.uploader||e.getConfig("picBed.current"),"picBed.uploader":s.uploader||e.getConfig("picBed.current"),"picBed.transformer":s.transformer||"path"}),e.log.success("Configure config successfully!")}catch(t){if(e.log.error(t),process.argv.includes("--debug"))throw t}})().catch((t=>{e.log.error(t)}))}))}},Te={handle:e=>{e.cmd.program.option("-p, --proxy ","set proxy for uploading",(t=>{e.setConfig({"picBed.proxy":t})}))}},ye=async(e,t)=>{try{const n=Be(t.tmp),r=v.default.join(t.tmp,"template");let i={};n.prompts&&n.prompts.length>0&&(i=await e.cmd.inquirer.prompt(n.prompts));let s=await k.default(["**/*"],{cwd:r,dot:!0});if(s=s.filter((t=>{let r="";return Object.keys(n.filters).forEach((e=>{q.default(t,e,{dot:!0})&&(r=t)})),!r||Oe(e,n.filters[r],i)})),0===s.length)return e.log.warn("Template files not found!");const a=be(s,r,i);xe(t.dest,a),"function"==typeof n.complete&&n.complete({answers:i,options:t,files:s,ctx:e}),n.completeMessage&&e.log.success(n.completeMessage),e.log.success("Done!")}catch(t){return e.log.error(t)}},Oe=(e,t,n)=>{const r=new Function("data","with (data) { return "+t+"}");try{return r(n)}catch(n){return e.log.error(`Error when evaluating filter condition: ${JSON.stringify(t)}`),!1}},Be=e=>{const t=v.default.join(e,"index.js");if($.default.existsSync(t)){return require(t)}return{}},be=(e,t,n)=>{const r={};return e.forEach((e=>{const i=$.default.readFileSync(v.default.join(t,e),"utf8"),s=K.default.render(i,n);(Buffer.isBuffer(s)||/[^\s]/.test(s))&&(r[e]=s)})),r},xe=(e,t)=>{Object.keys(t).forEach((n=>{const r=v.default.join(e,n);$.default.ensureDirSync(v.default.dirname(r)),$.default.writeFileSync(r,t[n])}))},we=(e,t)=>{t.offline?$.default.existsSync(t.template)?ye(e,t).catch((t=>{e.log.error(t)})):e.log.error(`Local template ${t.template} not found`):(t.template=t.hasSlash?t.template:"PicGo/picgo-template-"+t.template,Re(e,t))},Re=(e,t)=>{$.default.existsSync(t.tmp)&&j.default.sync(t.tmp),e.log.info("Template files are downloading..."),Y.default(t.template,t.tmp,{clone:t.clone},(n=>{if(n)return e.log.error(n);e.log.success("Template files are downloaded!"),ye(e,t).catch((t=>{e.log.error(t)}))}))},Ge={handle:async e=>{e.cmd.program.command("init").arguments(" [project]").option("--clone","use git clone").option("--offline","use cached template").description("create picgo plugin's development templates").action(((t,n,i)=>{(async()=>{try{const s=t.includes("/"),a=!n||"."===n,o=v.default.resolve(n||"."),l=i.clone||!1,u=i.offline||!1,c=v.default.join(r.homedir(),".picgo/templates",t.replace(/[/:]/g,"-"));i.offline&&(t=c);const d={template:t,project:n,hasSlash:s,inPlace:a,dest:o,clone:l,tmp:c,offline:u};a||$.default.existsSync(o)?await e.cmd.inquirer.prompt([{type:"confirm",message:a?"Generate project in current directory?":"Target directory exists. Continue?",name:"ok"}]).then((t=>{t.ok&&we(e,d)})):we(e,d)}catch(t){if(e.log.error(t),process.argv.includes("--debug"))throw t}})().catch((t=>{e.log.error(t)}))})).on("--help",(()=>{console.log(),console.log("Examples:"),console.log(),console.log(F.default.gray(" # create a new project with an official template")),console.log(" $ picgo init plugin my-project"),console.log(),console.log(F.default.gray(" # create a new project straight from a github template")),console.log(" $ picgo init username/repo my-project"),console.log()}))}},$e={handle:e=>{e.cmd.program.command("i18n").arguments("[lang]").description("change picgo language").action((async(t="")=>{const n=e.i18n.getLanguageList();if(!t){const t=[{type:"list",name:"i18n",choices:n,message:"Choose a language",default:e.getConfig("settings.language")||"zh-CN"}],r=await e.cmd.inquirer.prompt(t);return e.i18n.setLanguage(r.i18n),void e.log.success(`Language set to ${r.i18n}`)}if(!n.includes(t))return e.log.warn("No such language");e.i18n.setLanguage(t),e.log.success(`Language set to ${t}`)}))}};class ve{constructor(e){this.name=e,this.list=new Map,this.pluginIdMap=new Map}register(e,t){var n;if(!e)throw new TypeError("id is required!");if("function"!=typeof t.handle)throw new TypeError("plugin.handle must be a function!");if(this.list.has(e))throw new TypeError(`${this.name} duplicate id: ${e}!`);this.list.set(e,t),ve.currentPlugin&&(this.pluginIdMap.has(ve.currentPlugin)?null===(n=this.pluginIdMap.get(ve.currentPlugin))||void 0===n||n.push(e):this.pluginIdMap.set(ve.currentPlugin,[e]))}unregister(e){if(this.pluginIdMap.has(e)){const t=this.pluginIdMap.get(e);null==t||t.forEach((e=>{this.list.delete(e)}))}}getName(){return this.name}get(e){return this.list.get(e)}getList(){return[...this.list.values()]}getIdList(){return[...this.list.keys()]}}const Me=(e=null)=>{ve.currentPlugin=e};class He{constructor(e){this.name="commander",this.list=new Map,this.pluginIdMap=new Map,this.program=new i.Command,this.inquirer=H.default,this.ctx=e}getName(){return this.name}init(){var e;this.program.version("1.7.0","-v, --version").option("-d, --debug","debug mode",(()=>{this.ctx.setConfig({debug:!0})})).option("-s, --silent","silent mode",(()=>{this.ctx.setConfig({silent:!0})})).on("command:*",(()=>{this.ctx.log.error(`Invalid command: ${this.program.args.join(" ")}\nSee --help for a list of available commands.`),process.exit(1)})),(e=this.ctx).cmd.register("pluginHandler",ce),e.cmd.register("config",de),e.cmd.register("setting",De),e.cmd.register("upload",Le),e.cmd.register("use",Ae),e.cmd.register("proxy",Te),e.cmd.register("init",Ge),e.cmd.register("i18n",$e)}register(e,t){var n;if(!e)throw new TypeError("name is required!");if("function"!=typeof t.handle)throw new TypeError("plugin.handle must be a function!");if(this.list.has(e))throw new TypeError(`${this.name} plugin duplicate id: ${e}!`);this.list.set(e,t);const r=ve.currentPlugin;null!==r&&(this.pluginIdMap.has(r)?null===(n=this.pluginIdMap.get(r))||void 0===n||n.push(e):this.pluginIdMap.set(r,[e]))}unregister(e){if(this.pluginIdMap.has(e)){const t=this.pluginIdMap.get(e);null==t||t.forEach((e=>{this.list.delete(e)}))}}loadCommands(){this.getList().forEach((e=>{try{e.handle(this.ctx)}catch(e){this.ctx.log.error(e)}}))}get(e){return this.list.get(e)}getList(){return[...this.list.values()]}getIdList(){return[...this.list.keys()]}}var Fe,qe,ke;!function(e){e.success="success",e.info="info",e.warn="warn",e.error="error"}(Fe||(Fe={})),function(e){e.UPLOAD_PROGRESS="uploadProgress",e.FAILED="failed",e.BEFORE_TRANSFORM="beforeTransform",e.BEFORE_UPLOAD="beforeUpload",e.AFTER_UPLOAD="afterUpload",e.FINISHED="finished",e.INSTALL="install",e.UNINSTALL="uninstall",e.UPDATE="update",e.NOTIFICATION="notification"}(qe||(qe={})),function(e){e.CONFIG_CHANGE="CONFIG_CHANGE"}(ke||(ke={}));class Ke{constructor(e){this.level={[Fe.success]:"green",[Fe.info]:"blue",[Fe.warn]:"yellow",[Fe.error]:"red"},this.ctx=e}handleLog(e,...t){if(!this.ctx.getConfig("silent")){const n=F.default[this.level[e]](`[PicGo ${e.toUpperCase()}]:`);console.log(n,...t),this.logLevel=this.ctx.getConfig("settings.logLevel"),this.logPath=this.ctx.getConfig("settings.logPath")||v.default.join(this.ctx.baseDir,"./picgo.log"),setTimeout((()=>{try{const n=this.checkLogFileIsLarge(this.logPath);if(n.isLarge){const e=`Log file is too large (> ${n.logFileSizeLimit/1024/1024||"10"} MB), recreate log file`;console.log(F.default.yellow("[PicGo WARN]:"),e),this.recreateLogFile(this.logPath),t.unshift(e)}this.handleWriteLog(this.logPath,e,...t)}catch(e){console.error("[PicGo Error] on checking log file size",e)}}),0)}}checkLogFileIsLarge(e){if($.default.existsSync(e)){const t=$.default.statSync(e).size,n=1024*((e=0)=>isNaN(Number(e))?0:Number(e))(this.ctx.getConfig("settings.logFileSizeLimit")||10)*1024;return{isLarge:t>n,logFileSize:t,logFileSizeLimit:n}}return{isLarge:!1}}recreateLogFile(e){$.default.existsSync(e)&&($.default.unlinkSync(e),$.default.createFileSync(e))}handleWriteLog(e,t,...n){try{if(this.checkLogLevel(t,this.logLevel)){let r=`${Q.default().format("YYYY-MM-DD HH:mm:ss")} [PicGo ${t.toUpperCase()}] `;n.forEach((e=>{e instanceof Error&&"error"===t?r+=`\n------Error Stack Begin------\n${W.default.format(null==e?void 0:e.stack)}\n-------Error Stack End------- `:("object"==typeof e&&(e=JSON.stringify(e,null,2)),r+=`${e} `)})),r+="\n",$.default.appendFileSync(e,r)}}catch(e){console.error("[PicGo Error] on writing log file",e)}}checkLogLevel(e,t){return void 0===t||"all"===t||(Array.isArray(t)?t.some((t=>t===e||"all"===t)):e===t)}success(...e){return this.handleLog(Fe.success,...e)}info(...e){return this.handleLog(Fe.info,...e)}error(...e){return this.handleLog(Fe.error,...e)}warn(...e){return this.handleLog(Fe.warn,...e)}debug(...e){"development"===process.env.NODE_ENV&&this.handleLog(Fe.info,...e)}}class Ye extends n.EventEmitter{constructor(e){super(),this.ctx=e}async start(e){const t=(e=>({configPath:e.configPath,baseDir:e.baseDir,log:e.log,cmd:e.cmd,output:[],input:[],pluginLoader:e.pluginLoader,pluginHandler:e.pluginHandler,Request:e.Request,helper:e.helper,VERSION:e.VERSION,GUI_VERSION:e.GUI_VERSION,request:e.request,i18n:e.i18n,getConfig:e.getConfig.bind(e),saveConfig:e.saveConfig.bind(e),removeConfig:e.removeConfig.bind(e),setConfig:e.setConfig.bind(e),unsetConfig:e.unsetConfig.bind(e),upload:e.upload.bind(e),addListener:e.addListener.bind(e),on:e.on.bind(e),once:e.once.bind(e),removeListener:e.removeListener.bind(e),off:e.off.bind(e),removeAllListeners:e.removeAllListeners.bind(e),setMaxListeners:e.setMaxListeners.bind(e),getMaxListeners:e.getMaxListeners.bind(e),listeners:e.listeners.bind(e),rawListeners:e.rawListeners.bind(e),emit:e.emit.bind(e),listenerCount:e.listenerCount.bind(e),prependListener:e.prependListener.bind(e),prependOnceListener:e.prependOnceListener.bind(e),eventNames:e.eventNames.bind(e)}))(this.ctx);try{if(!Array.isArray(e))throw new Error("Input must be an array.");return t.input=e,t.output=[],await this.beforeTransform(t),await this.doTransform(t),await this.beforeUpload(t),await this.doUpload(t),await this.afterUpload(t),t}catch(e){if(t.log.warn(qe.FAILED),t.emit(qe.UPLOAD_PROGRESS,-1),t.emit(qe.FAILED,e),t.log.error(e),t.getConfig("debug"))throw e;return t}}async beforeTransform(e){return e.emit(qe.UPLOAD_PROGRESS,0),e.emit(qe.BEFORE_TRANSFORM,e),e.log.info("Before transform"),await this.handlePlugins(e.helper.beforeTransformPlugins,e),e}async doTransform(e){e.emit(qe.UPLOAD_PROGRESS,30);const t=e.getConfig("picBed.transformer")||"path";let n=t,r=e.helper.transformer.get(t);return r||(r=e.helper.transformer.get("path"),n="path",e.log.warn(`Can't find transformer - ${t}, switch to default transformer - path`)),e.log.info(`Transforming... Current transformer is [${n}]`),await(null==r?void 0:r.handle(e)),e}async beforeUpload(e){return e.emit(qe.UPLOAD_PROGRESS,60),e.log.info("Before upload"),e.emit(qe.BEFORE_UPLOAD,e),await this.handlePlugins(e.helper.beforeUploadPlugins,e),e}async doUpload(e){let t=e.getConfig("picBed.uploader")||e.getConfig("picBed.current")||"github",n=e.helper.uploader.get(t),r=t;n||(t="github",r="github",n=e.helper.uploader.get("github"),e.log.warn(`Can't find uploader - ${t}, switch to default uploader - github`)),e.log.info(`Uploading... Current uploader is [${r}]`),await(null==n?void 0:n.handle(e));for(const n of e.output)n.type=t;return e}async afterUpload(e){e.emit(qe.AFTER_UPLOAD,e),e.emit(qe.UPLOAD_PROGRESS,100),await this.handlePlugins(e.helper.afterUploadPlugins,e);let t="";const n=e.output.length;for(let r=0;r{try{t.log.info(`${i}: ${r[n]} running`),await e.handle(t)}catch(e){throw t.log.error(`${i}: ${r[n]} error`),e}}))),t}}const je=(e,t)=>{const n=e.secretId,r=e.secretKey,i=e.appId,s=e.bucket;let a,o="";if(e.version&&"v4"!==e.version){const n=Math.floor((new Date).getTime()/1e3);o=`${n};${n+86400}`;const i=z.default.createHmac("sha1",r).update(o).digest("hex"),s=`put\n/${e.path}${t}\n\nhost=${e.bucket}.cos.${e.area}.myqcloud.com\n`,l=`sha1\n${o}\n${z.default.createHash("sha1").update(s).digest("hex")}\n`;a=z.default.createHmac("sha1",i).update(l).digest("hex")}else{const e=Math.floor(1e10*Math.random()),t=Math.floor((new Date).getTime()/1e3)-1,o=`a=${i}&b=${s}&k=${n}&e=${t+3600}&t=${t}&r=${e}&f=`,l=z.default.createHmac("sha1",r).update(o).digest(),u=Buffer.concat([l,Buffer.from(o)]);a=Buffer.from(u).toString("base64")}return{signature:a,appId:i,bucket:s,signTime:o}},Qe=(e,t,n,r,i)=>{const s=e.area,a=e.path;return e.version&&"v4"!==e.version?{method:"PUT",url:`http://${e.bucket}.cos.${e.area}.myqcloud.com/${encodeURIComponent(a)}${encodeURIComponent(t)}`,headers:{Authorization:`q-sign-algorithm=sha1&q-ak=${e.secretId}&q-sign-time=${n.signTime}&q-key-time=${n.signTime}&q-header-list=host&q-url-param-list=&q-signature=${n.signature}`,contentType:V.default.lookup(t),userAgent:`PicGo;${i};null;null`},body:r,resolveWithFullResponse:!0}:{method:"POST",url:`http://${s}.file.myqcloud.com/files/v2/${n.appId}/${n.bucket}/${encodeURI(a)}${t}`,headers:{Authorization:n.signature,contentType:"multipart/form-data",userAgent:`PicGo;${i};null;null`},formData:{op:"upload",filecontent:r},resolveWithFullResponse:!0}},We=async e=>{var t,n,r;const i=e.getConfig("picBed.tcyun");if(!i)throw new Error("Can't find tencent COS config");try{const s=e.output,a=i.customUrl,o=i.path,l=!i.version||"v4"===i.version;for(const u of s)if(u.fileName&&u.buffer){const s=je(i,u.fileName);if(!s)return!1;let c=u.buffer;!c&&u.base64Image&&(c=Buffer.from(u.base64Image,"base64"));const d=Qe(i,u.fileName,s,c,e.GUI_VERSION||e.VERSION),p=await e.request(d).then((e=>e)).catch((t=>({statusCode:400,body:{msg:e.i18n.translate("AUTH_FAILED"),err:t}})));let g;if(g=l&&"string"==typeof p?JSON.parse(p):p,400===g.statusCode)throw(null===(t=null==g?void 0:g.body)||void 0===t?void 0:t.err)?g.body.err:new Error((null===(n=null==g?void 0:g.body)||void 0===n?void 0:n.msg)||(null===(r=null==g?void 0:g.body)||void 0===r?void 0:r.message));const E=i.options||"";if(l&&"SUCCESS"===g.message)delete u.base64Image,delete u.buffer,u.imgUrl=a?`${a}/${o}${u.fileName}`:`${g.data.source_url}${E}`;else{if(l||!g||200!==g.statusCode)throw new Error(p.body.msg);delete u.base64Image,delete u.buffer,u.imgUrl=a?`${a}/${encodeURI(o)}${encodeURI(u.fileName)}${E}`:`https://${i.bucket}.cos.${i.area}.myqcloud.com/${encodeURI(o)}${encodeURI(u.fileName)}${E}`}}return e}catch(t){if(!i.version||"v4"===i.version)try{const n=JSON.parse(t.error);e.emit(qe.NOTIFICATION,{title:e.i18n.translate("UPLOAD_FAILED"),body:e.i18n.translate("UPLOAD_FAILED_REASON",{code:n.code}),text:"https://cloud.tencent.com/document/product/436/8432"})}catch(e){}throw t}},ze=e=>{const t=e.getConfig("picBed.tcyun")||{};return[{name:"version",type:"list",alias:e.i18n.translate("PICBED_TENCENTCLOUD_VERSION"),choices:["v4","v5"],default:"v5",required:!1},{name:"secretId",type:"input",get alias(){return e.i18n.translate("PICBED_TENCENTCLOUD_SECRETID")},default:t.secretId||"",required:!0},{name:"secretKey",type:"password",get alias(){return e.i18n.translate("PICBED_TENCENTCLOUD_SECRETKEY")},default:t.secretKey||"",required:!0},{name:"bucket",type:"input",get alias(){return e.i18n.translate("PICBED_TENCENTCLOUD_BUCKET")},default:t.bucket||"",required:!0},{name:"appId",type:"input",get prefix(){return e.i18n.translate("PICBED_TENCENTCLOUD_APPID")},get alias(){return e.i18n.translate("PICBED_TENCENTCLOUD_APPID")},default:t.appId||"",get message(){return e.i18n.translate("PICBED_TENCENTCLOUD_MESSAGE_APPID")},required:!0},{name:"area",type:"input",get prefix(){return e.i18n.translate("PICBED_TENCENTCLOUD_AREA")},get alias(){return e.i18n.translate("PICBED_TENCENTCLOUD_AREA")},default:t.area||"",get message(){return e.i18n.translate("PICBED_TENCENTCLOUD_MESSAGE_AREA")},required:!0},{name:"path",type:"input",get prefix(){return e.i18n.translate("PICBED_TENCENTCLOUD_PATH")},get alias(){return e.i18n.translate("PICBED_TENCENTCLOUD_PATH")},default:t.path||"",get message(){return e.i18n.translate("PICBED_TENCENTCLOUD_MESSAGE_PATH")},required:!1},{name:"customUrl",type:"input",get prefix(){return e.i18n.translate("PICBED_TENCENTCLOUD_CUSTOMURL")},get alias(){return e.i18n.translate("PICBED_TENCENTCLOUD_CUSTOMURL")},default:t.customUrl||"",get message(){return e.i18n.translate("PICBED_TENCENTCLOUD_MESSAGE_CUSTOMURL")},required:!1},{name:"options",type:"input",default:t.options||"",get prefix(){return e.i18n.translate("PICBED_TENCENTCLOUD_OPTIONS")},get alias(){return e.i18n.translate("PICBED_TENCENTCLOUD_OPTIONS")},get message(){return e.i18n.translate("PICBED_TENCENTCLOUD_MESSAGE_OPTIONS")},required:!1}]};const Ve=(e,t,n)=>{const r=t.path||"",{token:i,repo:s}=t;return{method:"PUT",url:`https://api.github.com/repos/${s}/contents/${encodeURI(r)}${encodeURI(e)}`,headers:{Authorization:`token ${i}`,"User-Agent":"PicGo","Content-Type":V.default.lookup(e)},body:n,json:!0}},Je=async e=>{const t=e.getConfig("picBed.github");if(!t)throw new Error("Can't find github config");try{const n=e.output;for(const r of n)if(r.fileName&&r.buffer){const n=r.base64Image||Buffer.from(r.buffer).toString("base64"),i={message:"Upload by PicGo",branch:t.branch,content:n,path:t.path+encodeURI(r.fileName)},s=Ve(r.fileName,t,i),a=await e.request(s);if(!a)throw new Error("Server error, please try again");delete r.base64Image,delete r.buffer,t.customUrl?r.imgUrl=`${t.customUrl}/${t.path}${r.fileName}`:r.imgUrl=a.content.download_url}return e}catch(t){throw e.emit(qe.NOTIFICATION,{title:e.i18n.translate("UPLOAD_FAILED"),body:e.i18n.translate("CHECK_SETTINGS_AND_NETWORK")}),t}},Xe=e=>{const t=e.getConfig("picBed.github")||{};return[{name:"repo",type:"input",get prefix(){return e.i18n.translate("PICBED_GITHUB_REPO")},get alias(){return e.i18n.translate("PICBED_GITHUB_REPO")},get message(){return e.i18n.translate("PICBED_GITHUB_MESSAGE_REPO")},default:t.repo||"",required:!0},{name:"branch",type:"input",get prefix(){return e.i18n.translate("PICBED_GITHUB_BRANCH")},get alias(){return e.i18n.translate("PICBED_GITHUB_BRANCH")},get message(){return e.i18n.translate("PICBED_GITHUB_MESSAGE_BRANCH")},default:t.branch||"master",required:!0},{name:"token",type:"password",get alias(){return e.i18n.translate("PICBED_GITHUB_TOKEN")},default:t.token||"",required:!0},{name:"path",type:"input",get prefix(){return e.i18n.translate("PICBED_GITHUB_PATH")},get alias(){return e.i18n.translate("PICBED_GITHUB_PATH")},get message(){return e.i18n.translate("PICBED_GITHUB_MESSAGE_PATH")},default:t.path||"",required:!1},{name:"customUrl",type:"input",get prefix(){return e.i18n.translate("PICBED_GITHUB_CUSTOMURL")},get alias(){return e.i18n.translate("PICBED_GITHUB_CUSTOMURL")},get message(){return e.i18n.translate("PICBED_GITHUB_MESSAGE_CUSTOMURL")},default:t.customUrl||"",required:!1}]};function Ze(e,t,n,r){const i=function(e){return"z0"===e?"":"-"+e}(e.area||"z0"),s=e.path||"";return{method:"POST",url:`http://upload${i}.qiniup.com/putb64/-1/key/${Buffer.from(s+t,"utf-8").toString("base64").replace(/\+/g,"-").replace(/\//g,"_")}`,headers:{Authorization:`UpToken ${n}`,"Content-Type":V.default.lookup(t)||"application/octet-stream"},body:r}}function et(e){const t=e.accessKey,n=e.secretKey,r=new J.default.auth.digest.Mac(t,n),i={scope:e.bucket};return new J.default.rs.PutPolicy(i).uploadToken(r)}const tt=async e=>{const t=e.getConfig("picBed.qiniu");if(!t)throw new Error("Can't find qiniu config");try{const n=e.output;for(const r of n)if(r.fileName&&r.buffer){const n=r.base64Image||Buffer.from(r.buffer).toString("base64"),i=Ze(t,r.fileName,et(t),n),s=await e.request(i),a=JSON.parse(s);if(!(null==a?void 0:a.key))throw e.emit(qe.NOTIFICATION,{title:e.i18n.translate("UPLOAD_FAILED"),body:a.msg}),e.log.error("qiniu error",a),new Error("Upload failed");{delete r.base64Image,delete r.buffer;const e=t.url,n=t.options;r.imgUrl=`${e}/${a.key}${n}`}}return e}catch(t){if("Upload failed"!==t.message&&t.response){const n=t.response.body;e.emit(qe.NOTIFICATION,{title:e.i18n.translate("UPLOAD_FAILED"),body:n.error})}throw t}},nt=e=>{const t=e.getConfig("picBed.qiniu")||{};return[{name:"accessKey",type:"input",get alias(){return e.i18n.translate("PICBED_QINIU_ACCESSKEY")},default:t.accessKey||"",required:!0},{name:"secretKey",type:"password",get alias(){return e.i18n.translate("PICBED_QINIU_SECRETKEY")},default:t.secretKey||"",required:!0},{name:"bucket",type:"input",get alias(){return e.i18n.translate("PICBED_QINIU_BUCKET")},default:t.bucket||"",required:!0},{name:"url",type:"input",get prefix(){return e.i18n.translate("PICBED_QINIU_URL")},get alias(){return e.i18n.translate("PICBED_QINIU_URL")},get message(){return e.i18n.translate("PICBED_QINIU_MESSAGE_URL")},default:t.url||"",required:!0},{name:"area",type:"input",get prefix(){return e.i18n.translate("PICBED_QINIU_AREA")},get alias(){return e.i18n.translate("PICBED_QINIU_AREA")},get message(){return e.i18n.translate("PICBED_QINIU_MESSAGE_AREA")},default:t.area||"",required:!0},{name:"options",type:"input",get prefix(){return e.i18n.translate("PICBED_QINIU_OPTIONS")},get alias(){return e.i18n.translate("PICBED_QINIU_OPTIONS")},get message(){return e.i18n.translate("PICBED_QINIU_MESSAGE_OPTIONS")},default:t.options||"",required:!1},{name:"path",type:"input",get prefix(){return e.i18n.translate("PICBED_QINIU_PATH")},get alias(){return e.i18n.translate("PICBED_QINIU_PATH")},get message(){return e.i18n.translate("PICBED_QINIU_MESSAGE_PATH")},default:t.path||"",required:!1}]};const rt=e=>{let t=e;return t instanceof ArrayBuffer&&(t=Z.default(t)),t},it=(e,t)=>{const n=(new Date).toUTCString(),r=V.default.lookup(t);if(!r)throw Error(`No mime type found for file ${t}`);const i=`PUT\n\n${r}\n${n}\n/${e.bucket}/${e.path}${t}`,s=z.default.createHmac("sha1",e.accessKeySecret).update(i).digest("base64");return`OSS ${e.accessKeyId}:${s}`},st=(e,t,n,r)=>({method:"PUT",url:`https://${e.bucket}.${e.area}.aliyuncs.com/${encodeURI(e.path)}${encodeURI(t)}`,headers:{Host:`${e.bucket}.${e.area}.aliyuncs.com`,Authorization:n,Date:(new Date).toUTCString(),"Content-Type":V.default.lookup(t)},body:r,resolveWithFullResponse:!0}),at=async e=>{var t;e||await(async e=>{const t=e.getConfig("picBed.aliyun");if(!t)throw new Error("Can't find aliYun OSS config");try{const n=e.output,r=t.customUrl,i=t.path;for(const s of n)if(s.fileName&&s.buffer){const n=it(t,s.fileName);let a=s.buffer;!a&&s.base64Image&&(a=Buffer.from(s.base64Image,"base64"));const o=st(t,s.fileName,n,a);if(200!==(await e.request(o)).statusCode)throw new Error("Upload failed");{delete s.base64Image,delete s.buffer;const e=t.options||"";s.imgUrl=r?`${r}/${i}${s.fileName}${e}`:`https://${t.bucket}.${t.area}.aliyuncs.com/${i}${s.fileName}${e}`}}return e}catch(t){throw e.emit(qe.NOTIFICATION,{title:e.i18n.translate("UPLOAD_FAILED"),body:e.i18n.translate("CHECK_SETTINGS")}),t}})(e),console.warn("Using stream mode for aliyun upload, added by terwer, see https://github.com/terwer/Electron-PicGo-Core/blob/dev/src/plugins/uploader/aliyun.ts#L76");const n=e.getConfig("picBed.aliyun");if(!n)throw new Error("Can't find aliYun OSS config");try{const r=new X.default({region:n.area,accessKeyId:n.accessKeyId,accessKeySecret:n.accessKeySecret,bucket:n.bucket}),i=e.output,s=n.customUrl,a=n.path;for(const e of i)if(e.fileName&&e.buffer){let i=rt(e.buffer);!i&&e.base64Image&&(i=Buffer.from(e.base64Image,"base64"));const o=n.options||"",l=`${a}${e.fileName}${o}`,u=C.Readable.from(i),c=await r.putStream(l,u);if(console.log("Using aliyun SDK for upload add by terwer, result=>",c),!(null===(t=null==c?void 0:c.res)||void 0===t?void 0:t.status)||200!==c.res.status)throw new Error("Upload failed");delete e.base64Image,delete e.buffer,e.imgUrl=s?`${s}/${a}${e.fileName}${o}`:`https://${n.bucket}.${n.area}.aliyuncs.com/${a}${e.fileName}${o}`}return e}catch(t){throw e.emit(qe.NOTIFICATION,{title:e.i18n.translate("UPLOAD_FAILED"),body:e.i18n.translate("CHECK_SETTINGS")}),t}},ot=e=>{const t=e.getConfig("picBed.aliyun")||{};return[{name:"accessKeyId",type:"input",get alias(){return e.i18n.translate("PICBED_ALICLOUD_ACCESSKEYID")},default:t.accessKeyId||"",required:!0},{name:"accessKeySecret",type:"password",get alias(){return e.i18n.translate("PICBED_ALICLOUD_ACCESSKEYSECRET")},default:t.accessKeySecret||"",required:!0},{name:"bucket",type:"input",get alias(){return e.i18n.translate("PICBED_ALICLOUD_BUCKET")},default:t.bucket||"",required:!0},{name:"area",type:"input",get prefix(){return e.i18n.translate("PICBED_ALICLOUD_AREA")},get alias(){return e.i18n.translate("PICBED_ALICLOUD_AREA")},default:t.area||"",get message(){return e.i18n.translate("PICBED_ALICLOUD_MESSAGE_AREA")},required:!0},{name:"path",type:"input",get prefix(){return e.i18n.translate("PICBED_ALICLOUD_PATH")},get alias(){return e.i18n.translate("PICBED_ALICLOUD_PATH")},get message(){return e.i18n.translate("PICBED_ALICLOUD_MESSAGE_PATH")},default:t.path||"",required:!1},{name:"customUrl",type:"input",get prefix(){return e.i18n.translate("PICBED_ALICLOUD_CUSTOMURL")},get alias(){return e.i18n.translate("PICBED_ALICLOUD_CUSTOMURL")},get message(){return e.i18n.translate("PICBED_ALICLOUD_MESSAGE_CUSTOMURL")},default:t.customUrl||"",required:!1},{name:"options",type:"input",get prefix(){return e.i18n.translate("PICBED_ALICLOUD_OPTIONS")},get alias(){return e.i18n.translate("PICBED_ALICLOUD_OPTIONS")},get message(){return e.i18n.translate("PICBED_ALICLOUD_MESSAGE_OPTIONS")},default:t.options||"",required:!1}]};const lt=(e,t)=>{const n=e.path||"",r=e.operator,i=e.password,s=ee.default(i),a=(new Date).toUTCString(),o=`PUT&${`/${e.bucket}/${encodeURI(n)}${encodeURI(t)}`}&${a}`;return`UPYUN ${r}:${z.default.createHmac("sha1",s).update(o).digest("base64")}`},ut=(e,t,n,r)=>{const i=e.bucket,s=e.path||"";return{method:"PUT",url:`https://v0.api.upyun.com/${i}/${encodeURI(s)}${encodeURI(t)}`,headers:{Authorization:n,Date:(new Date).toUTCString(),"Content-Type":V.default.lookup(t)||"application/octet-stream"},body:r,resolveWithFullResponse:!0}},ct=async e=>{e||await(async e=>{const t=e.getConfig("picBed.upyun");if(!t)throw new Error("Can't find upYun config");try{const n=e.output,r=t.path||"";for(const i of n)if(i.fileName&&i.buffer){let n=i.buffer;!n&&i.base64Image&&(n=Buffer.from(i.base64Image,"base64"));const s=lt(t,i.fileName),a=ut(t,i.fileName,s,n);if(200!==(await e.request(a)).statusCode)throw new Error("Upload failed");delete i.base64Image,delete i.buffer,i.imgUrl=`${t.url}/${r}${i.fileName}${t.options}`}return e}catch(t){if("Upload failed"===t.message)e.emit(qe.NOTIFICATION,{title:e.i18n.translate("UPLOAD_FAILED"),body:e.i18n.translate("CHECK_SETTINGS")});else{const n=Ne(t.error);e.emit(qe.NOTIFICATION,{title:e.i18n.translate("UPLOAD_FAILED"),body:e.i18n.translate("UPLOAD_FAILED_REASON",{code:"object"==typeof n?n.code:n}),text:"http://docs.upyun.com/api/errno/"})}throw t}})(e),console.warn("Using stream mode for upyun upload, added by terwer, see https://github.com/terwer/Electron-PicGo-Core/blob/dev/src/plugins/uploader/upyun.ts#L88");const t=e.getConfig("picBed.upyun");if(!t)throw new Error("Can't find upYun config");try{const n=t.bucket,r=t.operator,i=t.password,s=new te.default.Service(n,r,i),a=new te.default.Client(s),o=e.output;for(const e of o)if(e.fileName&&e.buffer){let n=rt(e.buffer);!n&&e.base64Image&&(n=Buffer.from(e.base64Image,"base64"));const r=t.path||"",i=`${r}${e.fileName}${t.options}`,s=C.Readable.from(n),o=await a.putFile(i,s);if(console.log("Using upyun SDK for upload add by terwer, res=>",o),!o)throw new Error("Upload failed");delete e.base64Image,delete e.buffer,e.imgUrl=`${t.url}/${r}${e.fileName}${t.options}`}return e}catch(t){if("Upload failed"===t.message)e.emit(qe.NOTIFICATION,{title:e.i18n.translate("UPLOAD_FAILED"),body:e.i18n.translate("CHECK_SETTINGS")});else{const n=Ne(t.error);e.emit(qe.NOTIFICATION,{title:e.i18n.translate("UPLOAD_FAILED"),body:e.i18n.translate("UPLOAD_FAILED_REASON",{code:"object"==typeof n?n.code:n}),text:"http://docs.upyun.com/api/errno/"})}throw t}},dt=e=>{const t=e.getConfig("picBed.upyun")||{};return[{name:"bucket",type:"input",get alias(){return e.i18n.translate("PICBED_UPYUN_BUCKET")},default:t.bucket||"",required:!0},{name:"operator",type:"input",get alias(){return e.i18n.translate("PICBED_UPYUN_OPERATOR")},get prefix(){return e.i18n.translate("PICBED_UPYUN_OPERATOR")},get message(){return e.i18n.translate("PICBED_UPYUN_MESSAGE_OPERATOR")},default:t.operator||"",required:!0},{name:"password",type:"password",get prefix(){return e.i18n.translate("PICBED_UPYUN_MESSAGE_PASSWORD")},get alias(){return e.i18n.translate("PICBED_UPYUN_PASSWORD")},get message(){return e.i18n.translate("PICBED_UPYUN_MESSAGE_PASSWORD")},default:t.password||"",required:!0},{name:"url",type:"input",get alias(){return e.i18n.translate("PICBED_UPYUN_URL")},get message(){return e.i18n.translate("PICBED_UPYUN_MESSAGE_URL")},default:t.url||"",required:!0},{name:"options",type:"input",get prefix(){return e.i18n.translate("PICBED_UPYUN_OPTIONS")},get alias(){return e.i18n.translate("PICBED_UPYUN_OPTIONS")},get message(){return e.i18n.translate("PICBED_UPYUN_MESSAGE_OPTIONS")},default:t.options||"",required:!1},{name:"path",type:"input",get prefix(){return e.i18n.translate("PICBED_UPYUN_PATH")},get alias(){return e.i18n.translate("PICBED_UPYUN_PATH")},get message(){return e.i18n.translate("PICBED_UPYUN_MESSAGE_PATH")},default:t.path||"",required:!1}]};const pt=()=>({register(e){!function(e){e.helper.uploader.register("aliyun",{get name(){return e.i18n.translate("PICBED_ALICLOUD")},handle:at,config:ot})}(e),function(e){e.helper.uploader.register("tcyun",{get name(){return e.i18n.translate("PICBED_TENCENTCLOUD")},handle:We,config:ze})}(e),function(e){e.helper.uploader.register("github",{get name(){return e.i18n.translate("PICBED_GITHUB")},handle:Je,config:Xe})}(e),function(e){e.helper.uploader.register("qiniu",{get name(){return e.i18n.translate("PICBED_QINIU")},handle:tt,config:nt})}(e),function(e){e.helper.uploader.register("upyun",{get name(){return e.i18n.translate("PICBED_UPYUN")},handle:ct,config:dt})}(e)}}),gt=(e,t,n)=>{const r=Ee(t);return r.real||(e.log.warn(`can't get ${n}'s image size`),e.log.warn("fallback to 200 * 200")),r};var Et={handle:async e=>{const t=e.output;return await Promise.all(e.input.map((async(n,r)=>{let i;if(i=pe(n)?await(async(e,t)=>{e=ge(e);let n,r=!1,i="";const s=new Promise(((s,a)=>{(async()=>{var a;try{const a=await t.request({method:"get",url:e,resolveWithFullResponse:!0,responseType:"arraybuffer"}).then((e=>{const t=e.headers["content-type"];return(null==t?void 0:t.includes("image"))&&(r=!0,i=`.${t.split("image/")[1]}`),e.data}));if(clearTimeout(n),r){const t=new o.URL(e).pathname;s({buffer:a,fileName:v.default.basename(t),extname:i,success:!0})}else s({success:!1,reason:`${e} is not image`})}catch(t){clearTimeout(n),s({success:!1,reason:`request ${e} error, ${null!==(a=null==t?void 0:t.message)&&void 0!==a?a:""}`})}})().catch(a)})),a=new Promise((t=>{n=setTimeout((()=>{t({success:!1,reason:`request ${e} timeout`})}),1e4)}));return Promise.race([s,a])})(n,e):await(async e=>{try{return{extname:v.default.extname(e),fileName:v.default.basename(e),buffer:await $.default.readFile(e),success:!0}}catch(t){return{reason:`read file ${e} error`,success:!1}}})(n),!i.success||!i.buffer)throw new Error(i.reason);{const s=gt(e,i.buffer,n);t[r]={buffer:i.buffer,fileName:i.fileName,width:s.width,height:s.height,extname:i.extname}}}))),e.output=t.filter((e=>e)),e}};var _t={handle:async e=>(e.output.push(...e.input),e)};class It{constructor(e){this.list=[],this.fullList=new Set,this.pluginMap=new Map,this.ctx=e,this.init()}init(){const e=v.default.join(this.ctx.baseDir,"package.json");if(!$.default.existsSync(e)){const t={name:"picgo-plugins",description:"picgo-plugins",repository:"https://github.com/PicGo/PicGo-Core",license:"MIT"};$.default.writeFileSync(e,JSON.stringify(t),"utf8")}}resolvePlugin(e,t){try{return ne.default.sync(t,{basedir:e.baseDir})}catch(n){return v.default.join(e.baseDir,"node_modules",t)}}load(){const e=v.default.join(this.ctx.baseDir,"package.json"),t=v.default.join(this.ctx.baseDir,"node_modules/");if(!$.default.existsSync(t))return!1;const n=$.default.readJSONSync(e),r=Object.keys(n.dependencies||{}),i=Object.keys(n.devDependencies||{}),s=r.concat(i).filter((e=>{if(!/^picgo-plugin-|^@[^/]+\/picgo-plugin-/.test(e))return!1;const t=this.resolvePlugin(this.ctx,e);return $.default.existsSync(t)}));for(const e of s)this.registerPlugin(e);return!0}registerPlugin(e,t){if(e&&"string"==typeof e){console.log("Start registering plugin "+e+" ..."),this.fullList.add(e);try{if(t){this.list.push(e),Me(e);const n=t(this.ctx);this.pluginMap.set(e,n),n.register(this.ctx)}else if(!0===this.ctx.getConfig(`picgoPlugins.${e}`)||void 0===this.ctx.getConfig(`picgoPlugins.${e}`)){this.list.push(e),Me(e),this.getPlugin(e).register(this.ctx);const t=`picgoPlugins[${e}]`;this.ctx.saveConfig({[t]:!0})}}catch(t){this.pluginMap.delete(e),this.list=this.list.filter((t=>t!==e)),this.fullList.delete(e),this.ctx.log.error(t),this.ctx.emit(qe.NOTIFICATION,{title:`Plugin ${e} Load Error`,body:t})}}else this.ctx.log.warn("Please provide valid plugin")}unregisterPlugin(e){this.list=this.list.filter((t=>t!==e)),this.fullList.delete(e),this.pluginMap.delete(e),Me(e),this.ctx.helper.uploader.unregister(e),this.ctx.helper.transformer.unregister(e),this.ctx.helper.beforeTransformPlugins.unregister(e),this.ctx.helper.beforeUploadPlugins.unregister(e),this.ctx.helper.afterUploadPlugins.unregister(e),this.ctx.cmd.unregister(e),this.ctx.removeConfig("picgoPlugins",e)}getPlugin(e){if(this.pluginMap.has(e))return this.pluginMap.get(e);const t=v.default.join(this.ctx.baseDir,"node_modules/");console.log("Start requiring plugin lib, pluginDir",t),console.log("Start requiring plugin lib, name",e);const n=require(t+e)(this.ctx);return this.pluginMap.set(e,n),n}getList(){return this.list}hasPlugin(e){return this.fullList.has(e)}getFullList(){return[...this.fullList]}}const ft="picgo-clipboard-images",ht={darwin:'-- From https://github.com/mushanshitiancai/vscode-paste-image\nproperty fileTypes : {{«class PNGf», ".png"}}\n\non run argv\n\tif argv is {} then\n\t\treturn ""\n\tend if\n\n\tif ((clipboard info) as string) contains "«class furl»" then\n\t\treturn POSIX path of (the clipboard as «class furl»)\n\telse\n\t\tset imagePath to (item 1 of argv)\n\t\tset theType to getType()\n\n\t\tif theType is not missing value then\n\t\t\ttry\n\t\t\t\tset myFile to (open for access imagePath with write permission)\n\t\t\t\tset eof myFile to 0\n\t\t\t\twrite (the clipboard as (first item of theType)) to myFile\n\t\t\t\tclose access myFile\n\t\t\t\treturn (POSIX path of imagePath)\n\t\t\ton error\n\t\t\t\ttry\n\t\t\t\t\tclose access myFile\n\t\t\t\tend try\n\t\t\t\treturn "no image"\n\t\t\tend try\n\t\telse\n\t\t\treturn "no image"\n\t\tend if\n\tend if\nend run\n\non getType()\n\trepeat with aType in fileTypes\n\t\trepeat with theInfo in (clipboard info)\n\t\t\tif (first item of theInfo) is equal to (first item of aType) then return aType\n\t\tend repeat\n\tend repeat\n\treturn missing value\nend getType\n',win32:'\nparam($imagePath)\n\n# Adapted from https://github.com/octan3/img-clipboard-dump/blob/master/dump-clipboard-png.ps1\n\nAdd-Type -Assembly PresentationCore\n$img = [Windows.Clipboard]::GetImage()\n\nif ($img -eq $null) {\n "no image"\n Exit 1\n}\n\nif (-not $imagePath) {\n "no image"\n Exit 1\n}\n\n$fcb = new-object Windows.Media.Imaging.FormatConvertedBitmap($img, [Windows.Media.PixelFormats]::Rgb24, $null, 0)\n$stream = [IO.File]::Open($imagePath, "OpenOrCreate")\n$encoder = New-Object Windows.Media.Imaging.PngBitmapEncoder\n$encoder.Frames.Add([Windows.Media.Imaging.BitmapFrame]::Create($fcb)) | out-null\n$encoder.Save($stream) | out-null\n$stream.Dispose() | out-null\n\n$imagePath\n',win10:'# Adapted from https://github.com/octan3/img-clipboard-dump/blob/master/dump-clipboard-png.ps1\nparam($imagePath)\n\n# https://github.com/PowerShell/PowerShell/issues/7233\n# fix the output encoding bug\n[console]::InputEncoding = [console]::OutputEncoding = New-Object System.Text.UTF8Encoding\n\nAdd-Type -Assembly PresentationCore\nfunction main {\n $img = [Windows.Clipboard]::GetImage()\n\n if ($img -eq $null) {\n "no image"\n Exit 1\n }\n\n if (-not $imagePath) {\n "no image"\n Exit 1\n }\n\n $fcb = new-object Windows.Media.Imaging.FormatConvertedBitmap($img, [Windows.Media.PixelFormats]::Rgb24, $null, 0)\n $stream = [IO.File]::Open($imagePath, "OpenOrCreate")\n $encoder = New-Object Windows.Media.Imaging.PngBitmapEncoder\n $encoder.Frames.Add([Windows.Media.Imaging.BitmapFrame]::Create($fcb)) | out-null\n $encoder.Save($stream) | out-null\n $stream.Dispose() | out-null\n\n $imagePath\n # fix windows 10 native cmd crash bug when "picgo upload"\n # https://github.com/PicGo/PicGo-Core/issues/32\n Exit 1\n}\n\ntry {\n # For WIN10\n $file = Get-Clipboard -Format FileDropList\n if ($file -ne $null) {\n Convert-Path $file\n Exit 1\n }\n} catch {\n # For WIN7 WIN8 WIN10\n main\n}\n\nmain',linux:'#!/bin/sh\n\nif [ -z "$DISPLAY" ]; then\n echo "no support" >&2\n exit 1\nfi\n\ncase "$XDG_SESSION_TYPE" in\nwayland)\n command -v wl-copy >/dev/null 2>&1 || {\n echo >&2 "no wl-clipboard"\n exit 1\n }\n filePath=$(wl-copy -o 2>/dev/null | grep ^file:// | cut -c8-)\n if [ -z "$filePath" ]; then\n if\n wl-copy -t image/png image/png -o >"$1" 2>/dev/null\n then\n echo "$1"\n else\n rm -f "$1"\n echo "no image"\n fi\n else\n echo "$filePath"\n fi\n ;;\nx11 | tty)\n # require xclip(see http://stackoverflow.com/questions/592620/check-if-a-program-exists-from-a-bash-script/677212#677212)\n command -v xclip >/dev/null 2>&1 || {\n echo >&2 "no xclip"\n exit 1\n }\n # write image in clipboard to file (see http://unix.stackexchange.com/questions/145131/copy-image-from-clipboard-to-file)\n filePath=$(xclip -selection clipboard -o 2>/dev/null | grep ^file:// | cut -c8-)\n if [ -z "$filePath" ]; then\n if\n xclip -selection clipboard -target image/png -o >"$1" 2>/dev/null\n then\n echo "$1"\n else\n rm -f "$1"\n echo "no image"\n fi\n else\n echo "$filePath"\n fi\n ;;\nesac\n',wsl:'#!/bin/sh\n# grab the paths\nscriptPath=$(echo $0 | awk \'{ print substr( $0, 1, length($0)-6 ) }\')"windows10.ps1"\nimagePath=$(echo $1 | awk \'{ print substr( $0, 1, length($0)-18 ) }\')\nimageName=$(echo $1 | awk \'{ print substr( $0, length($0)-17, length($0) ) }\')\n\n# run the powershell script\nres=$(powershell.exe -noprofile -noninteractive -nologo -sta -executionpolicy unrestricted -file $(wslpath -w $scriptPath) $(wslpath -w $imagePath)"\\\\"$imageName)\n\n# note that there is a return symbol in powershell result\nnoImage=$(echo "no image\\r")\n\n# check whether image exists\nif [ "$res" = "$noImage" ] ;then\n echo "no image"\nelse\n echo $(wslpath -u -a "${res}")\nfi\n'},Pt={darwin:"mac.applescript",win32:"windows.ps1",win10:"windows10.ps1",linux:"linux.sh",wsl:"wsl.sh"};const Ct=async e=>{!function(e){const t=v.default.join(e.baseDir,ft);$.default.existsSync(t)||$.default.mkdirSync(t)}(e);const t=v.default.join(e.baseDir,ft,`${Q.default().format("YYYYMMDDHHmmss")}.png`);return await new Promise(((n,r)=>{const i=(()=>{const e=process.platform;if(re.default)return"wsl";if("win32"===e)return"10"===M.default.release().split(".")[0]?"win10":"win32";return"darwin"===e?"darwin":"linux"})(),s=v.default.join(e.baseDir,Pt[i]);let a;$.default.existsSync(s)||$.default.writeFileSync(s,ht[i],"utf8"),a="darwin"===i?D.spawn("osascript",[s,t]):"win32"===i||"win10"===i?D.spawn("powershell",["-noprofile","-noninteractive","-nologo","-sta","-executionpolicy","unrestricted","-file",s,t]):D.spawn("sh",[s,t]),a.stdout.on("data",(s=>{if("linux"===i&&"no xclip or wl-clipboard"===s.toString().trim())return e.emit(qe.NOTIFICATION,{title:"xclip or wl-clipboard not found",body:"Please install xclip(for x11) or wl-clipboard(for wayland) before run picgo"}),r(new Error("Please install xclip(for x11) or wl-clipboard(for wayland) before run picgo"));const a=s.toString().trim();let o=!1;if(v.default.basename(a)!==v.default.basename(t)&&$.default.existsSync(a)&&(o=!0),"no image"!==a&&!$.default.existsSync(a))return r(new Error(`Can't find ${a}`));n({imgPath:a,shouldKeepAfterUploading:o})}))}))},mt=new n.EventEmitter,Ut=new ae.default.Agent({maxVersion:"TLSv1.2",minVersion:"TLSv1.2"});function Nt(e,t,n){"object"==typeof n&&"value"in n&&"options"in n?e.append(t,n.value,n.options):e.append(t,n)}function Lt(e){return Object.assign(Object.assign({},e),{statusCode:e.status,body:e.data})}function St(e){var t,n,r,i,s,a,o;const l={method:(null===(n=null===(t=null==e?void 0:e.config)||void 0===t?void 0:t.method)||void 0===n?void 0:n.toUpperCase())||"",url:(null===(r=null==e?void 0:e.config)||void 0===r?void 0:r.url)||"",statusCode:(null===(i=null==e?void 0:e.response)||void 0===i?void 0:i.status)||0,message:(null==e?void 0:e.message)||"",stack:(null==e?void 0:e.stack)||{},response:{status:(null===(s=null==e?void 0:e.response)||void 0===s?void 0:s.status)||0,statusCode:(null===(a=null==e?void 0:e.response)||void 0===a?void 0:a.status)||0,body:(null===(o=null==e?void 0:e.response)||void 0===o?void 0:o.data)||""}};return Promise.reject(l)}class Dt{constructor(e){this.proxy="",this.options={},this.ctx=e,this.init(),mt.on(ke.CONFIG_CHANGE,(e=>{var t;switch(e.configName){case"picBed":(null===(t=e.value)||void 0===t?void 0:t.proxy)&&(this.proxy=e.value.proxy);break;case"picBed.proxy":this.proxy=e.value}}))}init(){const e=this.ctx.getConfig("picBed.proxy");e&&(this.proxy=e)}handleProxy(){if(this.proxy)try{const e=new o.URL(this.proxy);return{host:e.hostname,port:parseInt(e.port||"0",10),protocol:e.protocol}}catch(e){console.error(e)}return!1}request(e){var t;this.options.proxy=this.handleProxy(),this.options.headers=e.headers||{},this.options.maxBodyLength=1/0,this.options.maxContentLength=1/0,this.options.proxy&&(null===(t=e.url)||void 0===t?void 0:t.startsWith("https://"))?(this.options.httpsAgent=oe.default.httpsOverHttp({proxy:{host:this.options.proxy.host,port:this.options.proxy.port}}),this.options.proxy=!1):this.options.httpsAgent=Ut;const n=ie.default.create(this.options);n.interceptors.response.use(Lt,St);const r=function(e){var t;let n=!1;const r=Object.assign(Object.assign({},e),{url:e.url||"",headers:e.headers||{}});if(e.proxy){let i=e.proxy;if("string"==typeof i){try{i=new o.URL(e.proxy)}catch(e){i=!1,r.proxy=!1,console.error(e)}n=!0}i&&((null===(t=e.url)||void 0===t?void 0:t.startsWith("https://"))?(r.proxy=!1,r.httpsAgent=oe.default.httpsOverHttp({proxy:{host:null==i?void 0:i.hostname,port:parseInt(null==i?void 0:i.port,10)}})):r.proxy={host:i.hostname,port:parseInt(i.port,10),protocol:"http"})}if("formData"in e){const t=new se.default;for(const n in e.formData)Nt(t,n,e.formData[n]);r.data=t,r.headers=Object.assign(r.headers||{},t.getHeaders()),n=!0,delete r.formData}return"body"in e&&(r.data=e.body,n=!0,delete r.body),"qs"in e&&(r.params=e.qs,n=!0),r.__isOldOptions=n,r}(e);return n.interceptors.request.use((function(e){var t,n,r;let i="";return(null===(t=null==e?void 0:e.headers)||void 0===t?void 0:t.contentType)?(i=e.headers.contentType,delete e.headers.contentType):(null===(n=null==e?void 0:e.headers)||void 0===n?void 0:n.ContentType)?(i=e.headers.ContentType,delete e.headers.ContentType):(null===(r=null==e?void 0:e.headers)||void 0===r?void 0:r["content-type"])&&(i=e.headers["content-type"],delete e.headers["content-type"]),""!==i&&e.headers&&(e.headers["Content-Type"]=i),e})),"resolveWithFullResponse"in e&&e.resolveWithFullResponse?n.request(r):n.request(r).then((t=>r.__isOldOptions?"json"in e?e.json?t.data:void 0:JSON.stringify(t.data):t.data))}}class At{constructor(e){if(this.ctx=e,this.db=new b.JSONStore(this.ctx.configPath),!this.db.has("picBed"))try{this.db.set("picBed",{uploader:"github",current:"github"})}catch(e){throw this.ctx.log.error(e),e}if(!this.db.has("picgoPlugins"))try{this.db.set("picgoPlugins",{})}catch(e){throw this.ctx.log.error(e),e}}read(e){return this.db.read(e)}get(e=""){return this.read(!0),this.db.get(e)}set(e,t){return this.read(!0),this.db.set(e,t)}has(e){return this.read(!0),this.db.has(e)}unset(e,t){return this.read(!0),this.db.unset(e,t)}saveConfig(e){Object.keys(e).forEach((t=>{this.set(t,e[t])}))}removeConfig(e){Object.keys(e).forEach((t=>{this.unset(t,e[t])}))}}class Tt{constructor(e){this.ctx=e}async install(e,t,n){t||(t={});const r=[],i=e.map((e=>yt(this.ctx,e))).filter((e=>this.ctx.pluginLoader.hasPlugin(e.pkgName)?(r.push(e.pkgName),this.ctx.log.success(`PicGo has already installed ${e.pkgName}`),!1):!!e.success)),s=i.map((e=>e.fullName)),a=i.map((e=>e.pkgName));if(s.length>0){const e=await this.execCommand("install",s,this.ctx.baseDir,t,n);if(console.log("execCommand install result=>",e),e.code){const t=this.ctx.i18n.translate("PLUGIN_HANDLER_PLUGIN_INSTALL_FAILED_REASON",{code:`${e.code}`,data:e.data});this.ctx.log.error(t),this.ctx.emit("installFailed",{title:this.ctx.i18n.translate("PLUGIN_HANDLER_PLUGIN_INSTALL_FAILED"),body:t});return{success:!1,body:t}}a.forEach((e=>{this.ctx.pluginLoader.registerPlugin(e)})),this.ctx.log.success(this.ctx.i18n.translate("PLUGIN_HANDLER_PLUGIN_INSTALL_SUCCESS")),this.ctx.emit("installSuccess",{title:this.ctx.i18n.translate("PLUGIN_HANDLER_PLUGIN_INSTALL_SUCCESS"),body:[...a,...r]});return{success:!0,body:[...a,...r]}}if(0===r.length){const e=this.ctx.i18n.translate("PLUGIN_HANDLER_PLUGIN_UNINSTALL_FAILED_VALID");this.ctx.log.error(e),this.ctx.emit("installFailed",{title:this.ctx.i18n.translate("PLUGIN_HANDLER_PLUGIN_INSTALL_FAILED"),body:e});return{success:!1,body:e}}this.ctx.log.success(this.ctx.i18n.translate("PLUGIN_HANDLER_PLUGIN_INSTALL_SUCCESS")),this.ctx.emit("installSuccess",{title:this.ctx.i18n.translate("PLUGIN_HANDLER_PLUGIN_INSTALL_SUCCESS"),body:[...a,...r]});return{success:!0,body:[...a,...r]}}async uninstall(e,t,n){t||(t={});const r=e.map((e=>yt(this.ctx,e))).filter((e=>e.success)).map((e=>e.pkgName));if(r.length>0){const e=await this.execCommand("uninstall",r,this.ctx.baseDir,t,n);if(console.log("execCommand uninstall result=>",e),e.code){const t=this.ctx.i18n.translate("PLUGIN_HANDLER_PLUGIN_UNINSTALL_FAILED_REASON",{code:`${e.code}`,data:e.data});this.ctx.log.error(t),this.ctx.emit("uninstallFailed",{title:this.ctx.i18n.translate("PLUGIN_HANDLER_PLUGIN_UNINSTALL_FAILED"),body:t});return{success:!1,body:t}}r.forEach((e=>{this.ctx.pluginLoader.unregisterPlugin(e)})),this.ctx.log.success(this.ctx.i18n.translate("PLUGIN_HANDLER_PLUGIN_UNINSTALL_SUCCESS")),this.ctx.emit("uninstallSuccess",{title:this.ctx.i18n.translate("PLUGIN_HANDLER_PLUGIN_UNINSTALL_SUCCESS"),body:r});return{success:!0,body:r}}{const e=this.ctx.i18n.translate("PLUGIN_HANDLER_PLUGIN_UNINSTALL_FAILED_VALID");this.ctx.log.error(e),this.ctx.emit("uninstallFailed",{title:this.ctx.i18n.translate("PLUGIN_HANDLER_PLUGIN_UNINSTALL_FAILED"),body:e});return{success:!1,body:e}}}async update(e,t,n){t||(t={});const r=e.map((e=>yt(this.ctx,e))).filter((e=>e.success)).map((e=>e.pkgName));if(r.length>0){const e=await this.execCommand("update",r,this.ctx.baseDir,t,n);if(console.log("execCommand update result=>",e),e.code){const t=this.ctx.i18n.translate("PLUGIN_HANDLER_PLUGIN_UPDATE_FAILED_REASON",{code:`${e.code}`,data:e.data});this.ctx.log.error(t),this.ctx.emit("updateFailed",{title:this.ctx.i18n.translate("PLUGIN_HANDLER_PLUGIN_UPDATE_FAILED"),body:t});return{success:!1,body:t}}this.ctx.log.success(this.ctx.i18n.translate("PLUGIN_HANDLER_PLUGIN_UPDATE_SUCCESS")),this.ctx.emit("updateSuccess",{title:this.ctx.i18n.translate("PLUGIN_HANDLER_PLUGIN_UPDATE_SUCCESS"),body:r});return{success:!0,body:r}}{const e=this.ctx.i18n.translate("PLUGIN_HANDLER_PLUGIN_UPDATE_FAILED_VALID");this.ctx.log.error(e),this.ctx.emit("updateFailed",{title:this.ctx.i18n.translate("PLUGIN_HANDLER_PLUGIN_UPDATE_FAILED"),body:e});return{success:!1,body:e}}}async execCommand(e,t,n,r={},i={}){const s=r.registry||this.ctx.getConfig("settings.registry"),a=r.proxy||this.ctx.getConfig("settings.proxy");return await new Promise((r=>{var o,l;let u=[e].concat(t).concat("--color=always").concat("--save");s&&(u=u.concat(`--registry=${s}`)),a&&(u=u.concat(`--proxy=${a}`));try{const e={cwd:n,env:Object.assign({},process.env,i)};console.log("Start run npm, args=>",u),console.log("Start run npm, npmOptions=>",e);const t=le.default("npm",u,e);let s="";null===(o=t.stdout)||void 0===o||o.on("data",(e=>{s+=e})).pipe(process.stdout),null===(l=t.stderr)||void 0===l||l.on("data",(e=>{s+=e})).pipe(process.stderr),t.on("close",(e=>{r(e?{code:e,data:s}:{code:0,data:s})})),t.on("error",(e=>{this.ctx.log.error(e),this.ctx.log.error("NPM is not installed"),this.ctx.emit(qe.FAILED,"NPM is not installed")}))}catch(e){this.ctx.log.error(e),this.ctx.emit(qe.FAILED,e)}}))}}const yt=(e,t)=>{const n={success:!1,fullName:"",pkgName:""},r=((e,t=console)=>{switch(_e(e)){case"normal":case"scope":return e;case"simple":return fe(e);default:{let n=e;return v.default.isAbsolute(e)&&$.default.existsSync(e)?he(n):(n=v.default.join(process.cwd(),e),$.default.existsSync(n)?he(n):(t.warn(`Can't find plugin ${e}`),""))}}})(t,e.log);if(!r)return n;const i=((e,t=console)=>{var n;switch(_e(e)){case"normal":return Pe(e);case"scope":return Pe(e,!0);case"simple":return Pe(fe(e));default:{if(!$.default.existsSync(e))return t.warn(`Can't find plugin: ${e}`),"";const r=v.default.posix.join(e,"package.json");if($.default.existsSync(r)){const e=$.default.readJSONSync(r)||{};return(null===(n=e.name)||void 0===n?void 0:n.includes("picgo-plugin-"))?e.name:(t.warn(`The plugin package.json's name filed is ${e.name||"empty"}, need to include the prefix: picgo-plugin-`),"")}return t.warn(`Can't find plugin: ${e}`),""}}})(r,e.log);return i?{success:!0,fullName:r,pkgName:i}:n},Ot={"zh-CN":{UPLOAD_FAILED:"上传失败",CHECK_SETTINGS:"请检查你的配置项是否正确",CHECK_SETTINGS_AND_NETWORK:"请检查你的配置项以及网络",UPLOAD_FAILED_REASON:"错误码:${code},请打开浏览器粘贴地址查看相关原因",SERVER_ERROR:"服务端出错,请重试",AUTH_FAILED:"认证失败",PICBED_SMMS:"SM.MS",PICBED_SMMS_TOKEN:"设定Token",PICBED_SMMS_BACKUP_DOMAIN:"备用上传域名",PICBED_SMMS_MESSAGE_BACKUP_DOMAIN:"例如 smms.app",PICBED_ALICLOUD:"阿里云OSS",PICBED_ALICLOUD_ACCESSKEYID:"设定KeyId",PICBED_ALICLOUD_ACCESSKEYSECRET:"设定KeySecret",PICBED_ALICLOUD_BUCKET:"设定Bucket",PICBED_ALICLOUD_AREA:"设定存储区域",PICBED_ALICLOUD_PATH:"设定存储路径",PICBED_ALICLOUD_CUSTOMURL:"设定自定义域名",PICBED_ALICLOUD_OPTIONS:"设定网址后缀",PICBED_ALICLOUD_MESSAGE_AREA:"例如:oss-cn-beijing",PICBED_ALICLOUD_MESSAGE_PATH:"例如:test/",PICBED_ALICLOUD_MESSAGE_OPTIONS:"例如:?x-oss-process=xxx",PICBED_ALICLOUD_MESSAGE_CUSTOMURL:"例如:https://test.com",PICBED_TENCENTCLOUD:"腾讯云COS",PICBED_TENCENTCLOUD_VERSION:"COS版本",PICBED_TENCENTCLOUD_SECRETID:"设定SecretId",PICBED_TENCENTCLOUD_SECRETKEY:"设定SecretKey",PICBED_TENCENTCLOUD_APPID:"设定AppId",PICBED_TENCENTCLOUD_BUCKET:"设定Bucket",PICBED_TENCENTCLOUD_AREA:"设定存储区域",PICBED_TENCENTCLOUD_PATH:"设定存储路径",PICBED_TENCENTCLOUD_OPTIONS:"设定网址后缀",PICBED_TENCENTCLOUD_CUSTOMURL:"设定自定义域名",PICBED_TENCENTCLOUD_MESSAGE_APPID:"例如:1234567890",PICBED_TENCENTCLOUD_MESSAGE_AREA:"例如:ap-beijing",PICBED_TENCENTCLOUD_MESSAGE_PATH:"例如:test/",PICBED_TENCENTCLOUD_MESSAGE_CUSTOMURL:"例如:https://test.com",PICBED_TENCENTCLOUD_MESSAGE_OPTIONS:"例如:?imageMogr2",PICBED_GITHUB:"GitHub",PICBED_GITHUB_TOKEN:"设定Token",PICBED_GITHUB_REPO:"设定仓库名",PICBED_GITHUB_PATH:"设定存储路径",PICBED_GITHUB_BRANCH:"设定分支名",PICBED_GITHUB_CUSTOMURL:"设定自定义域名",PICBED_GITHUB_MESSAGE_REPO:"格式:username/repo",PICBED_GITHUB_MESSAGE_BRANCH:"例如:main",PICBED_GITHUB_MESSAGE_PATH:"例如:test/",PICBED_GITHUB_MESSAGE_CUSTOMURL:"例如:https://test.com",PICBED_QINIU:"七牛云",PICBED_QINIU_ACCESSKEY:"设定AccessKey",PICBED_QINIU_SECRETKEY:"设定SecretKey",PICBED_QINIU_BUCKET:"设定Bucket",PICBED_QINIU_PATH:"设定存储路径",PICBED_QINIU_URL:"设定访问网址",PICBED_QINIU_OPTIONS:"设定网址后缀",PICBED_QINIU_AREA:"设定存储区域",PICBED_QINIU_MESSAGE_PATH:"例如:test/",PICBED_QINIU_MESSAGE_AREA:"例如:z0",PICBED_QINIU_MESSAGE_OPTIONS:"例如:?imageslim",PICBED_QINIU_MESSAGE_URL:"例如:https://xxx.yyy.glb.clouddn.com",PICBED_IMGUR:"Imgur",PICBED_IMGUR_CLIENTID:"设定ClientId",PICBED_IMGUR_PROXY:"设定代理",PICBED_IMGUR_MESSAGE_PROXY:"例如:http://127.0.0.1:1080",PICBED_UPYUN:"又拍云",PICBED_UPYUN_BUCKET:"设定Bucket",PICBED_UPYUN_OPERATOR:"设定操作员",PICBED_UPYUN_PASSWORD:"设定操作员密码",PICBED_UPYUN_PATH:"设定存储路径",PICBED_UPYUN_URL:"设定加速域名",PICBED_UPYUN_OPTIONS:"设定网址后缀",PICBED_UPYUN_MESSAGE_OPERATOR:"例如:me",PICBED_UPYUN_MESSAGE_PASSWORD:"输入操作员密码",PICBED_UPYUN_MESSAGE_URL:"例如:http://xxx.test.upcdn.net",PICBED_UPYUN_MESSAGE_OPTIONS:"例如:!imgslim",PICBED_UPYUN_MESSAGE_PATH:"例如:test/",PLUGIN_HANDLER_PLUGIN_INSTALL_SUCCESS:"插件安装成功",PLUGIN_HANDLER_PLUGIN_INSTALL_FAILED:"插件安装失败",PLUGIN_HANDLER_PLUGIN_INSTALL_FAILED_REASON:"插件安装失败,失败码为${code},错误日志为 \n ${data}",PLUGIN_HANDLER_PLUGIN_INSTALL_FAILED_PATH:"插件安装失败,请输入合法插件名或合法安装路径",PLUGIN_HANDLER_PLUGIN_UNINSTALL_SUCCESS:"插件卸载成功",PLUGIN_HANDLER_PLUGIN_UNINSTALL_FAILED:"插件卸载失败",PLUGIN_HANDLER_PLUGIN_UNINSTALL_FAILED_REASON:"插件卸载失败,失败码为${code},错误日志为 \n ${data}",PLUGIN_HANDLER_PLUGIN_UNINSTALL_FAILED_VALID:"插件卸载失败,请输入合法插件名",PLUGIN_HANDLER_PLUGIN_UPDATE_SUCCESS:"插件更新成功",PLUGIN_HANDLER_PLUGIN_UPDATE_FAILED:"插件更新失败",PLUGIN_HANDLER_PLUGIN_UPDATE_FAILED_REASON:"插件更新失败,失败码为${code},错误日志为 \n ${data}",PLUGIN_HANDLER_PLUGIN_UPDATE_FAILED_VALID:"插件更新失败,请输入合法插件名"},"zh-TW":{UPLOAD_FAILED:"上傳失敗",CHECK_SETTINGS:"請檢查你的設定是否正確",CHECK_SETTINGS_AND_NETWORK:"請檢查你的設定及網路",UPLOAD_FAILED_REASON:"錯誤碼:${code},請打開瀏覽器貼上地址查看相關原因",SERVER_ERROR:"伺服器出錯,請重試",AUTH_FAILED:"認證失敗",PICBED_SMMS:"SM.MS",PICBED_SMMS_TOKEN:"設定Token",PICBED_SMMS_BACKUP_DOMAIN:"備用上傳網址",PICBED_SMMS_MESSAGE_BACKUP_DOMAIN:"例如 smms.app",PICBED_ALICLOUD:"阿里云OSS",PICBED_ALICLOUD_ACCESSKEYID:"設定KeyId",PICBED_ALICLOUD_ACCESSKEYSECRET:"設定KeySecret",PICBED_ALICLOUD_BUCKET:"設定Bucket",PICBED_ALICLOUD_AREA:"設定儲存區域",PICBED_ALICLOUD_PATH:"設定儲存路徑",PICBED_ALICLOUD_CUSTOMURL:"設定自訂網址",PICBED_ALICLOUD_OPTIONS:"設定網址後綴",PICBED_ALICLOUD_MESSAGE_AREA:"例如:oss-cn-beijing",PICBED_ALICLOUD_MESSAGE_PATH:"例如:test/",PICBED_ALICLOUD_MESSAGE_OPTIONS:"例如:?x-oss-process=xxx",PICBED_ALICLOUD_MESSAGE_CUSTOMURL:"例如:https://test.com",PICBED_TENCENTCLOUD:"騰訊云COS",PICBED_TENCENTCLOUD_VERSION:"COS版本",PICBED_TENCENTCLOUD_SECRETID:"設定SecretId",PICBED_TENCENTCLOUD_SECRETKEY:"設定SecretKey",PICBED_TENCENTCLOUD_APPID:"設定AppId",PICBED_TENCENTCLOUD_BUCKET:"設定Bucket",PICBED_TENCENTCLOUD_AREA:"設定儲存區域",PICBED_TENCENTCLOUD_PATH:"設定儲存路徑",PICBED_TENCENTCLOUD_OPTIONS:"設定網址後綴",PICBED_TENCENTCLOUD_CUSTOMURL:"設定自訂網址",PICBED_TENCENTCLOUD_MESSAGE_APPID:"例如:1234567890",PICBED_TENCENTCLOUD_MESSAGE_AREA:"例如:ap-beijing",PICBED_TENCENTCLOUD_MESSAGE_PATH:"例如:test/",PICBED_TENCENTCLOUD_MESSAGE_CUSTOMURL:"例如:https://test.com",PICBED_TENCENTCLOUD_MESSAGE_OPTIONS:"例如:?imageMogr2",PICBED_GITHUB:"GitHub",PICBED_GITHUB_TOKEN:"設定Token",PICBED_GITHUB_REPO:"設定倉庫名稱",PICBED_GITHUB_PATH:"設定儲存路徑",PICBED_GITHUB_BRANCH:"設定分支名稱",PICBED_GITHUB_CUSTOMURL:"設定自訂網址",PICBED_GITHUB_MESSAGE_REPO:"格式:username/repo",PICBED_GITHUB_MESSAGE_BRANCH:"例如:main",PICBED_GITHUB_MESSAGE_PATH:"例如:test/",PICBED_GITHUB_MESSAGE_CUSTOMURL:"例如:https://test.com",PICBED_QINIU:"七牛云",PICBED_QINIU_ACCESSKEY:"設定AccessKey",PICBED_QINIU_SECRETKEY:"設定SecretKey",PICBED_QINIU_BUCKET:"設定Bucket",PICBED_QINIU_PATH:"設定儲存路徑",PICBED_QINIU_URL:"設定訪問網址",PICBED_QINIU_OPTIONS:"設定網址後綴",PICBED_QINIU_AREA:"設定儲存區域",PICBED_QINIU_MESSAGE_PATH:"例如:test/",PICBED_QINIU_MESSAGE_AREA:"例如:z0",PICBED_QINIU_MESSAGE_OPTIONS:"例如:?imageslim",PICBED_QINIU_MESSAGE_URL:"例如:https://xxx.yyy.glb.clouddn.com",PICBED_IMGUR:"Imgur",PICBED_IMGUR_CLIENTID:"設定ClientId",PICBED_IMGUR_PROXY:"設定PROXY",PICBED_IMGUR_MESSAGE_PROXY:"例如:http://127.0.0.1:1080",PICBED_UPYUN:"又拍云",PICBED_UPYUN_BUCKET:"設定Bucket",PICBED_UPYUN_OPERATOR:"設定操作員",PICBED_UPYUN_PASSWORD:"設定操作員密碼",PICBED_UPYUN_PATH:"設定儲存路徑",PICBED_UPYUN_URL:"設定加速網址",PICBED_UPYUN_OPTIONS:"設定網址後綴",PICBED_UPYUN_MESSAGE_OPERATOR:"例如:me",PICBED_UPYUN_MESSAGE_PASSWORD:"輸入操作員密碼",PICBED_UPYUN_MESSAGE_URL:"例如:http://xxx.test.upcdn.net",PICBED_UPYUN_MESSAGE_OPTIONS:"例如:!imgslim",PICBED_UPYUN_MESSAGE_PATH:"例如:test/",PLUGIN_HANDLER_PLUGIN_INSTALL_SUCCESS:"插件安裝成功",PLUGIN_HANDLER_PLUGIN_INSTALL_FAILED:"插件安裝失敗",PLUGIN_HANDLER_PLUGIN_INSTALL_FAILED_REASON:"插件安裝失敗,失敗碼為${code},錯誤紀錄為 \n ${data}",PLUGIN_HANDLER_PLUGIN_INSTALL_FAILED_PATH:"插件安裝失敗,請輸入正確的插件名稱或正確的安裝路徑",PLUGIN_HANDLER_PLUGIN_UNINSTALL_SUCCESS:"插件卸載成功",PLUGIN_HANDLER_PLUGIN_UNINSTALL_FAILED:"插件卸載失敗",PLUGIN_HANDLER_PLUGIN_UNINSTALL_FAILED_REASON:"插件卸載失敗,失敗碼為${code},錯誤紀錄為 \n ${data}",PLUGIN_HANDLER_PLUGIN_UNINSTALL_FAILED_VALID:"插件卸載失敗,請輸入正確的插件名稱",PLUGIN_HANDLER_PLUGIN_UPDATE_SUCCESS:"插件更新成功",PLUGIN_HANDLER_PLUGIN_UPDATE_FAILED:"插件更新失敗",PLUGIN_HANDLER_PLUGIN_UPDATE_FAILED_REASON:"插件更新失敗,失敗碼為${code},錯誤紀錄為 \n ${data}",PLUGIN_HANDLER_PLUGIN_UPDATE_FAILED_VALID:"插件更新失敗,請輸入正確的插件名稱"},en:{UPLOAD_FAILED:"Upload failed",CHECK_SETTINGS:"Please check your settings",CHECK_SETTINGS_AND_NETWORK:"Please check your settings and network",UPLOAD_FAILED_REASON:"Error code: ${code}, please open the browser and paste the address to see the reason",SERVER_ERROR:"Server error, please try again later",AUTH_FAILED:"Authentication failed",PICBED_SMMS:"SM.MS",PICBED_SMMS_TOKEN:"Set Token",PICBED_SMMS_BACKUP_DOMAIN:"Set Backup Upload Domain",PICBED_SMMS_MESSAGE_BACKUP_DOMAIN:"Ex. smms.app",PICBED_ALICLOUD:"Ali Cloud",PICBED_ALICLOUD_ACCESSKEYID:"Set KeyId",PICBED_ALICLOUD_ACCESSKEYSECRET:"Set KeySecret",PICBED_ALICLOUD_BUCKET:"Set Bucket",PICBED_ALICLOUD_AREA:"Set Area",PICBED_ALICLOUD_PATH:"Set Path",PICBED_ALICLOUD_CUSTOMURL:"Set Custom URL",PICBED_ALICLOUD_OPTIONS:"Set URL Suffix",PICBED_ALICLOUD_MESSAGE_AREA:"Ex. oss-cn-beijing",PICBED_ALICLOUD_MESSAGE_PATH:"Ex. test/",PICBED_ALICLOUD_MESSAGE_OPTIONS:"Ex. ?x-oss-process=xxx",PICBED_ALICLOUD_MESSAGE_CUSTOMURL:"Ex. https://test.com",PICBED_TENCENTCLOUD:"Tencent Cloud",PICBED_TENCENTCLOUD_VERSION:"Choose COS version",PICBED_TENCENTCLOUD_SECRETID:"Set SecretId",PICBED_TENCENTCLOUD_SECRETKEY:"Set SecretKey",PICBED_TENCENTCLOUD_APPID:"Set AppId",PICBED_TENCENTCLOUD_BUCKET:"Set Bucket",PICBED_TENCENTCLOUD_AREA:"Set Area",PICBED_TENCENTCLOUD_PATH:"Set Path",PICBED_TENCENTCLOUD_OPTIONS:"Set URL Suffix",PICBED_TENCENTCLOUD_CUSTOMURL:"Set Custom URL",PICBED_TENCENTCLOUD_MESSAGE_APPID:"Ex. 1234567890",PICBED_TENCENTCLOUD_MESSAGE_AREA:"Ex. ap-beijing",PICBED_TENCENTCLOUD_MESSAGE_PATH:"Ex. test/",PICBED_TENCENTCLOUD_MESSAGE_CUSTOMURL:"Ex. http://test.com",PICBED_TENCENTCLOUD_MESSAGE_OPTIONS:"Ex. ?imageMogr2",PICBED_GITHUB:"GitHub",PICBED_GITHUB_TOKEN:"Set Token",PICBED_GITHUB_REPO:"Set Repo Name",PICBED_GITHUB_PATH:"Set Path",PICBED_GITHUB_BRANCH:"Set Branch",PICBED_GITHUB_CUSTOMURL:"Set Custom URL",PICBED_GITHUB_MESSAGE_REPO:"Ex. username/repo",PICBED_GITHUB_MESSAGE_BRANCH:"Ex. main",PICBED_GITHUB_MESSAGE_PATH:"Ex. test/",PICBED_GITHUB_MESSAGE_CUSTOMURL:"Ex. https://test.com",PICBED_QINIU:"Qiniu",PICBED_QINIU_ACCESSKEY:"Set AccessKey",PICBED_QINIU_SECRETKEY:"Set SecretKey",PICBED_QINIU_BUCKET:"Set Bucket",PICBED_QINIU_PATH:"Set Path",PICBED_QINIU_URL:"Set URL",PICBED_QINIU_OPTIONS:"Set URL Suffix",PICBED_QINIU_AREA:"Set Area",PICBED_QINIU_MESSAGE_PATH:"Ex. test/",PICBED_QINIU_MESSAGE_AREA:"Ex. z0",PICBED_QINIU_MESSAGE_OPTIONS:"Ex. ?imageslim",PICBED_QINIU_MESSAGE_URL:"Ex. https://xxx.yyy.glb.clouddn.com",PICBED_IMGUR:"Imgur",PICBED_IMGUR_CLIENTID:"Set ClientId",PICBED_IMGUR_PROXY:"Set Proxy",PICBED_IMGUR_MESSAGE_PROXY:"Ex. http://127.0.0.1:1080",PICBED_UPYUN:"Upyun",PICBED_UPYUN_BUCKET:"Set Bucket",PICBED_UPYUN_OPERATOR:"Set Operator",PICBED_UPYUN_PASSWORD:"Set Operator Password",PICBED_UPYUN_PATH:"Set Path",PICBED_UPYUN_URL:"Set URL",PICBED_UPYUN_OPTIONS:"Set URL Suffix",PICBED_UPYUN_MESSAGE_OPERATOR:"Ex. me",PICBED_UPYUN_MESSAGE_PASSWORD:"Please type the operator password",PICBED_UPYUN_MESSAGE_URL:"Ex. http://xxx.test.upcdn.net",PICBED_UPYUN_MESSAGE_OPTIONS:"Ex. !imgslim",PICBED_UPYUN_MESSAGE_PATH:"Ex. test/",PLUGIN_HANDLER_PLUGIN_INSTALL_SUCCESS:"Plugin installed successfully",PLUGIN_HANDLER_PLUGIN_INSTALL_FAILED:"Plugin installation failed",PLUGIN_HANDLER_PLUGIN_INSTALL_FAILED_REASON:"Plugin installation failed, error code is ${code}, error log is \n ${data}",PLUGIN_HANDLER_PLUGIN_INSTALL_FAILED_PATH:"Plugin installation failed, please enter a valid plugin name or valid installation path",PLUGIN_HANDLER_PLUGIN_UNINSTALL_SUCCESS:"Plugin uninstalled successfully",PLUGIN_HANDLER_PLUGIN_UNINSTALL_FAILED:"Plugin uninstall failed",PLUGIN_HANDLER_PLUGIN_UNINSTALL_FAILED_REASON:"Plugin uninstall failed, error code is ${code}, error log is \n ${data}",PLUGIN_HANDLER_PLUGIN_UNINSTALL_FAILED_VALID:"Plugin uninstall failed, please enter a valid plugin name",PLUGIN_HANDLER_PLUGIN_UPDATE_SUCCESS:"Plugin updated successfully",PLUGIN_HANDLER_PLUGIN_UPDATE_FAILED:"Plugin update failed",PLUGIN_HANDLER_PLUGIN_UPDATE_FAILED_REASON:"Plugin update failed, error code is ${code}, error log is \n ${data}",PLUGIN_HANDLER_PLUGIN_UPDATE_FAILED_VALID:"Plugin update failed, please enter a valid plugin name"}};class Bt{constructor(e){this.ctx=e,this.objectAdapter=new R.ObjectAdapter(Ot);let t=this.ctx.getConfig("settings.language")||"zh-CN";Ot[t]||(t="zh-CN"),this.i18n=new R.I18n({adapter:this.objectAdapter,defaultLanguage:t}),this.loadOutterI18n()}loadOutterI18n(){const e=this.getOutterI18nFolder();$.default.readdirSync(e,{withFileTypes:!0}).forEach((t=>{if(t.isFile()&&t.name.endsWith(".yml")){const n=v.default.join(e,t.name),r=$.default.readFileSync(n,"utf8");try{const e=ue.default.load(r);Ot[t.name.replace(/\.yml$/,"")]=e}catch(e){console.error(e)}}}))}getOutterI18nFolder(){const e=v.default.join(this.ctx.baseDir,"i18n-cli");return $.default.pathExistsSync(e)||$.default.ensureDirSync(e),e}translate(e,t){return this.i18n.translate(e,t)||e}setLanguage(e){this.i18n.setLanguage(e),this.ctx.saveConfig({"settings.language":e})}addLocale(e,t){const n=this.objectAdapter.getLocale(e);if(!n)return!1;const r=S.merge(n,t);return this.objectAdapter.setLocale(e,r),!0}addLanguage(e,t){return!this.objectAdapter.getLocale(e)&&(this.objectAdapter.setLocale(e,t),Ot[e]=t,!0)}getLanguageList(){return Object.keys(Ot)}}class bt extends n.EventEmitter{get pluginLoader(){return this._pluginLoader}constructor(e=""){super(),this.VERSION="1.7.0",this.configPath=e,this.output=[],this.input=[],this.helper={transformer:new ve("transformer"),uploader:new ve("uploader"),beforeTransformPlugins:new ve("beforeTransformPlugins"),beforeUploadPlugins:new ve("beforeUploadPlugins"),afterUploadPlugins:new ve("afterUploadPlugins")},this.initConfigPath(),this.log=new Ke(this),this.cmd=new He(this),this.pluginHandler=new Tt(this),this.initConfig(),this.init()}initConfigPath(){if(""===this.configPath&&(this.configPath=r.homedir()+"/.picgo/config.json"),".JSON"!==v.default.extname(this.configPath).toUpperCase())throw this.configPath="",Error("The configuration file only supports JSON format.");this.baseDir=v.default.dirname(this.configPath);$.default.pathExistsSync(this.configPath)||$.default.ensureFileSync(`${this.configPath}`)}initConfig(){this.db=new At(this),this._config=this.db.read(!0)}init(){try{this.i18n=new Bt(this),this.Request=new Dt(this),this._pluginLoader=new It(this),Me("picgo"),pt().register(this),{register(e){e.helper.transformer.register("path",Et),e.helper.transformer.register("base64",_t)}}.register(this),Me(""),this._pluginLoader.load(),this.lifecycle=new Ye(this)}catch(e){throw this.emit(qe.UPLOAD_PROGRESS,-1),this.log.error(e),e}}use(e,t){if(t)return this.pluginLoader.registerPlugin(t,e),this.pluginLoader.getPlugin(t);return e(this)}registerCommands(){""!==this.configPath&&(this.cmd.init(),this.cmd.loadCommands())}getConfig(e){return e?S.get(this._config,e):this._config}saveConfig(e){Ue(e)?(this.setConfig(e),this.db.saveConfig(e)):this.log.warn("the format of config is invalid, please provide object")}removeConfig(e,t){e&&t&&(me(e)?this.log.warn(`the config.${e} can't be removed`):(this.unsetConfig(e,t),this.db.unset(e,t)))}setConfig(e){Ue(e)?Object.keys(e).forEach((t=>{me(t)&&(this.log.warn(`the config.${t} can't be modified`),delete e[t]),S.set(this._config,t,e[t]),mt.emit(ke.CONFIG_CHANGE,{configName:t,value:e[t]})})):this.log.warn("the format of config is invalid, please provide object")}unsetConfig(e,t){e&&t&&(me(e)?this.log.warn(`the config.${e} can't be unset`):S.unset(this.getConfig(e),t))}get request(){return this.Request.request.bind(this.Request)}async upload(e){if(""===this.configPath)return this.log.error("The configuration file only supports JSON format."),[];if(void 0!==e&&0!==e.length){const{output:t}=await this.lifecycle.start(e);return t}try{const{imgPath:e,shouldKeepAfterUploading:t}=await Ct(this);if("no image"===e)throw new Error("image not found in clipboard");{this.once(qe.FAILED,(()=>{t||$.default.remove(e).catch((e=>{this.log.error(e)}))})),this.once("finished",(()=>{t||$.default.remove(e).catch((e=>{this.log.error(e)}))}));const{output:n}=await this.lifecycle.start([e]);return n}}catch(e){throw this.emit(qe.FAILED,e),e}}}exports.Commander=He,exports.Lifecycle=Ye,exports.LifecyclePlugins=ve,exports.Logger=Ke,exports.PicGo=bt,exports.PluginHandler=Tt,exports.PluginLoader=It,exports.Request=Dt;
-//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguY2pzLmpzIiwic291cmNlcyI6WyIuLi9zcmMvcGx1Z2lucy9jb21tYW5kZXIvcGx1Z2luSGFuZGxlci50cyIsIi4uL3NyYy9wbHVnaW5zL2NvbW1hbmRlci9jb25maWcudHMiLCIuLi9zcmMvdXRpbHMvY29tbW9uLnRzIiwiLi4vc3JjL3BsdWdpbnMvY29tbWFuZGVyL3VwbG9hZC50cyIsIi4uL3NyYy9wbHVnaW5zL2NvbW1hbmRlci9zZXR0aW5nLnRzIiwiLi4vc3JjL3BsdWdpbnMvY29tbWFuZGVyL3VzZS50cyIsIi4uL3NyYy9wbHVnaW5zL2NvbW1hbmRlci9wcm94eS50cyIsIi4uL3NyYy91dGlscy9pbml0VXRpbHMudHMiLCIuLi9zcmMvcGx1Z2lucy9jb21tYW5kZXIvaW5pdC50cyIsIi4uL3NyYy9wbHVnaW5zL2NvbW1hbmRlci9pMThuLnRzIiwiLi4vc3JjL2xpYi9MaWZlY3ljbGVQbHVnaW5zLnRzIiwiLi4vc3JjL2xpYi9Db21tYW5kZXIudHMiLCIuLi9zcmMvcGx1Z2lucy9jb21tYW5kZXIvaW5kZXgudHMiLCIuLi9zcmMvdXRpbHMvZW51bS50cyIsIi4uL3NyYy9saWIvTG9nZ2VyLnRzIiwiLi4vc3JjL2NvcmUvTGlmZWN5Y2xlLnRzIiwiLi4vc3JjL3V0aWxzL2NyZWF0ZUNvbnRleHQudHMiLCIuLi9zcmMvcGx1Z2lucy91cGxvYWRlci90Y3l1bi50cyIsIi4uL3NyYy9wbHVnaW5zL3VwbG9hZGVyL2dpdGh1Yi50cyIsIi4uL3NyYy9wbHVnaW5zL3VwbG9hZGVyL3Fpbml1LnRzIiwiLi4vc3JjL3V0aWxzL3N0cmVhbVV0aWxzLnRzIiwiLi4vc3JjL3BsdWdpbnMvdXBsb2FkZXIvYWxpeXVuLnRzIiwiLi4vc3JjL3BsdWdpbnMvdXBsb2FkZXIvdXB5dW4udHMiLCIuLi9zcmMvcGx1Z2lucy91cGxvYWRlci9pbmRleC50cyIsIi4uL3NyYy9wbHVnaW5zL3RyYW5zZm9ybWVyL3BhdGgudHMiLCIuLi9zcmMvcGx1Z2lucy90cmFuc2Zvcm1lci9iYXNlNjQudHMiLCIuLi9zcmMvbGliL1BsdWdpbkxvYWRlci50cyIsIi4uL3NyYy91dGlscy9zdGF0aWMudHMiLCIuLi9zcmMvdXRpbHMvZ2V0Q2xpcGJvYXJkSW1hZ2UudHMiLCIuLi9zcmMvdXRpbHMvZXZlbnRCdXMudHMiLCIuLi9zcmMvbGliL1JlcXVlc3QudHMiLCIuLi9zcmMvdXRpbHMvZGIudHMiLCIuLi9zcmMvbGliL1BsdWdpbkhhbmRsZXIudHMiLCIuLi9zcmMvaTE4bi9pbmRleC50cyIsIi4uL3NyYy9pMThuL3poLUNOLnRzIiwiLi4vc3JjL2kxOG4vemgtVFcudHMiLCIuLi9zcmMvaTE4bi9lbi50cyIsIi4uL3NyYy9jb3JlL1BpY0dvLnRzIiwiLi4vc3JjL3BsdWdpbnMvdHJhbnNmb3JtZXIvaW5kZXgudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSVBpY0dvLCBJUGx1Z2luIH0gZnJvbSBcIi4uLy4uL3R5cGVzXCJcblxuY29uc3QgcGx1Z2luSGFuZGxlcjogSVBsdWdpbiA9IHtcbiAgaGFuZGxlOiAoY3R4OiBJUGljR28pID0+IHtcbiAgICAvLyBjb25zdCBwbHVnaW5IYW5kbGVyID0gbmV3IFBsdWdpbkhhbmRsZXIoY3R4KVxuICAgIGNvbnN0IGNtZCA9IGN0eC5jbWRcbiAgICBjbWQucHJvZ3JhbVxuICAgICAgLmNvbW1hbmQoXCJpbnN0YWxsIDxwbHVnaW5zLi4uPlwiKVxuICAgICAgLmRlc2NyaXB0aW9uKFwiaW5zdGFsbCBwaWNnbyBwbHVnaW5cIilcbiAgICAgIC5hbGlhcyhcImFkZFwiKVxuICAgICAgLm9wdGlvbihcIi1wLCAtLXByb3h5IDxwcm94eT5cIiwgXCJBZGQgcHJveHkgZm9yIGluc3RhbGxpbmdcIilcbiAgICAgIC5vcHRpb24oXCItciwgLS1yZWdpc3RyeSA8cmVnaXN0cnk+XCIsIFwiQ2hvb3NlIGEgcmVnaXN0cnkgZm9yIGluc3RhbGxpbmdcIilcbiAgICAgIC5hY3Rpb24oKHBsdWdpbnM6IHN0cmluZ1tdLCBwcm9ncmFtOiBhbnkpID0+IHtcbiAgICAgICAgY29uc3QgeyBwcm94eSwgcmVnaXN0cnkgfSA9IHByb2dyYW1cbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgICBwcm94eSxcbiAgICAgICAgICByZWdpc3RyeSxcbiAgICAgICAgfVxuICAgICAgICBjdHgucGx1Z2luSGFuZGxlci5pbnN0YWxsKHBsdWdpbnMsIG9wdGlvbnMpLmNhdGNoKChlKSA9PiB7XG4gICAgICAgICAgY3R4LmxvZy5lcnJvcihlKVxuICAgICAgICB9KVxuICAgICAgfSlcbiAgICBjbWQucHJvZ3JhbVxuICAgICAgLmNvbW1hbmQoXCJ1bmluc3RhbGwgPHBsdWdpbnMuLi4+XCIpXG4gICAgICAuYWxpYXMoXCJybVwiKVxuICAgICAgLmRlc2NyaXB0aW9uKFwidW5pbnN0YWxsIHBpY2dvIHBsdWdpblwiKVxuICAgICAgLmFjdGlvbigocGx1Z2luczogc3RyaW5nW10pID0+IHtcbiAgICAgICAgY3R4LnBsdWdpbkhhbmRsZXIudW5pbnN0YWxsKHBsdWdpbnMpLmNhdGNoKChlKSA9PiB7XG4gICAgICAgICAgY3R4LmxvZy5lcnJvcihlKVxuICAgICAgICB9KVxuICAgICAgfSlcbiAgICBjbWQucHJvZ3JhbVxuICAgICAgLmNvbW1hbmQoXCJ1cGRhdGUgPHBsdWdpbnMuLi4+XCIpXG4gICAgICAuZGVzY3JpcHRpb24oXCJ1cGRhdGUgcGljZ28gcGx1Z2luXCIpXG4gICAgICAub3B0aW9uKFwiLXAsIC0tcHJveHkgPHByb3h5PlwiLCBcIkFkZCBwcm94eSBmb3IgaW5zdGFsbGluZ1wiKVxuICAgICAgLm9wdGlvbihcIi1yLCAtLXJlZ2lzdHJ5IDxyZWdpc3RyeT5cIiwgXCJDaG9vc2UgYSByZWdpc3RyeSBmb3IgaW5zdGFsbGluZ1wiKVxuICAgICAgLmFjdGlvbigocGx1Z2luczogc3RyaW5nW10sIHByb2dyYW06IGFueSkgPT4ge1xuICAgICAgICBjb25zdCB7IHByb3h5LCByZWdpc3RyeSB9ID0gcHJvZ3JhbVxuICAgICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICAgIHByb3h5LFxuICAgICAgICAgIHJlZ2lzdHJ5LFxuICAgICAgICB9XG4gICAgICAgIGN0eC5wbHVnaW5IYW5kbGVyLnVwZGF0ZShwbHVnaW5zLCBvcHRpb25zKS5jYXRjaCgoZTogRXJyb3IpID0+IHtcbiAgICAgICAgICBjdHgubG9nLmVycm9yKGUpXG4gICAgICAgIH0pXG4gICAgICB9KVxuICB9LFxufVxuXG5leHBvcnQgZGVmYXVsdCBwbHVnaW5IYW5kbGVyXG4iLCJpbXBvcnQgeyBJUGljR28sIElQbHVnaW4gfSBmcm9tIFwiLi4vLi4vdHlwZXNcIlxuXG5jb25zdCBjb25maWc6IElQbHVnaW4gPSB7XG4gIGhhbmRsZTogKGN0eDogSVBpY0dvKSA9PiB7XG4gICAgY29uc3QgY21kID0gY3R4LmNtZFxuICAgIGNtZC5wcm9ncmFtLm9wdGlvbihcIi1jLCAtLWNvbmZpZyA8cGF0aD5cIiwgXCJzZXQgY29uZmlnIHBhdGhcIilcbiAgICAvLyB3aWxsIGhhbmRsZSBpbiBgYmluL3BpY2dvYFxuICB9LFxufVxuXG5leHBvcnQgZGVmYXVsdCBjb25maWdcbiIsImltcG9ydCBmcyBmcm9tIFwiZnMtZXh0cmFcIlxuaW1wb3J0IHBhdGggZnJvbSBcInBhdGhcIlxuaW1wb3J0IHsgaW1hZ2VTaXplIH0gZnJvbSBcImltYWdlLXNpemVcIlxuaW1wb3J0IHsgSUltZ1NpemUsIElQYXRoVHJhbnNmb3JtZWRJbWdJbmZvLCBJUGx1Z2luTmFtZVR5cGUsIElMb2dnZXIsIElQaWNHbyB9IGZyb20gXCIuLi90eXBlc1wiXG5pbXBvcnQgeyBVUkwgfSBmcm9tIFwidXJsXCJcblxuZXhwb3J0IGNvbnN0IGlzVXJsID0gKHVybDogc3RyaW5nKTogYm9vbGVhbiA9PiB1cmwuc3RhcnRzV2l0aChcImh0dHA6Ly9cIikgfHwgdXJsLnN0YXJ0c1dpdGgoXCJodHRwczovL1wiKVxuZXhwb3J0IGNvbnN0IGlzVXJsRW5jb2RlID0gKHVybDogc3RyaW5nKTogYm9vbGVhbiA9PiB7XG4gIHVybCA9IHVybCB8fCBcIlwiXG4gIHRyeSB7XG4gICAgLy8gdGhlIHdob2xlIHVybCBlbmNvZGUgb3IgZGVjb2RlIHNob2xkIG5vdCB1c2UgZW5jb2RlVVJJQ29tcG9uZW50IG9yIGRlY29kZVVSSUNvbXBvbmVudFxuICAgIHJldHVybiB1cmwgIT09IGRlY29kZVVSSSh1cmwpXG4gIH0gY2F0Y2ggKGUpIHtcbiAgICAvLyBpZiBzb21lIGVycm9yIGNhdWdodCwgdHJ5IHRvIGxldCBpdCBnb1xuICAgIHJldHVybiB0cnVlXG4gIH1cbn1cbmV4cG9ydCBjb25zdCBoYW5kbGVVcmxFbmNvZGUgPSAodXJsOiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICBpZiAoIWlzVXJsRW5jb2RlKHVybCkpIHtcbiAgICB1cmwgPSBlbmNvZGVVUkkodXJsKVxuICB9XG4gIHJldHVybiB1cmxcbn1cblxuZXhwb3J0IGNvbnN0IGdldEltYWdlU2l6ZSA9IChmaWxlOiBCdWZmZXIpOiBJSW1nU2l6ZSA9PiB7XG4gIHRyeSB7XG4gICAgY29uc3QgeyB3aWR0aCA9IDAsIGhlaWdodCA9IDAgfSA9IGltYWdlU2l6ZShmaWxlKVxuICAgIHJldHVybiB7XG4gICAgICByZWFsOiB0cnVlLFxuICAgICAgd2lkdGgsXG4gICAgICBoZWlnaHQsXG4gICAgfVxuICB9IGNhdGNoIChlKSB7XG4gICAgLy8gZmFsbGJhY2sgdG8gMjAwICogMjAwXG4gICAgcmV0dXJuIHtcbiAgICAgIHJlYWw6IGZhbHNlLFxuICAgICAgd2lkdGg6IDIwMCxcbiAgICAgIGhlaWdodDogMjAwLFxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY29uc3QgZ2V0RlNGaWxlID0gYXN5bmMgKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPElQYXRoVHJhbnNmb3JtZWRJbWdJbmZvPiA9PiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGV4dG5hbWU6IHBhdGguZXh0bmFtZShmaWxlUGF0aCksXG4gICAgICBmaWxlTmFtZTogcGF0aC5iYXNlbmFtZShmaWxlUGF0aCksXG4gICAgICBidWZmZXI6IGF3YWl0IGZzLnJlYWRGaWxlKGZpbGVQYXRoKSxcbiAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgfVxuICB9IGNhdGNoIHtcbiAgICByZXR1cm4ge1xuICAgICAgcmVhc29uOiBgcmVhZCBmaWxlICR7ZmlsZVBhdGh9IGVycm9yYCxcbiAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY29uc3QgZ2V0VVJMRmlsZSA9IGFzeW5jICh1cmw6IHN0cmluZywgY3R4OiBJUGljR28pOiBQcm9taXNlPElQYXRoVHJhbnNmb3JtZWRJbWdJbmZvPiA9PiB7XG4gIHVybCA9IGhhbmRsZVVybEVuY29kZSh1cmwpXG4gIGxldCBpc0ltYWdlID0gZmFsc2VcbiAgbGV0IGV4dG5hbWUgPSBcIlwiXG4gIGxldCB0aW1lb3V0SWQ6IE5vZGVKUy5UaW1lb3V0XG4gIGNvbnN0IHJlcXVlc3RGbiA9IG5ldyBQcm9taXNlPElQYXRoVHJhbnNmb3JtZWRJbWdJbmZvPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgOyhhc3luYyAoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBjdHhcbiAgICAgICAgICAucmVxdWVzdCh7XG4gICAgICAgICAgICBtZXRob2Q6IFwiZ2V0XCIsXG4gICAgICAgICAgICB1cmwsXG4gICAgICAgICAgICByZXNvbHZlV2l0aEZ1bGxSZXNwb25zZTogdHJ1ZSxcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJhcnJheWJ1ZmZlclwiLFxuICAgICAgICAgIH0pXG4gICAgICAgICAgLnRoZW4oKHJlc3ApID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRlbnRUeXBlID0gcmVzcC5oZWFkZXJzW1wiY29udGVudC10eXBlXCJdXG4gICAgICAgICAgICBpZiAoY29udGVudFR5cGU/LmluY2x1ZGVzKFwiaW1hZ2VcIikpIHtcbiAgICAgICAgICAgICAgaXNJbWFnZSA9IHRydWVcbiAgICAgICAgICAgICAgZXh0bmFtZSA9IGAuJHtjb250ZW50VHlwZS5zcGxpdChcImltYWdlL1wiKVsxXX1gXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzcC5kYXRhIGFzIEJ1ZmZlclxuICAgICAgICAgIH0pXG4gICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0SWQpXG4gICAgICAgIGlmIChpc0ltYWdlKSB7XG4gICAgICAgICAgY29uc3QgdXJsUGF0aCA9IG5ldyBVUkwodXJsKS5wYXRobmFtZVxuICAgICAgICAgIHJlc29sdmUoe1xuICAgICAgICAgICAgYnVmZmVyOiByZXMsXG4gICAgICAgICAgICBmaWxlTmFtZTogcGF0aC5iYXNlbmFtZSh1cmxQYXRoKSxcbiAgICAgICAgICAgIGV4dG5hbWUsXG4gICAgICAgICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgICAgIH0pXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzb2x2ZSh7XG4gICAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICAgIHJlYXNvbjogYCR7dXJsfSBpcyBub3QgaW1hZ2VgLFxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRJZClcbiAgICAgICAgcmVzb2x2ZSh7XG4gICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9yZXN0cmljdC10ZW1wbGF0ZS1leHByZXNzaW9uc1xuICAgICAgICAgIHJlYXNvbjogYHJlcXVlc3QgJHt1cmx9IGVycm9yLCAke2Vycm9yPy5tZXNzYWdlID8/IFwiXCJ9YCxcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9KSgpLmNhdGNoKHJlamVjdClcbiAgfSlcbiAgY29uc3QgdGltZW91dFByb21pc2UgPSBuZXcgUHJvbWlzZTxJUGF0aFRyYW5zZm9ybWVkSW1nSW5mbz4oKHJlc29sdmUpOiB2b2lkID0+IHtcbiAgICB0aW1lb3V0SWQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHJlc29sdmUoe1xuICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgcmVhc29uOiBgcmVxdWVzdCAke3VybH0gdGltZW91dGAsXG4gICAgICB9KVxuICAgIH0sIDEwMDAwKVxuICB9KVxuICByZXR1cm4gUHJvbWlzZS5yYWNlKFtyZXF1ZXN0Rm4sIHRpbWVvdXRQcm9taXNlXSlcbn1cblxuLyoqXG4gKiBkZXRlY3QgdGhlIGlucHV0IHN0cmluZydzIHR5cGVcbiAqIGZvciBleGFtcGxlXG4gKiAxLiBAeHh4L3BpY2dvLXBsdWdpbi14eHggLT4gc2NvcGVcbiAqIDIuIHBpY2dvLXBsdWdpbi14eHggLT4gbm9ybWFsXG4gKiAzLiB4eHggLT4gc2ltcGxlXG4gKiA0LiBub3QgZXhpc3RzIG9yIGlzIGEgcGF0aCAtPiB1bmtub3duXG4gKiBAcGFyYW0gbmFtZVxuICovXG5leHBvcnQgY29uc3QgZ2V0UGx1Z2luTmFtZVR5cGUgPSAobmFtZTogc3RyaW5nKTogSVBsdWdpbk5hbWVUeXBlID0+IHtcbiAgaWYgKC9eQFteL10rXFwvcGljZ28tcGx1Z2luLS8udGVzdChuYW1lKSkge1xuICAgIHJldHVybiBcInNjb3BlXCJcbiAgfSBlbHNlIGlmIChuYW1lLnN0YXJ0c1dpdGgoXCJwaWNnby1wbHVnaW4tXCIpKSB7XG4gICAgcmV0dXJuIFwibm9ybWFsXCJcbiAgfSBlbHNlIGlmIChpc1NpbXBsZU5hbWUobmFtZSkpIHtcbiAgICByZXR1cm4gXCJzaW1wbGVcIlxuICB9XG4gIHJldHVybiBcInVua25vd25cIlxufVxuXG4vKipcbiAqIGRldGVjdCB0aGUgaW5wdXQgc3RyaW5nIGlzIGEgc2ltcGxlIHBsdWdpbiBuYW1lIG9yIG5vdFxuICogZm9yIGV4YW1wbGVcbiAqIDEuIHh4eCAtPiB0cnVlXG4gKiAyLiAvVXNyL3h4L3h4eHgvcGljZ28tcGx1Z2luLXh4eCAtPiBmYWxzZVxuICogQHBhcmFtIG5hbWUgcGx1Z2luTmFtZU9yUGF0aFxuICovXG5leHBvcnQgY29uc3QgaXNTaW1wbGVOYW1lID0gKG5hbWVPclBhdGg6IHN0cmluZyk6IGJvb2xlYW4gPT4ge1xuICBpZiAocGF0aC5pc0Fic29sdXRlKG5hbWVPclBhdGgpKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbiAgY29uc3QgcGx1Z2luUGF0aCA9IHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCBuYW1lT3JQYXRoKVxuICBpZiAoZnMuZXhpc3RzU3luYyhwbHVnaW5QYXRoKSkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG4gIGlmIChuYW1lT3JQYXRoLmluY2x1ZGVzKFwiL1wiKSB8fCBuYW1lT3JQYXRoLmluY2x1ZGVzKFwiXFxcXFwiKSkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG4gIHJldHVybiB0cnVlXG59XG5cbi8qKlxuICogc3RyZWFtbGluZSB0aGUgZnVsbCBwbHVnaW4gbmFtZSB0byBhIHNpbXBsZSBvbmVcbiAqIGZvciBleGFtcGxlOlxuICogMS4gcGljZ28tcGx1Z2luLXh4eCAtPiB4eHhcbiAqIDIuIEB4eHgvcGljZ28tcGx1Z2luLXl5eSAtPiB5eXlcbiAqIEBwYXJhbSBuYW1lIHBsdWdpbkZ1bGxOYW1lXG4gKi9cbmV4cG9ydCBjb25zdCBoYW5kbGVTdHJlYW1saW5lUGx1Z2luTmFtZSA9IChuYW1lOiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICBpZiAoL15AW14vXStcXC9waWNnby1wbHVnaW4tLy50ZXN0KG5hbWUpKSB7XG4gICAgcmV0dXJuIG5hbWUucmVwbGFjZSgvXkBbXi9dK1xcL3BpY2dvLXBsdWdpbi0vLCBcIlwiKVxuICB9IGVsc2Uge1xuICAgIHJldHVybiBuYW1lLnJlcGxhY2UoL3BpY2dvLXBsdWdpbi0vLCBcIlwiKVxuICB9XG59XG5cbi8qKlxuICogY29tcGxldGUgcGx1Z2luIG5hbWUgdG8gZnVsbCBuYW1lXG4gKiBmb3IgZXhhbXBsZTpcbiAqIDEuIHh4eCAtPiBwaWNnby1wbHVnaW4teHh4XG4gKiAyLiBwaWNnby1wbHVnaW4teHh4IC0+IHBpY2dvLXBsdWdpbi14eHhcbiAqIEBwYXJhbSBuYW1lIHBsdWdpblNpbXBsZU5hbWVcbiAqIEBwYXJhbSBzY29wZSBwbHVnaW5TY29wZVxuICovXG5leHBvcnQgY29uc3QgaGFuZGxlQ29tcGxldGVQbHVnaW5OYW1lID0gKG5hbWU6IHN0cmluZywgc2NvcGUgPSBcIlwiKTogc3RyaW5nID0+IHtcbiAgaWYgKHNjb3BlKSB7XG4gICAgcmV0dXJuIGBAJHtzY29wZX0vcGljZ28tcGx1Z2luLSR7bmFtZX1gXG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGBwaWNnby1wbHVnaW4tJHtuYW1lfWBcbiAgfVxufVxuXG4vKipcbiAqIGhhbmRsZSBpbnN0YWxsL3VuaW5zdGFsbC91cGRhdGUgcGx1Z2luIG5hbWUgb3IgcGF0aFxuICogZm9yIGV4YW1wbGVcbiAqIDEuIHBpY2dvLXBsdWdpbi14eHggLT4gcGljZ28tcGx1Z2luLXh4eFxuICogMi4gQHh4eC9waWNnby1wbHVnaW4teHh4IC0+IEB4eHgvcGljZ28tcGx1Z2luLXh4eFxuICogMy4geHh4IC0+IHBpY2dvLXBsdWdpbi14eHhcbiAqIDQuIC4veHh4eC9waWNnby1wbHVnaW4teHh4IC0+IC9hYnNvbHV0ZVBhdGgvLi4uL3h4eHgvcGljZ28tcGx1Z2luLXh4eFxuICogNS4gL2Fic29sdXRlUGF0aC8uLi4vcGljZ28tcGx1Z2luLXh4eCAtPiAvYWJzb2x1dGVQYXRoLy4uLi9waWNnby1wbHVnaW4teHh4XG4gKiBAcGFyYW0gbmFtZU9yUGF0aCBwbHVnaW5OYW1lIG9yIHBsdWdpblBhdGhcbiAqL1xuZXhwb3J0IGNvbnN0IGdldFByb2Nlc3NQbHVnaW5OYW1lID0gKG5hbWVPclBhdGg6IHN0cmluZywgbG9nZ2VyOiBJTG9nZ2VyIHwgQ29uc29sZSA9IGNvbnNvbGUpOiBzdHJpbmcgPT4ge1xuICBjb25zdCBwbHVnaW5OYW1lVHlwZSA9IGdldFBsdWdpbk5hbWVUeXBlKG5hbWVPclBhdGgpXG4gIHN3aXRjaCAocGx1Z2luTmFtZVR5cGUpIHtcbiAgICBjYXNlIFwibm9ybWFsXCI6XG4gICAgY2FzZSBcInNjb3BlXCI6XG4gICAgICByZXR1cm4gbmFtZU9yUGF0aFxuICAgIGNhc2UgXCJzaW1wbGVcIjpcbiAgICAgIHJldHVybiBoYW5kbGVDb21wbGV0ZVBsdWdpbk5hbWUobmFtZU9yUGF0aClcbiAgICBkZWZhdWx0OiB7XG4gICAgICAvLyBub3csIHRoZSBwbHVnaW5OYW1lVHlwZSBpcyB1bmtub3cgaGVyZVxuICAgICAgLy8gMS4gY2hlY2sgaWYgaXMgYW4gYWJzb2x1dGUgcGF0aFxuICAgICAgbGV0IHBsdWdpblBhdGggPSBuYW1lT3JQYXRoXG4gICAgICBpZiAocGF0aC5pc0Fic29sdXRlKG5hbWVPclBhdGgpICYmIGZzLmV4aXN0c1N5bmMobmFtZU9yUGF0aCkpIHtcbiAgICAgICAgcmV0dXJuIGhhbmRsZVVuaXhTdHlsZVBhdGgocGx1Z2luUGF0aClcbiAgICAgIH1cbiAgICAgIC8vIDIuIGNoZWNrIGlmIGlzIGEgcmVsYXRpdmUgcGF0aFxuICAgICAgcGx1Z2luUGF0aCA9IHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCBuYW1lT3JQYXRoKVxuICAgICAgaWYgKGZzLmV4aXN0c1N5bmMocGx1Z2luUGF0aCkpIHtcbiAgICAgICAgcmV0dXJuIGhhbmRsZVVuaXhTdHlsZVBhdGgocGx1Z2luUGF0aClcbiAgICAgIH1cbiAgICAgIC8vIDMuIGludmFsaWQgbmFtZU9yUGF0aFxuICAgICAgbG9nZ2VyLndhcm4oYENhbid0IGZpbmQgcGx1Z2luICR7bmFtZU9yUGF0aH1gKVxuICAgICAgcmV0dXJuIFwiXCJcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBnZXQgdGhlIG5vcm1hbCBwbHVnaW4gbmFtZVxuICogZm9yIGV4YW1wbGU6XG4gKiAxLiBwaWNnby1wbHVnaW4teHh4IC0+IHBpY2dvLXBsdWdpbi14eHhcbiAqIDIuIEB4eHgvcGljZ28tcGx1Z2luLXh4eCAtPiBAeHh4L3BpY2dvLXBsdWdpbi14eHhcbiAqIDMuIC4veHh4eC9waWNnby1wbHVnaW4teHh4IC0+IHBpY2dvLXBsdWdpbi14eHhcbiAqIDQuIC9hYnNvbHV0ZVBhdGgvLi4uL3BpY2dvLXBsdWdpbi14eHggLT4gcGljZ28tcGx1Z2luLXh4eFxuICogNS4gYW4gZXhjZXB0aW9uOiBbcGFja2FnZS5qc29uJ3MgbmFtZV0gIT09IFtmb2xkZXIgbmFtZV1cbiAqIHRoZW4gdXNlIFtwYWNrYWdlLmpzb24ncyBuYW1lXSwgdXN1YWxseSBtYXRjaCB0aGUgc2NvcGUgcGFja2FnZS5cbiAqIDYuIGlmIHBsdWdpbiBuYW1lIGhhcyB2ZXJzaW9uOiBwaWNnby1wbHVnaW4teHh4QHgueC54IHRoZW4gcmVtb3ZlIHRoZSB2ZXJzaW9uXG4gKiBAcGFyYW0gbmFtZU9yUGF0aFxuICovXG5leHBvcnQgY29uc3QgZ2V0Tm9ybWFsUGx1Z2luTmFtZSA9IChuYW1lT3JQYXRoOiBzdHJpbmcsIGxvZ2dlcjogSUxvZ2dlciB8IENvbnNvbGUgPSBjb25zb2xlKTogc3RyaW5nID0+IHtcbiAgY29uc3QgcGx1Z2luTmFtZVR5cGUgPSBnZXRQbHVnaW5OYW1lVHlwZShuYW1lT3JQYXRoKVxuICBzd2l0Y2ggKHBsdWdpbk5hbWVUeXBlKSB7XG4gICAgY2FzZSBcIm5vcm1hbFwiOlxuICAgICAgcmV0dXJuIHJlbW92ZVBsdWdpblZlcnNpb24obmFtZU9yUGF0aClcbiAgICBjYXNlIFwic2NvcGVcIjpcbiAgICAgIHJldHVybiByZW1vdmVQbHVnaW5WZXJzaW9uKG5hbWVPclBhdGgsIHRydWUpXG4gICAgY2FzZSBcInNpbXBsZVwiOlxuICAgICAgcmV0dXJuIHJlbW92ZVBsdWdpblZlcnNpb24oaGFuZGxlQ29tcGxldGVQbHVnaW5OYW1lKG5hbWVPclBhdGgpKVxuICAgIGRlZmF1bHQ6IHtcbiAgICAgIC8vIG5vdywgdGhlIG5hbWVPclBhdGggbXVzdCBiZSBwYXRoXG4gICAgICAvLyB0aGUgbmFtZU9yUGF0aCBoZXJlIHdpbGwgYmUgZW5zdXJlZCB3aXRoIHVuaXggc3R5bGVcbiAgICAgIC8vIHdlIG5lZWQgdG8gZmluZCB0aGUgcGFja2FnZS5qc29uJ3MgbmFtZSBjYXVzZSBucG0gdXNpbmcgdGhlIG5hbWUgaW4gcGFja2FnZS5qc29uJ3MgbmFtZSBmaWxlZFxuICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKG5hbWVPclBhdGgpKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKGBDYW4ndCBmaW5kIHBsdWdpbjogJHtuYW1lT3JQYXRofWApXG4gICAgICAgIHJldHVybiBcIlwiXG4gICAgICB9XG4gICAgICBjb25zdCBwYWNrYWdlSlNPTlBhdGggPSBwYXRoLnBvc2l4LmpvaW4obmFtZU9yUGF0aCwgXCJwYWNrYWdlLmpzb25cIilcbiAgICAgIGlmICghZnMuZXhpc3RzU3luYyhwYWNrYWdlSlNPTlBhdGgpKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKGBDYW4ndCBmaW5kIHBsdWdpbjogJHtuYW1lT3JQYXRofWApXG4gICAgICAgIHJldHVybiBcIlwiXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBwa2cgPSBmcy5yZWFkSlNPTlN5bmMocGFja2FnZUpTT05QYXRoKSB8fCB7fVxuICAgICAgICBpZiAoIXBrZy5uYW1lPy5pbmNsdWRlcyhcInBpY2dvLXBsdWdpbi1cIikpIHtcbiAgICAgICAgICBsb2dnZXIud2FybihcbiAgICAgICAgICAgIGBUaGUgcGx1Z2luIHBhY2thZ2UuanNvbidzIG5hbWUgZmlsZWQgaXMgJHtcbiAgICAgICAgICAgICAgKHBrZy5uYW1lIGFzIHN0cmluZykgfHwgXCJlbXB0eVwiXG4gICAgICAgICAgICB9LCBuZWVkIHRvIGluY2x1ZGUgdGhlIHByZWZpeDogcGljZ28tcGx1Z2luLWBcbiAgICAgICAgICApXG4gICAgICAgICAgcmV0dXJuIFwiXCJcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcGtnLm5hbWVcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBoYW5kbGUgdHJhbnNmb3JtIHRoZSBwYXRoIHRvIHVuaXggc3R5bGVcbiAqIGZvciBleGFtcGxlXG4gKiAxLiBDOlxcXFx4eHhcXFxceHh4IC0+IEM6L3h4eC94eHhcbiAqIDIuIC94eHgveHh4IC0+IC94eHgveHh4XG4gKiBAcGFyYW0gcGF0aFxuICovXG5leHBvcnQgY29uc3QgaGFuZGxlVW5peFN0eWxlUGF0aCA9IChwYXRoU3RyOiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICBjb25zdCBwYXRoQXJyID0gcGF0aFN0ci5zcGxpdChwYXRoLnNlcClcbiAgcmV0dXJuIHBhdGhBcnIuam9pbihcIi9cIilcbn1cblxuLyoqXG4gKiByZW1vdmUgcGx1Z2luIHZlcnNpb24gd2hlbiByZWdpc3RlciBwbHVnaW4gbmFtZVxuICogMS4gcGljZ28tcGx1Z2luLXh4eEAxLjAuMCAtPiBwaWNnby1wbHVnaW4teHh4XG4gKiAyLiBAeHh4L3BpY2dvLXBsdWdpbi14eHhAMS4wLjAgLT4gQHh4eC9waWNnby1wbHVnaW4teHh4XG4gKiBAcGFyYW0gbmFtZU9yUGF0aFxuICogQHBhcmFtIHNjb3BlXG4gKi9cbmV4cG9ydCBjb25zdCByZW1vdmVQbHVnaW5WZXJzaW9uID0gKG5hbWVPclBhdGg6IHN0cmluZywgc2NvcGUgPSBmYWxzZSk6IHN0cmluZyA9PiB7XG4gIGlmICghbmFtZU9yUGF0aC5pbmNsdWRlcyhcIkBcIikpIHtcbiAgICByZXR1cm4gbmFtZU9yUGF0aFxuICB9IGVsc2Uge1xuICAgIGxldCByZWcgPSAvKC4rXFwvKT8ocGljZ28tcGx1Z2luLVxcdyspKEAuKykqL1xuICAgIC8vIGlmIGlzIGEgc2NvcGUgcGtnXG4gICAgaWYgKHNjb3BlKSB7XG4gICAgICByZWcgPSAvKC4rXFwvKT8oXkBbXi9dK1xcL3BpY2dvLXBsdWdpbi1cXHcrKShALispKi9cbiAgICB9XG4gICAgY29uc3QgbWF0Y2hBcnIgPSBuYW1lT3JQYXRoLm1hdGNoKHJlZylcbiAgICBpZiAoIW1hdGNoQXJyKSB7XG4gICAgICBjb25zb2xlLndhcm4oXCJjYW4gbm90IHJlbW92ZSBwbHVnaW4gdmVyc2lvblwiKVxuICAgICAgcmV0dXJuIG5hbWVPclBhdGhcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG1hdGNoQXJyWzJdXG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogdGhlIGNvbmZpZyBibGFjayBpdGVtIGxpc3Qgd2hpY2ggd29uJ3QgYmUgc2V0dGVkXG4gKiBvbmx5IGNhbiBiZSBnb3RcbiAqL1xuZXhwb3J0IGNvbnN0IGNvbmZpZ0JsYWNrTGlzdCA9IFtdXG5cbi8qKlxuICogY2hlY2sgc29tZSBjb25maWcga2V5IGlzIGluIGJsYWNrTGlzdFxuICogQHBhcmFtIGtleVxuICovXG5leHBvcnQgY29uc3QgaXNDb25maWdLZXlJbkJsYWNrTGlzdCA9IChrZXk6IHN0cmluZyk6IGJvb2xlYW4gPT4ge1xuICByZXR1cm4gY29uZmlnQmxhY2tMaXN0LnNvbWUoKGJsYWNrSXRlbSkgPT4ga2V5LnN0YXJ0c1dpdGgoYmxhY2tJdGVtKSlcbn1cblxuLyoqXG4gKiBjaGVjayB0aGUgaW5wdXQgY29uZmlnIGlzIHZhbGlkXG4gKiBjb25maWcgbXVzdCBiZSBvYmplY3Qgc3VjaCBhcyB7IHh4eDogJ3h4eCcgfVxuICogJiYgY2FuJ3QgYmUgYXJyYXlcbiAqIEBwYXJhbSBjb25maWdcbiAqIEByZXR1cm5zXG4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvZXhwbGljaXQtbW9kdWxlLWJvdW5kYXJ5LXR5cGVzXG5leHBvcnQgY29uc3QgaXNJbnB1dENvbmZpZ1ZhbGlkID0gKGNvbmZpZzogYW55KTogYm9vbGVhbiA9PiB7XG4gIGlmICh0eXBlb2YgY29uZmlnID09PSBcIm9iamVjdFwiICYmICFBcnJheS5pc0FycmF5KGNvbmZpZykgJiYgT2JqZWN0LmtleXMoY29uZmlnKS5sZW5ndGggPiAwKSB7XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuICByZXR1cm4gZmFsc2Vcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNhZmVQYXJzZTxUPihzdHI6IHN0cmluZyk6IFQgfCBzdHJpbmcge1xuICB0cnkge1xuICAgIHJldHVybiBKU09OLnBhcnNlKHN0cilcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXR1cm4gc3RyXG4gIH1cbn1cblxuLy8gaG9sZC4uLlxuLy8gZXhwb3J0IGNvbnN0IGNvbmZpZ1doaXRlTGlzdDogUmVnRXhwW10gPSBbXG4vLyAgIC9ecGljQmVkLyxcbi8vICAgL15waWNnb1BsdWdpbnMvLFxuLy8gICAvXkBbXi9dK1xcL3BpY2dvLXBsdWdpbi0vLFxuLy8gICAvZGVidWcvLFxuLy8gICAvc2lsZW50Lyxcbi8vICAgL2NvbmZpZ1BhdGgvLFxuLy8gICAvXnNldHRpbmdzLyxcbi8vIF1cblxuLy8gZXhwb3J0IGNvbnN0IGlzQ29uZmlnS2V5SW5XaGl0ZUxpc3QgPSAoa2V5OiBzdHJpbmcpOiBib29sZWFuID0+IHtcbi8vICAgcmV0dXJuIGNvbmZpZ1doaXRlTGlzdC5zb21lKHdoaXRlSXRlbSA9PiB3aGl0ZUl0ZW0udGVzdChrZXkpKVxuLy8gfVxuXG5leHBvcnQgY29uc3QgZm9yY2VOdW1iZXIgPSAobnVtOiBzdHJpbmcgfCBudW1iZXIgPSAwKTogbnVtYmVyID0+IHtcbiAgcmV0dXJuIGlzTmFOKE51bWJlcihudW0pKSA/IDAgOiBOdW1iZXIobnVtKVxufVxuXG5leHBvcnQgY29uc3QgaXNEZXYgPSAoKTogYm9vbGVhbiA9PiB7XG4gIHJldHVybiBwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJkZXZlbG9wbWVudFwiXG59XG5cbmV4cG9ydCBjb25zdCBpc1Byb2QgPSAoKTogYm9vbGVhbiA9PiB7XG4gIHJldHVybiBwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCJcbn1cbiIsImltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCJcbmltcG9ydCBmcyBmcm9tIFwiZnMtZXh0cmFcIlxuaW1wb3J0IHsgaXNVcmwgfSBmcm9tIFwiLi4vLi4vdXRpbHMvY29tbW9uXCJcbmltcG9ydCB7IElQaWNHbywgSVBsdWdpbiB9IGZyb20gXCIuLi8uLi90eXBlc1wiXG5cbmNvbnN0IHVwbG9hZDogSVBsdWdpbiA9IHtcbiAgaGFuZGxlOiAoY3R4OiBJUGljR28pID0+IHtcbiAgICBjb25zdCBjbWQgPSBjdHguY21kXG4gICAgY21kLnByb2dyYW1cbiAgICAgIC5jb21tYW5kKFwidXBsb2FkXCIpXG4gICAgICAuZGVzY3JpcHRpb24oXCJ1cGxvYWQsIGdvIGdvIGdvXCIpXG4gICAgICAuYXJndW1lbnRzKFwiW2lucHV0Li4uXVwiKVxuICAgICAgLmFsaWFzKFwidVwiKVxuICAgICAgLmFjdGlvbigoaW5wdXQ6IHN0cmluZ1tdKSA9PiB7XG4gICAgICAgIDsoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGlucHV0TGlzdCA9IGlucHV0XG4gICAgICAgICAgICAubWFwKChpdGVtOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgICAgcmV0dXJuIGlzVXJsKGl0ZW0pID8gaXRlbSA6IHBhdGgucmVzb2x2ZShpdGVtKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5maWx0ZXIoKGl0ZW06IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgICBjb25zdCBleGlzdCA9IGZzLmV4aXN0c1N5bmMoaXRlbSkgfHwgaXNVcmwoaXRlbSlcbiAgICAgICAgICAgICAgaWYgKCFleGlzdCkge1xuICAgICAgICAgICAgICAgIGN0eC5sb2cud2FybihgJHtpdGVtfSBkb2VzIG5vdCBleGlzdC5gKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiBleGlzdFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICBhd2FpdCBjdHgudXBsb2FkKGlucHV0TGlzdClcbiAgICAgICAgfSkoKS5jYXRjaCgoZSkgPT4ge1xuICAgICAgICAgIGN0eC5sb2cuZXJyb3IoZSlcbiAgICAgICAgfSlcbiAgICAgIH0pXG4gIH0sXG59XG5cbmV4cG9ydCBkZWZhdWx0IHVwbG9hZFxuIiwiaW1wb3J0IHsgSVBpY0dvLCBJUGx1Z2luQ29uZmlnLCBJU3RyaW5nS2V5TWFwIH0gZnJvbSBcIi4uLy4uL3R5cGVzXCJcblxuLy8gaGFuZGxlIG1vZHVsZXMgY29uZmlnIC0+IHNhdmUgdG8gcGljZ28gY29uZmlnIGZpbGVcbmNvbnN0IGhhbmRsZUNvbmZpZyA9IGFzeW5jIChjdHg6IElQaWNHbywgcHJvbXB0czogSVBsdWdpbkNvbmZpZ1tdLCBtb2R1bGU6IHN0cmluZywgbmFtZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gIGNvbnN0IGFuc3dlciA9IGF3YWl0IGN0eC5jbWQuaW5xdWlyZXIucHJvbXB0KHByb21wdHMpXG4gIGNvbnN0IGNvbmZpZ05hbWUgPSBtb2R1bGUgPT09IFwidXBsb2FkZXJcIiA/IGBwaWNCZWQuJHtuYW1lfWAgOiBtb2R1bGUgPT09IFwidHJhbnNmb3JtZXJcIiA/IGB0cmFuc2Zvcm1lci4ke25hbWV9YCA6IG5hbWVcbiAgY3R4LnNhdmVDb25maWcoe1xuICAgIFtjb25maWdOYW1lXTogYW5zd2VyLFxuICB9KVxufVxuXG5jb25zdCBzZXR0aW5nID0ge1xuICBoYW5kbGU6IChjdHg6IElQaWNHbykgPT4ge1xuICAgIGNvbnN0IGNtZCA9IGN0eC5jbWRcbiAgICBjbWQucHJvZ3JhbVxuICAgICAgLmNvbW1hbmQoXCJzZXRcIilcbiAgICAgIC5hbGlhcyhcImNvbmZpZ1wiKVxuICAgICAgLmFyZ3VtZW50cyhcIjxtb2R1bGU+IFtuYW1lXVwiKVxuICAgICAgLmRlc2NyaXB0aW9uKFwiY29uZmlndXJlIGNvbmZpZyBvZiBwaWNnbyBtb2R1bGVzXCIpXG4gICAgICAuYWN0aW9uKChtb2R1bGU6IHN0cmluZywgbmFtZTogc3RyaW5nKSA9PiB7XG4gICAgICAgIDsoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyAvLyBsb2FkIHRoaXJkLXBhcnR5IHBsdWdpbnNcbiAgICAgICAgICAgIC8vIGF3YWl0IGN0eC5wbHVnaW5Mb2FkZXIubG9hZCgpXG4gICAgICAgICAgICAvLyBpZiBhIG1vZHVsZSBpcyBzcGVjaWZpYywgdGhlbiBqdXN0IHNldCB0aGlzIG9wdGlvbiBpbiBjb25maWdcbiAgICAgICAgICAgIHN3aXRjaCAobW9kdWxlKSB7XG4gICAgICAgICAgICAgIGNhc2UgXCJ1cGxvYWRlclwiOlxuICAgICAgICAgICAgICBjYXNlIFwidHJhbnNmb3JtZXJcIjpcbiAgICAgICAgICAgICAgICBpZiAobmFtZSkge1xuICAgICAgICAgICAgICAgICAgY29uc3QgaXRlbSA9IGN0eC5oZWxwZXJbbW9kdWxlXS5nZXQobmFtZSlcbiAgICAgICAgICAgICAgICAgIGlmICghaXRlbSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY3R4LmxvZy5lcnJvcihgTm8gJHttb2R1bGV9IG5hbWVkICR7bmFtZX1gKVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0uY29uZmlnKSB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGhhbmRsZUNvbmZpZyhjdHgsIGl0ZW0uY29uZmlnKGN0eCksIG1vZHVsZSwgbmFtZSlcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgY29uc3QgcHJvbXB0cyA9IFtcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFwibGlzdFwiLFxuICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IGAke21vZHVsZX1gLFxuICAgICAgICAgICAgICAgICAgICAgIGNob2ljZXM6IGN0eC5oZWxwZXJbbW9kdWxlXS5nZXRJZExpc3QoKSxcbiAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBgQ2hvb3NlIGEobikgJHttb2R1bGV9YCxcbiAgICAgICAgICAgICAgICAgICAgICAvLyBkZWZhdWx0OiBjdHguZ2V0Q29uZmlnKCdwaWNCZWQudXBsb2FkZXInKSB8fCBjdHguZ2V0Q29uZmlnKCdwaWNCZWQuY3VycmVudCcpXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgICBjb25zdCBhbnN3ZXIgPSBhd2FpdCBjdHguY21kLmlucXVpcmVyLnByb21wdDxJU3RyaW5nS2V5TWFwPGFueT4+KHByb21wdHMpXG4gICAgICAgICAgICAgICAgICBjb25zdCBpdGVtID0gY3R4LmhlbHBlclttb2R1bGVdLmdldChhbnN3ZXJbbW9kdWxlXSlcbiAgICAgICAgICAgICAgICAgIGlmIChpdGVtPy5jb25maWcpIHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgaGFuZGxlQ29uZmlnKGN0eCwgaXRlbS5jb25maWcoY3R4KSwgbW9kdWxlLCBhbnN3ZXJbbW9kdWxlXSlcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgY2FzZSBcInBsdWdpblwiOlxuICAgICAgICAgICAgICAgIGlmIChuYW1lKSB7XG4gICAgICAgICAgICAgICAgICBpZiAoIW5hbWUuaW5jbHVkZXMoXCJwaWNnby1wbHVnaW4tXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWUgPSBgcGljZ28tcGx1Z2luLSR7bmFtZX1gXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBpZiAoT2JqZWN0LmtleXMoY3R4LmdldENvbmZpZyhcInBpY2dvUGx1Z2luc1wiKSkuaW5jbHVkZXMobmFtZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGN0eC5wbHVnaW5Mb2FkZXIuZ2V0UGx1Z2luKG5hbWUpPy5jb25maWcpIHtcbiAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBoYW5kbGVDb25maWcoY3R4LCBjdHgucGx1Z2luTG9hZGVyLmdldFBsdWdpbihuYW1lKSEuY29uZmlnIShjdHgpLCBcInBsdWdpblwiLCBuYW1lKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY3R4LmxvZy5lcnJvcihgTm8gcGx1Z2luIG5hbWVkICR7bmFtZX1gKVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBwcm9tcHRzID0gW1xuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJsaXN0XCIsXG4gICAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJwbHVnaW5cIixcbiAgICAgICAgICAgICAgICAgICAgICBjaG9pY2VzOiBjdHgucGx1Z2luTG9hZGVyLmdldEZ1bGxMaXN0KCksXG4gICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogXCJDaG9vc2UgYSBwbHVnaW5cIixcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICAgIGNvbnN0IGFuc3dlciA9IGF3YWl0IGN0eC5jbWQuaW5xdWlyZXIucHJvbXB0PGFueT4ocHJvbXB0cylcbiAgICAgICAgICAgICAgICAgIGlmIChjdHgucGx1Z2luTG9hZGVyLmdldFBsdWdpbihhbnN3ZXIucGx1Z2luKT8uY29uZmlnKSB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGhhbmRsZUNvbmZpZyhcbiAgICAgICAgICAgICAgICAgICAgICBjdHgsXG4gICAgICAgICAgICAgICAgICAgICAgY3R4LnBsdWdpbkxvYWRlci5nZXRQbHVnaW4oYW5zd2VyLnBsdWdpbikhLmNvbmZpZyEoY3R4KSxcbiAgICAgICAgICAgICAgICAgICAgICBcInBsdWdpblwiLFxuICAgICAgICAgICAgICAgICAgICAgIGFuc3dlci5wbHVnaW5cbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIGN0eC5sb2cud2FybihgTm8gbW9kdWxlIG5hbWVkICR7bW9kdWxlfWApXG4gICAgICAgICAgICAgICAgcmV0dXJuIGN0eC5sb2cud2FybihcIkF2YWlsYWJsZSBtb2R1bGVzIGFyZSB1cGxvYWRlcnx0cmFuc2Zvcm1lcnxwbHVnaW5cIilcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHVzZU1vZHVsZU5hbWUgPSBtb2R1bGUgPT09IFwicGx1Z2luXCIgPyBcInBsdWdpbnNcIiA6IG1vZHVsZVxuICAgICAgICAgICAgY3R4LmxvZy5zdWNjZXNzKFwiQ29uZmlndXJlIGNvbmZpZyBzdWNjZXNzZnVsbHkhXCIpXG4gICAgICAgICAgICBjdHgubG9nLmluZm8oYElmIHlvdSB3YW50IHRvIHVzZSB0aGlzIGNvbmZpZywgcGxlYXNlIHJ1biAncGljZ28gdXNlICR7dXNlTW9kdWxlTmFtZX0nYClcbiAgICAgICAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgICAgICAgIGN0eC5sb2cuZXJyb3IoZSlcbiAgICAgICAgICAgIGlmIChwcm9jZXNzLmFyZ3YuaW5jbHVkZXMoXCItLWRlYnVnXCIpKSB7XG4gICAgICAgICAgICAgIHRocm93IGVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pKCkuY2F0Y2goKGUpID0+IHtcbiAgICAgICAgICBjdHgubG9nLmVycm9yKGUpXG4gICAgICAgIH0pXG4gICAgICB9KVxuICB9LFxufVxuXG5leHBvcnQgZGVmYXVsdCBzZXR0aW5nXG4iLCJpbXBvcnQgeyBJUGljR28sIElQbHVnaW4sIFVuZGVmaW5hYmxlLCBJQ0xJQ29uZmlncywgSVN0cmluZ0tleU1hcCB9IGZyb20gXCIuLi8uLi90eXBlc1wiXG5cbmNvbnN0IHVzZTogSVBsdWdpbiA9IHtcbiAgaGFuZGxlOiBhc3luYyAoY3R4OiBJUGljR28pID0+IHtcbiAgICBjb25zdCBjbWQgPSBjdHguY21kXG4gICAgY21kLnByb2dyYW1cbiAgICAgIC5jb21tYW5kKFwidXNlXCIpXG4gICAgICAuYXJndW1lbnRzKFwiW21vZHVsZV1cIilcbiAgICAgIC5kZXNjcmlwdGlvbihcInVzZSBtb2R1bGVzIG9mIHBpY2dvXCIpXG4gICAgICAuYWN0aW9uKChtb2R1bGU6IHN0cmluZykgPT4ge1xuICAgICAgICA7KGFzeW5jICgpID0+IHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gLy8gbG9hZCB0aGlyZC1wYXJ0eSBwbHVnaW5zXG4gICAgICAgICAgICAvLyBhd2FpdCBjdHgucGx1Z2luTG9hZGVyLmxvYWQoKVxuICAgICAgICAgICAgbGV0IHByb21wdHM6IGFueVtdID0gW11cbiAgICAgICAgICAgIGNvbnN0IGNvbmZpZzogSUNMSUNvbmZpZ3MgPSB7XG4gICAgICAgICAgICAgIHVwbG9hZGVyOiB7XG4gICAgICAgICAgICAgICAgdHlwZTogXCJsaXN0XCIsXG4gICAgICAgICAgICAgICAgbmFtZTogXCJ1cGxvYWRlclwiLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IFwiVXNlIGFuIHVwbG9hZGVyXCIsXG4gICAgICAgICAgICAgICAgY2hvaWNlczogY3R4LmhlbHBlci51cGxvYWRlci5nZXRJZExpc3QoKSxcbiAgICAgICAgICAgICAgICBkZWZhdWx0OiBjdHguZ2V0Q29uZmlnKFwicGljQmVkLnVwbG9hZGVyXCIpIHx8IGN0eC5nZXRDb25maWcoXCJwaWNCZWQuY3VycmVudFwiKSB8fCBcImdpdGh1YlwiLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB0cmFuc2Zvcm1lcjoge1xuICAgICAgICAgICAgICAgIHR5cGU6IFwibGlzdFwiLFxuICAgICAgICAgICAgICAgIG5hbWU6IFwidHJhbnNmb3JtZXJcIixcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiBcIlVzZSBhIHRyYW5zZm9ybWVyXCIsXG4gICAgICAgICAgICAgICAgY2hvaWNlczogY3R4LmhlbHBlci50cmFuc2Zvcm1lci5nZXRJZExpc3QoKSxcbiAgICAgICAgICAgICAgICBkZWZhdWx0OiBjdHguZ2V0Q29uZmlnPFVuZGVmaW5hYmxlPHN0cmluZz4+KFwicGljQmVkLnRyYW5zZm9ybWVyXCIpIHx8IFwicGF0aFwiLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBwbHVnaW5zOiB7XG4gICAgICAgICAgICAgICAgdHlwZTogXCJjaGVja2JveFwiLFxuICAgICAgICAgICAgICAgIG5hbWU6IFwicGx1Z2luc1wiLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IFwiVXNlIHBsdWdpbnNcIixcbiAgICAgICAgICAgICAgICBjaG9pY2VzOiBjdHgucGx1Z2luTG9hZGVyLmdldEZ1bGxMaXN0KCksXG4gICAgICAgICAgICAgICAgZGVmYXVsdDogT2JqZWN0LmtleXMoY3R4LmdldENvbmZpZyhcInBpY2dvUGx1Z2luc1wiKSkuZmlsdGVyKChpdGVtOiBzdHJpbmcpID0+XG4gICAgICAgICAgICAgICAgICBjdHguZ2V0Q29uZmlnKGBwaWNnb1BsdWdpbnMuJHtpdGVtfWApXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGlmIGFuIG9wdGlvbiBpcyBzcGVjaWZpYywgdGhlbiBqdXN0IHNldCB0aGlzIG9wdGlvbiBpbiBjb25maWdcbiAgICAgICAgICAgIGlmIChtb2R1bGUpIHtcbiAgICAgICAgICAgICAgaWYgKGNvbmZpZ1ttb2R1bGVdKSB7XG4gICAgICAgICAgICAgICAgcHJvbXB0cy5wdXNoKGNvbmZpZ1ttb2R1bGVdKVxuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGN0eC5sb2cud2FybihgTm8gbW9kdWxlIG5hbWVkICR7bW9kdWxlfWApXG4gICAgICAgICAgICAgICAgcmV0dXJuIGN0eC5sb2cud2FybihcIkF2YWlsYWJsZSBtb2R1bGVzIGFyZSB1cGxvYWRlcnx0cmFuc2Zvcm1lcnxwbHVnaW5zXCIpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHByb21wdHMgPSBPYmplY3Qua2V5cyhjb25maWcpLm1hcCgoaXRlbTogc3RyaW5nKSA9PiBjb25maWdbaXRlbV0pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBhbnN3ZXIgPSBhd2FpdCBjbWQuaW5xdWlyZXIucHJvbXB0PGFueT4ocHJvbXB0cylcblxuICAgICAgICAgICAgLy8gaGFuZGxlIGZvciBwbHVnaW5zIG9wdGlvbiBmcm9tIEFycmF5IHRvIG9iamVjdFxuICAgICAgICAgICAgaWYgKGFuc3dlci5wbHVnaW5zKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHBsdWdpbnMgPSBjdHguZ2V0Q29uZmlnPElTdHJpbmdLZXlNYXA8Ym9vbGVhbj4+KFwicGljZ29QbHVnaW5zXCIpXG4gICAgICAgICAgICAgIE9iamVjdC5rZXlzKHBsdWdpbnMpLm1hcCgoaXRlbTogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGFuc3dlci5wbHVnaW5zLmluY2x1ZGVzKGl0ZW0pKSB7XG4gICAgICAgICAgICAgICAgICBwbHVnaW5zW2l0ZW1dID0gdHJ1ZVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICBwbHVnaW5zW2l0ZW1dID0gZmFsc2VcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIC8vIHNhdmUgY29uZmlnIGZvciBwbHVnaW5zXG4gICAgICAgICAgICAgIGN0eC5zYXZlQ29uZmlnKHtcbiAgICAgICAgICAgICAgICBwaWNnb1BsdWdpbnM6IHBsdWdpbnMsXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBzYXZlIGNvbmZpZyBmb3IgdXBsb2FkZXIgJiB0cmFuc2Zvcm1lclxuICAgICAgICAgICAgY3R4LnNhdmVDb25maWcoe1xuICAgICAgICAgICAgICBcInBpY0JlZC5jdXJyZW50XCI6IGFuc3dlci51cGxvYWRlciB8fCBjdHguZ2V0Q29uZmlnPHN0cmluZz4oXCJwaWNCZWQuY3VycmVudFwiKSxcbiAgICAgICAgICAgICAgXCJwaWNCZWQudXBsb2FkZXJcIjogYW5zd2VyLnVwbG9hZGVyIHx8IGN0eC5nZXRDb25maWc8c3RyaW5nPihcInBpY0JlZC5jdXJyZW50XCIpLFxuICAgICAgICAgICAgICBcInBpY0JlZC50cmFuc2Zvcm1lclwiOiBhbnN3ZXIudHJhbnNmb3JtZXIgfHwgXCJwYXRoXCIsXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgY3R4LmxvZy5zdWNjZXNzKFwiQ29uZmlndXJlIGNvbmZpZyBzdWNjZXNzZnVsbHkhXCIpXG4gICAgICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgICAgICBjdHgubG9nLmVycm9yKGUpXG4gICAgICAgICAgICBpZiAocHJvY2Vzcy5hcmd2LmluY2x1ZGVzKFwiLS1kZWJ1Z1wiKSkge1xuICAgICAgICAgICAgICB0aHJvdyBlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KSgpLmNhdGNoKChlKSA9PiB7XG4gICAgICAgICAgY3R4LmxvZy5lcnJvcihlKVxuICAgICAgICB9KVxuICAgICAgfSlcbiAgfSxcbn1cblxuZXhwb3J0IGRlZmF1bHQgdXNlXG4iLCJpbXBvcnQgeyBJUGljR28sIElQbHVnaW4gfSBmcm9tIFwiLi4vLi4vdHlwZXNcIlxuXG5jb25zdCBwcm94eTogSVBsdWdpbiA9IHtcbiAgaGFuZGxlOiAoY3R4OiBJUGljR28pID0+IHtcbiAgICBjb25zdCBjbWQgPSBjdHguY21kXG4gICAgY21kLnByb2dyYW0ub3B0aW9uKFwiLXAsIC0tcHJveHkgPHVybD5cIiwgXCJzZXQgcHJveHkgZm9yIHVwbG9hZGluZ1wiLCAocHJveHk6IHN0cmluZykgPT4ge1xuICAgICAgY3R4LnNldENvbmZpZyh7XG4gICAgICAgIFwicGljQmVkLnByb3h5XCI6IHByb3h5LFxuICAgICAgfSlcbiAgICB9KVxuICB9LFxufVxuXG5leHBvcnQgZGVmYXVsdCBwcm94eVxuIiwiaW1wb3J0IG1hdGNoIGZyb20gXCJtaW5pbWF0Y2hcIlxuaW1wb3J0IHsgSVBpY0dvLCBJT3B0aW9ucywgSUZpbGVUcmVlIH0gZnJvbSBcIi4uL3R5cGVzXCJcbmltcG9ydCBmcyBmcm9tIFwiZnMtZXh0cmFcIlxuaW1wb3J0IHBhdGggZnJvbSBcInBhdGhcIlxuaW1wb3J0IGdsb2JieSBmcm9tIFwiZ2xvYmJ5XCJcbmltcG9ydCBlanMgZnJvbSBcImVqc1wiXG5cbi8qKlxuICogR2VuZXJhdGUgdGVtcGxhdGUgZmlsZXMgdG8gZGVzdGluYXRpb24gZmlsZXMuXG4gKiBAcGFyYW0ge1BpY0dvfSBjdHhcbiAqIEBwYXJhbSB7SU9wdGlvbnN9IG9wdGlvbnNcbiAqL1xuY29uc3QgZ2VuZXJhdGUgPSBhc3luYyAoY3R4OiBJUGljR28sIG9wdGlvbnM6IElPcHRpb25zKTogUHJvbWlzZTxhbnk+ID0+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBvcHRzID0gZ2V0T3B0aW9ucyhvcHRpb25zLnRtcClcbiAgICBjb25zdCBzb3VyY2UgPSBwYXRoLmpvaW4ob3B0aW9ucy50bXAsIFwidGVtcGxhdGVcIilcbiAgICBsZXQgYW5zd2VycyA9IHt9XG4gICAgaWYgKG9wdHMucHJvbXB0cyAmJiBvcHRzLnByb21wdHMubGVuZ3RoID4gMCkge1xuICAgICAgYW5zd2VycyA9IGF3YWl0IGN0eC5jbWQuaW5xdWlyZXIucHJvbXB0KG9wdHMucHJvbXB0cylcbiAgICB9XG4gICAgbGV0IF9maWxlczogc3RyaW5nW10gPSBhd2FpdCBnbG9iYnkoW1wiKiovKlwiXSwgeyBjd2Q6IHNvdXJjZSwgZG90OiB0cnVlIH0pIC8vIGdldCBmaWxlcycgbmFtZSBhcnJheVxuICAgIF9maWxlcyA9IF9maWxlcy5maWx0ZXIoKGl0ZW06IHN0cmluZykgPT4ge1xuICAgICAgbGV0IGdsb2IgPSBcIlwiXG4gICAgICBPYmplY3Qua2V5cyhvcHRzLmZpbHRlcnMpLmZvckVhY2goKGtleTogc3RyaW5nKSA9PiB7XG4gICAgICAgIGlmIChtYXRjaChpdGVtLCBrZXksIHsgZG90OiB0cnVlIH0pKSB7XG4gICAgICAgICAgZ2xvYiA9IGl0ZW1cbiAgICAgICAgfVxuICAgICAgfSlcbiAgICAgIGlmIChnbG9iKSB7XG4gICAgICAgIC8vIGZpbmQgYSBmaWx0ZXIgZXhwcmVzc2lvblxuICAgICAgICByZXR1cm4gZmlsdGVycyhjdHgsIG9wdHMuZmlsdGVyc1tnbG9iXSwgYW5zd2VycylcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgfSlcbiAgICBpZiAoX2ZpbGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIGN0eC5sb2cud2FybihcIlRlbXBsYXRlIGZpbGVzIG5vdCBmb3VuZCFcIilcbiAgICB9XG4gICAgY29uc3QgZmlsZXMgPSByZW5kZXIoX2ZpbGVzLCBzb3VyY2UsIGFuc3dlcnMpXG4gICAgd3JpdGVGaWxlVHJlZShvcHRpb25zLmRlc3QsIGZpbGVzKVxuICAgIGlmICh0eXBlb2Ygb3B0cy5jb21wbGV0ZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICBvcHRzLmNvbXBsZXRlKHsgYW5zd2Vycywgb3B0aW9ucywgZmlsZXM6IF9maWxlcywgY3R4IH0pXG4gICAgfVxuICAgIGlmIChvcHRzLmNvbXBsZXRlTWVzc2FnZSkge1xuICAgICAgY3R4LmxvZy5zdWNjZXNzKG9wdHMuY29tcGxldGVNZXNzYWdlKVxuICAgIH1cbiAgICBjdHgubG9nLnN1Y2Nlc3MoXCJEb25lIVwiKVxuICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICByZXR1cm4gY3R4LmxvZy5lcnJvcihlKVxuICB9XG59XG5cbi8qKlxuICogUmV0dXJuIHRoZSBmaWx0ZXJzJyByZXN1bHRcbiAqIEBwYXJhbSBjdHggUGljR29cbiAqIEBwYXJhbSBleHAgY29uZGl0aW9uIGV4cHJlc3Npb25cbiAqIEBwYXJhbSBkYXRhIG9wdGlvbnMgZGF0YVxuICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2V4cGxpY2l0LW1vZHVsZS1ib3VuZGFyeS10eXBlc1xuY29uc3QgZmlsdGVycyA9IChjdHg6IElQaWNHbywgZXhwOiBhbnksIGRhdGE6IGFueSk6IGJvb2xlYW4gPT4ge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L3Jlc3RyaWN0LXBsdXMtb3BlcmFuZHMsIG5vLW5ldy1mdW5jLCBAdHlwZXNjcmlwdC1lc2xpbnQvbm8taW1wbGllZC1ldmFsXG4gIGNvbnN0IGZuID0gbmV3IEZ1bmN0aW9uKFwiZGF0YVwiLCBcIndpdGggKGRhdGEpIHsgcmV0dXJuIFwiICsgZXhwICsgXCJ9XCIpXG4gIHRyeSB7XG4gICAgcmV0dXJuIGZuKGRhdGEpXG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBjdHgubG9nLmVycm9yKGBFcnJvciB3aGVuIGV2YWx1YXRpbmcgZmlsdGVyIGNvbmRpdGlvbjogJHtKU09OLnN0cmluZ2lmeShleHApfWApXG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbn1cblxuLyoqXG4gKiBHZXQgdGVtcGxhdGUgb3B0aW9uc1xuICogQHBhcmFtIHtzdHJpbmd9IHRlbXBsYXRlUGF0aFxuICovXG5jb25zdCBnZXRPcHRpb25zID0gKHRlbXBsYXRlUGF0aDogc3RyaW5nKTogYW55ID0+IHtcbiAgY29uc3Qgb3B0aW9uc1BhdGggPSBwYXRoLmpvaW4odGVtcGxhdGVQYXRoLCBcImluZGV4LmpzXCIpXG4gIGlmIChmcy5leGlzdHNTeW5jKG9wdGlvbnNQYXRoKSkge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdmFyLXJlcXVpcmVzXG4gICAgY29uc3Qgb3B0aW9ucyA9IHJlcXVpcmUob3B0aW9uc1BhdGgpXG4gICAgcmV0dXJuIG9wdGlvbnNcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4ge31cbiAgfVxufVxuXG4vKipcbiAqIFJlbmRlciBmaWxlcyB0byBhIHZpcnR1YWwgdHJlZSBvYmplY3RcbiAqIEBwYXJhbSB7YXJyYXl9IGZpbGVzXG4gKiBAcGFyYW0gc291cmNlXG4gKiBAcGFyYW0gb3B0aW9uc1xuICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2V4cGxpY2l0LW1vZHVsZS1ib3VuZGFyeS10eXBlc1xuY29uc3QgcmVuZGVyID0gKGZpbGVzOiBzdHJpbmdbXSwgc291cmNlOiBzdHJpbmcsIG9wdGlvbnM6IGFueSk6IGFueSA9PiB7XG4gIGNvbnN0IGZpbGVUcmVlOiBJRmlsZVRyZWUgPSB7fVxuICBmaWxlcy5mb3JFYWNoKChmaWxlUGF0aDogc3RyaW5nKTogdm9pZCA9PiB7XG4gICAgY29uc3QgZmlsZSA9IGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4oc291cmNlLCBmaWxlUGF0aCksIFwidXRmOFwiKVxuICAgIGNvbnN0IGNvbnRlbnQgPSBlanMucmVuZGVyKGZpbGUsIG9wdGlvbnMpXG4gICAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihjb250ZW50KSB8fCAvW15cXHNdLy50ZXN0KGNvbnRlbnQpKSB7XG4gICAgICBmaWxlVHJlZVtmaWxlUGF0aF0gPSBjb250ZW50XG4gICAgfVxuICB9KVxuICByZXR1cm4gZmlsZVRyZWVcbn1cblxuLyoqXG4gKiBXcml0ZSByZW5kZXJlZCBmaWxlcycgY29udGVudCB0byByZWFsIGZpbGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBkaXJcbiAqIEBwYXJhbSB7b2JqZWN0fSBmaWxlc1xuICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2V4cGxpY2l0LW1vZHVsZS1ib3VuZGFyeS10eXBlc1xuY29uc3Qgd3JpdGVGaWxlVHJlZSA9IChkaXI6IHN0cmluZywgZmlsZXM6IGFueSk6IHZvaWQgPT4ge1xuICBPYmplY3Qua2V5cyhmaWxlcykuZm9yRWFjaCgobmFtZTogc3RyaW5nKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4oZGlyLCBuYW1lKVxuICAgIGZzLmVuc3VyZURpclN5bmMocGF0aC5kaXJuYW1lKGZpbGVQYXRoKSlcbiAgICBmcy53cml0ZUZpbGVTeW5jKGZpbGVQYXRoLCBmaWxlc1tuYW1lXSlcbiAgfSlcbn1cblxuZXhwb3J0IHsgZmlsdGVycywgZ2VuZXJhdGUsIHJlbmRlciwgd3JpdGVGaWxlVHJlZSB9XG4iLCJpbXBvcnQgY2hhbGsgZnJvbSBcImNoYWxrXCJcbmltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCJcbmltcG9ydCBmcyBmcm9tIFwiZnMtZXh0cmFcIlxuaW1wb3J0IHsgZ2VuZXJhdGUgfSBmcm9tIFwiLi4vLi4vdXRpbHMvaW5pdFV0aWxzXCJcbmltcG9ydCB7IGhvbWVkaXIgfSBmcm9tIFwib3NcIlxuaW1wb3J0IGRvd25sb2FkIGZyb20gXCJkb3dubG9hZC1naXQtcmVwb1wiXG5pbXBvcnQgeyBJT3B0aW9ucywgSVBsdWdpbiwgSVBpY0dvIH0gZnJvbSBcIi4uLy4uL3R5cGVzXCJcbmltcG9ydCBybSBmcm9tIFwicmltcmFmXCJcblxuY29uc3QgcnVuID0gKGN0eDogSVBpY0dvLCBvcHRpb25zOiBJT3B0aW9ucyk6IHZvaWQgPT4ge1xuICAvLyBjb25zdCBuYW1lID0gb3B0aW9ucy5pblBsYWNlID8gcGF0aC5yZWxhdGl2ZSgnLi4vJywgcHJvY2Vzcy5jd2QoKSkgOiBvcHRpb25zLnByb2plY3RcbiAgaWYgKG9wdGlvbnMub2ZmbGluZSkge1xuICAgIC8vIG9mZmxpbmUgbW9kZVxuICAgIGlmIChmcy5leGlzdHNTeW5jKG9wdGlvbnMudGVtcGxhdGUpKSB7XG4gICAgICBnZW5lcmF0ZShjdHgsIG9wdGlvbnMpLmNhdGNoKChlKSA9PiB7XG4gICAgICAgIGN0eC5sb2cuZXJyb3IoZSlcbiAgICAgIH0pXG4gICAgfSBlbHNlIHtcbiAgICAgIGN0eC5sb2cuZXJyb3IoYExvY2FsIHRlbXBsYXRlICR7b3B0aW9ucy50ZW1wbGF0ZX0gbm90IGZvdW5kYClcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gb25saW5lIG1vZGVcbiAgICBvcHRpb25zLnRlbXBsYXRlID0gIW9wdGlvbnMuaGFzU2xhc2hcbiAgICAgID8gXCJQaWNHby9waWNnby10ZW1wbGF0ZS1cIiArIG9wdGlvbnMudGVtcGxhdGUgLy8gb2ZmaWNpYWwgdGVtcGxhdGVcbiAgICAgIDogb3B0aW9ucy50ZW1wbGF0ZVxuICAgIGRvd25sb2FkQW5kR2VuZXJhdGUoY3R4LCBvcHRpb25zKVxuICB9XG59XG5cbi8qKlxuICogZG93bmxvYWQgdGVtcGxhdGUgJiBnZW5lcmF0ZVxuICogQHBhcmFtIHsgUGljR28gfSBjdHhcbiAqIEBwYXJhbSB7IElPcHRpb25zIH0gb3B0aW9uc1xuICovXG5jb25zdCBkb3dubG9hZEFuZEdlbmVyYXRlID0gKGN0eDogSVBpY0dvLCBvcHRpb25zOiBJT3B0aW9ucyk6IHZvaWQgPT4ge1xuICBpZiAoZnMuZXhpc3RzU3luYyhvcHRpb25zLnRtcCkpIHtcbiAgICBybS5zeW5jKG9wdGlvbnMudG1wKVxuICB9XG4gIGN0eC5sb2cuaW5mbyhcIlRlbXBsYXRlIGZpbGVzIGFyZSBkb3dubG9hZGluZy4uLlwiKVxuICBkb3dubG9hZChvcHRpb25zLnRlbXBsYXRlLCBvcHRpb25zLnRtcCwgeyBjbG9uZTogb3B0aW9ucy5jbG9uZSB9LCAoZXJyOiBFcnJvcikgPT4ge1xuICAgIGlmIChlcnIpIHtcbiAgICAgIHJldHVybiBjdHgubG9nLmVycm9yKGVycilcbiAgICB9XG4gICAgY3R4LmxvZy5zdWNjZXNzKFwiVGVtcGxhdGUgZmlsZXMgYXJlIGRvd25sb2FkZWQhXCIpXG4gICAgZ2VuZXJhdGUoY3R4LCBvcHRpb25zKS5jYXRjaCgoZSkgPT4ge1xuICAgICAgY3R4LmxvZy5lcnJvcihlKVxuICAgIH0pXG4gIH0pXG59XG5cbmNvbnN0IGluaXQ6IElQbHVnaW4gPSB7XG4gIGhhbmRsZTogYXN5bmMgKGN0eDogSVBpY0dvKSA9PiB7XG4gICAgY29uc3QgY21kID0gY3R4LmNtZFxuICAgIGNtZC5wcm9ncmFtXG4gICAgICAuY29tbWFuZChcImluaXRcIilcbiAgICAgIC5hcmd1bWVudHMoXCI8dGVtcGxhdGU+IFtwcm9qZWN0XVwiKVxuICAgICAgLm9wdGlvbihcIi0tY2xvbmVcIiwgXCJ1c2UgZ2l0IGNsb25lXCIpXG4gICAgICAub3B0aW9uKFwiLS1vZmZsaW5lXCIsIFwidXNlIGNhY2hlZCB0ZW1wbGF0ZVwiKVxuICAgICAgLmRlc2NyaXB0aW9uKFwiY3JlYXRlIHBpY2dvIHBsdWdpbidzIGRldmVsb3BtZW50IHRlbXBsYXRlc1wiKVxuICAgICAgLmFjdGlvbigodGVtcGxhdGU6IHN0cmluZywgcHJvamVjdDogc3RyaW5nLCBwcm9ncmFtOiBhbnkpID0+IHtcbiAgICAgICAgOyhhc3luYyAoKSA9PiB7XG4gICAgICAgICAgLy8gVGhhbmtzIHRvIHZ1ZS1jbGkgaW5pdDogaHR0cHM6Ly9naXRodWIuY29tL3Z1ZWpzL3Z1ZS1jbGkvYmxvYi9tYXN0ZXIvYmluL3Z1ZS1pbml0XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IGhhc1NsYXNoID0gdGVtcGxhdGUuaW5jbHVkZXMoXCIvXCIpXG4gICAgICAgICAgICBjb25zdCBpblBsYWNlID0gIXByb2plY3QgfHwgcHJvamVjdCA9PT0gXCIuXCJcbiAgICAgICAgICAgIGNvbnN0IGRlc3QgPSBwYXRoLnJlc29sdmUocHJvamVjdCB8fCBcIi5cIilcbiAgICAgICAgICAgIGNvbnN0IGNsb25lID0gcHJvZ3JhbS5jbG9uZSB8fCBmYWxzZVxuICAgICAgICAgICAgY29uc3Qgb2ZmbGluZSA9IHByb2dyYW0ub2ZmbGluZSB8fCBmYWxzZVxuICAgICAgICAgICAgY29uc3QgdG1wID0gcGF0aC5qb2luKGhvbWVkaXIoKSwgXCIucGljZ28vdGVtcGxhdGVzXCIsIHRlbXBsYXRlLnJlcGxhY2UoL1svOl0vZywgXCItXCIpKSAvLyBmb3IgY2FjaGluZyB0ZW1wbGF0ZVxuXG4gICAgICAgICAgICBpZiAocHJvZ3JhbS5vZmZsaW5lKSB7XG4gICAgICAgICAgICAgIHRlbXBsYXRlID0gdG1wXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICAgIHRlbXBsYXRlLFxuICAgICAgICAgICAgICBwcm9qZWN0LFxuICAgICAgICAgICAgICBoYXNTbGFzaCxcbiAgICAgICAgICAgICAgaW5QbGFjZSxcbiAgICAgICAgICAgICAgZGVzdCxcbiAgICAgICAgICAgICAgY2xvbmUsXG4gICAgICAgICAgICAgIHRtcCxcbiAgICAgICAgICAgICAgb2ZmbGluZSxcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gY2hlY2sgaWYgcHJvamVjdCBpcyBlbXB0eSBvciBleGlzdFxuICAgICAgICAgICAgaWYgKGluUGxhY2UgfHwgZnMuZXhpc3RzU3luYyhkZXN0KSkge1xuICAgICAgICAgICAgICBhd2FpdCBjdHguY21kLmlucXVpcmVyXG4gICAgICAgICAgICAgICAgLnByb21wdChbXG4gICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IFwiY29uZmlybVwiLFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBpblBsYWNlID8gXCJHZW5lcmF0ZSBwcm9qZWN0IGluIGN1cnJlbnQgZGlyZWN0b3J5P1wiIDogXCJUYXJnZXQgZGlyZWN0b3J5IGV4aXN0cy4gQ29udGludWU/XCIsXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwib2tcIixcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgXSlcbiAgICAgICAgICAgICAgICAudGhlbigoYW5zd2VyOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgIGlmIChhbnN3ZXIub2spIHtcbiAgICAgICAgICAgICAgICAgICAgcnVuKGN0eCwgb3B0aW9ucylcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgLy8gcHJvamVjdCBpcyBnaXZlblxuICAgICAgICAgICAgICBydW4oY3R4LCBvcHRpb25zKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgICAgICAgY3R4LmxvZy5lcnJvcihlKVxuICAgICAgICAgICAgaWYgKHByb2Nlc3MuYXJndi5pbmNsdWRlcyhcIi0tZGVidWdcIikpIHtcbiAgICAgICAgICAgICAgdGhyb3cgZVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSkoKS5jYXRjaCgoZSkgPT4ge1xuICAgICAgICAgIGN0eC5sb2cuZXJyb3IoZSlcbiAgICAgICAgfSlcbiAgICAgIH0pXG4gICAgICAub24oXCItLWhlbHBcIiwgKCkgPT4ge1xuICAgICAgICBjb25zb2xlLmxvZygpXG4gICAgICAgIGNvbnNvbGUubG9nKFwiRXhhbXBsZXM6XCIpXG4gICAgICAgIGNvbnNvbGUubG9nKClcbiAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JheShcIiAgIyBjcmVhdGUgYSBuZXcgcHJvamVjdCB3aXRoIGFuIG9mZmljaWFsIHRlbXBsYXRlXCIpKVxuICAgICAgICBjb25zb2xlLmxvZyhcIiAgJCBwaWNnbyBpbml0IHBsdWdpbiBteS1wcm9qZWN0XCIpXG4gICAgICAgIGNvbnNvbGUubG9nKClcbiAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JheShcIiAgIyBjcmVhdGUgYSBuZXcgcHJvamVjdCBzdHJhaWdodCBmcm9tIGEgZ2l0aHViIHRlbXBsYXRlXCIpKVxuICAgICAgICBjb25zb2xlLmxvZyhcIiAgJCBwaWNnbyBpbml0IHVzZXJuYW1lL3JlcG8gbXktcHJvamVjdFwiKVxuICAgICAgICBjb25zb2xlLmxvZygpXG4gICAgICB9KVxuICB9LFxufVxuXG5leHBvcnQgZGVmYXVsdCBpbml0XG4iLCJpbXBvcnQgeyBJUGx1Z2luLCBJUGljR28sIElTdHJpbmdLZXlNYXAgfSBmcm9tIFwiLi4vLi4vdHlwZXNcIlxuXG5jb25zdCBpMThuOiBJUGx1Z2luID0ge1xuICBoYW5kbGU6IChjdHg6IElQaWNHbykgPT4ge1xuICAgIGNvbnN0IGNtZCA9IGN0eC5jbWRcbiAgICBjbWQucHJvZ3JhbVxuICAgICAgLmNvbW1hbmQoXCJpMThuXCIpXG4gICAgICAuYXJndW1lbnRzKFwiW2xhbmddXCIpXG4gICAgICAuZGVzY3JpcHRpb24oXCJjaGFuZ2UgcGljZ28gbGFuZ3VhZ2VcIilcbiAgICAgIC5hY3Rpb24oYXN5bmMgKGxhbmcgPSBcIlwiKSA9PiB7XG4gICAgICAgIGNvbnN0IGxpc3QgPSBjdHguaTE4bi5nZXRMYW5ndWFnZUxpc3QoKVxuICAgICAgICBpZiAoIWxhbmcpIHtcbiAgICAgICAgICBjb25zdCBwcm9tcHRzID0gW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB0eXBlOiBcImxpc3RcIixcbiAgICAgICAgICAgICAgbmFtZTogXCJpMThuXCIsXG4gICAgICAgICAgICAgIGNob2ljZXM6IGxpc3QsXG4gICAgICAgICAgICAgIG1lc3NhZ2U6IFwiQ2hvb3NlIGEgbGFuZ3VhZ2VcIixcbiAgICAgICAgICAgICAgZGVmYXVsdDogY3R4LmdldENvbmZpZyhcInNldHRpbmdzLmxhbmd1YWdlXCIpIHx8IFwiemgtQ05cIixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXVxuICAgICAgICAgIGNvbnN0IGFuc3dlciA9IGF3YWl0IGN0eC5jbWQuaW5xdWlyZXIucHJvbXB0PElTdHJpbmdLZXlNYXA8c3RyaW5nPj4ocHJvbXB0cylcbiAgICAgICAgICBjdHguaTE4bi5zZXRMYW5ndWFnZShhbnN3ZXIuaTE4bilcbiAgICAgICAgICBjdHgubG9nLnN1Y2Nlc3MoYExhbmd1YWdlIHNldCB0byAke2Fuc3dlci5pMThufWApXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFsaXN0LmluY2x1ZGVzKGxhbmcpKSB7XG4gICAgICAgICAgcmV0dXJuIGN0eC5sb2cud2FybihcIk5vIHN1Y2ggbGFuZ3VhZ2VcIilcbiAgICAgICAgfVxuICAgICAgICBjdHguaTE4bi5zZXRMYW5ndWFnZShsYW5nKVxuICAgICAgICBjdHgubG9nLnN1Y2Nlc3MoYExhbmd1YWdlIHNldCB0byAke2xhbmd9YClcbiAgICAgIH0pXG4gIH0sXG59XG5cbmV4cG9ydCBkZWZhdWx0IGkxOG5cbiIsImltcG9ydCB7IElQbHVnaW4sIElMaWZlY3ljbGVQbHVnaW5zIH0gZnJvbSBcIi4uL3R5cGVzXCJcblxuZXhwb3J0IGNsYXNzIExpZmVjeWNsZVBsdWdpbnMgaW1wbGVtZW50cyBJTGlmZWN5Y2xlUGx1Z2lucyB7XG4gIHN0YXRpYyBjdXJyZW50UGx1Z2luOiBzdHJpbmcgfCBudWxsXG4gIHByaXZhdGUgcmVhZG9ubHkgbGlzdDogTWFwPHN0cmluZywgSVBsdWdpbj5cbiAgcHJpdmF0ZSByZWFkb25seSBwbHVnaW5JZE1hcDogTWFwPHN0cmluZywgc3RyaW5nW10+XG4gIHByaXZhdGUgcmVhZG9ubHkgbmFtZTogc3RyaW5nXG5cbiAgY29uc3RydWN0b3IobmFtZTogc3RyaW5nKSB7XG4gICAgdGhpcy5uYW1lID0gbmFtZVxuICAgIHRoaXMubGlzdCA9IG5ldyBNYXAoKVxuICAgIHRoaXMucGx1Z2luSWRNYXAgPSBuZXcgTWFwKClcbiAgfVxuXG4gIHJlZ2lzdGVyKGlkOiBzdHJpbmcsIHBsdWdpbjogSVBsdWdpbik6IHZvaWQge1xuICAgIGlmICghaWQpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJpZCBpcyByZXF1aXJlZCFcIilcbiAgICBpZiAodHlwZW9mIHBsdWdpbi5oYW5kbGUgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcInBsdWdpbi5oYW5kbGUgbXVzdCBiZSBhIGZ1bmN0aW9uIVwiKVxuICAgIGlmICh0aGlzLmxpc3QuaGFzKGlkKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihgJHt0aGlzLm5hbWV9IGR1cGxpY2F0ZSBpZDogJHtpZH0hYClcbiAgICB0aGlzLmxpc3Quc2V0KGlkLCBwbHVnaW4pXG4gICAgaWYgKExpZmVjeWNsZVBsdWdpbnMuY3VycmVudFBsdWdpbikge1xuICAgICAgaWYgKHRoaXMucGx1Z2luSWRNYXAuaGFzKExpZmVjeWNsZVBsdWdpbnMuY3VycmVudFBsdWdpbikpIHtcbiAgICAgICAgdGhpcy5wbHVnaW5JZE1hcC5nZXQoTGlmZWN5Y2xlUGx1Z2lucy5jdXJyZW50UGx1Z2luKT8ucHVzaChpZClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMucGx1Z2luSWRNYXAuc2V0KExpZmVjeWNsZVBsdWdpbnMuY3VycmVudFBsdWdpbiwgW2lkXSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB1bnJlZ2lzdGVyKHBsdWdpbk5hbWU6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICh0aGlzLnBsdWdpbklkTWFwLmhhcyhwbHVnaW5OYW1lKSkge1xuICAgICAgY29uc3QgcGx1Z2luTGlzdCA9IHRoaXMucGx1Z2luSWRNYXAuZ2V0KHBsdWdpbk5hbWUpXG4gICAgICBwbHVnaW5MaXN0Py5mb3JFYWNoKChwbHVnaW46IHN0cmluZykgPT4ge1xuICAgICAgICB0aGlzLmxpc3QuZGVsZXRlKHBsdWdpbilcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgZ2V0TmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLm5hbWVcbiAgfVxuXG4gIGdldChpZDogc3RyaW5nKTogSVBsdWdpbiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMubGlzdC5nZXQoaWQpXG4gIH1cblxuICBnZXRMaXN0KCk6IElQbHVnaW5bXSB7XG4gICAgcmV0dXJuIFsuLi50aGlzLmxpc3QudmFsdWVzKCldXG4gIH1cblxuICBnZXRJZExpc3QoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBbLi4udGhpcy5saXN0LmtleXMoKV1cbiAgfVxufVxuXG5leHBvcnQgY29uc3Qgc2V0Q3VycmVudFBsdWdpbk5hbWUgPSAobmFtZTogc3RyaW5nIHwgbnVsbCA9IG51bGwpOiB2b2lkID0+IHtcbiAgTGlmZWN5Y2xlUGx1Z2lucy5jdXJyZW50UGx1Z2luID0gbmFtZVxufVxuXG5leHBvcnQgY29uc3QgZ2V0Q3VycmVudFBsdWdpbk5hbWUgPSAoKTogc3RyaW5nIHwgbnVsbCA9PiB7XG4gIHJldHVybiBMaWZlY3ljbGVQbHVnaW5zLmN1cnJlbnRQbHVnaW5cbn1cblxuZXhwb3J0IGRlZmF1bHQgTGlmZWN5Y2xlUGx1Z2luc1xuIiwiLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLW1pc3VzZWQtcHJvbWlzZXMgKi9cbmltcG9ydCB7IENvbW1hbmQgfSBmcm9tIFwiY29tbWFuZGVyXCJcbmltcG9ydCBpbnF1aXJlciwgeyBJbnF1aXJlciB9IGZyb20gXCJpbnF1aXJlclwiXG5pbXBvcnQgeyBJUGx1Z2luLCBJQ29tbWFuZGVyLCBJUGljR28gfSBmcm9tIFwiLi4vdHlwZXNcIlxuaW1wb3J0IGNvbW1hbmRlcnMgZnJvbSBcIi4uL3BsdWdpbnMvY29tbWFuZGVyXCJcbmltcG9ydCB7IGdldEN1cnJlbnRQbHVnaW5OYW1lIH0gZnJvbSBcIi4vTGlmZWN5Y2xlUGx1Z2luc1wiXG5cbmV4cG9ydCBjbGFzcyBDb21tYW5kZXIgaW1wbGVtZW50cyBJQ29tbWFuZGVyIHtcbiAgcHJpdmF0ZSByZWFkb25seSBuYW1lID0gXCJjb21tYW5kZXJcIlxuICBzdGF0aWMgY3VycmVudFBsdWdpbjogc3RyaW5nIHwgbnVsbFxuICBwcml2YXRlIHJlYWRvbmx5IGxpc3Q6IE1hcDxzdHJpbmcsIElQbHVnaW4+ID0gbmV3IE1hcCgpXG4gIHByaXZhdGUgcmVhZG9ubHkgcGx1Z2luSWRNYXA6IE1hcDxzdHJpbmcsIHN0cmluZ1tdPiA9IG5ldyBNYXAoKVxuICBwcml2YXRlIHJlYWRvbmx5IGN0eDogSVBpY0dvXG5cbiAgcHJvZ3JhbTogQ29tbWFuZFxuICBpbnF1aXJlcjogSW5xdWlyZXJcblxuICBjb25zdHJ1Y3RvcihjdHg6IElQaWNHbykge1xuICAgIHRoaXMucHJvZ3JhbSA9IG5ldyBDb21tYW5kKClcbiAgICB0aGlzLmlucXVpcmVyID0gaW5xdWlyZXJcbiAgICB0aGlzLmN0eCA9IGN0eFxuICB9XG5cbiAgZ2V0TmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLm5hbWVcbiAgfVxuXG4gIGluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5wcm9ncmFtXG4gICAgICAudmVyc2lvbihwcm9jZXNzLmVudi5QSUNHT19WRVJTSU9OLCBcIi12LCAtLXZlcnNpb25cIilcbiAgICAgIC5vcHRpb24oXCItZCwgLS1kZWJ1Z1wiLCBcImRlYnVnIG1vZGVcIiwgKCkgPT4ge1xuICAgICAgICB0aGlzLmN0eC5zZXRDb25maWcoe1xuICAgICAgICAgIGRlYnVnOiB0cnVlLFxuICAgICAgICB9KVxuICAgICAgfSlcbiAgICAgIC5vcHRpb24oXCItcywgLS1zaWxlbnRcIiwgXCJzaWxlbnQgbW9kZVwiLCAoKSA9PiB7XG4gICAgICAgIHRoaXMuY3R4LnNldENvbmZpZyh7XG4gICAgICAgICAgc2lsZW50OiB0cnVlLFxuICAgICAgICB9KVxuICAgICAgfSlcbiAgICAgIC5vbihcImNvbW1hbmQ6KlwiLCAoKSA9PiB7XG4gICAgICAgIHRoaXMuY3R4LmxvZy5lcnJvcihcbiAgICAgICAgICBgSW52YWxpZCBjb21tYW5kOiAke3RoaXMucHJvZ3JhbS5hcmdzLmpvaW4oXCIgXCIpfVxcblNlZSAtLWhlbHAgZm9yIGEgbGlzdCBvZiBhdmFpbGFibGUgY29tbWFuZHMuYFxuICAgICAgICApXG4gICAgICAgIHByb2Nlc3MuZXhpdCgxKVxuICAgICAgfSlcblxuICAgIC8vIGJ1aWx0LWluIGNvbW1hbmRzXG4gICAgY29tbWFuZGVycyh0aGlzLmN0eClcbiAgfVxuXG4gIHJlZ2lzdGVyKGlkOiBzdHJpbmcsIHBsdWdpbjogSVBsdWdpbik6IHZvaWQge1xuICAgIGlmICghaWQpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJuYW1lIGlzIHJlcXVpcmVkIVwiKVxuICAgIGlmICh0eXBlb2YgcGx1Z2luLmhhbmRsZSAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwicGx1Z2luLmhhbmRsZSBtdXN0IGJlIGEgZnVuY3Rpb24hXCIpXG4gICAgaWYgKHRoaXMubGlzdC5oYXMoaWQpKSB0aHJvdyBuZXcgVHlwZUVycm9yKGAke3RoaXMubmFtZX0gcGx1Z2luIGR1cGxpY2F0ZSBpZDogJHtpZH0hYClcbiAgICB0aGlzLmxpc3Quc2V0KGlkLCBwbHVnaW4pXG4gICAgY29uc3QgY3VycmVudFBsdWdpbk5hbWUgPSBnZXRDdXJyZW50UGx1Z2luTmFtZSgpXG4gICAgaWYgKGN1cnJlbnRQbHVnaW5OYW1lICE9PSBudWxsKSB7XG4gICAgICBpZiAodGhpcy5wbHVnaW5JZE1hcC5oYXMoY3VycmVudFBsdWdpbk5hbWUpKSB7XG4gICAgICAgIHRoaXMucGx1Z2luSWRNYXAuZ2V0KGN1cnJlbnRQbHVnaW5OYW1lKT8ucHVzaChpZClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMucGx1Z2luSWRNYXAuc2V0KGN1cnJlbnRQbHVnaW5OYW1lLCBbaWRdKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHVucmVnaXN0ZXIocGx1Z2luTmFtZTogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucGx1Z2luSWRNYXAuaGFzKHBsdWdpbk5hbWUpKSB7XG4gICAgICBjb25zdCBwbHVnaW5MaXN0ID0gdGhpcy5wbHVnaW5JZE1hcC5nZXQocGx1Z2luTmFtZSlcbiAgICAgIHBsdWdpbkxpc3Q/LmZvckVhY2goKHBsdWdpbjogc3RyaW5nKSA9PiB7XG4gICAgICAgIHRoaXMubGlzdC5kZWxldGUocGx1Z2luKVxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICBsb2FkQ29tbWFuZHMoKTogdm9pZCB7XG4gICAgdGhpcy5nZXRMaXN0KCkuZm9yRWFjaCgoaXRlbTogSVBsdWdpbikgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaXRlbS5oYW5kbGUodGhpcy5jdHgpXG4gICAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgICAgdGhpcy5jdHgubG9nLmVycm9yKGUpXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIGdldChpZDogc3RyaW5nKTogSVBsdWdpbiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMubGlzdC5nZXQoaWQpXG4gIH1cblxuICBnZXRMaXN0KCk6IElQbHVnaW5bXSB7XG4gICAgcmV0dXJuIFsuLi50aGlzLmxpc3QudmFsdWVzKCldXG4gIH1cblxuICBnZXRJZExpc3QoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBbLi4udGhpcy5saXN0LmtleXMoKV1cbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBDb21tYW5kZXJcbiIsImltcG9ydCBwbHVnaW5IYW5kbGVyIGZyb20gXCIuL3BsdWdpbkhhbmRsZXJcIlxuaW1wb3J0IGNvbmZpZyBmcm9tIFwiLi9jb25maWdcIlxuaW1wb3J0IHVwbG9hZCBmcm9tIFwiLi91cGxvYWRcIlxuaW1wb3J0IHNldHRpbmcgZnJvbSBcIi4vc2V0dGluZ1wiXG5pbXBvcnQgdXNlIGZyb20gXCIuL3VzZVwiXG5pbXBvcnQgcHJveHkgZnJvbSBcIi4vcHJveHlcIlxuaW1wb3J0IGluaXQgZnJvbSBcIi4vaW5pdFwiXG5pbXBvcnQgaTE4biBmcm9tIFwiLi9pMThuXCJcbmltcG9ydCB7IElQaWNHbyB9IGZyb20gXCIuLi8uLi90eXBlc1wiXG5cbmV4cG9ydCBkZWZhdWx0IChjdHg6IElQaWNHbyk6IHZvaWQgPT4ge1xuICBjdHguY21kLnJlZ2lzdGVyKFwicGx1Z2luSGFuZGxlclwiLCBwbHVnaW5IYW5kbGVyKVxuICBjdHguY21kLnJlZ2lzdGVyKFwiY29uZmlnXCIsIGNvbmZpZylcbiAgY3R4LmNtZC5yZWdpc3RlcihcInNldHRpbmdcIiwgc2V0dGluZylcbiAgY3R4LmNtZC5yZWdpc3RlcihcInVwbG9hZFwiLCB1cGxvYWQpXG4gIGN0eC5jbWQucmVnaXN0ZXIoXCJ1c2VcIiwgdXNlKVxuICBjdHguY21kLnJlZ2lzdGVyKFwicHJveHlcIiwgcHJveHkpXG4gIGN0eC5jbWQucmVnaXN0ZXIoXCJpbml0XCIsIGluaXQpXG4gIGN0eC5jbWQucmVnaXN0ZXIoXCJpMThuXCIsIGkxOG4pXG59XG4iLCJleHBvcnQgZW51bSBJTG9nVHlwZSB7XG4gIHN1Y2Nlc3MgPSBcInN1Y2Nlc3NcIixcbiAgaW5mbyA9IFwiaW5mb1wiLFxuICB3YXJuID0gXCJ3YXJuXCIsXG4gIGVycm9yID0gXCJlcnJvclwiLFxufVxuXG4vKipcbiAqIHRoZXNlIGV2ZW50cyB3aWxsIGJlIGNhdGNoZWQgYnkgdXNlcnNcbiAqL1xuZXhwb3J0IGVudW0gSUJ1aWxkSW5FdmVudCB7XG4gIFVQTE9BRF9QUk9HUkVTUyA9IFwidXBsb2FkUHJvZ3Jlc3NcIixcbiAgRkFJTEVEID0gXCJmYWlsZWRcIixcbiAgQkVGT1JFX1RSQU5TRk9STSA9IFwiYmVmb3JlVHJhbnNmb3JtXCIsXG4gIEJFRk9SRV9VUExPQUQgPSBcImJlZm9yZVVwbG9hZFwiLFxuICBBRlRFUl9VUExPQUQgPSBcImFmdGVyVXBsb2FkXCIsXG4gIEZJTklTSEVEID0gXCJmaW5pc2hlZFwiLFxuICBJTlNUQUxMID0gXCJpbnN0YWxsXCIsXG4gIFVOSU5TVEFMTCA9IFwidW5pbnN0YWxsXCIsXG4gIFVQREFURSA9IFwidXBkYXRlXCIsXG4gIE5PVElGSUNBVElPTiA9IFwibm90aWZpY2F0aW9uXCIsXG59XG5cbi8qKlxuICogdGhlc2UgZXZlbnRzIHdpbGwgYmUgY2F0Y2hlZCBvbmx5IGJ5IHBpY2dvXG4gKi9cbmV4cG9ydCBlbnVtIElCdXNFdmVudCB7XG4gIENPTkZJR19DSEFOR0UgPSBcIkNPTkZJR19DSEFOR0VcIixcbn1cbiIsImltcG9ydCBjaGFsayBmcm9tIFwiY2hhbGtcIlxuaW1wb3J0IGRheWpzIGZyb20gXCJkYXlqc1wiXG5pbXBvcnQgZnMgZnJvbSBcImZzLWV4dHJhXCJcbmltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCJcbmltcG9ydCB1dGlsIGZyb20gXCJ1dGlsXCJcbmltcG9ydCB7IElMb2dUeXBlIH0gZnJvbSBcIi4uL3V0aWxzL2VudW1cIlxuaW1wb3J0IHsgSUxvZ0FyZ3ZUeXBlLCBJTG9nQXJndlR5cGVXaXRoRXJyb3IsIFVuZGVmaW5hYmxlLCBJTG9nQ29sb3IsIElMb2dnZXIsIElQaWNHbyB9IGZyb20gXCIuLi90eXBlc1wiXG5pbXBvcnQgeyBmb3JjZU51bWJlciwgaXNEZXYgfSBmcm9tIFwiLi4vdXRpbHMvY29tbW9uXCJcblxuZXhwb3J0IGNsYXNzIExvZ2dlciBpbXBsZW1lbnRzIElMb2dnZXIge1xuICBwcml2YXRlIHJlYWRvbmx5IGxldmVsID0ge1xuICAgIFtJTG9nVHlwZS5zdWNjZXNzXTogXCJncmVlblwiLFxuICAgIFtJTG9nVHlwZS5pbmZvXTogXCJibHVlXCIsXG4gICAgW0lMb2dUeXBlLndhcm5dOiBcInllbGxvd1wiLFxuICAgIFtJTG9nVHlwZS5lcnJvcl06IFwicmVkXCIsXG4gIH1cblxuICBwcml2YXRlIHJlYWRvbmx5IGN0eDogSVBpY0dvXG4gIHByaXZhdGUgbG9nTGV2ZWwhOiBzdHJpbmdcbiAgcHJpdmF0ZSBsb2dQYXRoITogc3RyaW5nXG4gIGNvbnN0cnVjdG9yKGN0eDogSVBpY0dvKSB7XG4gICAgdGhpcy5jdHggPSBjdHhcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlTG9nKHR5cGU6IElMb2dUeXBlLCAuLi5tc2c6IElMb2dBcmd2VHlwZVdpdGhFcnJvcltdKTogdm9pZCB7XG4gICAgLy8gY2hlY2sgY29uZmlnLnNpbGVudFxuICAgIGlmICghdGhpcy5jdHguZ2V0Q29uZmlnPFVuZGVmaW5hYmxlPHN0cmluZz4+KFwic2lsZW50XCIpKSB7XG4gICAgICBjb25zdCBsb2dIZWFkZXIgPSBjaGFsa1t0aGlzLmxldmVsW3R5cGVdIGFzIElMb2dDb2xvcl0oYFtQaWNHbyAke3R5cGUudG9VcHBlckNhc2UoKX1dOmApXG4gICAgICBjb25zb2xlLmxvZyhsb2dIZWFkZXIsIC4uLm1zZylcbiAgICAgIHRoaXMubG9nTGV2ZWwgPSB0aGlzLmN0eC5nZXRDb25maWcoXCJzZXR0aW5ncy5sb2dMZXZlbFwiKVxuICAgICAgdGhpcy5sb2dQYXRoID1cbiAgICAgICAgdGhpcy5jdHguZ2V0Q29uZmlnPFVuZGVmaW5hYmxlPHN0cmluZz4+KFwic2V0dGluZ3MubG9nUGF0aFwiKSB8fCBwYXRoLmpvaW4odGhpcy5jdHguYmFzZURpciwgXCIuL3BpY2dvLmxvZ1wiKVxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIC8vIGZpeCBsb2cgZmlsZSBpcyB0b28gbGFyZ2UsIG5vdyB0aGUgbG9nIGZpbGUncyBkZWZhdWx0IHNpemUgaXMgMTAgTUJcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLmNoZWNrTG9nRmlsZUlzTGFyZ2UodGhpcy5sb2dQYXRoKVxuICAgICAgICAgIGlmIChyZXN1bHQuaXNMYXJnZSkge1xuICAgICAgICAgICAgY29uc3Qgd2FybmluZ01zZyA9IGBMb2cgZmlsZSBpcyB0b28gbGFyZ2UgKD4gJHtcbiAgICAgICAgICAgICAgcmVzdWx0LmxvZ0ZpbGVTaXplTGltaXQhIC8gMTAyNCAvIDEwMjQgfHwgXCIxMFwiXG4gICAgICAgICAgICB9IE1CKSwgcmVjcmVhdGUgbG9nIGZpbGVgXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay55ZWxsb3coXCJbUGljR28gV0FSTl06XCIpLCB3YXJuaW5nTXNnKVxuICAgICAgICAgICAgdGhpcy5yZWNyZWF0ZUxvZ0ZpbGUodGhpcy5sb2dQYXRoKVxuICAgICAgICAgICAgbXNnLnVuc2hpZnQod2FybmluZ01zZylcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5oYW5kbGVXcml0ZUxvZyh0aGlzLmxvZ1BhdGgsIHR5cGUsIC4uLm1zZylcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIC8vIHdoeT8/P1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJbUGljR28gRXJyb3JdIG9uIGNoZWNraW5nIGxvZyBmaWxlIHNpemVcIiwgZSlcbiAgICAgICAgfVxuICAgICAgfSwgMClcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNoZWNrTG9nRmlsZUlzTGFyZ2UobG9nUGF0aDogc3RyaW5nKToge1xuICAgIGlzTGFyZ2U6IGJvb2xlYW5cbiAgICBsb2dGaWxlU2l6ZT86IG51bWJlclxuICAgIGxvZ0ZpbGVTaXplTGltaXQ/OiBudW1iZXJcbiAgfSB7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMobG9nUGF0aCkpIHtcbiAgICAgIGNvbnN0IGxvZ0ZpbGVTaXplID0gZnMuc3RhdFN5bmMobG9nUGF0aCkuc2l6ZVxuICAgICAgY29uc3QgbG9nRmlsZVNpemVMaW1pdCA9XG4gICAgICAgIGZvcmNlTnVtYmVyKHRoaXMuY3R4LmdldENvbmZpZzxVbmRlZmluYWJsZTxudW1iZXI+PihcInNldHRpbmdzLmxvZ0ZpbGVTaXplTGltaXRcIikgfHwgMTApICogMTAyNCAqIDEwMjQgLy8gMTAgTUIgZGVmYXVsdFxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaXNMYXJnZTogbG9nRmlsZVNpemUgPiBsb2dGaWxlU2l6ZUxpbWl0LFxuICAgICAgICBsb2dGaWxlU2l6ZSxcbiAgICAgICAgbG9nRmlsZVNpemVMaW1pdCxcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIGlzTGFyZ2U6IGZhbHNlLFxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcmVjcmVhdGVMb2dGaWxlKGxvZ1BhdGg6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmIChmcy5leGlzdHNTeW5jKGxvZ1BhdGgpKSB7XG4gICAgICBmcy51bmxpbmtTeW5jKGxvZ1BhdGgpXG4gICAgICBmcy5jcmVhdGVGaWxlU3luYyhsb2dQYXRoKVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlV3JpdGVMb2cobG9nUGF0aDogc3RyaW5nLCB0eXBlOiBzdHJpbmcsIC4uLm1zZzogSUxvZ0FyZ3ZUeXBlV2l0aEVycm9yW10pOiB2b2lkIHtcbiAgICB0cnkge1xuICAgICAgaWYgKHRoaXMuY2hlY2tMb2dMZXZlbCh0eXBlLCB0aGlzLmxvZ0xldmVsKSkge1xuICAgICAgICBsZXQgbG9nID0gYCR7ZGF5anMoKS5mb3JtYXQoXCJZWVlZLU1NLUREIEhIOm1tOnNzXCIpfSBbUGljR28gJHt0eXBlLnRvVXBwZXJDYXNlKCl9XSBgXG4gICAgICAgIG1zZy5mb3JFYWNoKChpdGVtOiBJTG9nQXJndlR5cGVXaXRoRXJyb3IpID0+IHtcbiAgICAgICAgICBpZiAoaXRlbSBpbnN0YW5jZW9mIEVycm9yICYmIHR5cGUgPT09IFwiZXJyb3JcIikge1xuICAgICAgICAgICAgbG9nICs9IGBcXG4tLS0tLS1FcnJvciBTdGFjayBCZWdpbi0tLS0tLVxcbiR7dXRpbC5mb3JtYXQoaXRlbT8uc3RhY2spfVxcbi0tLS0tLS1FcnJvciBTdGFjayBFbmQtLS0tLS0tIGBcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBpdGVtID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgICAgIGl0ZW0gPSBKU09OLnN0cmluZ2lmeShpdGVtLCBudWxsLCAyKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbG9nICs9IGAke2l0ZW0gYXMgc3RyaW5nfSBgXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgICBsb2cgKz0gXCJcXG5cIlxuICAgICAgICAvLyBBIHN5bmNocm9uaXplZCBhcHByb2FjaCB0byBhdm9pZCBsb2cgbXNnIHNlcXVlbmNlIGVycm9yc1xuICAgICAgICBmcy5hcHBlbmRGaWxlU3luYyhsb2dQYXRoLCBsb2cpXG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29uc29sZS5lcnJvcihcIltQaWNHbyBFcnJvcl0gb24gd3JpdGluZyBsb2cgZmlsZVwiLCBlKVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY2hlY2tMb2dMZXZlbCh0eXBlOiBzdHJpbmcsIGxldmVsOiB1bmRlZmluZWQgfCBzdHJpbmcgfCBzdHJpbmdbXSk6IGJvb2xlYW4ge1xuICAgIGlmIChsZXZlbCA9PT0gdW5kZWZpbmVkIHx8IGxldmVsID09PSBcImFsbFwiKSB7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgICBpZiAoQXJyYXkuaXNBcnJheShsZXZlbCkpIHtcbiAgICAgIHJldHVybiBsZXZlbC5zb21lKChpdGVtOiBzdHJpbmcpID0+IGl0ZW0gPT09IHR5cGUgfHwgaXRlbSA9PT0gXCJhbGxcIilcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHR5cGUgPT09IGxldmVsXG4gICAgfVxuICB9XG5cbiAgc3VjY2VzcyguLi5tc2c6IElMb2dBcmd2VHlwZVtdKTogdm9pZCB7XG4gICAgcmV0dXJuIHRoaXMuaGFuZGxlTG9nKElMb2dUeXBlLnN1Y2Nlc3MsIC4uLm1zZylcbiAgfVxuXG4gIGluZm8oLi4ubXNnOiBJTG9nQXJndlR5cGVbXSk6IHZvaWQge1xuICAgIHJldHVybiB0aGlzLmhhbmRsZUxvZyhJTG9nVHlwZS5pbmZvLCAuLi5tc2cpXG4gIH1cblxuICBlcnJvciguLi5tc2c6IElMb2dBcmd2VHlwZVdpdGhFcnJvcltdKTogdm9pZCB7XG4gICAgcmV0dXJuIHRoaXMuaGFuZGxlTG9nKElMb2dUeXBlLmVycm9yLCAuLi5tc2cpXG4gIH1cblxuICB3YXJuKC4uLm1zZzogSUxvZ0FyZ3ZUeXBlW10pOiB2b2lkIHtcbiAgICByZXR1cm4gdGhpcy5oYW5kbGVMb2coSUxvZ1R5cGUud2FybiwgLi4ubXNnKVxuICB9XG5cbiAgZGVidWcoLi4ubXNnOiBJTG9nQXJndlR5cGVbXSk6IHZvaWQge1xuICAgIGlmIChpc0RldigpKSB7XG4gICAgICB0aGlzLmhhbmRsZUxvZyhJTG9nVHlwZS5pbmZvLCAuLi5tc2cpXG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IExvZ2dlclxuIiwiaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSBcImV2ZW50c1wiXG5pbXBvcnQgeyBJTGlmZWN5Y2xlUGx1Z2lucywgSVBpY0dvLCBJUGx1Z2luLCBVbmRlZmluYWJsZSB9IGZyb20gXCIuLi90eXBlc1wiXG5pbXBvcnQgeyBoYW5kbGVVcmxFbmNvZGUgfSBmcm9tIFwiLi4vdXRpbHMvY29tbW9uXCJcbmltcG9ydCB7IElCdWlsZEluRXZlbnQgfSBmcm9tIFwiLi4vdXRpbHMvZW51bVwiXG5pbXBvcnQgeyBjcmVhdGVDb250ZXh0IH0gZnJvbSBcIi4uL3V0aWxzL2NyZWF0ZUNvbnRleHRcIlxuXG5leHBvcnQgY2xhc3MgTGlmZWN5Y2xlIGV4dGVuZHMgRXZlbnRFbWl0dGVyIHtcbiAgcHJpdmF0ZSByZWFkb25seSBjdHg6IElQaWNHb1xuXG4gIGNvbnN0cnVjdG9yKGN0eDogSVBpY0dvKSB7XG4gICAgc3VwZXIoKVxuICAgIHRoaXMuY3R4ID0gY3R4XG4gIH1cblxuICBhc3luYyBzdGFydChpbnB1dDogYW55W10pOiBQcm9taXNlPElQaWNHbz4ge1xuICAgIC8vIGVuc3VyZSBldmVyeSB1cGxvYWQgcHJvY2VzcyBoYXMgYW4gdW5pcXVlIGNvbnRleHRcbiAgICBjb25zdCBjdHggPSBjcmVhdGVDb250ZXh0KHRoaXMuY3R4KVxuICAgIHRyeSB7XG4gICAgICAvLyBpbWFnZXMgaW5wdXRcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheShpbnB1dCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW5wdXQgbXVzdCBiZSBhbiBhcnJheS5cIilcbiAgICAgIH1cbiAgICAgIGN0eC5pbnB1dCA9IGlucHV0XG4gICAgICBjdHgub3V0cHV0ID0gW11cblxuICAgICAgLy8gbGlmZWN5Y2xlIG1haW5cbiAgICAgIGF3YWl0IHRoaXMuYmVmb3JlVHJhbnNmb3JtKGN0eClcbiAgICAgIGF3YWl0IHRoaXMuZG9UcmFuc2Zvcm0oY3R4KVxuICAgICAgYXdhaXQgdGhpcy5iZWZvcmVVcGxvYWQoY3R4KVxuICAgICAgYXdhaXQgdGhpcy5kb1VwbG9hZChjdHgpXG4gICAgICBhd2FpdCB0aGlzLmFmdGVyVXBsb2FkKGN0eClcbiAgICAgIHJldHVybiBjdHhcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIGN0eC5sb2cud2FybihJQnVpbGRJbkV2ZW50LkZBSUxFRClcbiAgICAgIGN0eC5lbWl0KElCdWlsZEluRXZlbnQuVVBMT0FEX1BST0dSRVNTLCAtMSlcbiAgICAgIGN0eC5lbWl0KElCdWlsZEluRXZlbnQuRkFJTEVELCBlKVxuICAgICAgY3R4LmxvZy5lcnJvcihlKVxuICAgICAgaWYgKGN0eC5nZXRDb25maWc8VW5kZWZpbmFibGU8c3RyaW5nPj4oXCJkZWJ1Z1wiKSkge1xuICAgICAgICB0aHJvdyBlXG4gICAgICB9XG4gICAgICByZXR1cm4gY3R4XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBiZWZvcmVUcmFuc2Zvcm0oY3R4OiBJUGljR28pOiBQcm9taXNlPElQaWNHbz4ge1xuICAgIGN0eC5lbWl0KElCdWlsZEluRXZlbnQuVVBMT0FEX1BST0dSRVNTLCAwKVxuICAgIGN0eC5lbWl0KElCdWlsZEluRXZlbnQuQkVGT1JFX1RSQU5TRk9STSwgY3R4KVxuICAgIGN0eC5sb2cuaW5mbyhcIkJlZm9yZSB0cmFuc2Zvcm1cIilcbiAgICBhd2FpdCB0aGlzLmhhbmRsZVBsdWdpbnMoY3R4LmhlbHBlci5iZWZvcmVUcmFuc2Zvcm1QbHVnaW5zLCBjdHgpXG4gICAgcmV0dXJuIGN0eFxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBkb1RyYW5zZm9ybShjdHg6IElQaWNHbyk6IFByb21pc2U8SVBpY0dvPiB7XG4gICAgY3R4LmVtaXQoSUJ1aWxkSW5FdmVudC5VUExPQURfUFJPR1JFU1MsIDMwKVxuICAgIGNvbnN0IHR5cGUgPSBjdHguZ2V0Q29uZmlnPFVuZGVmaW5hYmxlPHN0cmluZz4+KFwicGljQmVkLnRyYW5zZm9ybWVyXCIpIHx8IFwicGF0aFwiXG4gICAgbGV0IGN1cnJlbnRUcmFuc2Zvcm1lciA9IHR5cGVcbiAgICBsZXQgdHJhbnNmb3JtZXIgPSBjdHguaGVscGVyLnRyYW5zZm9ybWVyLmdldCh0eXBlKVxuICAgIGlmICghdHJhbnNmb3JtZXIpIHtcbiAgICAgIHRyYW5zZm9ybWVyID0gY3R4LmhlbHBlci50cmFuc2Zvcm1lci5nZXQoXCJwYXRoXCIpXG4gICAgICBjdXJyZW50VHJhbnNmb3JtZXIgPSBcInBhdGhcIlxuICAgICAgY3R4LmxvZy53YXJuKGBDYW4ndCBmaW5kIHRyYW5zZm9ybWVyIC0gJHt0eXBlfSwgc3dpdGNoIHRvIGRlZmF1bHQgdHJhbnNmb3JtZXIgLSBwYXRoYClcbiAgICB9XG4gICAgY3R4LmxvZy5pbmZvKGBUcmFuc2Zvcm1pbmcuLi4gQ3VycmVudCB0cmFuc2Zvcm1lciBpcyBbJHtjdXJyZW50VHJhbnNmb3JtZXJ9XWApXG4gICAgYXdhaXQgdHJhbnNmb3JtZXI/LmhhbmRsZShjdHgpXG4gICAgcmV0dXJuIGN0eFxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBiZWZvcmVVcGxvYWQoY3R4OiBJUGljR28pOiBQcm9taXNlPElQaWNHbz4ge1xuICAgIGN0eC5lbWl0KElCdWlsZEluRXZlbnQuVVBMT0FEX1BST0dSRVNTLCA2MClcbiAgICBjdHgubG9nLmluZm8oXCJCZWZvcmUgdXBsb2FkXCIpXG4gICAgY3R4LmVtaXQoSUJ1aWxkSW5FdmVudC5CRUZPUkVfVVBMT0FELCBjdHgpXG4gICAgYXdhaXQgdGhpcy5oYW5kbGVQbHVnaW5zKGN0eC5oZWxwZXIuYmVmb3JlVXBsb2FkUGx1Z2lucywgY3R4KVxuICAgIHJldHVybiBjdHhcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZG9VcGxvYWQoY3R4OiBJUGljR28pOiBQcm9taXNlPElQaWNHbz4ge1xuICAgIGxldCB0eXBlID1cbiAgICAgIGN0eC5nZXRDb25maWc8VW5kZWZpbmFibGU8c3RyaW5nPj4oXCJwaWNCZWQudXBsb2FkZXJcIikgfHxcbiAgICAgIGN0eC5nZXRDb25maWc8VW5kZWZpbmFibGU8c3RyaW5nPj4oXCJwaWNCZWQuY3VycmVudFwiKSB8fFxuICAgICAgXCJnaXRodWJcIlxuICAgIGxldCB1cGxvYWRlciA9IGN0eC5oZWxwZXIudXBsb2FkZXIuZ2V0KHR5cGUpXG4gICAgbGV0IGN1cnJlbnRUcmFuc2Zvcm1lciA9IHR5cGVcbiAgICBpZiAoIXVwbG9hZGVyKSB7XG4gICAgICB0eXBlID0gXCJnaXRodWJcIlxuICAgICAgY3VycmVudFRyYW5zZm9ybWVyID0gXCJnaXRodWJcIlxuICAgICAgdXBsb2FkZXIgPSBjdHguaGVscGVyLnVwbG9hZGVyLmdldChcImdpdGh1YlwiKVxuICAgICAgY3R4LmxvZy53YXJuKGBDYW4ndCBmaW5kIHVwbG9hZGVyIC0gJHt0eXBlfSwgc3dpdGNoIHRvIGRlZmF1bHQgdXBsb2FkZXIgLSBnaXRodWJgKVxuICAgIH1cbiAgICBjdHgubG9nLmluZm8oYFVwbG9hZGluZy4uLiBDdXJyZW50IHVwbG9hZGVyIGlzIFske2N1cnJlbnRUcmFuc2Zvcm1lcn1dYClcbiAgICBhd2FpdCB1cGxvYWRlcj8uaGFuZGxlKGN0eClcbiAgICBmb3IgKGNvbnN0IG91dHB1dEltZyBvZiBjdHgub3V0cHV0KSB7XG4gICAgICBvdXRwdXRJbWcudHlwZSA9IHR5cGVcbiAgICB9XG4gICAgcmV0dXJuIGN0eFxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBhZnRlclVwbG9hZChjdHg6IElQaWNHbyk6IFByb21pc2U8SVBpY0dvPiB7XG4gICAgY3R4LmVtaXQoSUJ1aWxkSW5FdmVudC5BRlRFUl9VUExPQUQsIGN0eClcbiAgICBjdHguZW1pdChJQnVpbGRJbkV2ZW50LlVQTE9BRF9QUk9HUkVTUywgMTAwKVxuICAgIGF3YWl0IHRoaXMuaGFuZGxlUGx1Z2lucyhjdHguaGVscGVyLmFmdGVyVXBsb2FkUGx1Z2lucywgY3R4KVxuICAgIGxldCBtc2cgPSBcIlwiXG4gICAgY29uc3QgbGVuZ3RoID0gY3R4Lm91dHB1dC5sZW5ndGhcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAodHlwZW9mIGN0eC5vdXRwdXRbaV0uaW1nVXJsICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgIG1zZyArPSBoYW5kbGVVcmxFbmNvZGUoY3R4Lm91dHB1dFtpXS5pbWdVcmwhKVxuICAgICAgICBpZiAoaSAhPT0gbGVuZ3RoIC0gMSkge1xuICAgICAgICAgIG1zZyArPSBcIlxcblwiXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGRlbGV0ZSBjdHgub3V0cHV0W2ldLmJhc2U2NEltYWdlXG4gICAgICBkZWxldGUgY3R4Lm91dHB1dFtpXS5idWZmZXJcbiAgICB9XG4gICAgY3R4LmVtaXQoSUJ1aWxkSW5FdmVudC5GSU5JU0hFRCwgY3R4KVxuICAgIGN0eC5sb2cuc3VjY2VzcyhgXFxuJHttc2d9YClcbiAgICByZXR1cm4gY3R4XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGhhbmRsZVBsdWdpbnMobGlmZUN5Y2xlUGx1Z2luczogSUxpZmVjeWNsZVBsdWdpbnMsIGN0eDogSVBpY0dvKTogUHJvbWlzZTxJUGljR28+IHtcbiAgICBjb25zdCBwbHVnaW5zID0gbGlmZUN5Y2xlUGx1Z2lucy5nZXRMaXN0KClcbiAgICBjb25zdCBwbHVnaW5OYW1lcyA9IGxpZmVDeWNsZVBsdWdpbnMuZ2V0SWRMaXN0KClcbiAgICBjb25zdCBsaWZlQ3ljbGVOYW1lID0gbGlmZUN5Y2xlUGx1Z2lucy5nZXROYW1lKClcbiAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIHBsdWdpbnMubWFwKGFzeW5jIChwbHVnaW46IElQbHVnaW4sIGluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjdHgubG9nLmluZm8oYCR7bGlmZUN5Y2xlTmFtZX06ICR7cGx1Z2luTmFtZXNbaW5kZXhdfSBydW5uaW5nYClcbiAgICAgICAgICBhd2FpdCBwbHVnaW4uaGFuZGxlKGN0eClcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGN0eC5sb2cuZXJyb3IoYCR7bGlmZUN5Y2xlTmFtZX06ICR7cGx1Z2luTmFtZXNbaW5kZXhdfSBlcnJvcmApXG4gICAgICAgICAgdGhyb3cgZVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIClcbiAgICByZXR1cm4gY3R4XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgTGlmZWN5Y2xlXG4iLCJpbXBvcnQgeyBJUGljR28gfSBmcm9tIFwiLi4vdHlwZXNcIlxuXG4vKipcbiAqIGNyZWF0ZSBhbiB1bmlxdWUgY29udGV4dCBmb3IgZWFjaCB1cGxvYWQgcHJvY2Vzc1xuICogQHBhcmFtIGN0eFxuICovXG5leHBvcnQgY29uc3QgY3JlYXRlQ29udGV4dCA9IChjdHg6IElQaWNHbyk6IElQaWNHbyA9PiB7XG4gIHJldHVybiB7XG4gICAgY29uZmlnUGF0aDogY3R4LmNvbmZpZ1BhdGgsXG4gICAgYmFzZURpcjogY3R4LmJhc2VEaXIsXG4gICAgbG9nOiBjdHgubG9nLFxuICAgIGNtZDogY3R4LmNtZCxcbiAgICBvdXRwdXQ6IFtdLFxuICAgIGlucHV0OiBbXSxcbiAgICBwbHVnaW5Mb2FkZXI6IGN0eC5wbHVnaW5Mb2FkZXIsXG4gICAgcGx1Z2luSGFuZGxlcjogY3R4LnBsdWdpbkhhbmRsZXIsXG4gICAgUmVxdWVzdDogY3R4LlJlcXVlc3QsXG4gICAgaGVscGVyOiBjdHguaGVscGVyLFxuICAgIFZFUlNJT046IGN0eC5WRVJTSU9OLFxuICAgIEdVSV9WRVJTSU9OOiBjdHguR1VJX1ZFUlNJT04sXG4gICAgcmVxdWVzdDogY3R4LnJlcXVlc3QsXG4gICAgaTE4bjogY3R4LmkxOG4sXG4gICAgZ2V0Q29uZmlnOiBjdHguZ2V0Q29uZmlnLmJpbmQoY3R4KSxcbiAgICBzYXZlQ29uZmlnOiBjdHguc2F2ZUNvbmZpZy5iaW5kKGN0eCksXG4gICAgcmVtb3ZlQ29uZmlnOiBjdHgucmVtb3ZlQ29uZmlnLmJpbmQoY3R4KSxcbiAgICBzZXRDb25maWc6IGN0eC5zZXRDb25maWcuYmluZChjdHgpLFxuICAgIHVuc2V0Q29uZmlnOiBjdHgudW5zZXRDb25maWcuYmluZChjdHgpLFxuICAgIHVwbG9hZDogY3R4LnVwbG9hZC5iaW5kKGN0eCksXG4gICAgYWRkTGlzdGVuZXI6IGN0eC5hZGRMaXN0ZW5lci5iaW5kKGN0eCksXG4gICAgb246IGN0eC5vbi5iaW5kKGN0eCksXG4gICAgb25jZTogY3R4Lm9uY2UuYmluZChjdHgpLFxuICAgIHJlbW92ZUxpc3RlbmVyOiBjdHgucmVtb3ZlTGlzdGVuZXIuYmluZChjdHgpLFxuICAgIG9mZjogY3R4Lm9mZi5iaW5kKGN0eCksXG4gICAgcmVtb3ZlQWxsTGlzdGVuZXJzOiBjdHgucmVtb3ZlQWxsTGlzdGVuZXJzLmJpbmQoY3R4KSxcbiAgICBzZXRNYXhMaXN0ZW5lcnM6IGN0eC5zZXRNYXhMaXN0ZW5lcnMuYmluZChjdHgpLFxuICAgIGdldE1heExpc3RlbmVyczogY3R4LmdldE1heExpc3RlbmVycy5iaW5kKGN0eCksXG4gICAgbGlzdGVuZXJzOiBjdHgubGlzdGVuZXJzLmJpbmQoY3R4KSxcbiAgICByYXdMaXN0ZW5lcnM6IGN0eC5yYXdMaXN0ZW5lcnMuYmluZChjdHgpLFxuICAgIGVtaXQ6IGN0eC5lbWl0LmJpbmQoY3R4KSxcbiAgICBsaXN0ZW5lckNvdW50OiBjdHgubGlzdGVuZXJDb3VudC5iaW5kKGN0eCksXG4gICAgcHJlcGVuZExpc3RlbmVyOiBjdHgucHJlcGVuZExpc3RlbmVyLmJpbmQoY3R4KSxcbiAgICBwcmVwZW5kT25jZUxpc3RlbmVyOiBjdHgucHJlcGVuZE9uY2VMaXN0ZW5lci5iaW5kKGN0eCksXG4gICAgZXZlbnROYW1lczogY3R4LmV2ZW50TmFtZXMuYmluZChjdHgpLFxuICB9XG59XG4iLCJpbXBvcnQgY3J5cHRvIGZyb20gXCJjcnlwdG9cIlxuaW1wb3J0IG1pbWUgZnJvbSBcIm1pbWUtdHlwZXNcIlxuaW1wb3J0IHsgSU9sZFJlcU9wdGlvbnNXaXRoRnVsbFJlc3BvbnNlLCBJUGljR28sIElQbHVnaW5Db25maWcsIElUY3l1bkNvbmZpZyB9IGZyb20gXCIuLi8uLi90eXBlc1wiXG5pbXBvcnQgeyBJQnVpbGRJbkV2ZW50IH0gZnJvbSBcIi4uLy4uL3V0aWxzL2VudW1cIlxuaW1wb3J0IHsgSUxvY2FsZXNLZXkgfSBmcm9tIFwiLi4vLi4vaTE4bi96aC1DTlwiXG5cbi8vIGdlbmVyYXRlIENPUyBzaWduYXR1cmUgc3RyaW5nXG5cbmV4cG9ydCBpbnRlcmZhY2UgSVNpZ25hdHVyZSB7XG4gIHNpZ25hdHVyZTogc3RyaW5nXG4gIGFwcElkOiBzdHJpbmdcbiAgYnVja2V0OiBzdHJpbmdcbiAgc2lnblRpbWU6IHN0cmluZ1xufVxuXG5jb25zdCBnZW5lcmF0ZVNpZ25hdHVyZSA9IChvcHRpb25zOiBJVGN5dW5Db25maWcsIGZpbGVOYW1lOiBzdHJpbmcpOiBJU2lnbmF0dXJlID0+IHtcbiAgY29uc3Qgc2VjcmV0SWQgPSBvcHRpb25zLnNlY3JldElkXG4gIGNvbnN0IHNlY3JldEtleSA9IG9wdGlvbnMuc2VjcmV0S2V5XG4gIGNvbnN0IGFwcElkID0gb3B0aW9ucy5hcHBJZFxuICBjb25zdCBidWNrZXQgPSBvcHRpb25zLmJ1Y2tldFxuICBsZXQgc2lnbmF0dXJlXG4gIGxldCBzaWduVGltZSA9IFwiXCJcbiAgaWYgKCFvcHRpb25zLnZlcnNpb24gfHwgb3B0aW9ucy52ZXJzaW9uID09PSBcInY0XCIpIHtcbiAgICBjb25zdCByYW5kb20gPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAxMDAwMDAwMDAwMClcbiAgICBjb25zdCBjdXJyZW50ID0gTWF0aC5mbG9vcihuZXcgRGF0ZSgpLmdldFRpbWUoKSAvIDEwMDApIC0gMVxuICAgIGNvbnN0IGV4cGlyZWQgPSBjdXJyZW50ICsgMzYwMFxuXG4gICAgY29uc3QgbXVsdGlTaWduYXR1cmUgPSBgYT0ke2FwcElkfSZiPSR7YnVja2V0fSZrPSR7c2VjcmV0SWR9JmU9JHtleHBpcmVkfSZ0PSR7Y3VycmVudH0mcj0ke3JhbmRvbX0mZj1gXG5cbiAgICBjb25zdCBzaWduSGV4S2V5ID0gY3J5cHRvLmNyZWF0ZUhtYWMoXCJzaGExXCIsIHNlY3JldEtleSkudXBkYXRlKG11bHRpU2lnbmF0dXJlKS5kaWdlc3QoKVxuICAgIGNvbnN0IHRlbXBTdHJpbmcgPSBCdWZmZXIuY29uY2F0KFtzaWduSGV4S2V5LCBCdWZmZXIuZnJvbShtdWx0aVNpZ25hdHVyZSldKVxuICAgIHNpZ25hdHVyZSA9IEJ1ZmZlci5mcm9tKHRlbXBTdHJpbmcpLnRvU3RyaW5nKFwiYmFzZTY0XCIpXG4gIH0gZWxzZSB7XG4gICAgLy8gaHR0cHM6Ly9jbG91ZC50ZW5jZW50LmNvbS9kb2N1bWVudC9wcm9kdWN0LzQzNi83Nzc4I3NpZ25hdHVyZVxuICAgIGNvbnN0IHRvZGF5ID0gTWF0aC5mbG9vcihuZXcgRGF0ZSgpLmdldFRpbWUoKSAvIDEwMDApXG4gICAgY29uc3QgdG9tb3Jyb3cgPSB0b2RheSArIDg2NDAwXG4gICAgc2lnblRpbWUgPSBgJHt0b2RheX07JHt0b21vcnJvd31gXG4gICAgY29uc3Qgc2lnbktleSA9IGNyeXB0by5jcmVhdGVIbWFjKFwic2hhMVwiLCBzZWNyZXRLZXkpLnVwZGF0ZShzaWduVGltZSkuZGlnZXN0KFwiaGV4XCIpXG4gICAgY29uc3QgaHR0cFN0cmluZyA9IGBwdXRcXG4vJHtvcHRpb25zLnBhdGh9JHtmaWxlTmFtZX1cXG5cXG5ob3N0PSR7b3B0aW9ucy5idWNrZXR9LmNvcy4ke29wdGlvbnMuYXJlYX0ubXlxY2xvdWQuY29tXFxuYFxuICAgIGNvbnN0IHNoYTFlZEh0dHBTdHJpbmcgPSBjcnlwdG8uY3JlYXRlSGFzaChcInNoYTFcIikudXBkYXRlKGh0dHBTdHJpbmcpLmRpZ2VzdChcImhleFwiKVxuICAgIGNvbnN0IHN0cmluZ1RvU2lnbiA9IGBzaGExXFxuJHtzaWduVGltZX1cXG4ke3NoYTFlZEh0dHBTdHJpbmd9XFxuYFxuICAgIHNpZ25hdHVyZSA9IGNyeXB0by5jcmVhdGVIbWFjKFwic2hhMVwiLCBzaWduS2V5KS51cGRhdGUoc3RyaW5nVG9TaWduKS5kaWdlc3QoXCJoZXhcIilcbiAgfVxuICByZXR1cm4ge1xuICAgIHNpZ25hdHVyZSxcbiAgICBhcHBJZCxcbiAgICBidWNrZXQsXG4gICAgc2lnblRpbWUsXG4gIH1cbn1cblxuY29uc3QgcG9zdE9wdGlvbnMgPSAoXG4gIG9wdGlvbnM6IElUY3l1bkNvbmZpZyxcbiAgZmlsZU5hbWU6IHN0cmluZyxcbiAgc2lnbmF0dXJlOiBJU2lnbmF0dXJlLFxuICBpbWFnZTogQnVmZmVyLFxuICB2ZXJzaW9uOiBzdHJpbmdcbik6IElPbGRSZXFPcHRpb25zV2l0aEZ1bGxSZXNwb25zZSA9PiB7XG4gIGNvbnN0IGFyZWEgPSBvcHRpb25zLmFyZWFcbiAgY29uc3QgcGF0aCA9IG9wdGlvbnMucGF0aFxuICBpZiAoIW9wdGlvbnMudmVyc2lvbiB8fCBvcHRpb25zLnZlcnNpb24gPT09IFwidjRcIikge1xuICAgIHJldHVybiB7XG4gICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgdXJsOiBgaHR0cDovLyR7YXJlYX0uZmlsZS5teXFjbG91ZC5jb20vZmlsZXMvdjIvJHtzaWduYXR1cmUuYXBwSWR9LyR7c2lnbmF0dXJlLmJ1Y2tldH0vJHtlbmNvZGVVUkkoXG4gICAgICAgIHBhdGhcbiAgICAgICl9JHtmaWxlTmFtZX1gLFxuICAgICAgaGVhZGVyczoge1xuICAgICAgICAvLyB1bnNhZmVcbiAgICAgICAgLy8gSG9zdDogYCR7YXJlYX0uZmlsZS5teXFjbG91ZC5jb21gLFxuICAgICAgICBBdXRob3JpemF0aW9uOiBzaWduYXR1cmUuc2lnbmF0dXJlLFxuICAgICAgICBjb250ZW50VHlwZTogXCJtdWx0aXBhcnQvZm9ybS1kYXRhXCIsXG4gICAgICAgIHVzZXJBZ2VudDogYFBpY0dvOyR7dmVyc2lvbn07bnVsbDtudWxsYCxcbiAgICAgIH0sXG4gICAgICBmb3JtRGF0YToge1xuICAgICAgICBvcDogXCJ1cGxvYWRcIixcbiAgICAgICAgZmlsZWNvbnRlbnQ6IGltYWdlLFxuICAgICAgfSxcbiAgICAgIHJlc29sdmVXaXRoRnVsbFJlc3BvbnNlOiB0cnVlLFxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICByZXR1cm4ge1xuICAgICAgbWV0aG9kOiBcIlBVVFwiLFxuICAgICAgdXJsOiBgaHR0cDovLyR7b3B0aW9ucy5idWNrZXR9LmNvcy4ke29wdGlvbnMuYXJlYX0ubXlxY2xvdWQuY29tLyR7ZW5jb2RlVVJJQ29tcG9uZW50KHBhdGgpfSR7ZW5jb2RlVVJJQ29tcG9uZW50KFxuICAgICAgICBmaWxlTmFtZVxuICAgICAgKX1gLFxuICAgICAgaGVhZGVyczoge1xuICAgICAgICAvLyBIb3N0OiBgJHtvcHRpb25zLmJ1Y2tldH0uY29zLiR7b3B0aW9ucy5hcmVhfS5teXFjbG91ZC5jb21gLFxuICAgICAgICBBdXRob3JpemF0aW9uOiBgcS1zaWduLWFsZ29yaXRobT1zaGExJnEtYWs9JHtvcHRpb25zLnNlY3JldElkfSZxLXNpZ24tdGltZT0ke3NpZ25hdHVyZS5zaWduVGltZX0mcS1rZXktdGltZT0ke3NpZ25hdHVyZS5zaWduVGltZX0mcS1oZWFkZXItbGlzdD1ob3N0JnEtdXJsLXBhcmFtLWxpc3Q9JnEtc2lnbmF0dXJlPSR7c2lnbmF0dXJlLnNpZ25hdHVyZX1gLFxuICAgICAgICBjb250ZW50VHlwZTogbWltZS5sb29rdXAoZmlsZU5hbWUpLFxuICAgICAgICB1c2VyQWdlbnQ6IGBQaWNHbzske3ZlcnNpb259O251bGw7bnVsbGAsXG4gICAgICB9LFxuICAgICAgYm9keTogaW1hZ2UsXG4gICAgICByZXNvbHZlV2l0aEZ1bGxSZXNwb25zZTogdHJ1ZSxcbiAgICB9XG4gIH1cbn1cblxuY29uc3QgaGFuZGxlID0gYXN5bmMgKGN0eDogSVBpY0dvKTogUHJvbWlzZTxJUGljR28gfCBib29sZWFuPiA9PiB7XG4gIGNvbnN0IHRjWXVuT3B0aW9ucyA9IGN0eC5nZXRDb25maWc8SVRjeXVuQ29uZmlnPihcInBpY0JlZC50Y3l1blwiKVxuICBpZiAoIXRjWXVuT3B0aW9ucykge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkNhbid0IGZpbmQgdGVuY2VudCBDT1MgY29uZmlnXCIpXG4gIH1cbiAgdHJ5IHtcbiAgICBjb25zdCBpbWdMaXN0ID0gY3R4Lm91dHB1dFxuICAgIGNvbnN0IGN1c3RvbVVybCA9IHRjWXVuT3B0aW9ucy5jdXN0b21VcmxcbiAgICBjb25zdCBwYXRoID0gdGNZdW5PcHRpb25zLnBhdGhcbiAgICBjb25zdCB1c2VWNCA9ICF0Y1l1bk9wdGlvbnMudmVyc2lvbiB8fCB0Y1l1bk9wdGlvbnMudmVyc2lvbiA9PT0gXCJ2NFwiXG4gICAgZm9yIChjb25zdCBpbWcgb2YgaW1nTGlzdCkge1xuICAgICAgaWYgKGltZy5maWxlTmFtZSAmJiBpbWcuYnVmZmVyKSB7XG4gICAgICAgIGNvbnN0IHNpZ25hdHVyZSA9IGdlbmVyYXRlU2lnbmF0dXJlKHRjWXVuT3B0aW9ucywgaW1nLmZpbGVOYW1lKVxuICAgICAgICBpZiAoIXNpZ25hdHVyZSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICB9XG4gICAgICAgIGxldCBpbWFnZSA9IGltZy5idWZmZXJcbiAgICAgICAgaWYgKCFpbWFnZSAmJiBpbWcuYmFzZTY0SW1hZ2UpIHtcbiAgICAgICAgICBpbWFnZSA9IEJ1ZmZlci5mcm9tKGltZy5iYXNlNjRJbWFnZSwgXCJiYXNlNjRcIilcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBvcHRpb25zID0gcG9zdE9wdGlvbnModGNZdW5PcHRpb25zLCBpbWcuZmlsZU5hbWUsIHNpZ25hdHVyZSwgaW1hZ2UsIGN0eC5HVUlfVkVSU0lPTiB8fCBjdHguVkVSU0lPTilcbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgY3R4XG4gICAgICAgICAgLnJlcXVlc3Qob3B0aW9ucylcbiAgICAgICAgICAudGhlbigocmVzOiBhbnkpID0+IHJlcylcbiAgICAgICAgICAuY2F0Y2goKGVycjogRXJyb3IpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIHN0YXR1c0NvZGU6IDQwMCxcbiAgICAgICAgICAgICAgYm9keToge1xuICAgICAgICAgICAgICAgIG1zZzogY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PihcIkFVVEhfRkFJTEVEXCIpLFxuICAgICAgICAgICAgICAgIGVycixcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICBsZXQgYm9keVxuICAgICAgICBpZiAodXNlVjQgJiYgdHlwZW9mIHJlcyA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgIGJvZHkgPSBKU09OLnBhcnNlKHJlcylcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBib2R5ID0gcmVzXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGJvZHkuc3RhdHVzQ29kZSA9PT0gNDAwKSB7XG4gICAgICAgICAgaWYgKGJvZHk/LmJvZHk/LmVycikge1xuICAgICAgICAgICAgdGhyb3cgYm9keS5ib2R5LmVyclxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYm9keT8uYm9keT8ubXNnIHx8IGJvZHk/LmJvZHk/Lm1lc3NhZ2UpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG9wdGlvblVybCA9IHRjWXVuT3B0aW9ucy5vcHRpb25zIHx8IFwiXCJcbiAgICAgICAgaWYgKHVzZVY0ICYmIGJvZHkubWVzc2FnZSA9PT0gXCJTVUNDRVNTXCIpIHtcbiAgICAgICAgICBkZWxldGUgaW1nLmJhc2U2NEltYWdlXG4gICAgICAgICAgZGVsZXRlIGltZy5idWZmZXJcbiAgICAgICAgICBpZiAoY3VzdG9tVXJsKSB7XG4gICAgICAgICAgICBpbWcuaW1nVXJsID0gYCR7Y3VzdG9tVXJsfS8ke3BhdGh9JHtpbWcuZmlsZU5hbWV9YFxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpbWcuaW1nVXJsID0gYCR7Ym9keS5kYXRhLnNvdXJjZV91cmwgYXMgc3RyaW5nfSR7b3B0aW9uVXJsfWBcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoIXVzZVY0ICYmIGJvZHkgJiYgYm9keS5zdGF0dXNDb2RlID09PSAyMDApIHtcbiAgICAgICAgICBkZWxldGUgaW1nLmJhc2U2NEltYWdlXG4gICAgICAgICAgZGVsZXRlIGltZy5idWZmZXJcbiAgICAgICAgICBpZiAoY3VzdG9tVXJsKSB7XG4gICAgICAgICAgICBpbWcuaW1nVXJsID0gYCR7Y3VzdG9tVXJsfS8ke2VuY29kZVVSSShwYXRoKX0ke2VuY29kZVVSSShpbWcuZmlsZU5hbWUpfSR7b3B0aW9uVXJsfWBcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaW1nLmltZ1VybCA9IGBodHRwczovLyR7dGNZdW5PcHRpb25zLmJ1Y2tldH0uY29zLiR7dGNZdW5PcHRpb25zLmFyZWF9Lm15cWNsb3VkLmNvbS8ke2VuY29kZVVSSShcbiAgICAgICAgICAgICAgcGF0aFxuICAgICAgICAgICAgKX0ke2VuY29kZVVSSShpbWcuZmlsZU5hbWUpfSR7b3B0aW9uVXJsfWBcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKHJlcy5ib2R5Lm1zZylcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY3R4XG4gIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgaWYgKCF0Y1l1bk9wdGlvbnMudmVyc2lvbiB8fCB0Y1l1bk9wdGlvbnMudmVyc2lvbiA9PT0gXCJ2NFwiKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBib2R5ID0gSlNPTi5wYXJzZShlcnIuZXJyb3IpXG4gICAgICAgIGN0eC5lbWl0KElCdWlsZEluRXZlbnQuTk9USUZJQ0FUSU9OLCB7XG4gICAgICAgICAgdGl0bGU6IGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oXCJVUExPQURfRkFJTEVEXCIpLFxuICAgICAgICAgIGJvZHk6IGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oXCJVUExPQURfRkFJTEVEX1JFQVNPTlwiLCB7XG4gICAgICAgICAgICBjb2RlOiBib2R5LmNvZGUgYXMgc3RyaW5nLFxuICAgICAgICAgIH0pLFxuICAgICAgICAgIHRleHQ6IFwiaHR0cHM6Ly9jbG91ZC50ZW5jZW50LmNvbS9kb2N1bWVudC9wcm9kdWN0LzQzNi84NDMyXCIsXG4gICAgICAgIH0pXG4gICAgICB9IGNhdGNoIChlKSB7fVxuICAgIH1cbiAgICB0aHJvdyBlcnJcbiAgfVxufVxuXG5jb25zdCBjb25maWcgPSAoY3R4OiBJUGljR28pOiBJUGx1Z2luQ29uZmlnW10gPT4ge1xuICBjb25zdCB1c2VyQ29uZmlnID0gY3R4LmdldENvbmZpZzxJVGN5dW5Db25maWc+KFwicGljQmVkLnRjeXVuXCIpIHx8IHt9XG4gIGNvbnN0IGNvbmZpZzogSVBsdWdpbkNvbmZpZ1tdID0gW1xuICAgIHtcbiAgICAgIG5hbWU6IFwidmVyc2lvblwiLFxuICAgICAgdHlwZTogXCJsaXN0XCIsXG4gICAgICBhbGlhczogY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PihcIlBJQ0JFRF9URU5DRU5UQ0xPVURfVkVSU0lPTlwiKSxcbiAgICAgIGNob2ljZXM6IFtcInY0XCIsIFwidjVcIl0sXG4gICAgICBkZWZhdWx0OiBcInY1XCIsXG4gICAgICByZXF1aXJlZDogZmFsc2UsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcInNlY3JldElkXCIsXG4gICAgICB0eXBlOiBcImlucHV0XCIsXG4gICAgICBnZXQgYWxpYXMoKSB7XG4gICAgICAgIHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KFwiUElDQkVEX1RFTkNFTlRDTE9VRF9TRUNSRVRJRFwiKVxuICAgICAgfSxcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcuc2VjcmV0SWQgfHwgXCJcIixcbiAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogXCJzZWNyZXRLZXlcIixcbiAgICAgIHR5cGU6IFwicGFzc3dvcmRcIixcbiAgICAgIGdldCBhbGlhcygpIHtcbiAgICAgICAgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oXCJQSUNCRURfVEVOQ0VOVENMT1VEX1NFQ1JFVEtFWVwiKVxuICAgICAgfSxcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcuc2VjcmV0S2V5IHx8IFwiXCIsXG4gICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFwiYnVja2V0XCIsXG4gICAgICB0eXBlOiBcImlucHV0XCIsXG4gICAgICBnZXQgYWxpYXMoKSB7XG4gICAgICAgIHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KFwiUElDQkVEX1RFTkNFTlRDTE9VRF9CVUNLRVRcIilcbiAgICAgIH0sXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLmJ1Y2tldCB8fCBcIlwiLFxuICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcImFwcElkXCIsXG4gICAgICB0eXBlOiBcImlucHV0XCIsXG4gICAgICBnZXQgcHJlZml4KCkge1xuICAgICAgICByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PihcIlBJQ0JFRF9URU5DRU5UQ0xPVURfQVBQSURcIilcbiAgICAgIH0sXG4gICAgICBnZXQgYWxpYXMoKSB7XG4gICAgICAgIHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KFwiUElDQkVEX1RFTkNFTlRDTE9VRF9BUFBJRFwiKVxuICAgICAgfSxcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcuYXBwSWQgfHwgXCJcIixcbiAgICAgIGdldCBtZXNzYWdlKCkge1xuICAgICAgICByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PihcIlBJQ0JFRF9URU5DRU5UQ0xPVURfTUVTU0FHRV9BUFBJRFwiKVxuICAgICAgfSxcbiAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogXCJhcmVhXCIsXG4gICAgICB0eXBlOiBcImlucHV0XCIsXG4gICAgICBnZXQgcHJlZml4KCkge1xuICAgICAgICByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PihcIlBJQ0JFRF9URU5DRU5UQ0xPVURfQVJFQVwiKVxuICAgICAgfSxcbiAgICAgIGdldCBhbGlhcygpIHtcbiAgICAgICAgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oXCJQSUNCRURfVEVOQ0VOVENMT1VEX0FSRUFcIilcbiAgICAgIH0sXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLmFyZWEgfHwgXCJcIixcbiAgICAgIGdldCBtZXNzYWdlKCkge1xuICAgICAgICByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PihcIlBJQ0JFRF9URU5DRU5UQ0xPVURfTUVTU0FHRV9BUkVBXCIpXG4gICAgICB9LFxuICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcInBhdGhcIixcbiAgICAgIHR5cGU6IFwiaW5wdXRcIixcbiAgICAgIGdldCBwcmVmaXgoKSB7XG4gICAgICAgIHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KFwiUElDQkVEX1RFTkNFTlRDTE9VRF9QQVRIXCIpXG4gICAgICB9LFxuICAgICAgZ2V0IGFsaWFzKCkge1xuICAgICAgICByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PihcIlBJQ0JFRF9URU5DRU5UQ0xPVURfUEFUSFwiKVxuICAgICAgfSxcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcucGF0aCB8fCBcIlwiLFxuICAgICAgZ2V0IG1lc3NhZ2UoKSB7XG4gICAgICAgIHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KFwiUElDQkVEX1RFTkNFTlRDTE9VRF9NRVNTQUdFX1BBVEhcIilcbiAgICAgIH0sXG4gICAgICByZXF1aXJlZDogZmFsc2UsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcImN1c3RvbVVybFwiLFxuICAgICAgdHlwZTogXCJpbnB1dFwiLFxuICAgICAgZ2V0IHByZWZpeCgpIHtcbiAgICAgICAgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oXCJQSUNCRURfVEVOQ0VOVENMT1VEX0NVU1RPTVVSTFwiKVxuICAgICAgfSxcbiAgICAgIGdldCBhbGlhcygpIHtcbiAgICAgICAgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oXCJQSUNCRURfVEVOQ0VOVENMT1VEX0NVU1RPTVVSTFwiKVxuICAgICAgfSxcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcuY3VzdG9tVXJsIHx8IFwiXCIsXG4gICAgICBnZXQgbWVzc2FnZSgpIHtcbiAgICAgICAgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oXCJQSUNCRURfVEVOQ0VOVENMT1VEX01FU1NBR0VfQ1VTVE9NVVJMXCIpXG4gICAgICB9LFxuICAgICAgcmVxdWlyZWQ6IGZhbHNlLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogXCJvcHRpb25zXCIsXG4gICAgICB0eXBlOiBcImlucHV0XCIsXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLm9wdGlvbnMgfHwgXCJcIixcbiAgICAgIGdldCBwcmVmaXgoKSB7XG4gICAgICAgIHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KFwiUElDQkVEX1RFTkNFTlRDTE9VRF9PUFRJT05TXCIpXG4gICAgICB9LFxuICAgICAgZ2V0IGFsaWFzKCkge1xuICAgICAgICByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PihcIlBJQ0JFRF9URU5DRU5UQ0xPVURfT1BUSU9OU1wiKVxuICAgICAgfSxcbiAgICAgIGdldCBtZXNzYWdlKCkge1xuICAgICAgICByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PihcIlBJQ0JFRF9URU5DRU5UQ0xPVURfTUVTU0FHRV9PUFRJT05TXCIpXG4gICAgICB9LFxuICAgICAgcmVxdWlyZWQ6IGZhbHNlLFxuICAgIH0sXG4gIF1cbiAgcmV0dXJuIGNvbmZpZ1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiByZWdpc3RlcihjdHg6IElQaWNHbyk6IHZvaWQge1xuICBjdHguaGVscGVyLnVwbG9hZGVyLnJlZ2lzdGVyKFwidGN5dW5cIiwge1xuICAgIGdldCBuYW1lKCkge1xuICAgICAgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oXCJQSUNCRURfVEVOQ0VOVENMT1VEXCIpXG4gICAgfSxcbiAgICBoYW5kbGUsXG4gICAgY29uZmlnLFxuICB9KVxufVxuIiwiaW1wb3J0IHsgSVBpY0dvLCBJUGx1Z2luQ29uZmlnLCBJR2l0aHViQ29uZmlnLCBJT2xkUmVxT3B0aW9uc1dpdGhKU09OIH0gZnJvbSBcIi4uLy4uL3R5cGVzXCJcbmltcG9ydCB7IElCdWlsZEluRXZlbnQgfSBmcm9tIFwiLi4vLi4vdXRpbHMvZW51bVwiXG5pbXBvcnQgeyBJTG9jYWxlc0tleSB9IGZyb20gXCIuLi8uLi9pMThuL3poLUNOXCJcbmltcG9ydCBtaW1lIGZyb20gXCJtaW1lLXR5cGVzXCJcblxuY29uc3QgcG9zdE9wdGlvbnMgPSAoZmlsZU5hbWU6IHN0cmluZywgb3B0aW9uczogSUdpdGh1YkNvbmZpZywgZGF0YTogYW55KTogSU9sZFJlcU9wdGlvbnNXaXRoSlNPTiA9PiB7XG4gIGNvbnN0IHBhdGggPSBvcHRpb25zLnBhdGggfHwgXCJcIlxuICBjb25zdCB7IHRva2VuLCByZXBvIH0gPSBvcHRpb25zXG4gIHJldHVybiB7XG4gICAgbWV0aG9kOiBcIlBVVFwiLFxuICAgIHVybDogYGh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvJHtyZXBvfS9jb250ZW50cy8ke2VuY29kZVVSSShwYXRoKX0ke2VuY29kZVVSSShmaWxlTmFtZSl9YCxcbiAgICBoZWFkZXJzOiB7XG4gICAgICBBdXRob3JpemF0aW9uOiBgdG9rZW4gJHt0b2tlbn1gLFxuICAgICAgXCJVc2VyLUFnZW50XCI6IFwiUGljR29cIixcbiAgICAgIFwiQ29udGVudC1UeXBlXCI6IG1pbWUubG9va3VwKGZpbGVOYW1lKSxcbiAgICB9LFxuICAgIGJvZHk6IGRhdGEsXG4gICAganNvbjogdHJ1ZSxcbiAgfSBhcyBjb25zdFxufVxuXG5jb25zdCBoYW5kbGUgPSBhc3luYyAoY3R4OiBJUGljR28pOiBQcm9taXNlPElQaWNHbz4gPT4ge1xuICBjb25zdCBnaXRodWJPcHRpb25zID0gY3R4LmdldENvbmZpZzxJR2l0aHViQ29uZmlnPihcInBpY0JlZC5naXRodWJcIilcbiAgaWYgKCFnaXRodWJPcHRpb25zKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQ2FuJ3QgZmluZCBnaXRodWIgY29uZmlnXCIpXG4gIH1cbiAgdHJ5IHtcbiAgICBjb25zdCBpbWdMaXN0ID0gY3R4Lm91dHB1dFxuICAgIGZvciAoY29uc3QgaW1nIG9mIGltZ0xpc3QpIHtcbiAgICAgIGlmIChpbWcuZmlsZU5hbWUgJiYgaW1nLmJ1ZmZlcikge1xuICAgICAgICBjb25zdCBiYXNlNjRJbWFnZSA9IGltZy5iYXNlNjRJbWFnZSB8fCBCdWZmZXIuZnJvbShpbWcuYnVmZmVyKS50b1N0cmluZyhcImJhc2U2NFwiKVxuICAgICAgICBjb25zdCBkYXRhID0ge1xuICAgICAgICAgIG1lc3NhZ2U6IFwiVXBsb2FkIGJ5IFBpY0dvXCIsXG4gICAgICAgICAgYnJhbmNoOiBnaXRodWJPcHRpb25zLmJyYW5jaCxcbiAgICAgICAgICBjb250ZW50OiBiYXNlNjRJbWFnZSxcbiAgICAgICAgICBwYXRoOiBnaXRodWJPcHRpb25zLnBhdGggKyBlbmNvZGVVUkkoaW1nLmZpbGVOYW1lKSxcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwb3N0Q29uZmlnID0gcG9zdE9wdGlvbnMoaW1nLmZpbGVOYW1lLCBnaXRodWJPcHRpb25zLCBkYXRhKVxuICAgICAgICBjb25zdCBib2R5OiB7XG4gICAgICAgICAgY29udGVudDoge1xuICAgICAgICAgICAgZG93bmxvYWRfdXJsOiBzdHJpbmdcbiAgICAgICAgICB9XG4gICAgICAgIH0gPSBhd2FpdCBjdHgucmVxdWVzdChwb3N0Q29uZmlnKVxuICAgICAgICBpZiAoYm9keSkge1xuICAgICAgICAgIGRlbGV0ZSBpbWcuYmFzZTY0SW1hZ2VcbiAgICAgICAgICBkZWxldGUgaW1nLmJ1ZmZlclxuICAgICAgICAgIGlmIChnaXRodWJPcHRpb25zLmN1c3RvbVVybCkge1xuICAgICAgICAgICAgaW1nLmltZ1VybCA9IGAke2dpdGh1Yk9wdGlvbnMuY3VzdG9tVXJsfS8ke2dpdGh1Yk9wdGlvbnMucGF0aH0ke2ltZy5maWxlTmFtZX1gXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGltZy5pbWdVcmwgPSBib2R5LmNvbnRlbnQuZG93bmxvYWRfdXJsXG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlNlcnZlciBlcnJvciwgcGxlYXNlIHRyeSBhZ2FpblwiKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjdHhcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgY3R4LmVtaXQoSUJ1aWxkSW5FdmVudC5OT1RJRklDQVRJT04sIHtcbiAgICAgIHRpdGxlOiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KFwiVVBMT0FEX0ZBSUxFRFwiKSxcbiAgICAgIGJvZHk6IGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oXCJDSEVDS19TRVRUSU5HU19BTkRfTkVUV09SS1wiKSxcbiAgICB9KVxuICAgIHRocm93IGVyclxuICB9XG59XG5cbmNvbnN0IGNvbmZpZyA9IChjdHg6IElQaWNHbyk6IElQbHVnaW5Db25maWdbXSA9PiB7XG4gIGNvbnN0IHVzZXJDb25maWcgPSBjdHguZ2V0Q29uZmlnPElHaXRodWJDb25maWc+KFwicGljQmVkLmdpdGh1YlwiKSB8fCB7fVxuICBjb25zdCBjb25maWc6IElQbHVnaW5Db25maWdbXSA9IFtcbiAgICB7XG4gICAgICBuYW1lOiBcInJlcG9cIixcbiAgICAgIHR5cGU6IFwiaW5wdXRcIixcbiAgICAgIGdldCBwcmVmaXgoKSB7XG4gICAgICAgIHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KFwiUElDQkVEX0dJVEhVQl9SRVBPXCIpXG4gICAgICB9LFxuICAgICAgZ2V0IGFsaWFzKCkge1xuICAgICAgICByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PihcIlBJQ0JFRF9HSVRIVUJfUkVQT1wiKVxuICAgICAgfSxcbiAgICAgIGdldCBtZXNzYWdlKCkge1xuICAgICAgICByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PihcIlBJQ0JFRF9HSVRIVUJfTUVTU0FHRV9SRVBPXCIpXG4gICAgICB9LFxuICAgICAgZGVmYXVsdDogdXNlckNvbmZpZy5yZXBvIHx8IFwiXCIsXG4gICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFwiYnJhbmNoXCIsXG4gICAgICB0eXBlOiBcImlucHV0XCIsXG4gICAgICBnZXQgcHJlZml4KCkge1xuICAgICAgICByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PihcIlBJQ0JFRF9HSVRIVUJfQlJBTkNIXCIpXG4gICAgICB9LFxuICAgICAgZ2V0IGFsaWFzKCkge1xuICAgICAgICByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PihcIlBJQ0JFRF9HSVRIVUJfQlJBTkNIXCIpXG4gICAgICB9LFxuICAgICAgZ2V0IG1lc3NhZ2UoKSB7XG4gICAgICAgIHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KFwiUElDQkVEX0dJVEhVQl9NRVNTQUdFX0JSQU5DSFwiKVxuICAgICAgfSxcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcuYnJhbmNoIHx8IFwibWFzdGVyXCIsXG4gICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFwidG9rZW5cIixcbiAgICAgIHR5cGU6IFwicGFzc3dvcmRcIixcbiAgICAgIGdldCBhbGlhcygpIHtcbiAgICAgICAgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oXCJQSUNCRURfR0lUSFVCX1RPS0VOXCIpXG4gICAgICB9LFxuICAgICAgZGVmYXVsdDogdXNlckNvbmZpZy50b2tlbiB8fCBcIlwiLFxuICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcInBhdGhcIixcbiAgICAgIHR5cGU6IFwiaW5wdXRcIixcbiAgICAgIGdldCBwcmVmaXgoKSB7XG4gICAgICAgIHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KFwiUElDQkVEX0dJVEhVQl9QQVRIXCIpXG4gICAgICB9LFxuICAgICAgZ2V0IGFsaWFzKCkge1xuICAgICAgICByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PihcIlBJQ0JFRF9HSVRIVUJfUEFUSFwiKVxuICAgICAgfSxcbiAgICAgIGdldCBtZXNzYWdlKCkge1xuICAgICAgICByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PihcIlBJQ0JFRF9HSVRIVUJfTUVTU0FHRV9QQVRIXCIpXG4gICAgICB9LFxuICAgICAgZGVmYXVsdDogdXNlckNvbmZpZy5wYXRoIHx8IFwiXCIsXG4gICAgICByZXF1aXJlZDogZmFsc2UsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcImN1c3RvbVVybFwiLFxuICAgICAgdHlwZTogXCJpbnB1dFwiLFxuICAgICAgZ2V0IHByZWZpeCgpIHtcbiAgICAgICAgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oXCJQSUNCRURfR0lUSFVCX0NVU1RPTVVSTFwiKVxuICAgICAgfSxcbiAgICAgIGdldCBhbGlhcygpIHtcbiAgICAgICAgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oXCJQSUNCRURfR0lUSFVCX0NVU1RPTVVSTFwiKVxuICAgICAgfSxcbiAgICAgIGdldCBtZXNzYWdlKCkge1xuICAgICAgICByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PihcIlBJQ0JFRF9HSVRIVUJfTUVTU0FHRV9DVVNUT01VUkxcIilcbiAgICAgIH0sXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLmN1c3RvbVVybCB8fCBcIlwiLFxuICAgICAgcmVxdWlyZWQ6IGZhbHNlLFxuICAgIH0sXG4gIF1cbiAgcmV0dXJuIGNvbmZpZ1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiByZWdpc3RlcihjdHg6IElQaWNHbyk6IHZvaWQge1xuICBjdHguaGVscGVyLnVwbG9hZGVyLnJlZ2lzdGVyKFwiZ2l0aHViXCIsIHtcbiAgICBnZXQgbmFtZSgpIHtcbiAgICAgIHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KFwiUElDQkVEX0dJVEhVQlwiKVxuICAgIH0sXG4gICAgaGFuZGxlLFxuICAgIGNvbmZpZyxcbiAgfSlcbn1cbiIsImltcG9ydCBxaW5pdSBmcm9tIFwicWluaXVcIlxuaW1wb3J0IHsgSVBsdWdpbkNvbmZpZywgSVFpbml1Q29uZmlnLCBJUGljR28sIElPbGRSZXFPcHRpb25zIH0gZnJvbSBcIi4uLy4uL3R5cGVzXCJcbmltcG9ydCB7IElCdWlsZEluRXZlbnQgfSBmcm9tIFwiLi4vLi4vdXRpbHMvZW51bVwiXG5pbXBvcnQgeyBJTG9jYWxlc0tleSB9IGZyb20gXCIuLi8uLi9pMThuL3poLUNOXCJcbmltcG9ydCBtaW1lIGZyb20gXCJtaW1lLXR5cGVzXCJcblxuZnVuY3Rpb24gcG9zdE9wdGlvbnMob3B0aW9uczogSVFpbml1Q29uZmlnLCBmaWxlTmFtZTogc3RyaW5nLCB0b2tlbjogc3RyaW5nLCBpbWdCYXNlNjQ6IHN0cmluZyk6IElPbGRSZXFPcHRpb25zIHtcbiAgY29uc3QgYXJlYSA9IHNlbGVjdEFyZWEob3B0aW9ucy5hcmVhIHx8IFwiejBcIilcbiAgY29uc3QgcGF0aCA9IG9wdGlvbnMucGF0aCB8fCBcIlwiXG4gIGNvbnN0IGJhc2U2NEZpbGVOYW1lID0gQnVmZmVyLmZyb20ocGF0aCArIGZpbGVOYW1lLCBcInV0Zi04XCIpXG4gICAgLnRvU3RyaW5nKFwiYmFzZTY0XCIpXG4gICAgLnJlcGxhY2UoL1xcKy9nLCBcIi1cIilcbiAgICAucmVwbGFjZSgvXFwvL2csIFwiX1wiKVxuICByZXR1cm4ge1xuICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgdXJsOiBgaHR0cDovL3VwbG9hZCR7YXJlYX0ucWluaXVwLmNvbS9wdXRiNjQvLTEva2V5LyR7YmFzZTY0RmlsZU5hbWV9YCxcbiAgICBoZWFkZXJzOiB7XG4gICAgICBBdXRob3JpemF0aW9uOiBgVXBUb2tlbiAke3Rva2VufWAsXG4gICAgICBcIkNvbnRlbnQtVHlwZVwiOiBtaW1lLmxvb2t1cChmaWxlTmFtZSkgfHwgXCJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW1cIixcbiAgICB9LFxuICAgIGJvZHk6IGltZ0Jhc2U2NCxcbiAgfVxufVxuXG5mdW5jdGlvbiBzZWxlY3RBcmVhKGFyZWE6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBhcmVhID09PSBcInowXCIgPyBcIlwiIDogXCItXCIgKyBhcmVhXG59XG5cbmZ1bmN0aW9uIGdldFRva2VuKHFpbml1T3B0aW9uczogYW55KTogc3RyaW5nIHtcbiAgY29uc3QgYWNjZXNzS2V5ID0gcWluaXVPcHRpb25zLmFjY2Vzc0tleVxuICBjb25zdCBzZWNyZXRLZXkgPSBxaW5pdU9wdGlvbnMuc2VjcmV0S2V5XG4gIGNvbnN0IG1hYyA9IG5ldyBxaW5pdS5hdXRoLmRpZ2VzdC5NYWMoYWNjZXNzS2V5LCBzZWNyZXRLZXkpXG4gIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgc2NvcGU6IHFpbml1T3B0aW9ucy5idWNrZXQsXG4gIH1cbiAgY29uc3QgcHV0UG9saWN5ID0gbmV3IHFpbml1LnJzLlB1dFBvbGljeShvcHRpb25zKVxuICByZXR1cm4gcHV0UG9saWN5LnVwbG9hZFRva2VuKG1hYylcbn1cblxuY29uc3QgaGFuZGxlID0gYXN5bmMgKGN0eDogSVBpY0dvKTogUHJvbWlzZTxJUGljR28+ID0+IHtcbiAgY29uc3QgcWluaXVPcHRpb25zID0gY3R4LmdldENvbmZpZzxJUWluaXVDb25maWc+KFwicGljQmVkLnFpbml1XCIpXG4gIGlmICghcWluaXVPcHRpb25zKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQ2FuJ3QgZmluZCBxaW5pdSBjb25maWdcIilcbiAgfVxuICB0cnkge1xuICAgIGNvbnN0IGltZ0xpc3QgPSBjdHgub3V0cHV0XG4gICAgZm9yIChjb25zdCBpbWcgb2YgaW1nTGlzdCkge1xuICAgICAgaWYgKGltZy5maWxlTmFtZSAmJiBpbWcuYnVmZmVyKSB7XG4gICAgICAgIGNvbnN0IGJhc2U2NEltYWdlID0gaW1nLmJhc2U2NEltYWdlIHx8IEJ1ZmZlci5mcm9tKGltZy5idWZmZXIpLnRvU3RyaW5nKFwiYmFzZTY0XCIpXG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSBwb3N0T3B0aW9ucyhxaW5pdU9wdGlvbnMsIGltZy5maWxlTmFtZSwgZ2V0VG9rZW4ocWluaXVPcHRpb25zKSwgYmFzZTY0SW1hZ2UpXG4gICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGN0eC5yZXF1ZXN0KG9wdGlvbnMpXG4gICAgICAgIGNvbnN0IGJvZHkgPSBKU09OLnBhcnNlKHJlcylcbiAgICAgICAgaWYgKGJvZHk/LmtleSkge1xuICAgICAgICAgIGRlbGV0ZSBpbWcuYmFzZTY0SW1hZ2VcbiAgICAgICAgICBkZWxldGUgaW1nLmJ1ZmZlclxuICAgICAgICAgIGNvbnN0IGJhc2VVcmwgPSBxaW5pdU9wdGlvbnMudXJsXG4gICAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHFpbml1T3B0aW9ucy5vcHRpb25zXG4gICAgICAgICAgaW1nLmltZ1VybCA9IGAke2Jhc2VVcmx9LyR7Ym9keS5rZXkgYXMgc3RyaW5nfSR7b3B0aW9uc31gXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY3R4LmVtaXQoSUJ1aWxkSW5FdmVudC5OT1RJRklDQVRJT04sIHtcbiAgICAgICAgICAgIHRpdGxlOiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KFwiVVBMT0FEX0ZBSUxFRFwiKSxcbiAgICAgICAgICAgIGJvZHk6IGJvZHkubXNnLFxuICAgICAgICAgIH0pXG4gICAgICAgICAgY3R4LmxvZy5lcnJvcihcInFpbml1IGVycm9yXCIsIGJvZHkpXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVXBsb2FkIGZhaWxlZFwiKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjdHhcbiAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcbiAgICBpZiAoZXJyLm1lc3NhZ2UgIT09IFwiVXBsb2FkIGZhaWxlZFwiKSB7XG4gICAgICAvLyBlcnIucmVzcG9uc2UgbWF5YmUgdW5kZWZpbmVkXG4gICAgICBpZiAoZXJyLnJlc3BvbnNlKSB7XG4gICAgICAgIGNvbnN0IGVycm9yID0gZXJyLnJlc3BvbnNlLmJvZHlcbiAgICAgICAgY3R4LmVtaXQoSUJ1aWxkSW5FdmVudC5OT1RJRklDQVRJT04sIHtcbiAgICAgICAgICB0aXRsZTogY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PihcIlVQTE9BRF9GQUlMRURcIiksXG4gICAgICAgICAgYm9keTogZXJyb3IuZXJyb3IsXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfVxuICAgIHRocm93IGVyclxuICB9XG59XG5cbmNvbnN0IGNvbmZpZyA9IChjdHg6IElQaWNHbyk6IElQbHVnaW5Db25maWdbXSA9PiB7XG4gIGNvbnN0IHVzZXJDb25maWcgPSBjdHguZ2V0Q29uZmlnPElRaW5pdUNvbmZpZz4oXCJwaWNCZWQucWluaXVcIikgfHwge31cbiAgY29uc3QgY29uZmlnOiBJUGx1Z2luQ29uZmlnW10gPSBbXG4gICAge1xuICAgICAgbmFtZTogXCJhY2Nlc3NLZXlcIixcbiAgICAgIHR5cGU6IFwiaW5wdXRcIixcbiAgICAgIGdldCBhbGlhcygpIHtcbiAgICAgICAgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oXCJQSUNCRURfUUlOSVVfQUNDRVNTS0VZXCIpXG4gICAgICB9LFxuICAgICAgZGVmYXVsdDogdXNlckNvbmZpZy5hY2Nlc3NLZXkgfHwgXCJcIixcbiAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogXCJzZWNyZXRLZXlcIixcbiAgICAgIHR5cGU6IFwicGFzc3dvcmRcIixcbiAgICAgIGdldCBhbGlhcygpIHtcbiAgICAgICAgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oXCJQSUNCRURfUUlOSVVfU0VDUkVUS0VZXCIpXG4gICAgICB9LFxuICAgICAgZGVmYXVsdDogdXNlckNvbmZpZy5zZWNyZXRLZXkgfHwgXCJcIixcbiAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogXCJidWNrZXRcIixcbiAgICAgIHR5cGU6IFwiaW5wdXRcIixcbiAgICAgIGdldCBhbGlhcygpIHtcbiAgICAgICAgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oXCJQSUNCRURfUUlOSVVfQlVDS0VUXCIpXG4gICAgICB9LFxuICAgICAgZGVmYXVsdDogdXNlckNvbmZpZy5idWNrZXQgfHwgXCJcIixcbiAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogXCJ1cmxcIixcbiAgICAgIHR5cGU6IFwiaW5wdXRcIixcbiAgICAgIGdldCBwcmVmaXgoKSB7XG4gICAgICAgIHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KFwiUElDQkVEX1FJTklVX1VSTFwiKVxuICAgICAgfSxcbiAgICAgIGdldCBhbGlhcygpIHtcbiAgICAgICAgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oXCJQSUNCRURfUUlOSVVfVVJMXCIpXG4gICAgICB9LFxuICAgICAgZ2V0IG1lc3NhZ2UoKSB7XG4gICAgICAgIHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KFwiUElDQkVEX1FJTklVX01FU1NBR0VfVVJMXCIpXG4gICAgICB9LFxuICAgICAgZGVmYXVsdDogdXNlckNvbmZpZy51cmwgfHwgXCJcIixcbiAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogXCJhcmVhXCIsXG4gICAgICB0eXBlOiBcImlucHV0XCIsXG4gICAgICBnZXQgcHJlZml4KCkge1xuICAgICAgICByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PihcIlBJQ0JFRF9RSU5JVV9BUkVBXCIpXG4gICAgICB9LFxuICAgICAgZ2V0IGFsaWFzKCkge1xuICAgICAgICByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PihcIlBJQ0JFRF9RSU5JVV9BUkVBXCIpXG4gICAgICB9LFxuICAgICAgZ2V0IG1lc3NhZ2UoKSB7XG4gICAgICAgIHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KFwiUElDQkVEX1FJTklVX01FU1NBR0VfQVJFQVwiKVxuICAgICAgfSxcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcuYXJlYSB8fCBcIlwiLFxuICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcIm9wdGlvbnNcIixcbiAgICAgIHR5cGU6IFwiaW5wdXRcIixcbiAgICAgIGdldCBwcmVmaXgoKSB7XG4gICAgICAgIHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KFwiUElDQkVEX1FJTklVX09QVElPTlNcIilcbiAgICAgIH0sXG4gICAgICBnZXQgYWxpYXMoKSB7XG4gICAgICAgIHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KFwiUElDQkVEX1FJTklVX09QVElPTlNcIilcbiAgICAgIH0sXG4gICAgICBnZXQgbWVzc2FnZSgpIHtcbiAgICAgICAgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oXCJQSUNCRURfUUlOSVVfTUVTU0FHRV9PUFRJT05TXCIpXG4gICAgICB9LFxuICAgICAgZGVmYXVsdDogdXNlckNvbmZpZy5vcHRpb25zIHx8IFwiXCIsXG4gICAgICByZXF1aXJlZDogZmFsc2UsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcInBhdGhcIixcbiAgICAgIHR5cGU6IFwiaW5wdXRcIixcbiAgICAgIGdldCBwcmVmaXgoKSB7XG4gICAgICAgIHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KFwiUElDQkVEX1FJTklVX1BBVEhcIilcbiAgICAgIH0sXG4gICAgICBnZXQgYWxpYXMoKSB7XG4gICAgICAgIHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KFwiUElDQkVEX1FJTklVX1BBVEhcIilcbiAgICAgIH0sXG4gICAgICBnZXQgbWVzc2FnZSgpIHtcbiAgICAgICAgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oXCJQSUNCRURfUUlOSVVfTUVTU0FHRV9QQVRIXCIpXG4gICAgICB9LFxuICAgICAgZGVmYXVsdDogdXNlckNvbmZpZy5wYXRoIHx8IFwiXCIsXG4gICAgICByZXF1aXJlZDogZmFsc2UsXG4gICAgfSxcbiAgXVxuICByZXR1cm4gY29uZmlnXG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHJlZ2lzdGVyKGN0eDogSVBpY0dvKTogdm9pZCB7XG4gIGN0eC5oZWxwZXIudXBsb2FkZXIucmVnaXN0ZXIoXCJxaW5pdVwiLCB7XG4gICAgZ2V0IG5hbWUoKSB7XG4gICAgICByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PihcIlBJQ0JFRF9RSU5JVVwiKVxuICAgIH0sXG4gICAgaGFuZGxlLFxuICAgIGNvbmZpZyxcbiAgfSlcbn1cbiIsImltcG9ydCBhcnJheUJ1ZmZlclRvQnVmZmVyIGZyb20gXCJhcnJheWJ1ZmZlci10by1idWZmZXJcIlxuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2V4cGxpY2l0LW1vZHVsZS1ib3VuZGFyeS10eXBlc1xuY29uc3QgcmVhZEJ1ZmZlciA9IChidWY6IGFueSk6IEJ1ZmZlciA9PiB7XG4gIGxldCBpbWFnZUJ1ZmZlciA9IGJ1ZlxuICBpZiAoaW1hZ2VCdWZmZXIgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikge1xuICAgIGltYWdlQnVmZmVyID0gYXJyYXlCdWZmZXJUb0J1ZmZlcihpbWFnZUJ1ZmZlcilcbiAgfVxuICByZXR1cm4gaW1hZ2VCdWZmZXJcbn1cblxuY29uc3Qgc3RyZWFtVXRpbHMgPSB7XG4gIHJlYWRCdWZmZXIsXG59XG5cbmV4cG9ydCBkZWZhdWx0IHN0cmVhbVV0aWxzXG4iLCJpbXBvcnQgeyBJQWxpeXVuQ29uZmlnLCBJT2xkUmVxT3B0aW9uc1dpdGhGdWxsUmVzcG9uc2UsIElQaWNHbywgSVBsdWdpbkNvbmZpZyB9IGZyb20gXCIuLi8uLi90eXBlc1wiXG5pbXBvcnQgY3J5cHRvIGZyb20gXCJjcnlwdG9cIlxuaW1wb3J0IG1pbWUgZnJvbSBcIm1pbWUtdHlwZXNcIlxuaW1wb3J0IHsgSUJ1aWxkSW5FdmVudCB9IGZyb20gXCIuLi8uLi91dGlscy9lbnVtXCJcbmltcG9ydCB7IElMb2NhbGVzS2V5IH0gZnJvbSBcIi4uLy4uL2kxOG4vemgtQ05cIlxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9iYW4tdHMtY29tbWVudFxuLy8gQHRzLWV4cGVjdC1lcnJvclxuaW1wb3J0IE9TUyBmcm9tIFwiYWxpLW9zc1wiXG5pbXBvcnQgeyBSZWFkYWJsZSB9IGZyb20gXCJzdHJlYW1cIlxuaW1wb3J0IHN0cmVhbVV0aWxzIGZyb20gXCIuLi8uLi91dGlscy9zdHJlYW1VdGlsc1wiXG5cbi8vIGdlbmVyYXRlIE9TUyBzaWduYXR1cmVcbmNvbnN0IGdlbmVyYXRlU2lnbmF0dXJlID0gKG9wdGlvbnM6IElBbGl5dW5Db25maWcsIGZpbGVOYW1lOiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICBjb25zdCBkYXRlID0gbmV3IERhdGUoKS50b1VUQ1N0cmluZygpXG4gIGNvbnN0IG1pbWVUeXBlID0gbWltZS5sb29rdXAoZmlsZU5hbWUpXG4gIGlmICghbWltZVR5cGUpIHRocm93IEVycm9yKGBObyBtaW1lIHR5cGUgZm91bmQgZm9yIGZpbGUgJHtmaWxlTmFtZX1gKVxuXG4gIGNvbnN0IHNpZ25TdHJpbmcgPSBgUFVUXFxuXFxuJHttaW1lVHlwZX1cXG4ke2RhdGV9XFxuLyR7b3B0aW9ucy5idWNrZXR9LyR7b3B0aW9ucy5wYXRofSR7ZmlsZU5hbWV9YFxuXG4gIGNvbnN0IHNpZ25hdHVyZSA9IGNyeXB0by5jcmVhdGVIbWFjKFwic2hhMVwiLCBvcHRpb25zLmFjY2Vzc0tleVNlY3JldCkudXBkYXRlKHNpZ25TdHJpbmcpLmRpZ2VzdChcImJhc2U2NFwiKVxuICByZXR1cm4gYE9TUyAke29wdGlvbnMuYWNjZXNzS2V5SWR9OiR7c2lnbmF0dXJlfWBcbn1cblxuY29uc3QgcG9zdE9wdGlvbnMgPSAoXG4gIG9wdGlvbnM6IElBbGl5dW5Db25maWcsXG4gIGZpbGVOYW1lOiBzdHJpbmcsXG4gIHNpZ25hdHVyZTogc3RyaW5nLFxuICBpbWFnZTogQnVmZmVyXG4pOiBJT2xkUmVxT3B0aW9uc1dpdGhGdWxsUmVzcG9uc2UgPT4ge1xuICByZXR1cm4ge1xuICAgIG1ldGhvZDogXCJQVVRcIixcbiAgICB1cmw6IGBodHRwczovLyR7b3B0aW9ucy5idWNrZXR9LiR7b3B0aW9ucy5hcmVhfS5hbGl5dW5jcy5jb20vJHtlbmNvZGVVUkkob3B0aW9ucy5wYXRoKX0ke2VuY29kZVVSSShmaWxlTmFtZSl9YCxcbiAgICBoZWFkZXJzOiB7XG4gICAgICBIb3N0OiBgJHtvcHRpb25zLmJ1Y2tldH0uJHtvcHRpb25zLmFyZWF9LmFsaXl1bmNzLmNvbWAsXG4gICAgICBBdXRob3JpemF0aW9uOiBzaWduYXR1cmUsXG4gICAgICBEYXRlOiBuZXcgRGF0ZSgpLnRvVVRDU3RyaW5nKCksXG4gICAgICBcIkNvbnRlbnQtVHlwZVwiOiBtaW1lLmxvb2t1cChmaWxlTmFtZSksXG4gICAgfSxcbiAgICBib2R5OiBpbWFnZSxcbiAgICByZXNvbHZlV2l0aEZ1bGxSZXNwb25zZTogdHJ1ZSxcbiAgfVxufVxuXG5jb25zdCBoYW5kbGVSZXN0ID0gYXN5bmMgKGN0eDogSVBpY0dvKTogUHJvbWlzZTxJUGljR28+ID0+IHtcbiAgY29uc3QgYWxpWXVuT3B0aW9ucyA9IGN0eC5nZXRDb25maWc8SUFsaXl1bkNvbmZpZz4oXCJwaWNCZWQuYWxpeXVuXCIpXG4gIGlmICghYWxpWXVuT3B0aW9ucykge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkNhbid0IGZpbmQgYWxpWXVuIE9TUyBjb25maWdcIilcbiAgfVxuICB0cnkge1xuICAgIGNvbnN0IGltZ0xpc3QgPSBjdHgub3V0cHV0XG4gICAgY29uc3QgY3VzdG9tVXJsID0gYWxpWXVuT3B0aW9ucy5jdXN0b21VcmxcbiAgICBjb25zdCBwYXRoID0gYWxpWXVuT3B0aW9ucy5wYXRoXG4gICAgZm9yIChjb25zdCBpbWcgb2YgaW1nTGlzdCkge1xuICAgICAgaWYgKGltZy5maWxlTmFtZSAmJiBpbWcuYnVmZmVyKSB7XG4gICAgICAgIGNvbnN0IHNpZ25hdHVyZSA9IGdlbmVyYXRlU2lnbmF0dXJlKGFsaVl1bk9wdGlvbnMsIGltZy5maWxlTmFtZSlcbiAgICAgICAgbGV0IGltYWdlID0gaW1nLmJ1ZmZlclxuICAgICAgICBpZiAoIWltYWdlICYmIGltZy5iYXNlNjRJbWFnZSkge1xuICAgICAgICAgIGltYWdlID0gQnVmZmVyLmZyb20oaW1nLmJhc2U2NEltYWdlLCBcImJhc2U2NFwiKVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSBwb3N0T3B0aW9ucyhhbGlZdW5PcHRpb25zLCBpbWcuZmlsZU5hbWUsIHNpZ25hdHVyZSwgaW1hZ2UpXG4gICAgICAgIGNvbnN0IGJvZHkgPSBhd2FpdCBjdHgucmVxdWVzdChvcHRpb25zKVxuICAgICAgICBpZiAoYm9keS5zdGF0dXNDb2RlID09PSAyMDApIHtcbiAgICAgICAgICBkZWxldGUgaW1nLmJhc2U2NEltYWdlXG4gICAgICAgICAgZGVsZXRlIGltZy5idWZmZXJcbiAgICAgICAgICBjb25zdCBvcHRpb25VcmwgPSBhbGlZdW5PcHRpb25zLm9wdGlvbnMgfHwgXCJcIlxuICAgICAgICAgIGlmIChjdXN0b21VcmwpIHtcbiAgICAgICAgICAgIGltZy5pbWdVcmwgPSBgJHtjdXN0b21Vcmx9LyR7cGF0aH0ke2ltZy5maWxlTmFtZX0ke29wdGlvblVybH1gXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGltZy5pbWdVcmwgPSBgaHR0cHM6Ly8ke2FsaVl1bk9wdGlvbnMuYnVja2V0fS4ke2FsaVl1bk9wdGlvbnMuYXJlYX0uYWxpeXVuY3MuY29tLyR7cGF0aH0ke2ltZy5maWxlTmFtZX0ke29wdGlvblVybH1gXG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVwbG9hZCBmYWlsZWRcIilcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY3R4XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGN0eC5lbWl0KElCdWlsZEluRXZlbnQuTk9USUZJQ0FUSU9OLCB7XG4gICAgICB0aXRsZTogY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PihcIlVQTE9BRF9GQUlMRURcIiksXG4gICAgICBib2R5OiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KFwiQ0hFQ0tfU0VUVElOR1NcIiksXG4gICAgfSlcbiAgICB0aHJvdyBlcnJcbiAgfVxufVxuXG5jb25zdCBoYW5kbGUgPSBhc3luYyAoY3R4OiBJUGljR28pOiBQcm9taXNlPElQaWNHbz4gPT4ge1xuICBpZiAoIWN0eCkge1xuICAgIGF3YWl0IGhhbmRsZVJlc3QoY3R4KVxuICB9XG5cbiAgY29uc29sZS53YXJuKFxuICAgIFwiVXNpbmcgc3RyZWFtIG1vZGUgZm9yIGFsaXl1biB1cGxvYWQsIGFkZGVkIGJ5IHRlcndlciwgc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS90ZXJ3ZXIvRWxlY3Ryb24tUGljR28tQ29yZS9ibG9iL2Rldi9zcmMvcGx1Z2lucy91cGxvYWRlci9hbGl5dW4udHMjTDc2XCJcbiAgKVxuICBjb25zdCBhbGlZdW5PcHRpb25zID0gY3R4LmdldENvbmZpZzxJQWxpeXVuQ29uZmlnPihcInBpY0JlZC5hbGl5dW5cIilcbiAgaWYgKCFhbGlZdW5PcHRpb25zKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQ2FuJ3QgZmluZCBhbGlZdW4gT1NTIGNvbmZpZ1wiKVxuICB9XG4gIHRyeSB7XG4gICAgY29uc3Qgc3RvcmUgPSBuZXcgT1NTKHtcbiAgICAgIHJlZ2lvbjogYWxpWXVuT3B0aW9ucy5hcmVhLFxuICAgICAgYWNjZXNzS2V5SWQ6IGFsaVl1bk9wdGlvbnMuYWNjZXNzS2V5SWQsXG4gICAgICBhY2Nlc3NLZXlTZWNyZXQ6IGFsaVl1bk9wdGlvbnMuYWNjZXNzS2V5U2VjcmV0LFxuICAgICAgYnVja2V0OiBhbGlZdW5PcHRpb25zLmJ1Y2tldCxcbiAgICB9KVxuXG4gICAgY29uc3QgaW1nTGlzdCA9IGN0eC5vdXRwdXRcbiAgICBjb25zdCBjdXN0b21VcmwgPSBhbGlZdW5PcHRpb25zLmN1c3RvbVVybFxuICAgIGNvbnN0IHBhdGggPSBhbGlZdW5PcHRpb25zLnBhdGhcblxuICAgIGZvciAoY29uc3QgaW1nIG9mIGltZ0xpc3QpIHtcbiAgICAgIGlmIChpbWcuZmlsZU5hbWUgJiYgaW1nLmJ1ZmZlcikge1xuICAgICAgICBsZXQgaW1hZ2UgPSBzdHJlYW1VdGlscy5yZWFkQnVmZmVyKGltZy5idWZmZXIpXG4gICAgICAgIGlmICghaW1hZ2UgJiYgaW1nLmJhc2U2NEltYWdlKSB7XG4gICAgICAgICAgaW1hZ2UgPSBCdWZmZXIuZnJvbShpbWcuYmFzZTY0SW1hZ2UsIFwiYmFzZTY0XCIpXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBvcHRpb25VcmwgPSBhbGlZdW5PcHRpb25zLm9wdGlvbnMgfHwgXCJcIlxuICAgICAgICBjb25zdCByZW1vdGVQYXRoID0gYCR7cGF0aH0ke2ltZy5maWxlTmFtZX0ke29wdGlvblVybH1gXG4gICAgICAgIGNvbnN0IHN0cmVhbSA9IFJlYWRhYmxlLmZyb20oaW1hZ2UpXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKCdCZWZvcmUgdXBsb2FkLHJlbW90ZVBhdGg9PicsIHJlbW90ZVBhdGgpXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKCdCZWZvcmUgdXBsb2FkLHN0cmVhbT0+Jywgc3RyZWFtKVxuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHN0b3JlLnB1dFN0cmVhbShyZW1vdGVQYXRoLCBzdHJlYW0pXG4gICAgICAgIGNvbnNvbGUubG9nKFwiVXNpbmcgYWxpeXVuIFNESyBmb3IgdXBsb2FkIGFkZCBieSB0ZXJ3ZXIsIHJlc3VsdD0+XCIsIHJlc3VsdClcblxuICAgICAgICBpZiAocmVzdWx0Py5yZXM/LnN0YXR1cyAmJiByZXN1bHQucmVzLnN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICAgICAgZGVsZXRlIGltZy5iYXNlNjRJbWFnZVxuICAgICAgICAgIGRlbGV0ZSBpbWcuYnVmZmVyXG4gICAgICAgICAgaWYgKGN1c3RvbVVybCkge1xuICAgICAgICAgICAgaW1nLmltZ1VybCA9IGAke2N1c3RvbVVybH0vJHtwYXRofSR7aW1nLmZpbGVOYW1lfSR7b3B0aW9uVXJsfWBcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaW1nLmltZ1VybCA9IGBodHRwczovLyR7YWxpWXVuT3B0aW9ucy5idWNrZXR9LiR7YWxpWXVuT3B0aW9ucy5hcmVhfS5hbGl5dW5jcy5jb20vJHtwYXRofSR7aW1nLmZpbGVOYW1lfSR7b3B0aW9uVXJsfWBcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVXBsb2FkIGZhaWxlZFwiKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjdHhcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgY3R4LmVtaXQoSUJ1aWxkSW5FdmVudC5OT1RJRklDQVRJT04sIHtcbiAgICAgIHRpdGxlOiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KFwiVVBMT0FEX0ZBSUxFRFwiKSxcbiAgICAgIGJvZHk6IGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oXCJDSEVDS19TRVRUSU5HU1wiKSxcbiAgICB9KVxuICAgIHRocm93IGVyclxuICB9XG59XG5cbmNvbnN0IGNvbmZpZyA9IChjdHg6IElQaWNHbyk6IElQbHVnaW5Db25maWdbXSA9PiB7XG4gIGNvbnN0IHVzZXJDb25maWcgPSBjdHguZ2V0Q29uZmlnPElBbGl5dW5Db25maWc+KFwicGljQmVkLmFsaXl1blwiKSB8fCB7fVxuICBjb25zdCBjb25maWc6IElQbHVnaW5Db25maWdbXSA9IFtcbiAgICB7XG4gICAgICBuYW1lOiBcImFjY2Vzc0tleUlkXCIsXG4gICAgICB0eXBlOiBcImlucHV0XCIsXG4gICAgICBnZXQgYWxpYXMoKSB7XG4gICAgICAgIHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KFwiUElDQkVEX0FMSUNMT1VEX0FDQ0VTU0tFWUlEXCIpXG4gICAgICB9LFxuICAgICAgZGVmYXVsdDogdXNlckNvbmZpZy5hY2Nlc3NLZXlJZCB8fCBcIlwiLFxuICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcImFjY2Vzc0tleVNlY3JldFwiLFxuICAgICAgdHlwZTogXCJwYXNzd29yZFwiLFxuICAgICAgZ2V0IGFsaWFzKCkge1xuICAgICAgICByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PihcIlBJQ0JFRF9BTElDTE9VRF9BQ0NFU1NLRVlTRUNSRVRcIilcbiAgICAgIH0sXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLmFjY2Vzc0tleVNlY3JldCB8fCBcIlwiLFxuICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcImJ1Y2tldFwiLFxuICAgICAgdHlwZTogXCJpbnB1dFwiLFxuICAgICAgZ2V0IGFsaWFzKCkge1xuICAgICAgICByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PihcIlBJQ0JFRF9BTElDTE9VRF9CVUNLRVRcIilcbiAgICAgIH0sXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLmJ1Y2tldCB8fCBcIlwiLFxuICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcImFyZWFcIixcbiAgICAgIHR5cGU6IFwiaW5wdXRcIixcbiAgICAgIGdldCBwcmVmaXgoKSB7XG4gICAgICAgIHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KFwiUElDQkVEX0FMSUNMT1VEX0FSRUFcIilcbiAgICAgIH0sXG4gICAgICBnZXQgYWxpYXMoKSB7XG4gICAgICAgIHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KFwiUElDQkVEX0FMSUNMT1VEX0FSRUFcIilcbiAgICAgIH0sXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLmFyZWEgfHwgXCJcIixcbiAgICAgIGdldCBtZXNzYWdlKCkge1xuICAgICAgICByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PihcIlBJQ0JFRF9BTElDTE9VRF9NRVNTQUdFX0FSRUFcIilcbiAgICAgIH0sXG4gICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFwicGF0aFwiLFxuICAgICAgdHlwZTogXCJpbnB1dFwiLFxuICAgICAgZ2V0IHByZWZpeCgpIHtcbiAgICAgICAgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oXCJQSUNCRURfQUxJQ0xPVURfUEFUSFwiKVxuICAgICAgfSxcbiAgICAgIGdldCBhbGlhcygpIHtcbiAgICAgICAgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oXCJQSUNCRURfQUxJQ0xPVURfUEFUSFwiKVxuICAgICAgfSxcbiAgICAgIGdldCBtZXNzYWdlKCkge1xuICAgICAgICByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PihcIlBJQ0JFRF9BTElDTE9VRF9NRVNTQUdFX1BBVEhcIilcbiAgICAgIH0sXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLnBhdGggfHwgXCJcIixcbiAgICAgIHJlcXVpcmVkOiBmYWxzZSxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFwiY3VzdG9tVXJsXCIsXG4gICAgICB0eXBlOiBcImlucHV0XCIsXG4gICAgICBnZXQgcHJlZml4KCkge1xuICAgICAgICByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PihcIlBJQ0JFRF9BTElDTE9VRF9DVVNUT01VUkxcIilcbiAgICAgIH0sXG4gICAgICBnZXQgYWxpYXMoKSB7XG4gICAgICAgIHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KFwiUElDQkVEX0FMSUNMT1VEX0NVU1RPTVVSTFwiKVxuICAgICAgfSxcbiAgICAgIGdldCBtZXNzYWdlKCkge1xuICAgICAgICByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PihcIlBJQ0JFRF9BTElDTE9VRF9NRVNTQUdFX0NVU1RPTVVSTFwiKVxuICAgICAgfSxcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcuY3VzdG9tVXJsIHx8IFwiXCIsXG4gICAgICByZXF1aXJlZDogZmFsc2UsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcIm9wdGlvbnNcIixcbiAgICAgIHR5cGU6IFwiaW5wdXRcIixcbiAgICAgIGdldCBwcmVmaXgoKSB7XG4gICAgICAgIHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KFwiUElDQkVEX0FMSUNMT1VEX09QVElPTlNcIilcbiAgICAgIH0sXG4gICAgICBnZXQgYWxpYXMoKSB7XG4gICAgICAgIHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KFwiUElDQkVEX0FMSUNMT1VEX09QVElPTlNcIilcbiAgICAgIH0sXG4gICAgICBnZXQgbWVzc2FnZSgpIHtcbiAgICAgICAgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oXCJQSUNCRURfQUxJQ0xPVURfTUVTU0FHRV9PUFRJT05TXCIpXG4gICAgICB9LFxuICAgICAgZGVmYXVsdDogdXNlckNvbmZpZy5vcHRpb25zIHx8IFwiXCIsXG4gICAgICByZXF1aXJlZDogZmFsc2UsXG4gICAgfSxcbiAgXVxuICByZXR1cm4gY29uZmlnXG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHJlZ2lzdGVyKGN0eDogSVBpY0dvKTogdm9pZCB7XG4gIGN0eC5oZWxwZXIudXBsb2FkZXIucmVnaXN0ZXIoXCJhbGl5dW5cIiwge1xuICAgIGdldCBuYW1lKCkge1xuICAgICAgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oXCJQSUNCRURfQUxJQ0xPVURcIilcbiAgICB9LFxuICAgIGhhbmRsZSxcbiAgICBjb25maWcsXG4gIH0pXG59XG4iLCJpbXBvcnQgeyBJT2xkUmVxT3B0aW9uc1dpdGhGdWxsUmVzcG9uc2UsIElQaWNHbywgSVBsdWdpbkNvbmZpZywgSVVweXVuQ29uZmlnIH0gZnJvbSBcIi4uLy4uL3R5cGVzXCJcbmltcG9ydCBjcnlwdG8gZnJvbSBcImNyeXB0b1wiXG5pbXBvcnQgTUQ1IGZyb20gXCJtZDVcIlxuaW1wb3J0IHsgSUJ1aWxkSW5FdmVudCB9IGZyb20gXCIuLi8uLi91dGlscy9lbnVtXCJcbmltcG9ydCB7IElMb2NhbGVzS2V5IH0gZnJvbSBcIi4uLy4uL2kxOG4vemgtQ05cIlxuaW1wb3J0IHsgc2FmZVBhcnNlIH0gZnJvbSBcIi4uLy4uL3V0aWxzL2NvbW1vblwiXG5pbXBvcnQgbWltZSBmcm9tIFwibWltZS10eXBlc1wiXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10cy1jb21tZW50XG4vLyBAdHMtZXhwZWN0LWVycm9yXG5pbXBvcnQgdXB5dW4gZnJvbSBcInVweXVuXCJcbmltcG9ydCB7IFJlYWRhYmxlIH0gZnJvbSBcInN0cmVhbVwiXG5pbXBvcnQgc3RyZWFtVXRpbHMgZnJvbSBcIi4uLy4uL3V0aWxzL3N0cmVhbVV0aWxzXCJcblxuLy8gZ2VuZXJhdGUgQ09TIHNpZ25hdHVyZSBzdHJpbmdcbmNvbnN0IGdlbmVyYXRlU2lnbmF0dXJlID0gKG9wdGlvbnM6IElVcHl1bkNvbmZpZywgZmlsZU5hbWU6IHN0cmluZyk6IHN0cmluZyA9PiB7XG4gIGNvbnN0IHBhdGggPSBvcHRpb25zLnBhdGggfHwgXCJcIlxuICBjb25zdCBvcGVyYXRvciA9IG9wdGlvbnMub3BlcmF0b3JcbiAgY29uc3QgcGFzc3dvcmQgPSBvcHRpb25zLnBhc3N3b3JkXG4gIGNvbnN0IG1kNVBhc3N3b3JkID0gTUQ1KHBhc3N3b3JkKVxuICBjb25zdCBkYXRlID0gbmV3IERhdGUoKS50b1VUQ1N0cmluZygpXG4gIGNvbnN0IHVyaSA9IGAvJHtvcHRpb25zLmJ1Y2tldH0vJHtlbmNvZGVVUkkocGF0aCl9JHtlbmNvZGVVUkkoZmlsZU5hbWUpfWBcbiAgY29uc3QgdmFsdWUgPSBgUFVUJiR7dXJpfSYke2RhdGV9YFxuICBjb25zdCBzaWduID0gY3J5cHRvLmNyZWF0ZUhtYWMoXCJzaGExXCIsIG1kNVBhc3N3b3JkKS51cGRhdGUodmFsdWUpLmRpZ2VzdChcImJhc2U2NFwiKVxuICByZXR1cm4gYFVQWVVOICR7b3BlcmF0b3J9OiR7c2lnbn1gXG59XG5cbmNvbnN0IHBvc3RPcHRpb25zID0gKFxuICBvcHRpb25zOiBJVXB5dW5Db25maWcsXG4gIGZpbGVOYW1lOiBzdHJpbmcsXG4gIHNpZ25hdHVyZTogc3RyaW5nLFxuICBpbWFnZTogQnVmZmVyXG4pOiBJT2xkUmVxT3B0aW9uc1dpdGhGdWxsUmVzcG9uc2UgPT4ge1xuICBjb25zdCBidWNrZXQgPSBvcHRpb25zLmJ1Y2tldFxuICBjb25zdCBwYXRoID0gb3B0aW9ucy5wYXRoIHx8IFwiXCJcbiAgcmV0dXJuIHtcbiAgICBtZXRob2Q6IFwiUFVUXCIsXG4gICAgdXJsOiBgaHR0cHM6Ly92MC5hcGkudXB5dW4uY29tLyR7YnVja2V0fS8ke2VuY29kZVVSSShwYXRoKX0ke2VuY29kZVVSSShmaWxlTmFtZSl9YCxcbiAgICBoZWFkZXJzOiB7XG4gICAgICBBdXRob3JpemF0aW9uOiBzaWduYXR1cmUsXG4gICAgICBEYXRlOiBuZXcgRGF0ZSgpLnRvVVRDU3RyaW5nKCksXG4gICAgICBcIkNvbnRlbnQtVHlwZVwiOiBtaW1lLmxvb2t1cChmaWxlTmFtZSkgfHwgXCJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW1cIixcbiAgICB9LFxuICAgIGJvZHk6IGltYWdlLFxuICAgIHJlc29sdmVXaXRoRnVsbFJlc3BvbnNlOiB0cnVlLFxuICB9XG59XG5cbmNvbnN0IGhhbmRsZVJlc3QgPSBhc3luYyAoY3R4OiBJUGljR28pOiBQcm9taXNlPElQaWNHbz4gPT4ge1xuICBjb25zdCB1cHl1bk9wdGlvbnMgPSBjdHguZ2V0Q29uZmlnPElVcHl1bkNvbmZpZz4oXCJwaWNCZWQudXB5dW5cIilcbiAgaWYgKCF1cHl1bk9wdGlvbnMpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW4ndCBmaW5kIHVwWXVuIGNvbmZpZ1wiKVxuICB9XG4gIHRyeSB7XG4gICAgY29uc3QgaW1nTGlzdCA9IGN0eC5vdXRwdXRcbiAgICBjb25zdCBwYXRoID0gdXB5dW5PcHRpb25zLnBhdGggfHwgXCJcIlxuICAgIGZvciAoY29uc3QgaW1nIG9mIGltZ0xpc3QpIHtcbiAgICAgIGlmIChpbWcuZmlsZU5hbWUgJiYgaW1nLmJ1ZmZlcikge1xuICAgICAgICBsZXQgaW1hZ2UgPSBpbWcuYnVmZmVyXG4gICAgICAgIGlmICghaW1hZ2UgJiYgaW1nLmJhc2U2NEltYWdlKSB7XG4gICAgICAgICAgaW1hZ2UgPSBCdWZmZXIuZnJvbShpbWcuYmFzZTY0SW1hZ2UsIFwiYmFzZTY0XCIpXG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc2lnbmF0dXJlID0gZ2VuZXJhdGVTaWduYXR1cmUodXB5dW5PcHRpb25zLCBpbWcuZmlsZU5hbWUpXG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSBwb3N0T3B0aW9ucyh1cHl1bk9wdGlvbnMsIGltZy5maWxlTmFtZSwgc2lnbmF0dXJlLCBpbWFnZSlcbiAgICAgICAgY29uc3QgYm9keSA9IGF3YWl0IGN0eC5yZXF1ZXN0KG9wdGlvbnMpXG4gICAgICAgIGlmIChib2R5LnN0YXR1c0NvZGUgPT09IDIwMCkge1xuICAgICAgICAgIGRlbGV0ZSBpbWcuYmFzZTY0SW1hZ2VcbiAgICAgICAgICBkZWxldGUgaW1nLmJ1ZmZlclxuICAgICAgICAgIGltZy5pbWdVcmwgPSBgJHt1cHl1bk9wdGlvbnMudXJsfS8ke3BhdGh9JHtpbWcuZmlsZU5hbWV9JHt1cHl1bk9wdGlvbnMub3B0aW9uc31gXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVXBsb2FkIGZhaWxlZFwiKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjdHhcbiAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcbiAgICBpZiAoZXJyLm1lc3NhZ2UgPT09IFwiVXBsb2FkIGZhaWxlZFwiKSB7XG4gICAgICBjdHguZW1pdChJQnVpbGRJbkV2ZW50Lk5PVElGSUNBVElPTiwge1xuICAgICAgICB0aXRsZTogY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PihcIlVQTE9BRF9GQUlMRURcIiksXG4gICAgICAgIGJvZHk6IGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oXCJDSEVDS19TRVRUSU5HU1wiKSxcbiAgICAgIH0pXG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGJvZHkgPSBzYWZlUGFyc2U8eyBjb2RlOiBzdHJpbmcgfT4oZXJyLmVycm9yKVxuICAgICAgY3R4LmVtaXQoSUJ1aWxkSW5FdmVudC5OT1RJRklDQVRJT04sIHtcbiAgICAgICAgdGl0bGU6IGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oXCJVUExPQURfRkFJTEVEXCIpLFxuICAgICAgICBib2R5OiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KFwiVVBMT0FEX0ZBSUxFRF9SRUFTT05cIiwge1xuICAgICAgICAgIGNvZGU6IHR5cGVvZiBib2R5ID09PSBcIm9iamVjdFwiID8gYm9keS5jb2RlIDogYm9keSxcbiAgICAgICAgfSksXG4gICAgICAgIHRleHQ6IFwiaHR0cDovL2RvY3MudXB5dW4uY29tL2FwaS9lcnJuby9cIixcbiAgICAgIH0pXG4gICAgfVxuICAgIHRocm93IGVyclxuICB9XG59XG5cbmNvbnN0IGhhbmRsZSA9IGFzeW5jIChjdHg6IElQaWNHbyk6IFByb21pc2U8SVBpY0dvPiA9PiB7XG4gIGlmICghY3R4KSB7XG4gICAgYXdhaXQgaGFuZGxlUmVzdChjdHgpXG4gIH1cblxuICBjb25zb2xlLndhcm4oXG4gICAgXCJVc2luZyBzdHJlYW0gbW9kZSBmb3IgdXB5dW4gdXBsb2FkLCBhZGRlZCBieSB0ZXJ3ZXIsIHNlZSBodHRwczovL2dpdGh1Yi5jb20vdGVyd2VyL0VsZWN0cm9uLVBpY0dvLUNvcmUvYmxvYi9kZXYvc3JjL3BsdWdpbnMvdXBsb2FkZXIvdXB5dW4udHMjTDg4XCJcbiAgKVxuICBjb25zdCB1cHl1bk9wdGlvbnMgPSBjdHguZ2V0Q29uZmlnPElVcHl1bkNvbmZpZz4oXCJwaWNCZWQudXB5dW5cIilcbiAgaWYgKCF1cHl1bk9wdGlvbnMpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW4ndCBmaW5kIHVwWXVuIGNvbmZpZ1wiKVxuICB9XG4gIHRyeSB7XG4gICAgY29uc3Qgc2VydmljZU5hbWUgPSB1cHl1bk9wdGlvbnMuYnVja2V0XG4gICAgY29uc3Qgb3BlcmF0b3JOYW1lID0gdXB5dW5PcHRpb25zLm9wZXJhdG9yXG4gICAgY29uc3Qgb3BlcmF0b3JQYXNzd29yZCA9IHVweXVuT3B0aW9ucy5wYXNzd29yZFxuXG4gICAgLy8gY29uc29sZS5sb2coJ0JlZm9yZSB1cGxvYWQsc2VydmljZU5hbWU9PicsIHNlcnZpY2VOYW1lKVxuICAgIC8vIGNvbnNvbGUubG9nKCdCZWZvcmUgdXBsb2FkLG9wZXJhdG9yTmFtZT0+Jywgb3BlcmF0b3JOYW1lKVxuICAgIC8vIGNvbnNvbGUubG9nKCdCZWZvcmUgdXBsb2FkLG9wZXJhdG9yUGFzc3dvcmQ9PicsIG9wZXJhdG9yUGFzc3dvcmQpXG4gICAgY29uc3Qgc2VydmljZSA9IG5ldyB1cHl1bi5TZXJ2aWNlKHNlcnZpY2VOYW1lLCBvcGVyYXRvck5hbWUsIG9wZXJhdG9yUGFzc3dvcmQpXG4gICAgY29uc3QgY2xpZW50ID0gbmV3IHVweXVuLkNsaWVudChzZXJ2aWNlKVxuXG4gICAgY29uc3QgaW1nTGlzdCA9IGN0eC5vdXRwdXRcbiAgICBmb3IgKGNvbnN0IGltZyBvZiBpbWdMaXN0KSB7XG4gICAgICBpZiAoaW1nLmZpbGVOYW1lICYmIGltZy5idWZmZXIpIHtcbiAgICAgICAgbGV0IGltYWdlID0gc3RyZWFtVXRpbHMucmVhZEJ1ZmZlcihpbWcuYnVmZmVyKVxuICAgICAgICBpZiAoIWltYWdlICYmIGltZy5iYXNlNjRJbWFnZSkge1xuICAgICAgICAgIGltYWdlID0gQnVmZmVyLmZyb20oaW1nLmJhc2U2NEltYWdlLCBcImJhc2U2NFwiKVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcGF0aCA9IHVweXVuT3B0aW9ucy5wYXRoIHx8IFwiXCJcbiAgICAgICAgY29uc3QgcmVtb3RlUGF0aCA9IGAke3BhdGh9JHtpbWcuZmlsZU5hbWV9JHt1cHl1bk9wdGlvbnMub3B0aW9uc31gXG4gICAgICAgIGNvbnN0IHN0cmVhbSA9IFJlYWRhYmxlLmZyb20oaW1hZ2UpXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKCdCZWZvcmUgdXBsb2FkLHJlbW90ZVBhdGg9PicsIHJlbW90ZVBhdGgpXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKCdCZWZvcmUgdXBsb2FkLHN0cmVhbT0+Jywgc3RyZWFtKVxuXG4gICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGNsaWVudC5wdXRGaWxlKHJlbW90ZVBhdGgsIHN0cmVhbSlcbiAgICAgICAgY29uc29sZS5sb2coXCJVc2luZyB1cHl1biBTREsgZm9yIHVwbG9hZCBhZGQgYnkgdGVyd2VyLCByZXM9PlwiLCByZXMpXG5cbiAgICAgICAgaWYgKHJlcykge1xuICAgICAgICAgIGRlbGV0ZSBpbWcuYmFzZTY0SW1hZ2VcbiAgICAgICAgICBkZWxldGUgaW1nLmJ1ZmZlclxuICAgICAgICAgIGltZy5pbWdVcmwgPSBgJHt1cHl1bk9wdGlvbnMudXJsfS8ke3BhdGh9JHtpbWcuZmlsZU5hbWV9JHt1cHl1bk9wdGlvbnMub3B0aW9uc31gXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVXBsb2FkIGZhaWxlZFwiKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGN0eFxuICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgIGlmIChlcnIubWVzc2FnZSA9PT0gXCJVcGxvYWQgZmFpbGVkXCIpIHtcbiAgICAgIGN0eC5lbWl0KElCdWlsZEluRXZlbnQuTk9USUZJQ0FUSU9OLCB7XG4gICAgICAgIHRpdGxlOiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KFwiVVBMT0FEX0ZBSUxFRFwiKSxcbiAgICAgICAgYm9keTogY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PihcIkNIRUNLX1NFVFRJTkdTXCIpLFxuICAgICAgfSlcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgYm9keSA9IHNhZmVQYXJzZTx7IGNvZGU6IHN0cmluZyB9PihlcnIuZXJyb3IpXG4gICAgICBjdHguZW1pdChJQnVpbGRJbkV2ZW50Lk5PVElGSUNBVElPTiwge1xuICAgICAgICB0aXRsZTogY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PihcIlVQTE9BRF9GQUlMRURcIiksXG4gICAgICAgIGJvZHk6IGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oXCJVUExPQURfRkFJTEVEX1JFQVNPTlwiLCB7XG4gICAgICAgICAgY29kZTogdHlwZW9mIGJvZHkgPT09IFwib2JqZWN0XCIgPyBib2R5LmNvZGUgOiBib2R5LFxuICAgICAgICB9KSxcbiAgICAgICAgdGV4dDogXCJodHRwOi8vZG9jcy51cHl1bi5jb20vYXBpL2Vycm5vL1wiLFxuICAgICAgfSlcbiAgICB9XG4gICAgdGhyb3cgZXJyXG4gIH1cbn1cblxuY29uc3QgY29uZmlnID0gKGN0eDogSVBpY0dvKTogSVBsdWdpbkNvbmZpZ1tdID0+IHtcbiAgY29uc3QgdXNlckNvbmZpZyA9IGN0eC5nZXRDb25maWc8SVVweXVuQ29uZmlnPihcInBpY0JlZC51cHl1blwiKSB8fCB7fVxuICBjb25zdCBjb25maWc6IElQbHVnaW5Db25maWdbXSA9IFtcbiAgICB7XG4gICAgICBuYW1lOiBcImJ1Y2tldFwiLFxuICAgICAgdHlwZTogXCJpbnB1dFwiLFxuICAgICAgZ2V0IGFsaWFzKCkge1xuICAgICAgICByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PihcIlBJQ0JFRF9VUFlVTl9CVUNLRVRcIilcbiAgICAgIH0sXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLmJ1Y2tldCB8fCBcIlwiLFxuICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcIm9wZXJhdG9yXCIsXG4gICAgICB0eXBlOiBcImlucHV0XCIsXG4gICAgICBnZXQgYWxpYXMoKSB7XG4gICAgICAgIHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KFwiUElDQkVEX1VQWVVOX09QRVJBVE9SXCIpXG4gICAgICB9LFxuICAgICAgZ2V0IHByZWZpeCgpIHtcbiAgICAgICAgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oXCJQSUNCRURfVVBZVU5fT1BFUkFUT1JcIilcbiAgICAgIH0sXG4gICAgICBnZXQgbWVzc2FnZSgpIHtcbiAgICAgICAgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oXCJQSUNCRURfVVBZVU5fTUVTU0FHRV9PUEVSQVRPUlwiKVxuICAgICAgfSxcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcub3BlcmF0b3IgfHwgXCJcIixcbiAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogXCJwYXNzd29yZFwiLFxuICAgICAgdHlwZTogXCJwYXNzd29yZFwiLFxuICAgICAgZ2V0IHByZWZpeCgpIHtcbiAgICAgICAgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oXCJQSUNCRURfVVBZVU5fTUVTU0FHRV9QQVNTV09SRFwiKVxuICAgICAgfSxcbiAgICAgIGdldCBhbGlhcygpIHtcbiAgICAgICAgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oXCJQSUNCRURfVVBZVU5fUEFTU1dPUkRcIilcbiAgICAgIH0sXG4gICAgICBnZXQgbWVzc2FnZSgpIHtcbiAgICAgICAgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oXCJQSUNCRURfVVBZVU5fTUVTU0FHRV9QQVNTV09SRFwiKVxuICAgICAgfSxcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcucGFzc3dvcmQgfHwgXCJcIixcbiAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogXCJ1cmxcIixcbiAgICAgIHR5cGU6IFwiaW5wdXRcIixcbiAgICAgIGdldCBhbGlhcygpIHtcbiAgICAgICAgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oXCJQSUNCRURfVVBZVU5fVVJMXCIpXG4gICAgICB9LFxuICAgICAgZ2V0IG1lc3NhZ2UoKSB7XG4gICAgICAgIHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KFwiUElDQkVEX1VQWVVOX01FU1NBR0VfVVJMXCIpXG4gICAgICB9LFxuICAgICAgZGVmYXVsdDogdXNlckNvbmZpZy51cmwgfHwgXCJcIixcbiAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogXCJvcHRpb25zXCIsXG4gICAgICB0eXBlOiBcImlucHV0XCIsXG4gICAgICBnZXQgcHJlZml4KCkge1xuICAgICAgICByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PihcIlBJQ0JFRF9VUFlVTl9PUFRJT05TXCIpXG4gICAgICB9LFxuICAgICAgZ2V0IGFsaWFzKCkge1xuICAgICAgICByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PihcIlBJQ0JFRF9VUFlVTl9PUFRJT05TXCIpXG4gICAgICB9LFxuICAgICAgZ2V0IG1lc3NhZ2UoKSB7XG4gICAgICAgIHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KFwiUElDQkVEX1VQWVVOX01FU1NBR0VfT1BUSU9OU1wiKVxuICAgICAgfSxcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcub3B0aW9ucyB8fCBcIlwiLFxuICAgICAgcmVxdWlyZWQ6IGZhbHNlLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogXCJwYXRoXCIsXG4gICAgICB0eXBlOiBcImlucHV0XCIsXG4gICAgICBnZXQgcHJlZml4KCkge1xuICAgICAgICByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PihcIlBJQ0JFRF9VUFlVTl9QQVRIXCIpXG4gICAgICB9LFxuICAgICAgZ2V0IGFsaWFzKCkge1xuICAgICAgICByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PihcIlBJQ0JFRF9VUFlVTl9QQVRIXCIpXG4gICAgICB9LFxuICAgICAgZ2V0IG1lc3NhZ2UoKSB7XG4gICAgICAgIHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KFwiUElDQkVEX1VQWVVOX01FU1NBR0VfUEFUSFwiKVxuICAgICAgfSxcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcucGF0aCB8fCBcIlwiLFxuICAgICAgcmVxdWlyZWQ6IGZhbHNlLFxuICAgIH0sXG4gIF1cbiAgcmV0dXJuIGNvbmZpZ1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiByZWdpc3RlcihjdHg6IElQaWNHbyk6IHZvaWQge1xuICBjdHguaGVscGVyLnVwbG9hZGVyLnJlZ2lzdGVyKFwidXB5dW5cIiwge1xuICAgIGdldCBuYW1lKCkge1xuICAgICAgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oXCJQSUNCRURfVVBZVU5cIilcbiAgICB9LFxuICAgIGhhbmRsZSxcbiAgICBjb25maWcsXG4gIH0pXG59XG4iLCJpbXBvcnQgeyBJUGljR28sIElQaWNHb1BsdWdpbiB9IGZyb20gXCIuLi8uLi90eXBlc1wiXG5pbXBvcnQgdGNZdW5VcGxvYWRlciBmcm9tIFwiLi90Y3l1blwiXG5pbXBvcnQgZ2l0aHViVXBsb2FkZXIgZnJvbSBcIi4vZ2l0aHViXCJcbmltcG9ydCBxaW5pdVVwbG9hZGVyIGZyb20gXCIuL3Fpbml1XCJcbmltcG9ydCBhbGlZdW5VcGxvYWRlciBmcm9tIFwiLi9hbGl5dW5cIlxuaW1wb3J0IHVwWXVuVXBsb2FkZXIgZnJvbSBcIi4vdXB5dW5cIlxuXG5jb25zdCBidWlsZEluVXBsb2FkZXJzOiBJUGljR29QbHVnaW4gPSAoKSA9PiB7XG4gIHJldHVybiB7XG4gICAgcmVnaXN0ZXIoY3R4OiBJUGljR28pIHtcbiAgICAgIGFsaVl1blVwbG9hZGVyKGN0eClcbiAgICAgIHRjWXVuVXBsb2FkZXIoY3R4KVxuICAgICAgLy8gU01NU1VwbG9hZGVyKGN0eClcbiAgICAgIGdpdGh1YlVwbG9hZGVyKGN0eClcbiAgICAgIHFpbml1VXBsb2FkZXIoY3R4KVxuICAgICAgLy8gaW1ndXJVcGxvYWRlcihjdHgpXG4gICAgICB1cFl1blVwbG9hZGVyKGN0eClcbiAgICB9LFxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IGJ1aWxkSW5VcGxvYWRlcnNcbiIsImltcG9ydCB7IGlzVXJsLCBnZXRJbWFnZVNpemUsIGdldEZTRmlsZSwgZ2V0VVJMRmlsZSB9IGZyb20gXCIuLi8uLi91dGlscy9jb21tb25cIlxuaW1wb3J0IHsgSVBpY0dvLCBJUGF0aFRyYW5zZm9ybWVkSW1nSW5mbywgSUltZ0luZm8sIElJbWdTaXplIH0gZnJvbSBcIi4uLy4uL3R5cGVzXCJcblxuY29uc3QgaGFuZGxlID0gYXN5bmMgKGN0eDogSVBpY0dvKTogUHJvbWlzZTxJUGljR28+ID0+IHtcbiAgY29uc3QgcmVzdWx0czogSUltZ0luZm9bXSA9IGN0eC5vdXRwdXRcbiAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgY3R4LmlucHV0Lm1hcChhc3luYyAoaXRlbTogc3RyaW5nLCBpbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICBsZXQgaW5mbzogSVBhdGhUcmFuc2Zvcm1lZEltZ0luZm9cbiAgICAgIGlmIChpc1VybChpdGVtKSkge1xuICAgICAgICBpbmZvID0gYXdhaXQgZ2V0VVJMRmlsZShpdGVtLCBjdHgpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpbmZvID0gYXdhaXQgZ2V0RlNGaWxlKGl0ZW0pXG4gICAgICB9XG4gICAgICBpZiAoaW5mby5zdWNjZXNzICYmIGluZm8uYnVmZmVyKSB7XG4gICAgICAgIGNvbnN0IGltZ1NpemUgPSBnZXRJbWdTaXplKGN0eCwgaW5mby5idWZmZXIsIGl0ZW0pXG4gICAgICAgIHJlc3VsdHNbaW5kZXhdID0ge1xuICAgICAgICAgIGJ1ZmZlcjogaW5mby5idWZmZXIsXG4gICAgICAgICAgZmlsZU5hbWU6IGluZm8uZmlsZU5hbWUsXG4gICAgICAgICAgd2lkdGg6IGltZ1NpemUud2lkdGgsXG4gICAgICAgICAgaGVpZ2h0OiBpbWdTaXplLmhlaWdodCxcbiAgICAgICAgICBleHRuYW1lOiBpbmZvLmV4dG5hbWUsXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihpbmZvLnJlYXNvbilcbiAgICAgIH1cbiAgICB9KVxuICApXG4gIC8vIHJlbW92ZSBlbXB0eSBpdGVtXG4gIGN0eC5vdXRwdXQgPSByZXN1bHRzLmZpbHRlcigoaXRlbSkgPT4gaXRlbSlcbiAgcmV0dXJuIGN0eFxufVxuXG5jb25zdCBnZXRJbWdTaXplID0gKGN0eDogSVBpY0dvLCBmaWxlOiBCdWZmZXIsIHBhdGg6IHN0cmluZyk6IElJbWdTaXplID0+IHtcbiAgY29uc3QgaW1hZ2VTaXplID0gZ2V0SW1hZ2VTaXplKGZpbGUpXG4gIGlmICghaW1hZ2VTaXplLnJlYWwpIHtcbiAgICBjdHgubG9nLndhcm4oYGNhbid0IGdldCAke3BhdGh9J3MgaW1hZ2Ugc2l6ZWApXG4gICAgY3R4LmxvZy53YXJuKFwiZmFsbGJhY2sgdG8gMjAwICogMjAwXCIpXG4gIH1cbiAgcmV0dXJuIGltYWdlU2l6ZVxufVxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIGhhbmRsZSxcbn1cbiIsImltcG9ydCB7IElQaWNHbyB9IGZyb20gXCIuLi8uLi90eXBlc1wiXG5jb25zdCBoYW5kbGUgPSBhc3luYyAoY3R4OiBJUGljR28pOiBQcm9taXNlPElQaWNHbz4gPT4ge1xuICBjdHgub3V0cHV0LnB1c2goLi4uY3R4LmlucHV0KVxuICByZXR1cm4gY3R4XG59XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgaGFuZGxlLFxufVxuIiwiaW1wb3J0IGZzIGZyb20gXCJmcy1leHRyYVwiXG5pbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiXG5pbXBvcnQgcmVzb2x2ZSBmcm9tIFwicmVzb2x2ZVwiXG5pbXBvcnQgeyBJQnVpbGRJbkV2ZW50IH0gZnJvbSBcIi4uL3V0aWxzL2VudW1cIlxuaW1wb3J0IHsgSVBpY0dvLCBJUGljR29QbHVnaW4sIElQbHVnaW5Mb2FkZXIsIElQaWNHb1BsdWdpbkludGVyZmFjZSB9IGZyb20gXCIuLi90eXBlcy9pbmRleFwiXG5pbXBvcnQgeyBzZXRDdXJyZW50UGx1Z2luTmFtZSB9IGZyb20gXCIuL0xpZmVjeWNsZVBsdWdpbnNcIlxuXG4vKipcbiAqIExvY2FsIHBsdWdpbiBsb2FkZXIsIGZpbGUgc3lzdGVtIGlzIHJlcXVpcmVkXG4gKi9cbmV4cG9ydCBjbGFzcyBQbHVnaW5Mb2FkZXIgaW1wbGVtZW50cyBJUGx1Z2luTG9hZGVyIHtcbiAgcHJpdmF0ZSByZWFkb25seSBjdHg6IElQaWNHb1xuICBwcml2YXRlIGxpc3Q6IHN0cmluZ1tdID0gW11cbiAgcHJpdmF0ZSByZWFkb25seSBmdWxsTGlzdDogU2V0PHN0cmluZz4gPSBuZXcgU2V0KClcbiAgcHJpdmF0ZSByZWFkb25seSBwbHVnaW5NYXA6IE1hcDxzdHJpbmcsIElQaWNHb1BsdWdpbkludGVyZmFjZT4gPSBuZXcgTWFwKClcbiAgY29uc3RydWN0b3IoY3R4OiBJUGljR28pIHtcbiAgICB0aGlzLmN0eCA9IGN0eFxuICAgIHRoaXMuaW5pdCgpXG4gIH1cblxuICBwcml2YXRlIGluaXQoKTogdm9pZCB7XG4gICAgY29uc3QgcGFja2FnZVBhdGggPSBwYXRoLmpvaW4odGhpcy5jdHguYmFzZURpciwgXCJwYWNrYWdlLmpzb25cIilcbiAgICBpZiAoIWZzLmV4aXN0c1N5bmMocGFja2FnZVBhdGgpKSB7XG4gICAgICBjb25zdCBwa2cgPSB7XG4gICAgICAgIG5hbWU6IFwicGljZ28tcGx1Z2luc1wiLFxuICAgICAgICBkZXNjcmlwdGlvbjogXCJwaWNnby1wbHVnaW5zXCIsXG4gICAgICAgIHJlcG9zaXRvcnk6IFwiaHR0cHM6Ly9naXRodWIuY29tL1BpY0dvL1BpY0dvLUNvcmVcIixcbiAgICAgICAgbGljZW5zZTogXCJNSVRcIixcbiAgICAgIH1cbiAgICAgIGZzLndyaXRlRmlsZVN5bmMocGFja2FnZVBhdGgsIEpTT04uc3RyaW5naWZ5KHBrZyksIFwidXRmOFwiKVxuICAgIH1cbiAgfVxuXG4gIC8vIGdldCBwbHVnaW4gZW50cnlcbiAgcHJpdmF0ZSByZXNvbHZlUGx1Z2luKGN0eDogSVBpY0dvLCBuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gcmVzb2x2ZS5zeW5jKG5hbWUsIHsgYmFzZWRpcjogY3R4LmJhc2VEaXIgfSlcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHJldHVybiBwYXRoLmpvaW4oY3R4LmJhc2VEaXIsIFwibm9kZV9tb2R1bGVzXCIsIG5hbWUpXG4gICAgfVxuICB9XG5cbiAgLy8gbG9hZCBhbGwgdGhpcmQgcGFydHkgcGx1Z2luXG4gIGxvYWQoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgcGFja2FnZVBhdGggPSBwYXRoLmpvaW4odGhpcy5jdHguYmFzZURpciwgXCJwYWNrYWdlLmpzb25cIilcbiAgICBjb25zdCBwbHVnaW5EaXIgPSBwYXRoLmpvaW4odGhpcy5jdHguYmFzZURpciwgXCJub2RlX21vZHVsZXMvXCIpXG4gICAgLy8gVGhhbmtzIHRvIGhleG8gLT4gaHR0cHM6Ly9naXRodWIuY29tL2hleG9qcy9oZXhvL2Jsb2IvbWFzdGVyL2xpYi9oZXhvL2xvYWRfcGx1Z2lucy5qc1xuICAgIGlmICghZnMuZXhpc3RzU3luYyhwbHVnaW5EaXIpKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gICAgY29uc3QganNvbiA9IGZzLnJlYWRKU09OU3luYyhwYWNrYWdlUGF0aClcbiAgICBjb25zdCBkZXBzID0gT2JqZWN0LmtleXMoanNvbi5kZXBlbmRlbmNpZXMgfHwge30pXG4gICAgY29uc3QgZGV2RGVwcyA9IE9iamVjdC5rZXlzKGpzb24uZGV2RGVwZW5kZW5jaWVzIHx8IHt9KVxuICAgIGNvbnN0IG1vZHVsZXMgPSBkZXBzLmNvbmNhdChkZXZEZXBzKS5maWx0ZXIoKG5hbWU6IHN0cmluZykgPT4ge1xuICAgICAgaWYgKCEvXnBpY2dvLXBsdWdpbi18XkBbXi9dK1xcL3BpY2dvLXBsdWdpbi0vLnRlc3QobmFtZSkpIHJldHVybiBmYWxzZVxuICAgICAgY29uc3QgcGF0aCA9IHRoaXMucmVzb2x2ZVBsdWdpbih0aGlzLmN0eCwgbmFtZSlcbiAgICAgIHJldHVybiBmcy5leGlzdHNTeW5jKHBhdGgpXG4gICAgfSlcbiAgICBmb3IgKGNvbnN0IG1vZHVsZSBvZiBtb2R1bGVzKSB7XG4gICAgICB0aGlzLnJlZ2lzdGVyUGx1Z2luKG1vZHVsZSlcbiAgICB9XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIHJlZ2lzdGVyUGx1Z2luKG5hbWU6IHN0cmluZywgcGx1Z2luPzogSVBpY0dvUGx1Z2luKTogdm9pZCB7XG4gICAgaWYgKCFuYW1lIHx8IHR5cGVvZiBuYW1lICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICB0aGlzLmN0eC5sb2cud2FybihcIlBsZWFzZSBwcm92aWRlIHZhbGlkIHBsdWdpblwiKVxuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGNvbnNvbGUubG9nKFwiU3RhcnQgcmVnaXN0ZXJpbmcgcGx1Z2luIFwiICsgbmFtZSArIFwiIC4uLlwiKVxuICAgIHRoaXMuZnVsbExpc3QuYWRkKG5hbWUpXG4gICAgdHJ5IHtcbiAgICAgIC8vIHJlZ2lzdGVyIGxvY2FsIHBsdWdpblxuICAgICAgaWYgKCFwbHVnaW4pIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHRoaXMuY3R4LmdldENvbmZpZyhgcGljZ29QbHVnaW5zLiR7bmFtZX1gKSA9PT0gdHJ1ZSB8fFxuICAgICAgICAgIHRoaXMuY3R4LmdldENvbmZpZyhgcGljZ29QbHVnaW5zLiR7bmFtZX1gKSA9PT0gdW5kZWZpbmVkXG4gICAgICAgICkge1xuICAgICAgICAgIHRoaXMubGlzdC5wdXNoKG5hbWUpXG4gICAgICAgICAgc2V0Q3VycmVudFBsdWdpbk5hbWUobmFtZSlcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLW5vbi1udWxsLWFzc2VydGlvblxuICAgICAgICAgIHRoaXMuZ2V0UGx1Z2luKG5hbWUpIS5yZWdpc3Rlcih0aGlzLmN0eClcbiAgICAgICAgICBjb25zdCBwbHVnaW4gPSBgcGljZ29QbHVnaW5zWyR7bmFtZX1dYFxuICAgICAgICAgIHRoaXMuY3R4LnNhdmVDb25maWcoe1xuICAgICAgICAgICAgW3BsdWdpbl06IHRydWUsXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gcmVnaXN0ZXIgcHJvdmlkZWQgcGx1Z2luXG4gICAgICAgIC8vICYmIHdvbid0IHdyaXRlIGNvbmZpZyB0byBmaWxlc1xuICAgICAgICB0aGlzLmxpc3QucHVzaChuYW1lKVxuICAgICAgICBzZXRDdXJyZW50UGx1Z2luTmFtZShuYW1lKVxuICAgICAgICBjb25zdCBwbHVnaW5JbnRlcmZhY2UgPSBwbHVnaW4odGhpcy5jdHgpXG4gICAgICAgIHRoaXMucGx1Z2luTWFwLnNldChuYW1lLCBwbHVnaW5JbnRlcmZhY2UpXG4gICAgICAgIHBsdWdpbkludGVyZmFjZS5yZWdpc3Rlcih0aGlzLmN0eClcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aGlzLnBsdWdpbk1hcC5kZWxldGUobmFtZSlcbiAgICAgIHRoaXMubGlzdCA9IHRoaXMubGlzdC5maWx0ZXIoKGl0ZW06IHN0cmluZykgPT4gaXRlbSAhPT0gbmFtZSlcbiAgICAgIHRoaXMuZnVsbExpc3QuZGVsZXRlKG5hbWUpXG4gICAgICB0aGlzLmN0eC5sb2cuZXJyb3IoZSBhcyBFcnJvcilcbiAgICAgIHRoaXMuY3R4LmVtaXQoSUJ1aWxkSW5FdmVudC5OT1RJRklDQVRJT04sIHtcbiAgICAgICAgdGl0bGU6IGBQbHVnaW4gJHtuYW1lfSBMb2FkIEVycm9yYCxcbiAgICAgICAgYm9keTogZSxcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgdW5yZWdpc3RlclBsdWdpbihuYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmxpc3QgPSB0aGlzLmxpc3QuZmlsdGVyKChpdGVtOiBzdHJpbmcpID0+IGl0ZW0gIT09IG5hbWUpXG4gICAgdGhpcy5mdWxsTGlzdC5kZWxldGUobmFtZSlcbiAgICB0aGlzLnBsdWdpbk1hcC5kZWxldGUobmFtZSlcbiAgICBzZXRDdXJyZW50UGx1Z2luTmFtZShuYW1lKVxuICAgIHRoaXMuY3R4LmhlbHBlci51cGxvYWRlci51bnJlZ2lzdGVyKG5hbWUpXG4gICAgdGhpcy5jdHguaGVscGVyLnRyYW5zZm9ybWVyLnVucmVnaXN0ZXIobmFtZSlcbiAgICB0aGlzLmN0eC5oZWxwZXIuYmVmb3JlVHJhbnNmb3JtUGx1Z2lucy51bnJlZ2lzdGVyKG5hbWUpXG4gICAgdGhpcy5jdHguaGVscGVyLmJlZm9yZVVwbG9hZFBsdWdpbnMudW5yZWdpc3RlcihuYW1lKVxuICAgIHRoaXMuY3R4LmhlbHBlci5hZnRlclVwbG9hZFBsdWdpbnMudW5yZWdpc3RlcihuYW1lKVxuICAgIHRoaXMuY3R4LmNtZC51bnJlZ2lzdGVyKG5hbWUpXG4gICAgdGhpcy5jdHgucmVtb3ZlQ29uZmlnKFwicGljZ29QbHVnaW5zXCIsIG5hbWUpXG4gIH1cblxuICAvLyBnZXQgcGx1Z2luIGJ5IG5hbWVcbiAgZ2V0UGx1Z2luKG5hbWU6IHN0cmluZyk6IElQaWNHb1BsdWdpbkludGVyZmFjZSB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHRoaXMucGx1Z2luTWFwLmhhcyhuYW1lKSkge1xuICAgICAgcmV0dXJuIHRoaXMucGx1Z2luTWFwLmdldChuYW1lKVxuICAgIH1cbiAgICBjb25zdCBwbHVnaW5EaXIgPSBwYXRoLmpvaW4odGhpcy5jdHguYmFzZURpciwgXCJub2RlX21vZHVsZXMvXCIpXG4gICAgY29uc29sZS5sb2coXCJTdGFydCByZXF1aXJpbmcgcGx1Z2luIGxpYiwgcGx1Z2luRGlyXCIsIHBsdWdpbkRpcilcbiAgICBjb25zb2xlLmxvZyhcIlN0YXJ0IHJlcXVpcmluZyBwbHVnaW4gbGliLCBuYW1lXCIsIG5hbWUpXG4gICAgY29uc3QgcGx1Z2luID0gcmVxdWlyZShwbHVnaW5EaXIgKyBuYW1lKSh0aGlzLmN0eClcbiAgICB0aGlzLnBsdWdpbk1hcC5zZXQobmFtZSwgcGx1Z2luKVxuICAgIHJldHVybiBwbHVnaW5cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGxpc3Qgb2YgZW5hYmxlZCBwbHVnaW5zXG4gICAqL1xuICBnZXRMaXN0KCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5saXN0XG4gIH1cblxuICBoYXNQbHVnaW4obmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZnVsbExpc3QuaGFzKG5hbWUpXG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBmdWxsIGxpc3Qgb2YgcGx1Z2lucywgd2hldGhlciBpdCBpcyBlbmFibGVkIG9yIG5vdFxuICAgKi9cbiAgZ2V0RnVsbExpc3QoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBbLi4udGhpcy5mdWxsTGlzdF1cbiAgfVxufVxuZXhwb3J0IGRlZmF1bHQgUGx1Z2luTG9hZGVyXG4iLCJleHBvcnQgY29uc3QgQ0xJUEJPQVJEX0lNQUdFX0ZPTERFUiA9IFwicGljZ28tY2xpcGJvYXJkLWltYWdlc1wiXG4iLCJpbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiXG5pbXBvcnQgeyBzcGF3biB9IGZyb20gXCJjaGlsZF9wcm9jZXNzXCJcbmltcG9ydCBkYXlqcyBmcm9tIFwiZGF5anNcIlxuaW1wb3J0IG9zIGZyb20gXCJvc1wiXG5pbXBvcnQgZnMgZnJvbSBcImZzLWV4dHJhXCJcbmltcG9ydCBpc1dzbCBmcm9tIFwiaXMtd3NsXCJcbmltcG9ydCB7IElQaWNHbywgSUNsaXBib2FyZEltYWdlIH0gZnJvbSBcIi4uL3R5cGVzXCJcbmltcG9ydCB7IElCdWlsZEluRXZlbnQgfSBmcm9tIFwiLi9lbnVtXCJcbmltcG9ydCBtYWNDbGlwYm9hcmRTY3JpcHQgZnJvbSBcIi4vY2xpcGJvYXJkL21hYy5hcHBsZXNjcmlwdFwiXG5pbXBvcnQgd2luZG93c0NsaXBib2FyZFNjcmlwdCBmcm9tIFwiLi9jbGlwYm9hcmQvd2luZG93cy5wczFcIlxuaW1wb3J0IHdpbmRvd3MxMENsaXBib2FyZFNjcmlwdCBmcm9tIFwiLi9jbGlwYm9hcmQvd2luZG93czEwLnBzMVwiXG5pbXBvcnQgbGludXhDbGlwYm9hcmRTY3JpcHQgZnJvbSBcIi4vY2xpcGJvYXJkL2xpbnV4LnNoXCJcbmltcG9ydCB3c2xDbGlwYm9hcmRTY3JpcHQgZnJvbSBcIi4vY2xpcGJvYXJkL3dzbC5zaFwiXG5pbXBvcnQgeyBDTElQQk9BUkRfSU1BR0VfRk9MREVSIH0gZnJvbSBcIi4vc3RhdGljXCJcblxuZXhwb3J0IHR5cGUgUGxhdGZvcm0gPSBcImRhcndpblwiIHwgXCJ3aW4zMlwiIHwgXCJ3aW4xMFwiIHwgXCJsaW51eFwiIHwgXCJ3c2xcIlxuXG5jb25zdCBnZXRDdXJyZW50UGxhdGZvcm0gPSAoKTogUGxhdGZvcm0gPT4ge1xuICBjb25zdCBwbGF0Zm9ybSA9IHByb2Nlc3MucGxhdGZvcm1cbiAgaWYgKGlzV3NsKSB7XG4gICAgcmV0dXJuIFwid3NsXCJcbiAgfVxuICBpZiAocGxhdGZvcm0gPT09IFwid2luMzJcIikge1xuICAgIGNvbnN0IGN1cnJlbnRPUyA9IG9zLnJlbGVhc2UoKS5zcGxpdChcIi5cIilbMF1cbiAgICBpZiAoY3VycmVudE9TID09PSBcIjEwXCIpIHtcbiAgICAgIHJldHVybiBcIndpbjEwXCJcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIFwid2luMzJcIlxuICAgIH1cbiAgfSBlbHNlIGlmIChwbGF0Zm9ybSA9PT0gXCJkYXJ3aW5cIikge1xuICAgIHJldHVybiBcImRhcndpblwiXG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIFwibGludXhcIlxuICB9XG59XG5cbmNvbnN0IHBsYXRmb3JtMlNjcmlwdENvbnRlbnQ6IHtcbiAgW2tleSBpbiBQbGF0Zm9ybV06IHN0cmluZ1xufSA9IHtcbiAgZGFyd2luOiBtYWNDbGlwYm9hcmRTY3JpcHQsXG4gIHdpbjMyOiB3aW5kb3dzQ2xpcGJvYXJkU2NyaXB0LFxuICB3aW4xMDogd2luZG93czEwQ2xpcGJvYXJkU2NyaXB0LFxuICBsaW51eDogbGludXhDbGlwYm9hcmRTY3JpcHQsXG4gIHdzbDogd3NsQ2xpcGJvYXJkU2NyaXB0LFxufVxuLyoqXG4gKiBwb3dlcnNoZWxsIHdpbGwgcmVwb3J0IGVycm9yIGlmIGZpbGUgZG9lcyBub3QgaGF2ZSBhICcucHMxJyBleHRlbnNpb24sXG4gKiBzbyB3ZSBzaG91bGQga2VlcCB0aGUgZXh0ZW5zaW9uIG5hbWUgY29uc2lzdGVudCB3aXRoIGNvcnJlc3BvbmRpbmcgc2hlbGxcbiAqL1xuY29uc3QgcGxhdGZvcm0yU2NyaXB0RmlsZW5hbWU6IHtcbiAgW2tleSBpbiBQbGF0Zm9ybV06IHN0cmluZ1xufSA9IHtcbiAgZGFyd2luOiBcIm1hYy5hcHBsZXNjcmlwdFwiLFxuICB3aW4zMjogXCJ3aW5kb3dzLnBzMVwiLFxuICB3aW4xMDogXCJ3aW5kb3dzMTAucHMxXCIsXG4gIGxpbnV4OiBcImxpbnV4LnNoXCIsXG4gIHdzbDogXCJ3c2wuc2hcIixcbn1cblxuZnVuY3Rpb24gY3JlYXRlSW1hZ2VGb2xkZXIoY3R4OiBJUGljR28pOiB2b2lkIHtcbiAgY29uc3QgaW1hZ2VQYXRoID0gcGF0aC5qb2luKGN0eC5iYXNlRGlyLCBDTElQQk9BUkRfSU1BR0VfRk9MREVSKVxuICBpZiAoIWZzLmV4aXN0c1N5bmMoaW1hZ2VQYXRoKSkge1xuICAgIGZzLm1rZGlyU3luYyhpbWFnZVBhdGgpXG4gIH1cbn1cblxuLy8gVGhhbmtzIHRvIHZzLXBpY2dvOiBodHRwczovL2dpdGh1Yi5jb20vU3BhZGVzLVMvdnMtcGljZ28vYmxvYi9tYXN0ZXIvc3JjL2V4dGVuc2lvbi50c1xuY29uc3QgZ2V0Q2xpcGJvYXJkSW1hZ2UgPSBhc3luYyAoY3R4OiBJUGljR28pOiBQcm9taXNlPElDbGlwYm9hcmRJbWFnZT4gPT4ge1xuICBjcmVhdGVJbWFnZUZvbGRlcihjdHgpXG4gIC8vIGFkZCBhbiBjbGlwYm9hcmQgaW1hZ2UgZm9sZGVyIHRvIGNvbnRyb2wgdGhlIGltYWdlIGNhY2hlIGZpbGVcbiAgY29uc3QgaW1hZ2VQYXRoID0gcGF0aC5qb2luKGN0eC5iYXNlRGlyLCBDTElQQk9BUkRfSU1BR0VfRk9MREVSLCBgJHtkYXlqcygpLmZvcm1hdChcIllZWVlNTURESEhtbXNzXCIpfS5wbmdgKVxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10eXBlc1xuICByZXR1cm4gYXdhaXQgbmV3IFByb21pc2U8SUNsaXBib2FyZEltYWdlPigocmVzb2x2ZTogRnVuY3Rpb24sIHJlamVjdDogRnVuY3Rpb24pOiB2b2lkID0+IHtcbiAgICBjb25zdCBwbGF0Zm9ybSA9IGdldEN1cnJlbnRQbGF0Zm9ybSgpXG4gICAgY29uc3Qgc2NyaXB0UGF0aCA9IHBhdGguam9pbihjdHguYmFzZURpciwgcGxhdGZvcm0yU2NyaXB0RmlsZW5hbWVbcGxhdGZvcm1dKVxuICAgIC8vIElmIHRoZSBzY3JpcHQgZG9lcyBub3QgZXhpc3QgeWV0LCB3ZSBuZWVkIHRvIHdyaXRlIHRoZSBjb250ZW50IHRvIHRoZSBzY3JpcHQgZmlsZVxuICAgIGlmICghZnMuZXhpc3RzU3luYyhzY3JpcHRQYXRoKSkge1xuICAgICAgZnMud3JpdGVGaWxlU3luYyhzY3JpcHRQYXRoLCBwbGF0Zm9ybTJTY3JpcHRDb250ZW50W3BsYXRmb3JtXSwgXCJ1dGY4XCIpXG4gICAgfVxuICAgIGxldCBleGVjdXRpb25cbiAgICBpZiAocGxhdGZvcm0gPT09IFwiZGFyd2luXCIpIHtcbiAgICAgIGV4ZWN1dGlvbiA9IHNwYXduKFwib3Nhc2NyaXB0XCIsIFtzY3JpcHRQYXRoLCBpbWFnZVBhdGhdKVxuICAgIH0gZWxzZSBpZiAocGxhdGZvcm0gPT09IFwid2luMzJcIiB8fCBwbGF0Zm9ybSA9PT0gXCJ3aW4xMFwiKSB7XG4gICAgICBleGVjdXRpb24gPSBzcGF3bihcInBvd2Vyc2hlbGxcIiwgW1xuICAgICAgICBcIi1ub3Byb2ZpbGVcIixcbiAgICAgICAgXCItbm9uaW50ZXJhY3RpdmVcIixcbiAgICAgICAgXCItbm9sb2dvXCIsXG4gICAgICAgIFwiLXN0YVwiLFxuICAgICAgICBcIi1leGVjdXRpb25wb2xpY3lcIixcbiAgICAgICAgXCJ1bnJlc3RyaWN0ZWRcIixcbiAgICAgICAgLy8gZml4IHdpbmRvd3MgMTAgbmF0aXZlIGNtZCBjcmFzaCBidWcgd2hlbiBcInBpY2dvIHVwbG9hZFwiXG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9QaWNHby9QaWNHby1Db3JlL2lzc3Vlcy8zMlxuICAgICAgICAvLyAnLXdpbmRvd3N0eWxlJywnaGlkZGVuJyxcbiAgICAgICAgLy8gJy1ub2V4aXQnLFxuICAgICAgICBcIi1maWxlXCIsXG4gICAgICAgIHNjcmlwdFBhdGgsXG4gICAgICAgIGltYWdlUGF0aCxcbiAgICAgIF0pXG4gICAgfSBlbHNlIHtcbiAgICAgIGV4ZWN1dGlvbiA9IHNwYXduKFwic2hcIiwgW3NjcmlwdFBhdGgsIGltYWdlUGF0aF0pXG4gICAgfVxuXG4gICAgZXhlY3V0aW9uLnN0ZG91dC5vbihcImRhdGFcIiwgKGRhdGE6IEJ1ZmZlcikgPT4ge1xuICAgICAgaWYgKHBsYXRmb3JtID09PSBcImxpbnV4XCIpIHtcbiAgICAgICAgaWYgKGRhdGEudG9TdHJpbmcoKS50cmltKCkgPT09IFwibm8geGNsaXAgb3Igd2wtY2xpcGJvYXJkXCIpIHtcbiAgICAgICAgICBjdHguZW1pdChJQnVpbGRJbkV2ZW50Lk5PVElGSUNBVElPTiwge1xuICAgICAgICAgICAgdGl0bGU6IFwieGNsaXAgb3Igd2wtY2xpcGJvYXJkIG5vdCBmb3VuZFwiLFxuICAgICAgICAgICAgYm9keTogXCJQbGVhc2UgaW5zdGFsbCB4Y2xpcChmb3IgeDExKSBvciB3bC1jbGlwYm9hcmQoZm9yIHdheWxhbmQpIGJlZm9yZSBydW4gcGljZ29cIixcbiAgICAgICAgICB9KVxuICAgICAgICAgIHJldHVybiByZWplY3QobmV3IEVycm9yKFwiUGxlYXNlIGluc3RhbGwgeGNsaXAoZm9yIHgxMSkgb3Igd2wtY2xpcGJvYXJkKGZvciB3YXlsYW5kKSBiZWZvcmUgcnVuIHBpY2dvXCIpKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb25zdCBpbWdQYXRoID0gZGF0YS50b1N0cmluZygpLnRyaW0oKVxuXG4gICAgICAvLyBpZiB0aGUgZmlsZVBhdGggaXMgdGhlIHJlYWwgZmlsZSBpbiBzeXN0ZW1cbiAgICAgIC8vIHdlIHNob3VsZCBrZWVwIGl0IGluc3RlYWQgb2YgcmVtb3ZpbmdcbiAgICAgIGxldCBzaG91bGRLZWVwQWZ0ZXJVcGxvYWRpbmcgPSBmYWxzZVxuXG4gICAgICAvLyBpbiBtYWNPUyBpZiB5b3VyIGNvcHkgdGhlIGZpbGUgaW4gc3lzdGVtLCBpdCdzIGJhc2VuYW1lIHdpbGwgbm90IGVxdWFsIHRvIG91ciBkZWZhdWx0IGJhc2VuYW1lXG4gICAgICBpZiAocGF0aC5iYXNlbmFtZShpbWdQYXRoKSAhPT0gcGF0aC5iYXNlbmFtZShpbWFnZVBhdGgpKSB7XG4gICAgICAgIC8vIGlmIHRoZSBwYXRoIGlzIG5vdCBnZW5lcmF0ZSBieSBwaWNnb1xuICAgICAgICAvLyBidXQgdGhlIHBhdGggZXhpc3RzLCB3ZSBzaG91bGQga2VlcCBpdFxuICAgICAgICBpZiAoZnMuZXhpc3RzU3luYyhpbWdQYXRoKSkge1xuICAgICAgICAgIHNob3VsZEtlZXBBZnRlclVwbG9hZGluZyA9IHRydWVcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gaWYgdGhlIGltZ1BhdGggaXMgaW52YWxpZFxuICAgICAgaWYgKGltZ1BhdGggIT09IFwibm8gaW1hZ2VcIiAmJiAhZnMuZXhpc3RzU3luYyhpbWdQYXRoKSkge1xuICAgICAgICByZXR1cm4gcmVqZWN0KG5ldyBFcnJvcihgQ2FuJ3QgZmluZCAke2ltZ1BhdGh9YCkpXG4gICAgICB9XG5cbiAgICAgIHJlc29sdmUoe1xuICAgICAgICBpbWdQYXRoLFxuICAgICAgICBzaG91bGRLZWVwQWZ0ZXJVcGxvYWRpbmcsXG4gICAgICB9KVxuICAgIH0pXG4gIH0pXG59XG5cbmV4cG9ydCBkZWZhdWx0IGdldENsaXBib2FyZEltYWdlXG4iLCJpbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tIFwiZXZlbnRzXCJcblxuY29uc3QgZXZlbnRCdXMgPSBuZXcgRXZlbnRFbWl0dGVyKClcbmV4cG9ydCB7IGV2ZW50QnVzIH1cbiIsIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9leHBsaWNpdC1mdW5jdGlvbi1yZXR1cm4tdHlwZSAqL1xuLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L3Byb21pc2UtZnVuY3Rpb24tYXN5bmMgKi9cbmltcG9ydCBheGlvcywgeyBBeGlvc1JlcXVlc3RDb25maWcsIEF4aW9zUmVzcG9uc2UgfSBmcm9tIFwiYXhpb3NcIlxuaW1wb3J0IHtcbiAgSVBpY0dvLFxuICBVbmRlZmluYWJsZSxcbiAgSUNvbmZpZ0NoYW5nZVBheWxvYWQsXG4gIElDb25maWcsXG4gIElSZXF1ZXN0Q29uZmlnLFxuICBJT2xkUmVxT3B0aW9ucyxcbiAgSVJlc3BvbnNlLFxuICBJRnVsbFJlc3BvbnNlLFxuICBJUmVxdWVzdCxcbn0gZnJvbSBcIi4uL3R5cGVzXCJcbmltcG9ydCB7IElCdXNFdmVudCB9IGZyb20gXCIuLi91dGlscy9lbnVtXCJcbmltcG9ydCB7IGV2ZW50QnVzIH0gZnJvbSBcIi4uL3V0aWxzL2V2ZW50QnVzXCJcbmltcG9ydCB7IFVSTCB9IGZyb20gXCJ1cmxcIlxuaW1wb3J0IEZvcm1EYXRhIGZyb20gXCJmb3JtLWRhdGFcIlxuaW1wb3J0IGh0dHBzIGZyb20gXCJodHRwc1wiXG5pbXBvcnQgdHVubmVsIGZyb20gXCJ0dW5uZWxcIlxuY29uc3QgaHR0cHNBZ2VudCA9IG5ldyBodHRwcy5BZ2VudCh7XG4gIG1heFZlcnNpb246IFwiVExTdjEuMlwiLFxuICBtaW5WZXJzaW9uOiBcIlRMU3YxLjJcIixcbn0pXG5cbi8vIHRoYW5rcyBmb3IgaHR0cHM6Ly9naXRodWIuZGV2L3JlcXVlc3QvcmVxdWVzdC9ibG9iL21hc3Rlci9pbmRleC5qc1xuZnVuY3Rpb24gYXBwZW5kRm9ybURhdGEoZm9ybTogRm9ybURhdGEsIGtleTogc3RyaW5nLCBkYXRhOiBhbnkpOiB2b2lkIHtcbiAgaWYgKHR5cGVvZiBkYXRhID09PSBcIm9iamVjdFwiICYmIFwidmFsdWVcIiBpbiBkYXRhICYmIFwib3B0aW9uc1wiIGluIGRhdGEpIHtcbiAgICBmb3JtLmFwcGVuZChrZXksIGRhdGEudmFsdWUsIGRhdGEub3B0aW9ucylcbiAgfSBlbHNlIHtcbiAgICBmb3JtLmFwcGVuZChrZXksIGRhdGEpXG4gIH1cbn1cblxuZnVuY3Rpb24gcmVxdWVzdEludGVyY2VwdG9yKG9wdGlvbnM6IElPbGRSZXFPcHRpb25zIHwgQXhpb3NSZXF1ZXN0Q29uZmlnKTogQXhpb3NSZXF1ZXN0Q29uZmlnICYge1xuICBfX2lzT2xkT3B0aW9ucz86IGJvb2xlYW5cbn0ge1xuICBsZXQgX19pc09sZE9wdGlvbnMgPSBmYWxzZVxuICBjb25zdCBvcHQ6IEF4aW9zUmVxdWVzdENvbmZpZzxhbnk+ICYge1xuICAgIF9faXNPbGRPcHRpb25zPzogYm9vbGVhblxuICB9ID0ge1xuICAgIC4uLm9wdGlvbnMsXG4gICAgdXJsOiAob3B0aW9ucy51cmwgYXMgc3RyaW5nKSB8fCBcIlwiLFxuICAgIGhlYWRlcnM6IG9wdGlvbnMuaGVhZGVycyB8fCB7fSxcbiAgfVxuICAvLyB1c2VyIHJlcXVlc3QgY29uZmlnIHByb3h5XG4gIGlmIChvcHRpb25zLnByb3h5KSB7XG4gICAgbGV0IHByb3h5T3B0aW9ucyA9IG9wdGlvbnMucHJveHlcbiAgICBpZiAodHlwZW9mIHByb3h5T3B0aW9ucyA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcHJveHlPcHRpb25zID0gbmV3IFVSTChvcHRpb25zLnByb3h5KVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBwcm94eU9wdGlvbnMgPSBmYWxzZVxuICAgICAgICBvcHQucHJveHkgPSBmYWxzZVxuICAgICAgICBjb25zb2xlLmVycm9yKGUpXG4gICAgICB9XG4gICAgICBfX2lzT2xkT3B0aW9ucyA9IHRydWVcbiAgICB9XG4gICAgaWYgKHByb3h5T3B0aW9ucykge1xuICAgICAgaWYgKG9wdGlvbnMudXJsPy5zdGFydHNXaXRoKFwiaHR0cHM6Ly9cIikpIHtcbiAgICAgICAgb3B0LnByb3h5ID0gZmFsc2VcbiAgICAgICAgb3B0Lmh0dHBzQWdlbnQgPSB0dW5uZWwuaHR0cHNPdmVySHR0cCh7XG4gICAgICAgICAgcHJveHk6IHtcbiAgICAgICAgICAgIGhvc3Q6IHByb3h5T3B0aW9ucz8uaG9zdG5hbWUsXG4gICAgICAgICAgICBwb3J0OiBwYXJzZUludChwcm94eU9wdGlvbnM/LnBvcnQsIDEwKSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3B0LnByb3h5ID0ge1xuICAgICAgICAgIGhvc3Q6IHByb3h5T3B0aW9ucy5ob3N0bmFtZSxcbiAgICAgICAgICBwb3J0OiBwYXJzZUludChwcm94eU9wdGlvbnMucG9ydCwgMTApLFxuICAgICAgICAgIHByb3RvY29sOiBcImh0dHBcIixcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICBpZiAoXCJmb3JtRGF0YVwiIGluIG9wdGlvbnMpIHtcbiAgICBjb25zdCBmb3JtID0gbmV3IEZvcm1EYXRhKClcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBvcHRpb25zLmZvcm1EYXRhKSB7XG4gICAgICBjb25zdCBkYXRhID0gb3B0aW9ucy5mb3JtRGF0YVtrZXldXG4gICAgICBhcHBlbmRGb3JtRGF0YShmb3JtLCBrZXksIGRhdGEpXG4gICAgfVxuICAgIG9wdC5kYXRhID0gZm9ybVxuICAgIG9wdC5oZWFkZXJzID0gT2JqZWN0LmFzc2lnbihvcHQuaGVhZGVycyB8fCB7fSwgZm9ybS5nZXRIZWFkZXJzKCkpXG4gICAgX19pc09sZE9wdGlvbnMgPSB0cnVlXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9iYW4tdHMtY29tbWVudFxuICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICBkZWxldGUgb3B0LmZvcm1EYXRhXG4gIH1cbiAgaWYgKFwiYm9keVwiIGluIG9wdGlvbnMpIHtcbiAgICBvcHQuZGF0YSA9IG9wdGlvbnMuYm9keVxuICAgIF9faXNPbGRPcHRpb25zID0gdHJ1ZVxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvYmFuLXRzLWNvbW1lbnRcbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgZGVsZXRlIG9wdC5ib2R5XG4gIH1cbiAgaWYgKFwicXNcIiBpbiBvcHRpb25zKSB7XG4gICAgb3B0LnBhcmFtcyA9IG9wdGlvbnMucXNcbiAgICBfX2lzT2xkT3B0aW9ucyA9IHRydWVcbiAgfVxuICBvcHQuX19pc09sZE9wdGlvbnMgPSBfX2lzT2xkT3B0aW9uc1xuICByZXR1cm4gb3B0XG59XG5cbmZ1bmN0aW9uIHJlc3BvbnNlSW50ZXJjZXB0b3IocmVzcG9uc2U6IEF4aW9zUmVzcG9uc2UpOiBJRnVsbFJlc3BvbnNlIHtcbiAgcmV0dXJuIHtcbiAgICAuLi5yZXNwb25zZSxcbiAgICBzdGF0dXNDb2RlOiByZXNwb25zZS5zdGF0dXMsXG4gICAgYm9keTogcmVzcG9uc2UuZGF0YSxcbiAgfVxufVxuXG5mdW5jdGlvbiByZXNwb25zZUVycm9ySGFuZGxlcihlcnJvcjogYW55KSB7XG4gIC8vIGlmIChlcnJvci5yZXNwb25zZSkge1xuICAvLyAgIC8vIFRoZSByZXF1ZXN0IHdhcyBtYWRlIGFuZCB0aGUgc2VydmVyIHJlc3BvbmRlZCB3aXRoIGEgc3RhdHVzIGNvZGVcbiAgLy8gICAvLyB0aGF0IGZhbGxzIG91dCBvZiB0aGUgcmFuZ2Ugb2YgMnh4XG4gIC8vICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGVycm8pXG4gIC8vIH0gZWxzZSBpZiAoZXJyb3IucmVxdWVzdCkge1xuICAvLyAgIC8vIFRoZSByZXF1ZXN0IHdhcyBtYWRlIGJ1dCBubyByZXNwb25zZSB3YXMgcmVjZWl2ZWRcbiAgLy8gICAvLyBgZXJyb3IucmVxdWVzdGAgaXMgYW4gaW5zdGFuY2Ugb2YgWE1MSHR0cFJlcXVlc3QgaW4gdGhlIGJyb3dzZXIgYW5kIGFuIGluc3RhbmNlIG9mXG4gIC8vICAgLy8gaHR0cC5DbGllbnRSZXF1ZXN0IGluIG5vZGUuanNcbiAgLy8gICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyb3IucmVxdWVzdClcbiAgLy8gfSBlbHNlIHtcbiAgLy8gICAvLyBTb21ldGhpbmcgaGFwcGVuZWQgaW4gc2V0dGluZyB1cCB0aGUgcmVxdWVzdCB0aGF0IHRyaWdnZXJlZCBhbiBFcnJvclxuICAvLyAgIHJldHVybiBQcm9taXNlLnJlamVjdChlcnJvci5tZXNzYWdlKVxuICAvLyB9XG4gIGNvbnN0IGVycm9yT2JqID0ge1xuICAgIG1ldGhvZDogZXJyb3I/LmNvbmZpZz8ubWV0aG9kPy50b1VwcGVyQ2FzZSgpIHx8IFwiXCIsXG4gICAgdXJsOiBlcnJvcj8uY29uZmlnPy51cmwgfHwgXCJcIixcbiAgICBzdGF0dXNDb2RlOiBlcnJvcj8ucmVzcG9uc2U/LnN0YXR1cyB8fCAwLFxuICAgIG1lc3NhZ2U6IGVycm9yPy5tZXNzYWdlIHx8IFwiXCIsXG4gICAgc3RhY2s6IGVycm9yPy5zdGFjayB8fCB7fSxcbiAgICByZXNwb25zZToge1xuICAgICAgc3RhdHVzOiBlcnJvcj8ucmVzcG9uc2U/LnN0YXR1cyB8fCAwLFxuICAgICAgc3RhdHVzQ29kZTogZXJyb3I/LnJlc3BvbnNlPy5zdGF0dXMgfHwgMCxcbiAgICAgIGJvZHk6IGVycm9yPy5yZXNwb25zZT8uZGF0YSB8fCBcIlwiLFxuICAgIH0sXG4gIH1cbiAgcmV0dXJuIFByb21pc2UucmVqZWN0KGVycm9yT2JqKVxufVxuXG5leHBvcnQgY2xhc3MgUmVxdWVzdCBpbXBsZW1lbnRzIElSZXF1ZXN0IHtcbiAgcHJpdmF0ZSByZWFkb25seSBjdHg6IElQaWNHb1xuICBwcml2YXRlIHByb3h5OiBVbmRlZmluYWJsZTxzdHJpbmc+ID0gXCJcIlxuICBvcHRpb25zOiBBeGlvc1JlcXVlc3RDb25maWc8YW55PiA9IHt9XG4gIGNvbnN0cnVjdG9yKGN0eDogSVBpY0dvKSB7XG4gICAgdGhpcy5jdHggPSBjdHhcbiAgICB0aGlzLmluaXQoKVxuICAgIGV2ZW50QnVzLm9uKElCdXNFdmVudC5DT05GSUdfQ0hBTkdFLCAoZGF0YTogSUNvbmZpZ0NoYW5nZVBheWxvYWQ8c3RyaW5nIHwgSUNvbmZpZ1tcInBpY0JlZFwiXT4pID0+IHtcbiAgICAgIHN3aXRjaCAoZGF0YS5jb25maWdOYW1lKSB7XG4gICAgICAgIGNhc2UgXCJwaWNCZWRcIjpcbiAgICAgICAgICBpZiAoKGRhdGEudmFsdWUgYXMgSUNvbmZpZ1tcInBpY0JlZFwiXSk/LnByb3h5KSB7XG4gICAgICAgICAgICB0aGlzLnByb3h5ID0gKGRhdGEudmFsdWUgYXMgSUNvbmZpZ1tcInBpY0JlZFwiXSkucHJveHlcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSBcInBpY0JlZC5wcm94eVwiOlxuICAgICAgICAgIHRoaXMucHJveHkgPSBkYXRhLnZhbHVlIGFzIHN0cmluZ1xuICAgICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIHByaXZhdGUgaW5pdCgpOiB2b2lkIHtcbiAgICBjb25zdCBwcm94eSA9IHRoaXMuY3R4LmdldENvbmZpZzxVbmRlZmluYWJsZTxzdHJpbmc+PihcInBpY0JlZC5wcm94eVwiKVxuICAgIGlmIChwcm94eSkge1xuICAgICAgdGhpcy5wcm94eSA9IHByb3h5XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVQcm94eSgpOiBBeGlvc1JlcXVlc3RDb25maWdbXCJwcm94eVwiXSB8IGZhbHNlIHtcbiAgICBpZiAodGhpcy5wcm94eSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcHJveHlPcHRpb25zID0gbmV3IFVSTCh0aGlzLnByb3h5KVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGhvc3Q6IHByb3h5T3B0aW9ucy5ob3N0bmFtZSxcbiAgICAgICAgICBwb3J0OiBwYXJzZUludChwcm94eU9wdGlvbnMucG9ydCB8fCBcIjBcIiwgMTApLFxuICAgICAgICAgIHByb3RvY29sOiBwcm94eU9wdGlvbnMucHJvdG9jb2wsXG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihlKVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8vICM2NCBkeW5hbWljIGdldCBwcm94eSB2YWx1ZVxuICByZXF1ZXN0PFxuICAgIFQsXG4gICAgVSBleHRlbmRzIElSZXF1ZXN0Q29uZmlnPFU+IGV4dGVuZHMgSU9sZFJlcU9wdGlvbnNcbiAgICAgID8gSU9sZFJlcU9wdGlvbnNcbiAgICAgIDogSVJlcXVlc3RDb25maWc8VT4gZXh0ZW5kcyBBeGlvc1JlcXVlc3RDb25maWdcbiAgICAgID8gQXhpb3NSZXF1ZXN0Q29uZmlnXG4gICAgICA6IG5ldmVyXG4gID4ob3B0aW9uczogVSk6IFByb21pc2U8SVJlc3BvbnNlPFQsIFU+PiB7XG4gICAgdGhpcy5vcHRpb25zLnByb3h5ID0gdGhpcy5oYW5kbGVQcm94eSgpXG4gICAgdGhpcy5vcHRpb25zLmhlYWRlcnMgPSBvcHRpb25zLmhlYWRlcnMgfHwge31cbiAgICB0aGlzLm9wdGlvbnMubWF4Qm9keUxlbmd0aCA9IEluZmluaXR5XG4gICAgdGhpcy5vcHRpb25zLm1heENvbnRlbnRMZW5ndGggPSBJbmZpbml0eVxuICAgIGlmICh0aGlzLm9wdGlvbnMucHJveHkgJiYgb3B0aW9ucy51cmw/LnN0YXJ0c1dpdGgoXCJodHRwczovL1wiKSkge1xuICAgICAgdGhpcy5vcHRpb25zLmh0dHBzQWdlbnQgPSB0dW5uZWwuaHR0cHNPdmVySHR0cCh7XG4gICAgICAgIHByb3h5OiB7XG4gICAgICAgICAgaG9zdDogdGhpcy5vcHRpb25zLnByb3h5Lmhvc3QsXG4gICAgICAgICAgcG9ydDogdGhpcy5vcHRpb25zLnByb3h5LnBvcnQsXG4gICAgICAgIH0sXG4gICAgICB9KVxuICAgICAgdGhpcy5vcHRpb25zLnByb3h5ID0gZmFsc2VcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5vcHRpb25zLmh0dHBzQWdlbnQgPSBodHRwc0FnZW50XG4gICAgfVxuICAgIC8vICFOT1RJQ0UgdGhpcy5vcHRpb25zICE9PSBvcHRpb25zXG4gICAgLy8gdGhpcy5vcHRpb25zIGlzIHRoZSBkZWZhdWx0IG9wdGlvbnNcbiAgICBjb25zdCBpbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSh0aGlzLm9wdGlvbnMpXG4gICAgaW5zdGFuY2UuaW50ZXJjZXB0b3JzLnJlc3BvbnNlLnVzZShyZXNwb25zZUludGVyY2VwdG9yLCByZXNwb25zZUVycm9ySGFuZGxlcilcblxuICAgIC8vIGNvbXBhdGlibGUgd2l0aCBvbGQgcmVxdWVzdCBvcHRpb25zIHRvIG5ldyBvcHRpb25zXG4gICAgY29uc3Qgb3B0ID0gcmVxdWVzdEludGVyY2VwdG9yKG9wdGlvbnMpXG5cbiAgICBpbnN0YW5jZS5pbnRlcmNlcHRvcnMucmVxdWVzdC51c2UoZnVuY3Rpb24gKG9iaikge1xuICAgICAgLy8gaGFuZGxlIENvbnRlbnQtVHlwZVxuICAgICAgbGV0IGNvbnRlbnRUeXBlID0gXCJcIlxuICAgICAgaWYgKG9iaj8uaGVhZGVycz8uY29udGVudFR5cGUpIHtcbiAgICAgICAgY29udGVudFR5cGUgPSBvYmouaGVhZGVycy5jb250ZW50VHlwZSBhcyBzdHJpbmdcbiAgICAgICAgZGVsZXRlIG9iai5oZWFkZXJzLmNvbnRlbnRUeXBlXG4gICAgICB9IGVsc2UgaWYgKG9iaj8uaGVhZGVycz8uQ29udGVudFR5cGUpIHtcbiAgICAgICAgY29udGVudFR5cGUgPSBvYmouaGVhZGVycy5Db250ZW50VHlwZSBhcyBzdHJpbmdcbiAgICAgICAgZGVsZXRlIG9iai5oZWFkZXJzLkNvbnRlbnRUeXBlXG4gICAgICB9IGVsc2UgaWYgKG9iaj8uaGVhZGVycz8uW1wiY29udGVudC10eXBlXCJdKSB7XG4gICAgICAgIGNvbnRlbnRUeXBlID0gb2JqLmhlYWRlcnNbXCJjb250ZW50LXR5cGVcIl0gYXMgc3RyaW5nXG4gICAgICAgIGRlbGV0ZSBvYmouaGVhZGVyc1tcImNvbnRlbnQtdHlwZVwiXVxuICAgICAgfVxuICAgICAgaWYgKGNvbnRlbnRUeXBlICE9PSBcIlwiICYmIG9iai5oZWFkZXJzKSB7XG4gICAgICAgIG9iai5oZWFkZXJzW1wiQ29udGVudC1UeXBlXCJdID0gY29udGVudFR5cGVcbiAgICAgIH1cbiAgICAgIHJldHVybiBvYmpcbiAgICB9KVxuICAgIGlmIChcInJlc29sdmVXaXRoRnVsbFJlc3BvbnNlXCIgaW4gb3B0aW9ucyAmJiBvcHRpb25zLnJlc29sdmVXaXRoRnVsbFJlc3BvbnNlKSB7XG4gICAgICByZXR1cm4gaW5zdGFuY2UucmVxdWVzdChvcHQpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBpbnN0YW5jZS5yZXF1ZXN0KG9wdCkudGhlbigocmVzKSA9PiB7XG4gICAgICAgIC8vIHVzZSBvbGQgcmVxdWVzdCBvcHRpb24gZm9ybWF0XG4gICAgICAgIGlmIChvcHQuX19pc09sZE9wdGlvbnMpIHtcbiAgICAgICAgICBpZiAoXCJqc29uXCIgaW4gb3B0aW9ucykge1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMuanNvbikge1xuICAgICAgICAgICAgICByZXR1cm4gcmVzLmRhdGFcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHJlcy5kYXRhKVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gcmVzLmRhdGFcbiAgICAgICAgfVxuICAgICAgfSkgYXMgUHJvbWlzZTxJUmVzcG9uc2U8VCwgVT4+XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFJlcXVlc3RcbiIsImltcG9ydCB7IElDb25maWcsIElQaWNHbyB9IGZyb20gXCIuLi90eXBlc1wiXG5pbXBvcnQgeyBKU09OU3RvcmUgfSBmcm9tIFwiQHBpY2dvL3N0b3JlXCJcbmltcG9ydCB7IElKU09OIH0gZnJvbSBcIkBwaWNnby9zdG9yZS9kaXN0L3R5cGVzXCJcblxuY2xhc3MgREIge1xuICBwcml2YXRlIHJlYWRvbmx5IGN0eDogSVBpY0dvXG4gIHByaXZhdGUgcmVhZG9ubHkgZGI6IEpTT05TdG9yZVxuICBjb25zdHJ1Y3RvcihjdHg6IElQaWNHbykge1xuICAgIHRoaXMuY3R4ID0gY3R4XG4gICAgdGhpcy5kYiA9IG5ldyBKU09OU3RvcmUodGhpcy5jdHguY29uZmlnUGF0aClcblxuICAgIGlmICghdGhpcy5kYi5oYXMoXCJwaWNCZWRcIikpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHRoaXMuZGIuc2V0KFwicGljQmVkXCIsIHtcbiAgICAgICAgICB1cGxvYWRlcjogXCJnaXRodWJcIixcbiAgICAgICAgICBjdXJyZW50OiBcImdpdGh1YlwiLFxuICAgICAgICB9KVxuICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgIHRoaXMuY3R4LmxvZy5lcnJvcihlKVxuICAgICAgICB0aHJvdyBlXG4gICAgICB9XG4gICAgfVxuICAgIGlmICghdGhpcy5kYi5oYXMoXCJwaWNnb1BsdWdpbnNcIikpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHRoaXMuZGIuc2V0KFwicGljZ29QbHVnaW5zXCIsIHt9KVxuICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgIHRoaXMuY3R4LmxvZy5lcnJvcihlKVxuICAgICAgICB0aHJvdyBlXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmVhZChmbHVzaD86IGJvb2xlYW4pOiBJSlNPTiB7XG4gICAgcmV0dXJuIHRoaXMuZGIucmVhZChmbHVzaClcbiAgfVxuXG4gIGdldChrZXkgPSBcIlwiKTogYW55IHtcbiAgICB0aGlzLnJlYWQodHJ1ZSlcbiAgICByZXR1cm4gdGhpcy5kYi5nZXQoa2V5KVxuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9leHBsaWNpdC1tb2R1bGUtYm91bmRhcnktdHlwZXNcbiAgc2V0KGtleTogc3RyaW5nLCB2YWx1ZTogYW55KTogdm9pZCB7XG4gICAgdGhpcy5yZWFkKHRydWUpXG4gICAgcmV0dXJuIHRoaXMuZGIuc2V0KGtleSwgdmFsdWUpXG4gIH1cblxuICBoYXMoa2V5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICB0aGlzLnJlYWQodHJ1ZSlcbiAgICByZXR1cm4gdGhpcy5kYi5oYXMoa2V5KVxuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9leHBsaWNpdC1tb2R1bGUtYm91bmRhcnktdHlwZXNcbiAgdW5zZXQoa2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpOiBib29sZWFuIHtcbiAgICB0aGlzLnJlYWQodHJ1ZSlcbiAgICByZXR1cm4gdGhpcy5kYi51bnNldChrZXksIHZhbHVlKVxuICB9XG5cbiAgc2F2ZUNvbmZpZyhjb25maWc6IFBhcnRpYWw8SUNvbmZpZz4pOiB2b2lkIHtcbiAgICBPYmplY3Qua2V5cyhjb25maWcpLmZvckVhY2goKG5hbWU6IHN0cmluZykgPT4ge1xuICAgICAgdGhpcy5zZXQobmFtZSwgY29uZmlnW25hbWVdKVxuICAgIH0pXG4gIH1cblxuICByZW1vdmVDb25maWcoY29uZmlnOiBJQ29uZmlnKTogdm9pZCB7XG4gICAgT2JqZWN0LmtleXMoY29uZmlnKS5mb3JFYWNoKChuYW1lOiBzdHJpbmcpID0+IHtcbiAgICAgIHRoaXMudW5zZXQobmFtZSwgY29uZmlnW25hbWVdKVxuICAgIH0pXG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgREJcblxuLy8gY29uc3QgaW5pdENvbmZpZyA9IChjb25maWdQYXRoOiBzdHJpbmcpOiBsb3dkYi5Mb3dkYlN5bmM8YW55PiA9PiB7XG4vLyB9XG5cbi8vIGNvbnN0IHNhdmVDb25maWcgPSAoY29uZmlnUGF0aDogc3RyaW5nLCBjb25maWc6IGFueSk6IHZvaWQgPT4ge1xuLy8gICBjb25zdCBkYiA9IGluaXRDb25maWcoY29uZmlnUGF0aClcbi8vICAgT2JqZWN0LmtleXMoY29uZmlnKS5mb3JFYWNoKChuYW1lOiBzdHJpbmcpID0+IHtcbi8vICAgICBkYi5yZWFkKCkuc2V0KG5hbWUsIGNvbmZpZ1tuYW1lXSkud3JpdGUoKVxuLy8gICB9KVxuLy8gfVxuXG4vLyBleHBvcnQge1xuLy8gaW5pdENvbmZpZyxcbi8vIHNhdmVDb25maWdcbi8vIH1cbiIsImltcG9ydCBzcGF3biBmcm9tIFwiY3Jvc3Mtc3Bhd25cIlxuaW1wb3J0IHtcbiAgSVJlc3VsdCxcbiAgSVByb2Nlc3NFbnYsXG4gIElQbHVnaW5Qcm9jZXNzUmVzdWx0LFxuICBJUGx1Z2luSGFuZGxlcixcbiAgSVBsdWdpbkhhbmRsZXJPcHRpb25zLFxuICBVbmRlZmluYWJsZSxcbiAgSVBpY0dvLFxuICBJUGx1Z2luSGFuZGxlclJlc3VsdCxcbn0gZnJvbSBcIi4uL3R5cGVzXCJcbmltcG9ydCB7IElCdWlsZEluRXZlbnQgfSBmcm9tIFwiLi4vdXRpbHMvZW51bVwiXG5pbXBvcnQgeyBnZXRQcm9jZXNzUGx1Z2luTmFtZSwgZ2V0Tm9ybWFsUGx1Z2luTmFtZSB9IGZyb20gXCIuLi91dGlscy9jb21tb25cIlxuaW1wb3J0IHsgSUxvY2FsZXNLZXkgfSBmcm9tIFwiLi4vaTE4bi96aC1DTlwiXG5cbmV4cG9ydCBjbGFzcyBQbHVnaW5IYW5kbGVyIGltcGxlbWVudHMgSVBsdWdpbkhhbmRsZXIge1xuICAvLyBUaGFua3MgdG8gZmVmbG93IC0+IGh0dHBzOi8vZ2l0aHViLmNvbS9mZWZsb3cvZmVmbG93L2Jsb2IvbWFzdGVyL2xpYi9pbnRlcm5hbC9pbnN0YWxsL3BsdWdpbi5qc1xuICBwcml2YXRlIHJlYWRvbmx5IGN0eDogSVBpY0dvXG4gIGNvbnN0cnVjdG9yKGN0eDogSVBpY0dvKSB7XG4gICAgdGhpcy5jdHggPSBjdHhcbiAgfVxuXG4gIGFzeW5jIGluc3RhbGwoXG4gICAgcGx1Z2luczogc3RyaW5nW10sXG4gICAgb3B0aW9ucz86IElQbHVnaW5IYW5kbGVyT3B0aW9ucyxcbiAgICBlbnY/OiBJUHJvY2Vzc0VudlxuICApOiBQcm9taXNlPElQbHVnaW5IYW5kbGVyUmVzdWx0PGJvb2xlYW4+PiB7XG4gICAgaWYgKCFvcHRpb25zKSB7XG4gICAgICBvcHRpb25zID0ge31cbiAgICB9XG4gICAgY29uc3QgaW5zdGFsbGVkUGx1Z2luczogc3RyaW5nW10gPSBbXVxuICAgIGNvbnN0IHByb2Nlc3NQbHVnaW5zID0gcGx1Z2luc1xuICAgICAgLm1hcCgoaXRlbTogc3RyaW5nKSA9PiBoYW5kbGVQbHVnaW5OYW1lUHJvY2Vzcyh0aGlzLmN0eCwgaXRlbSkpXG4gICAgICAuZmlsdGVyKChpdGVtKSA9PiB7XG4gICAgICAgIC8vIGRldGVjdCBpZiBoYXMgYWxyZWFkeSBpbnN0YWxsZWRcbiAgICAgICAgLy8gb3Igd2lsbCBjYXVzZSBlcnJvclxuICAgICAgICBpZiAodGhpcy5jdHgucGx1Z2luTG9hZGVyLmhhc1BsdWdpbihpdGVtLnBrZ05hbWUpKSB7XG4gICAgICAgICAgaW5zdGFsbGVkUGx1Z2lucy5wdXNoKGl0ZW0ucGtnTmFtZSlcbiAgICAgICAgICB0aGlzLmN0eC5sb2cuc3VjY2VzcyhgUGljR28gaGFzIGFscmVhZHkgaW5zdGFsbGVkICR7aXRlbS5wa2dOYW1lfWApXG4gICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgIH1cbiAgICAgICAgLy8gaWYgc29tZXRoaW5nIHdyb25nLCBmaWx0ZXIgaXQgb3V0XG4gICAgICAgIGlmICghaXRlbS5zdWNjZXNzKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH0pXG4gICAgY29uc3QgZnVsbE5hbWVMaXN0ID0gcHJvY2Vzc1BsdWdpbnMubWFwKChpdGVtKSA9PiBpdGVtLmZ1bGxOYW1lKVxuICAgIGNvbnN0IHBrZ05hbWVMaXN0ID0gcHJvY2Vzc1BsdWdpbnMubWFwKChpdGVtKSA9PiBpdGVtLnBrZ05hbWUpXG4gICAgaWYgKGZ1bGxOYW1lTGlzdC5sZW5ndGggPiAwKSB7XG4gICAgICAvLyBpbnN0YWxsIHBsdWdpbnMgbXVzdCB1c2UgZnVsbE5hbWVMaXN0OlxuICAgICAgLy8gMS4gaW5zdGFsbCByZW1vdGUgcGFjYWdlXG4gICAgICAvLyAyLiBpbnN0YWxsIGxvY2FsIHBhY2FnZVxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5leGVjQ29tbWFuZChcImluc3RhbGxcIiwgZnVsbE5hbWVMaXN0LCB0aGlzLmN0eC5iYXNlRGlyLCBvcHRpb25zLCBlbnYpXG4gICAgICBjb25zb2xlLmxvZyhcImV4ZWNDb21tYW5kIGluc3RhbGwgcmVzdWx0PT5cIiwgcmVzdWx0KVxuICAgICAgaWYgKCFyZXN1bHQuY29kZSkge1xuICAgICAgICBwa2dOYW1lTGlzdC5mb3JFYWNoKChwbHVnaW5OYW1lOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICB0aGlzLmN0eC5wbHVnaW5Mb2FkZXIucmVnaXN0ZXJQbHVnaW4ocGx1Z2luTmFtZSlcbiAgICAgICAgfSlcbiAgICAgICAgdGhpcy5jdHgubG9nLnN1Y2Nlc3ModGhpcy5jdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KFwiUExVR0lOX0hBTkRMRVJfUExVR0lOX0lOU1RBTExfU1VDQ0VTU1wiKSlcbiAgICAgICAgdGhpcy5jdHguZW1pdChcImluc3RhbGxTdWNjZXNzXCIsIHtcbiAgICAgICAgICB0aXRsZTogdGhpcy5jdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KFwiUExVR0lOX0hBTkRMRVJfUExVR0lOX0lOU1RBTExfU1VDQ0VTU1wiKSxcbiAgICAgICAgICBib2R5OiBbLi4ucGtnTmFtZUxpc3QsIC4uLmluc3RhbGxlZFBsdWdpbnNdLFxuICAgICAgICB9KVxuICAgICAgICBjb25zdCByZXM6IElQbHVnaW5IYW5kbGVyUmVzdWx0PHRydWU+ID0ge1xuICAgICAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICAgICAgYm9keTogWy4uLnBrZ05hbWVMaXN0LCAuLi5pbnN0YWxsZWRQbHVnaW5zXSxcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBlcnIgPSB0aGlzLmN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oXCJQTFVHSU5fSEFORExFUl9QTFVHSU5fSU5TVEFMTF9GQUlMRURfUkVBU09OXCIsIHtcbiAgICAgICAgICBjb2RlOiBgJHtyZXN1bHQuY29kZX1gLFxuICAgICAgICAgIGRhdGE6IHJlc3VsdC5kYXRhLFxuICAgICAgICB9KVxuICAgICAgICB0aGlzLmN0eC5sb2cuZXJyb3IoZXJyKVxuICAgICAgICB0aGlzLmN0eC5lbWl0KFwiaW5zdGFsbEZhaWxlZFwiLCB7XG4gICAgICAgICAgdGl0bGU6IHRoaXMuY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PihcIlBMVUdJTl9IQU5ETEVSX1BMVUdJTl9JTlNUQUxMX0ZBSUxFRFwiKSxcbiAgICAgICAgICBib2R5OiBlcnIsXG4gICAgICAgIH0pXG4gICAgICAgIGNvbnN0IHJlczogSVBsdWdpbkhhbmRsZXJSZXN1bHQ8ZmFsc2U+ID0ge1xuICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgIGJvZHk6IGVycixcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChpbnN0YWxsZWRQbHVnaW5zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgY29uc3QgZXJyID0gdGhpcy5jdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KFwiUExVR0lOX0hBTkRMRVJfUExVR0lOX1VOSU5TVEFMTF9GQUlMRURfVkFMSURcIilcbiAgICAgIHRoaXMuY3R4LmxvZy5lcnJvcihlcnIpXG4gICAgICB0aGlzLmN0eC5lbWl0KFwiaW5zdGFsbEZhaWxlZFwiLCB7XG4gICAgICAgIHRpdGxlOiB0aGlzLmN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oXCJQTFVHSU5fSEFORExFUl9QTFVHSU5fSU5TVEFMTF9GQUlMRURcIiksXG4gICAgICAgIGJvZHk6IGVycixcbiAgICAgIH0pXG4gICAgICBjb25zdCByZXM6IElQbHVnaW5IYW5kbGVyUmVzdWx0PGZhbHNlPiA9IHtcbiAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgIGJvZHk6IGVycixcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXNcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jdHgubG9nLnN1Y2Nlc3ModGhpcy5jdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KFwiUExVR0lOX0hBTkRMRVJfUExVR0lOX0lOU1RBTExfU1VDQ0VTU1wiKSlcbiAgICAgIHRoaXMuY3R4LmVtaXQoXCJpbnN0YWxsU3VjY2Vzc1wiLCB7XG4gICAgICAgIHRpdGxlOiB0aGlzLmN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oXCJQTFVHSU5fSEFORExFUl9QTFVHSU5fSU5TVEFMTF9TVUNDRVNTXCIpLFxuICAgICAgICBib2R5OiBbLi4ucGtnTmFtZUxpc3QsIC4uLmluc3RhbGxlZFBsdWdpbnNdLFxuICAgICAgfSlcbiAgICAgIGNvbnN0IHJlczogSVBsdWdpbkhhbmRsZXJSZXN1bHQ8dHJ1ZT4gPSB7XG4gICAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICAgIGJvZHk6IFsuLi5wa2dOYW1lTGlzdCwgLi4uaW5zdGFsbGVkUGx1Z2luc10sXG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzXG4gICAgfVxuICB9XG5cbiAgYXN5bmMgdW5pbnN0YWxsKFxuICAgIHBsdWdpbnM6IHN0cmluZ1tdLFxuICAgIG9wdGlvbnM/OiBJUGx1Z2luSGFuZGxlck9wdGlvbnMsXG4gICAgZW52PzogSVByb2Nlc3NFbnZcbiAgKTogUHJvbWlzZTxJUGx1Z2luSGFuZGxlclJlc3VsdDxib29sZWFuPj4ge1xuICAgIGlmICghb3B0aW9ucykge1xuICAgICAgb3B0aW9ucyA9IHt9XG4gICAgfVxuICAgIGNvbnN0IHByb2Nlc3NQbHVnaW5zID0gcGx1Z2luc1xuICAgICAgLm1hcCgoaXRlbTogc3RyaW5nKSA9PiBoYW5kbGVQbHVnaW5OYW1lUHJvY2Vzcyh0aGlzLmN0eCwgaXRlbSkpXG4gICAgICAuZmlsdGVyKChpdGVtKSA9PiBpdGVtLnN1Y2Nlc3MpXG4gICAgY29uc3QgcGtnTmFtZUxpc3QgPSBwcm9jZXNzUGx1Z2lucy5tYXAoKGl0ZW0pID0+IGl0ZW0ucGtnTmFtZSlcbiAgICBpZiAocGtnTmFtZUxpc3QubGVuZ3RoID4gMCkge1xuICAgICAgLy8gdW5pbnN0YWxsIHBsdWdpbnMgbXVzdCB1c2UgcGtnTmFtZUxpc3Q6XG4gICAgICAvLyBucG0gdW5pbnN0YWxsIHdpbGwgdXNlIHRoZSBwYWNrYWdlLmpzb24ncyBuYW1lXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmV4ZWNDb21tYW5kKFwidW5pbnN0YWxsXCIsIHBrZ05hbWVMaXN0LCB0aGlzLmN0eC5iYXNlRGlyLCBvcHRpb25zLCBlbnYpXG4gICAgICBjb25zb2xlLmxvZyhcImV4ZWNDb21tYW5kIHVuaW5zdGFsbCByZXN1bHQ9PlwiLCByZXN1bHQpXG4gICAgICBpZiAoIXJlc3VsdC5jb2RlKSB7XG4gICAgICAgIHBrZ05hbWVMaXN0LmZvckVhY2goKHBsdWdpbk5hbWU6IHN0cmluZykgPT4ge1xuICAgICAgICAgIHRoaXMuY3R4LnBsdWdpbkxvYWRlci51bnJlZ2lzdGVyUGx1Z2luKHBsdWdpbk5hbWUpXG4gICAgICAgIH0pXG4gICAgICAgIHRoaXMuY3R4LmxvZy5zdWNjZXNzKHRoaXMuY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PihcIlBMVUdJTl9IQU5ETEVSX1BMVUdJTl9VTklOU1RBTExfU1VDQ0VTU1wiKSlcbiAgICAgICAgdGhpcy5jdHguZW1pdChcInVuaW5zdGFsbFN1Y2Nlc3NcIiwge1xuICAgICAgICAgIHRpdGxlOiB0aGlzLmN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oXCJQTFVHSU5fSEFORExFUl9QTFVHSU5fVU5JTlNUQUxMX1NVQ0NFU1NcIiksXG4gICAgICAgICAgYm9keTogcGtnTmFtZUxpc3QsXG4gICAgICAgIH0pXG4gICAgICAgIGNvbnN0IHJlczogSVBsdWdpbkhhbmRsZXJSZXN1bHQ8dHJ1ZT4gPSB7XG4gICAgICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgICAgICBib2R5OiBwa2dOYW1lTGlzdCxcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBlcnIgPSB0aGlzLmN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oXCJQTFVHSU5fSEFORExFUl9QTFVHSU5fVU5JTlNUQUxMX0ZBSUxFRF9SRUFTT05cIiwge1xuICAgICAgICAgIGNvZGU6IGAke3Jlc3VsdC5jb2RlfWAsXG4gICAgICAgICAgZGF0YTogcmVzdWx0LmRhdGEsXG4gICAgICAgIH0pXG4gICAgICAgIHRoaXMuY3R4LmxvZy5lcnJvcihlcnIpXG4gICAgICAgIHRoaXMuY3R4LmVtaXQoXCJ1bmluc3RhbGxGYWlsZWRcIiwge1xuICAgICAgICAgIHRpdGxlOiB0aGlzLmN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oXCJQTFVHSU5fSEFORExFUl9QTFVHSU5fVU5JTlNUQUxMX0ZBSUxFRFwiKSxcbiAgICAgICAgICBib2R5OiBlcnIsXG4gICAgICAgIH0pXG4gICAgICAgIGNvbnN0IHJlczogSVBsdWdpbkhhbmRsZXJSZXN1bHQ8ZmFsc2U+ID0ge1xuICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgIGJvZHk6IGVycixcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGVyciA9IHRoaXMuY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PihcIlBMVUdJTl9IQU5ETEVSX1BMVUdJTl9VTklOU1RBTExfRkFJTEVEX1ZBTElEXCIpXG4gICAgICB0aGlzLmN0eC5sb2cuZXJyb3IoZXJyKVxuICAgICAgdGhpcy5jdHguZW1pdChcInVuaW5zdGFsbEZhaWxlZFwiLCB7XG4gICAgICAgIHRpdGxlOiB0aGlzLmN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oXCJQTFVHSU5fSEFORExFUl9QTFVHSU5fVU5JTlNUQUxMX0ZBSUxFRFwiKSxcbiAgICAgICAgYm9keTogZXJyLFxuICAgICAgfSlcbiAgICAgIGNvbnN0IHJlczogSVBsdWdpbkhhbmRsZXJSZXN1bHQ8ZmFsc2U+ID0ge1xuICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgYm9keTogZXJyLFxuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHVwZGF0ZShcbiAgICBwbHVnaW5zOiBzdHJpbmdbXSxcbiAgICBvcHRpb25zPzogSVBsdWdpbkhhbmRsZXJPcHRpb25zLFxuICAgIGVudj86IElQcm9jZXNzRW52XG4gICk6IFByb21pc2U8SVBsdWdpbkhhbmRsZXJSZXN1bHQ8Ym9vbGVhbj4+IHtcbiAgICBpZiAoIW9wdGlvbnMpIHtcbiAgICAgIG9wdGlvbnMgPSB7fVxuICAgIH1cbiAgICBjb25zdCBwcm9jZXNzUGx1Z2lucyA9IHBsdWdpbnNcbiAgICAgIC5tYXAoKGl0ZW06IHN0cmluZykgPT4gaGFuZGxlUGx1Z2luTmFtZVByb2Nlc3ModGhpcy5jdHgsIGl0ZW0pKVxuICAgICAgLmZpbHRlcigoaXRlbSkgPT4gaXRlbS5zdWNjZXNzKVxuICAgIGNvbnN0IHBrZ05hbWVMaXN0ID0gcHJvY2Vzc1BsdWdpbnMubWFwKChpdGVtKSA9PiBpdGVtLnBrZ05hbWUpXG4gICAgaWYgKHBrZ05hbWVMaXN0Lmxlbmd0aCA+IDApIHtcbiAgICAgIC8vIHVwZGF0ZSBwbHVnaW5zIG11c3QgdXNlIHBrZ05hbWVMaXN0OlxuICAgICAgLy8gbnBtIHVwZGF0ZSB3aWxsIHVzZSB0aGUgcGFja2FnZS5qc29uJ3MgbmFtZVxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5leGVjQ29tbWFuZChcInVwZGF0ZVwiLCBwa2dOYW1lTGlzdCwgdGhpcy5jdHguYmFzZURpciwgb3B0aW9ucywgZW52KVxuICAgICAgY29uc29sZS5sb2coXCJleGVjQ29tbWFuZCB1cGRhdGUgcmVzdWx0PT5cIiwgcmVzdWx0KVxuICAgICAgaWYgKCFyZXN1bHQuY29kZSkge1xuICAgICAgICB0aGlzLmN0eC5sb2cuc3VjY2Vzcyh0aGlzLmN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oXCJQTFVHSU5fSEFORExFUl9QTFVHSU5fVVBEQVRFX1NVQ0NFU1NcIikpXG4gICAgICAgIHRoaXMuY3R4LmVtaXQoXCJ1cGRhdGVTdWNjZXNzXCIsIHtcbiAgICAgICAgICB0aXRsZTogdGhpcy5jdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KFwiUExVR0lOX0hBTkRMRVJfUExVR0lOX1VQREFURV9TVUNDRVNTXCIpLFxuICAgICAgICAgIGJvZHk6IHBrZ05hbWVMaXN0LFxuICAgICAgICB9KVxuICAgICAgICBjb25zdCByZXM6IElQbHVnaW5IYW5kbGVyUmVzdWx0PHRydWU+ID0ge1xuICAgICAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICAgICAgYm9keTogcGtnTmFtZUxpc3QsXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgZXJyID0gdGhpcy5jdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KFwiUExVR0lOX0hBTkRMRVJfUExVR0lOX1VQREFURV9GQUlMRURfUkVBU09OXCIsIHtcbiAgICAgICAgICBjb2RlOiBgJHtyZXN1bHQuY29kZX1gLFxuICAgICAgICAgIGRhdGE6IHJlc3VsdC5kYXRhLFxuICAgICAgICB9KVxuICAgICAgICB0aGlzLmN0eC5sb2cuZXJyb3IoZXJyKVxuICAgICAgICB0aGlzLmN0eC5lbWl0KFwidXBkYXRlRmFpbGVkXCIsIHtcbiAgICAgICAgICB0aXRsZTogdGhpcy5jdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KFwiUExVR0lOX0hBTkRMRVJfUExVR0lOX1VQREFURV9GQUlMRURcIiksXG4gICAgICAgICAgYm9keTogZXJyLFxuICAgICAgICB9KVxuICAgICAgICBjb25zdCByZXM6IElQbHVnaW5IYW5kbGVyUmVzdWx0PGZhbHNlPiA9IHtcbiAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICBib2R5OiBlcnIsXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBlcnIgPSB0aGlzLmN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oXCJQTFVHSU5fSEFORExFUl9QTFVHSU5fVVBEQVRFX0ZBSUxFRF9WQUxJRFwiKVxuICAgICAgdGhpcy5jdHgubG9nLmVycm9yKGVycilcbiAgICAgIHRoaXMuY3R4LmVtaXQoXCJ1cGRhdGVGYWlsZWRcIiwge1xuICAgICAgICB0aXRsZTogdGhpcy5jdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KFwiUExVR0lOX0hBTkRMRVJfUExVR0lOX1VQREFURV9GQUlMRURcIiksXG4gICAgICAgIGJvZHk6IGVycixcbiAgICAgIH0pXG4gICAgICBjb25zdCByZXM6IElQbHVnaW5IYW5kbGVyUmVzdWx0PGZhbHNlPiA9IHtcbiAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgIGJvZHk6IGVycixcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXNcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGV4ZWNDb21tYW5kKFxuICAgIGNtZDogc3RyaW5nLFxuICAgIG1vZHVsZXM6IHN0cmluZ1tdLFxuICAgIHdoZXJlOiBzdHJpbmcsXG4gICAgb3B0aW9uczogSVBsdWdpbkhhbmRsZXJPcHRpb25zID0ge30sXG4gICAgZW52OiBJUHJvY2Vzc0VudiA9IHt9XG4gICk6IFByb21pc2U8SVJlc3VsdD4ge1xuICAgIC8vIG9wdGlvbnMgZmlyc3RcbiAgICBjb25zdCByZWdpc3RyeSA9IG9wdGlvbnMucmVnaXN0cnkgfHwgdGhpcy5jdHguZ2V0Q29uZmlnPFVuZGVmaW5hYmxlPHN0cmluZz4+KFwic2V0dGluZ3MucmVnaXN0cnlcIilcbiAgICBjb25zdCBwcm94eSA9IG9wdGlvbnMucHJveHkgfHwgdGhpcy5jdHguZ2V0Q29uZmlnPFVuZGVmaW5hYmxlPHN0cmluZz4+KFwic2V0dGluZ3MucHJveHlcIilcbiAgICByZXR1cm4gYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmU6IGFueSk6IHZvaWQgPT4ge1xuICAgICAgbGV0IGFyZ3MgPSBbY21kXS5jb25jYXQobW9kdWxlcykuY29uY2F0KFwiLS1jb2xvcj1hbHdheXNcIikuY29uY2F0KFwiLS1zYXZlXCIpXG4gICAgICBpZiAocmVnaXN0cnkpIHtcbiAgICAgICAgYXJncyA9IGFyZ3MuY29uY2F0KGAtLXJlZ2lzdHJ5PSR7cmVnaXN0cnl9YClcbiAgICAgIH1cbiAgICAgIGlmIChwcm94eSkge1xuICAgICAgICBhcmdzID0gYXJncy5jb25jYXQoYC0tcHJveHk9JHtwcm94eX1gKVxuICAgICAgfVxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgbnBtT3B0aW9ucyA9IHsgY3dkOiB3aGVyZSwgZW52OiBPYmplY3QuYXNzaWduKHt9LCBwcm9jZXNzLmVudiwgZW52KSB9XG4gICAgICAgIGNvbnNvbGUubG9nKFwiU3RhcnQgcnVuIG5wbSwgYXJncz0+XCIsIGFyZ3MpXG4gICAgICAgIGNvbnNvbGUubG9nKFwiU3RhcnQgcnVuIG5wbSwgbnBtT3B0aW9ucz0+XCIsIG5wbU9wdGlvbnMpXG4gICAgICAgIGNvbnN0IG5wbSA9IHNwYXduKFwibnBtXCIsIGFyZ3MsIG5wbU9wdGlvbnMpXG5cbiAgICAgICAgbGV0IG91dHB1dCA9IFwiXCJcbiAgICAgICAgbnBtLnN0ZG91dFxuICAgICAgICAgID8ub24oXCJkYXRhXCIsIChkYXRhOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgIG91dHB1dCArPSBkYXRhXG4gICAgICAgICAgfSlcbiAgICAgICAgICAucGlwZShwcm9jZXNzLnN0ZG91dClcblxuICAgICAgICBucG0uc3RkZXJyXG4gICAgICAgICAgPy5vbihcImRhdGFcIiwgKGRhdGE6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgb3V0cHV0ICs9IGRhdGFcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5waXBlKHByb2Nlc3Muc3RkZXJyKVxuXG4gICAgICAgIG5wbS5vbihcImNsb3NlXCIsIChjb2RlOiBudW1iZXIpID0+IHtcbiAgICAgICAgICBpZiAoIWNvZGUpIHtcbiAgICAgICAgICAgIHJlc29sdmUoeyBjb2RlOiAwLCBkYXRhOiBvdXRwdXQgfSlcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzb2x2ZSh7IGNvZGU6IGNvZGUsIGRhdGE6IG91dHB1dCB9KVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgLy8gZm9yIHVzZXJzIHdobyBoYXZlbid0IGluc3RhbGxlZCBub2RlLmpzXG4gICAgICAgIG5wbS5vbihcImVycm9yXCIsIChlcnI6IEVycm9yKSA9PiB7XG4gICAgICAgICAgdGhpcy5jdHgubG9nLmVycm9yKGVycilcbiAgICAgICAgICB0aGlzLmN0eC5sb2cuZXJyb3IoXCJOUE0gaXMgbm90IGluc3RhbGxlZFwiKVxuICAgICAgICAgIHRoaXMuY3R4LmVtaXQoSUJ1aWxkSW5FdmVudC5GQUlMRUQsIFwiTlBNIGlzIG5vdCBpbnN0YWxsZWRcIilcbiAgICAgICAgfSlcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdGhpcy5jdHgubG9nLmVycm9yKGUgYXMgRXJyb3IpXG4gICAgICAgIHRoaXMuY3R4LmVtaXQoSUJ1aWxkSW5FdmVudC5GQUlMRUQsIGUpXG4gICAgICB9XG4gICAgfSlcbiAgfVxufVxuXG4vKipcbiAqIHRyYW5zZm9ybSB0aGUgaW5wdXQgcGx1Z2luIG5hbWUgb3IgcGF0aCBzdHJpbmcgdG8gdmFsaWQgcmVzdWx0XG4gKiBAcGFyYW0gY3R4XG4gKiBAcGFyYW0gbmFtZU9yUGF0aFxuICovXG5jb25zdCBoYW5kbGVQbHVnaW5OYW1lUHJvY2VzcyA9IChjdHg6IElQaWNHbywgbmFtZU9yUGF0aDogc3RyaW5nKTogSVBsdWdpblByb2Nlc3NSZXN1bHQgPT4ge1xuICBjb25zdCByZXMgPSB7XG4gICAgc3VjY2VzczogZmFsc2UsXG4gICAgZnVsbE5hbWU6IFwiXCIsXG4gICAgcGtnTmFtZTogXCJcIixcbiAgfVxuICBjb25zdCByZXN1bHQgPSBnZXRQcm9jZXNzUGx1Z2luTmFtZShuYW1lT3JQYXRoLCBjdHgubG9nKVxuICBpZiAoIXJlc3VsdCkge1xuICAgIHJldHVybiByZXNcbiAgfVxuICAvLyBmaXJzdCBnZXQgcmVzdWx0IHRoZW4gZG8gdGhpcyBwcm9jZXNzXG4gIC8vIG9yIHNvbWUgZXJyb3Igd2lsbCBsb2cgdHdpY2VcbiAgY29uc3QgcGtnTmFtZSA9IGdldE5vcm1hbFBsdWdpbk5hbWUocmVzdWx0LCBjdHgubG9nKVxuICBpZiAoIXBrZ05hbWUpIHtcbiAgICByZXR1cm4gcmVzXG4gIH1cbiAgcmV0dXJuIHtcbiAgICBzdWNjZXNzOiB0cnVlLFxuICAgIGZ1bGxOYW1lOiByZXN1bHQsXG4gICAgcGtnTmFtZSxcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBQbHVnaW5IYW5kbGVyXG4iLCJpbXBvcnQgeyBaSF9DTiwgSUxvY2FsZXNLZXksIElMb2NhbGVzIH0gZnJvbSBcIi4vemgtQ05cIlxuaW1wb3J0IHsgbWVyZ2UgfSBmcm9tIFwibG9kYXNoXCJcbmltcG9ydCB7IElQaWNHbyB9IGZyb20gXCIuLi90eXBlc1wiXG5pbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiXG5pbXBvcnQgZnMgZnJvbSBcImZzLWV4dHJhXCJcbmltcG9ydCB5YW1sIGZyb20gXCJqcy15YW1sXCJcblxuaW1wb3J0IHsgT2JqZWN0QWRhcHRlciwgSTE4biB9IGZyb20gXCJAcGljZ28vaTE4blwiXG5pbXBvcnQgeyBJU3RyaW5nS2V5TWFwLCBJSTE4bk1hbmFnZXIgfSBmcm9tIFwiLi4vdHlwZXMvaW5kZXhcIlxuaW1wb3J0IHsgSUxvY2FsZSB9IGZyb20gXCJAcGljZ28vaTE4bi9kaXN0L3R5cGVzXCJcbmltcG9ydCB7IEVOIH0gZnJvbSBcIi4vZW5cIlxuaW1wb3J0IHsgWkhfVFcgfSBmcm9tIFwiLi96aC1UV1wiXG5cbmNvbnN0IGxhbmd1YWdlTGlzdDogSVN0cmluZ0tleU1hcDxJU3RyaW5nS2V5TWFwPHN0cmluZz4+ID0ge1xuICBcInpoLUNOXCI6IFpIX0NOLFxuICBcInpoLVRXXCI6IFpIX1RXLFxuICBlbjogRU4sXG59XG5cbmNsYXNzIEkxOG5NYW5hZ2VyIGltcGxlbWVudHMgSUkxOG5NYW5hZ2VyIHtcbiAgcHJpdmF0ZSByZWFkb25seSBpMThuOiBJMThuXG4gIHByaXZhdGUgcmVhZG9ubHkgb2JqZWN0QWRhcHRlcjogT2JqZWN0QWRhcHRlclxuICBwcml2YXRlIHJlYWRvbmx5IGN0eDogSVBpY0dvXG4gIGNvbnN0cnVjdG9yKGN0eDogSVBpY0dvKSB7XG4gICAgdGhpcy5jdHggPSBjdHhcbiAgICB0aGlzLm9iamVjdEFkYXB0ZXIgPSBuZXcgT2JqZWN0QWRhcHRlcihsYW5ndWFnZUxpc3QpXG4gICAgbGV0IGxhbmd1YWdlID0gdGhpcy5jdHguZ2V0Q29uZmlnPHN0cmluZz4oXCJzZXR0aW5ncy5sYW5ndWFnZVwiKSB8fCBcInpoLUNOXCJcbiAgICBpZiAoIWxhbmd1YWdlTGlzdFtsYW5ndWFnZV0pIHtcbiAgICAgIGxhbmd1YWdlID0gXCJ6aC1DTlwiIC8vIHVzZSBkZWZhdWx0XG4gICAgfVxuICAgIHRoaXMuaTE4biA9IG5ldyBJMThuKHtcbiAgICAgIGFkYXB0ZXI6IHRoaXMub2JqZWN0QWRhcHRlcixcbiAgICAgIGRlZmF1bHRMYW5ndWFnZTogbGFuZ3VhZ2UsXG4gICAgfSlcbiAgICB0aGlzLmxvYWRPdXR0ZXJJMThuKClcbiAgfVxuXG4gIHByaXZhdGUgbG9hZE91dHRlckkxOG4oKTogdm9pZCB7XG4gICAgY29uc3QgaTE4bkZvbGRlciA9IHRoaXMuZ2V0T3V0dGVySTE4bkZvbGRlcigpXG4gICAgY29uc3QgZmlsZXMgPSBmcy5yZWFkZGlyU3luYyhpMThuRm9sZGVyLCB7XG4gICAgICB3aXRoRmlsZVR5cGVzOiB0cnVlLFxuICAgIH0pXG4gICAgZmlsZXMuZm9yRWFjaCgoZmlsZSkgPT4ge1xuICAgICAgaWYgKGZpbGUuaXNGaWxlKCkgJiYgZmlsZS5uYW1lLmVuZHNXaXRoKFwiLnltbFwiKSkge1xuICAgICAgICBjb25zdCBpMThuRmlsZVBhdGggPSBwYXRoLmpvaW4oaTE4bkZvbGRlciwgZmlsZS5uYW1lKVxuICAgICAgICBjb25zdCBpMThuRmlsZSA9IGZzLnJlYWRGaWxlU3luYyhpMThuRmlsZVBhdGgsIFwidXRmOFwiKVxuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IGkxOG5GaWxlT2JqID0geWFtbC5sb2FkKGkxOG5GaWxlKSBhcyBJTG9jYWxlc1xuICAgICAgICAgIGxhbmd1YWdlTGlzdFtmaWxlLm5hbWUucmVwbGFjZSgvXFwueW1sJC8sIFwiXCIpXSA9IGkxOG5GaWxlT2JqXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGUpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRPdXR0ZXJJMThuRm9sZGVyKCk6IHN0cmluZyB7XG4gICAgY29uc3QgaTE4bkZvbGRlciA9IHBhdGguam9pbih0aGlzLmN0eC5iYXNlRGlyLCBcImkxOG4tY2xpXCIpXG4gICAgaWYgKCFmcy5wYXRoRXhpc3RzU3luYyhpMThuRm9sZGVyKSkge1xuICAgICAgZnMuZW5zdXJlRGlyU3luYyhpMThuRm9sZGVyKVxuICAgIH1cbiAgICByZXR1cm4gaTE4bkZvbGRlclxuICB9XG5cbiAgdHJhbnNsYXRlPFQgZXh0ZW5kcyBzdHJpbmc+KGtleTogSUxvY2FsZXNLZXkgfCBULCBhcmdzPzogSVN0cmluZ0tleU1hcDxzdHJpbmc+KTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5pMThuLnRyYW5zbGF0ZShrZXksIGFyZ3MpIHx8IGtleVxuICB9XG5cbiAgc2V0TGFuZ3VhZ2UobGFuZ3VhZ2U6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuaTE4bi5zZXRMYW5ndWFnZShsYW5ndWFnZSlcbiAgICB0aGlzLmN0eC5zYXZlQ29uZmlnKHtcbiAgICAgIFwic2V0dGluZ3MubGFuZ3VhZ2VcIjogbGFuZ3VhZ2UsXG4gICAgfSlcbiAgfVxuXG4gIGFkZExvY2FsZShsYW5ndWFnZTogc3RyaW5nLCBsb2NhbGVzOiBJTG9jYWxlKTogYm9vbGVhbiB7XG4gICAgY29uc3Qgb3JpZ2luTG9jYWxlcyA9IHRoaXMub2JqZWN0QWRhcHRlci5nZXRMb2NhbGUobGFuZ3VhZ2UpXG4gICAgaWYgKCFvcmlnaW5Mb2NhbGVzKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gICAgY29uc3QgbmV3TG9jYWxlcyA9IG1lcmdlKG9yaWdpbkxvY2FsZXMsIGxvY2FsZXMpXG4gICAgdGhpcy5vYmplY3RBZGFwdGVyLnNldExvY2FsZShsYW5ndWFnZSwgbmV3TG9jYWxlcylcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgYWRkTGFuZ3VhZ2UobGFuZ3VhZ2U6IHN0cmluZywgbG9jYWxlczogSUxvY2FsZSk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IG9yaWdpbkxvY2FsZXMgPSB0aGlzLm9iamVjdEFkYXB0ZXIuZ2V0TG9jYWxlKGxhbmd1YWdlKVxuICAgIGlmIChvcmlnaW5Mb2NhbGVzKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gICAgdGhpcy5vYmplY3RBZGFwdGVyLnNldExvY2FsZShsYW5ndWFnZSwgbG9jYWxlcylcbiAgICBsYW5ndWFnZUxpc3RbbGFuZ3VhZ2VdID0gbG9jYWxlc1xuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICBnZXRMYW5ndWFnZUxpc3QoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBPYmplY3Qua2V5cyhsYW5ndWFnZUxpc3QpXG4gIH1cbn1cblxuZXhwb3J0IHsgSTE4bk1hbmFnZXIgfVxuIiwiLyogZXNsaW50LWRpc2FibGUgbm8tdGVtcGxhdGUtY3VybHktaW4tc3RyaW5nICovXG5leHBvcnQgY29uc3QgWkhfQ04gPSB7XG4gIFVQTE9BRF9GQUlMRUQ6IFwi5LiK5Lyg5aSx6LSlXCIsXG4gIENIRUNLX1NFVFRJTkdTOiBcIuivt+ajgOafpeS9oOeahOmFjee9rumhueaYr+WQpuato+ehrlwiLFxuICBDSEVDS19TRVRUSU5HU19BTkRfTkVUV09SSzogXCLor7fmo4Dmn6XkvaDnmoTphY3nva7pobnku6Xlj4rnvZHnu5xcIixcbiAgVVBMT0FEX0ZBSUxFRF9SRUFTT046IFwi6ZSZ6K+v56CB77yaJHtjb2Rlfe+8jOivt+aJk+W8gOa1j+iniOWZqOeymOi0tOWcsOWdgOafpeeci+ebuOWFs+WOn+WboFwiLFxuICBTRVJWRVJfRVJST1I6IFwi5pyN5Yqh56uv5Ye66ZSZ77yM6K+36YeN6K+VXCIsXG4gIEFVVEhfRkFJTEVEOiBcIuiupOivgeWksei0pVwiLFxuXG4gIC8vIHNtbXNcbiAgUElDQkVEX1NNTVM6IFwiU00uTVNcIixcbiAgUElDQkVEX1NNTVNfVE9LRU46IFwi6K6+5a6aVG9rZW5cIixcbiAgUElDQkVEX1NNTVNfQkFDS1VQX0RPTUFJTjogXCLlpIfnlKjkuIrkvKDln5/lkI1cIixcbiAgUElDQkVEX1NNTVNfTUVTU0FHRV9CQUNLVVBfRE9NQUlOOiBcIuS+i+WmgiBzbW1zLmFwcFwiLFxuXG4gIC8vIEFsaS1jbG91ZFxuICBQSUNCRURfQUxJQ0xPVUQ6IFwi6Zi/6YeM5LqRT1NTXCIsXG4gIFBJQ0JFRF9BTElDTE9VRF9BQ0NFU1NLRVlJRDogXCLorr7lrppLZXlJZFwiLFxuICBQSUNCRURfQUxJQ0xPVURfQUNDRVNTS0VZU0VDUkVUOiBcIuiuvuWumktleVNlY3JldFwiLFxuICBQSUNCRURfQUxJQ0xPVURfQlVDS0VUOiBcIuiuvuWumkJ1Y2tldFwiLFxuICBQSUNCRURfQUxJQ0xPVURfQVJFQTogXCLorr7lrprlrZjlgqjljLrln59cIixcbiAgUElDQkVEX0FMSUNMT1VEX1BBVEg6IFwi6K6+5a6a5a2Y5YKo6Lev5b6EXCIsXG4gIFBJQ0JFRF9BTElDTE9VRF9DVVNUT01VUkw6IFwi6K6+5a6a6Ieq5a6a5LmJ5Z+f5ZCNXCIsXG4gIFBJQ0JFRF9BTElDTE9VRF9PUFRJT05TOiBcIuiuvuWumue9keWdgOWQjue8gFwiLFxuICBQSUNCRURfQUxJQ0xPVURfTUVTU0FHRV9BUkVBOiBcIuS+i+Wmgu+8mm9zcy1jbi1iZWlqaW5nXCIsXG4gIFBJQ0JFRF9BTElDTE9VRF9NRVNTQUdFX1BBVEg6IFwi5L6L5aaC77yadGVzdC9cIixcbiAgUElDQkVEX0FMSUNMT1VEX01FU1NBR0VfT1BUSU9OUzogXCLkvovlpoLvvJo/eC1vc3MtcHJvY2Vzcz14eHhcIixcbiAgUElDQkVEX0FMSUNMT1VEX01FU1NBR0VfQ1VTVE9NVVJMOiBcIuS+i+Wmgu+8mmh0dHBzOi8vdGVzdC5jb21cIixcblxuICAvLyBUZW5jZW50LWNsb3VkXG4gIFBJQ0JFRF9URU5DRU5UQ0xPVUQ6IFwi6IW+6K6v5LqRQ09TXCIsXG4gIFBJQ0JFRF9URU5DRU5UQ0xPVURfVkVSU0lPTjogXCJDT1PniYjmnKxcIixcbiAgUElDQkVEX1RFTkNFTlRDTE9VRF9TRUNSRVRJRDogXCLorr7lrppTZWNyZXRJZFwiLFxuICBQSUNCRURfVEVOQ0VOVENMT1VEX1NFQ1JFVEtFWTogXCLorr7lrppTZWNyZXRLZXlcIixcbiAgUElDQkVEX1RFTkNFTlRDTE9VRF9BUFBJRDogXCLorr7lrppBcHBJZFwiLFxuICBQSUNCRURfVEVOQ0VOVENMT1VEX0JVQ0tFVDogXCLorr7lrppCdWNrZXRcIixcbiAgUElDQkVEX1RFTkNFTlRDTE9VRF9BUkVBOiBcIuiuvuWumuWtmOWCqOWMuuWfn1wiLFxuICBQSUNCRURfVEVOQ0VOVENMT1VEX1BBVEg6IFwi6K6+5a6a5a2Y5YKo6Lev5b6EXCIsXG4gIFBJQ0JFRF9URU5DRU5UQ0xPVURfT1BUSU9OUzogXCLorr7lrprnvZHlnYDlkI7nvIBcIixcbiAgUElDQkVEX1RFTkNFTlRDTE9VRF9DVVNUT01VUkw6IFwi6K6+5a6a6Ieq5a6a5LmJ5Z+f5ZCNXCIsXG4gIFBJQ0JFRF9URU5DRU5UQ0xPVURfTUVTU0FHRV9BUFBJRDogXCLkvovlpoLvvJoxMjM0NTY3ODkwXCIsXG4gIFBJQ0JFRF9URU5DRU5UQ0xPVURfTUVTU0FHRV9BUkVBOiBcIuS+i+Wmgu+8mmFwLWJlaWppbmdcIixcbiAgUElDQkVEX1RFTkNFTlRDTE9VRF9NRVNTQUdFX1BBVEg6IFwi5L6L5aaC77yadGVzdC9cIixcbiAgUElDQkVEX1RFTkNFTlRDTE9VRF9NRVNTQUdFX0NVU1RPTVVSTDogXCLkvovlpoLvvJpodHRwczovL3Rlc3QuY29tXCIsXG4gIFBJQ0JFRF9URU5DRU5UQ0xPVURfTUVTU0FHRV9PUFRJT05TOiBcIuS+i+Wmgu+8mj9pbWFnZU1vZ3IyXCIsXG5cbiAgLy8gR2l0SHViXG4gIFBJQ0JFRF9HSVRIVUI6IFwiR2l0SHViXCIsXG4gIFBJQ0JFRF9HSVRIVUJfVE9LRU46IFwi6K6+5a6aVG9rZW5cIixcbiAgUElDQkVEX0dJVEhVQl9SRVBPOiBcIuiuvuWumuS7k+W6k+WQjVwiLFxuICBQSUNCRURfR0lUSFVCX1BBVEg6IFwi6K6+5a6a5a2Y5YKo6Lev5b6EXCIsXG4gIFBJQ0JFRF9HSVRIVUJfQlJBTkNIOiBcIuiuvuWumuWIhuaUr+WQjVwiLFxuICBQSUNCRURfR0lUSFVCX0NVU1RPTVVSTDogXCLorr7lrproh6rlrprkuYnln5/lkI1cIixcbiAgUElDQkVEX0dJVEhVQl9NRVNTQUdFX1JFUE86IFwi5qC85byP77yadXNlcm5hbWUvcmVwb1wiLFxuICBQSUNCRURfR0lUSFVCX01FU1NBR0VfQlJBTkNIOiBcIuS+i+Wmgu+8mm1haW5cIixcbiAgUElDQkVEX0dJVEhVQl9NRVNTQUdFX1BBVEg6IFwi5L6L5aaC77yadGVzdC9cIixcbiAgUElDQkVEX0dJVEhVQl9NRVNTQUdFX0NVU1RPTVVSTDogXCLkvovlpoLvvJpodHRwczovL3Rlc3QuY29tXCIsXG5cbiAgLy8gcWluaXVcbiAgUElDQkVEX1FJTklVOiBcIuS4g+eJm+S6kVwiLFxuICBQSUNCRURfUUlOSVVfQUNDRVNTS0VZOiBcIuiuvuWumkFjY2Vzc0tleVwiLFxuICBQSUNCRURfUUlOSVVfU0VDUkVUS0VZOiBcIuiuvuWumlNlY3JldEtleVwiLFxuICBQSUNCRURfUUlOSVVfQlVDS0VUOiBcIuiuvuWumkJ1Y2tldFwiLFxuICBQSUNCRURfUUlOSVVfUEFUSDogXCLorr7lrprlrZjlgqjot6/lvoRcIixcbiAgUElDQkVEX1FJTklVX1VSTDogXCLorr7lrprorr/pl67nvZHlnYBcIixcbiAgUElDQkVEX1FJTklVX09QVElPTlM6IFwi6K6+5a6a572R5Z2A5ZCO57yAXCIsXG4gIFBJQ0JFRF9RSU5JVV9BUkVBOiBcIuiuvuWumuWtmOWCqOWMuuWfn1wiLFxuICBQSUNCRURfUUlOSVVfTUVTU0FHRV9QQVRIOiBcIuS+i+Wmgu+8mnRlc3QvXCIsXG4gIFBJQ0JFRF9RSU5JVV9NRVNTQUdFX0FSRUE6IFwi5L6L5aaC77yaejBcIixcbiAgUElDQkVEX1FJTklVX01FU1NBR0VfT1BUSU9OUzogXCLkvovlpoLvvJo/aW1hZ2VzbGltXCIsXG4gIFBJQ0JFRF9RSU5JVV9NRVNTQUdFX1VSTDogXCLkvovlpoLvvJpodHRwczovL3h4eC55eXkuZ2xiLmNsb3VkZG4uY29tXCIsXG5cbiAgLy8gaW1ndXJcbiAgUElDQkVEX0lNR1VSOiBcIkltZ3VyXCIsXG4gIFBJQ0JFRF9JTUdVUl9DTElFTlRJRDogXCLorr7lrppDbGllbnRJZFwiLFxuICBQSUNCRURfSU1HVVJfUFJPWFk6IFwi6K6+5a6a5Luj55CGXCIsXG4gIFBJQ0JFRF9JTUdVUl9NRVNTQUdFX1BST1hZOiBcIuS+i+Wmgu+8mmh0dHA6Ly8xMjcuMC4wLjE6MTA4MFwiLFxuXG4gIC8vIHVweXVuXG4gIFBJQ0JFRF9VUFlVTjogXCLlj4jmi43kupFcIixcbiAgUElDQkVEX1VQWVVOX0JVQ0tFVDogXCLorr7lrppCdWNrZXRcIixcbiAgUElDQkVEX1VQWVVOX09QRVJBVE9SOiBcIuiuvuWumuaTjeS9nOWRmFwiLFxuICBQSUNCRURfVVBZVU5fUEFTU1dPUkQ6IFwi6K6+5a6a5pON5L2c5ZGY5a+G56CBXCIsXG4gIFBJQ0JFRF9VUFlVTl9QQVRIOiBcIuiuvuWumuWtmOWCqOi3r+W+hFwiLFxuICBQSUNCRURfVVBZVU5fVVJMOiBcIuiuvuWumuWKoOmAn+Wfn+WQjVwiLFxuICBQSUNCRURfVVBZVU5fT1BUSU9OUzogXCLorr7lrprnvZHlnYDlkI7nvIBcIixcbiAgUElDQkVEX1VQWVVOX01FU1NBR0VfT1BFUkFUT1I6IFwi5L6L5aaC77yabWVcIixcbiAgUElDQkVEX1VQWVVOX01FU1NBR0VfUEFTU1dPUkQ6IFwi6L6T5YWl5pON5L2c5ZGY5a+G56CBXCIsXG4gIFBJQ0JFRF9VUFlVTl9NRVNTQUdFX1VSTDogXCLkvovlpoLvvJpodHRwOi8veHh4LnRlc3QudXBjZG4ubmV0XCIsXG4gIFBJQ0JFRF9VUFlVTl9NRVNTQUdFX09QVElPTlM6IFwi5L6L5aaC77yaIWltZ3NsaW1cIixcbiAgUElDQkVEX1VQWVVOX01FU1NBR0VfUEFUSDogXCLkvovlpoLvvJp0ZXN0L1wiLFxuXG4gIC8vIFBsdWdpbiBIYW5kbGVyXG4gIFBMVUdJTl9IQU5ETEVSX1BMVUdJTl9JTlNUQUxMX1NVQ0NFU1M6IFwi5o+S5Lu25a6J6KOF5oiQ5YqfXCIsXG4gIFBMVUdJTl9IQU5ETEVSX1BMVUdJTl9JTlNUQUxMX0ZBSUxFRDogXCLmj5Lku7blronoo4XlpLHotKVcIixcbiAgUExVR0lOX0hBTkRMRVJfUExVR0lOX0lOU1RBTExfRkFJTEVEX1JFQVNPTjogXCLmj5Lku7blronoo4XlpLHotKXvvIzlpLHotKXnoIHkuLoke2NvZGV977yM6ZSZ6K+v5pel5b+X5Li6IFxcbiAke2RhdGF9XCIsXG4gIFBMVUdJTl9IQU5ETEVSX1BMVUdJTl9JTlNUQUxMX0ZBSUxFRF9QQVRIOiBcIuaPkuS7tuWuieijheWksei0pe+8jOivt+i+k+WFpeWQiOazleaPkuS7tuWQjeaIluWQiOazleWuieijhei3r+W+hFwiLFxuICBQTFVHSU5fSEFORExFUl9QTFVHSU5fVU5JTlNUQUxMX1NVQ0NFU1M6IFwi5o+S5Lu25Y246L295oiQ5YqfXCIsXG4gIFBMVUdJTl9IQU5ETEVSX1BMVUdJTl9VTklOU1RBTExfRkFJTEVEOiBcIuaPkuS7tuWNuOi9veWksei0pVwiLFxuICBQTFVHSU5fSEFORExFUl9QTFVHSU5fVU5JTlNUQUxMX0ZBSUxFRF9SRUFTT046IFwi5o+S5Lu25Y246L295aSx6LSl77yM5aSx6LSl56CB5Li6JHtjb2Rlfe+8jOmUmeivr+aXpeW/l+S4uiBcXG4gJHtkYXRhfVwiLFxuICBQTFVHSU5fSEFORExFUl9QTFVHSU5fVU5JTlNUQUxMX0ZBSUxFRF9WQUxJRDogXCLmj5Lku7bljbjovb3lpLHotKXvvIzor7fovpPlhaXlkIjms5Xmj5Lku7blkI1cIixcbiAgUExVR0lOX0hBTkRMRVJfUExVR0lOX1VQREFURV9TVUNDRVNTOiBcIuaPkuS7tuabtOaWsOaIkOWKn1wiLFxuICBQTFVHSU5fSEFORExFUl9QTFVHSU5fVVBEQVRFX0ZBSUxFRDogXCLmj5Lku7bmm7TmlrDlpLHotKVcIixcbiAgUExVR0lOX0hBTkRMRVJfUExVR0lOX1VQREFURV9GQUlMRURfUkVBU09OOiBcIuaPkuS7tuabtOaWsOWksei0pe+8jOWksei0peeggeS4uiR7Y29kZX3vvIzplJnor6/ml6Xlv5fkuLogXFxuICR7ZGF0YX1cIixcbiAgUExVR0lOX0hBTkRMRVJfUExVR0lOX1VQREFURV9GQUlMRURfVkFMSUQ6IFwi5o+S5Lu25pu05paw5aSx6LSl77yM6K+36L6T5YWl5ZCI5rOV5o+S5Lu25ZCNXCIsXG59XG5cbmV4cG9ydCB0eXBlIElMb2NhbGVzS2V5ID0ga2V5b2YgdHlwZW9mIFpIX0NOXG5leHBvcnQgdHlwZSBJTG9jYWxlcyA9IHR5cGVvZiBaSF9DTlxuIiwiaW1wb3J0IHsgSUxvY2FsZXMgfSBmcm9tIFwiLi96aC1DTlwiXG5cbi8qIGVzbGludC1kaXNhYmxlIG5vLXRlbXBsYXRlLWN1cmx5LWluLXN0cmluZyAqL1xuZXhwb3J0IGNvbnN0IFpIX1RXOiBJTG9jYWxlcyA9IHtcbiAgVVBMT0FEX0ZBSUxFRDogXCLkuIrlgrPlpLHmlZdcIixcbiAgQ0hFQ0tfU0VUVElOR1M6IFwi6KuL5qqi5p+l5L2g55qE6Kit5a6a5piv5ZCm5q2j56K6XCIsXG4gIENIRUNLX1NFVFRJTkdTX0FORF9ORVRXT1JLOiBcIuiri+aqouafpeS9oOeahOioreWumuWPiue2sui3r1wiLFxuICBVUExPQURfRkFJTEVEX1JFQVNPTjogXCLpjK/oqqTnorzvvJoke2NvZGV977yM6KuL5omT6ZaL54CP6Ka95Zmo6LK85LiK5Zyw5Z2A5p+l55yL55u46Zec5Y6f5ZugXCIsXG4gIFNFUlZFUl9FUlJPUjogXCLkvLrmnI3lmajlh7rpjK/vvIzoq4vph43oqaZcIixcbiAgQVVUSF9GQUlMRUQ6IFwi6KqN6K2J5aSx5pWXXCIsXG5cbiAgLy8gc21tc1xuICBQSUNCRURfU01NUzogXCJTTS5NU1wiLFxuICBQSUNCRURfU01NU19UT0tFTjogXCLoqK3lrppUb2tlblwiLFxuICBQSUNCRURfU01NU19CQUNLVVBfRE9NQUlOOiBcIuWCmeeUqOS4iuWCs+e2suWdgFwiLFxuICBQSUNCRURfU01NU19NRVNTQUdFX0JBQ0tVUF9ET01BSU46IFwi5L6L5aaCIHNtbXMuYXBwXCIsXG5cbiAgLy8gQWxpLWNsb3VkXG4gIFBJQ0JFRF9BTElDTE9VRDogXCLpmL/ph4zkupFPU1NcIixcbiAgUElDQkVEX0FMSUNMT1VEX0FDQ0VTU0tFWUlEOiBcIuioreWumktleUlkXCIsXG4gIFBJQ0JFRF9BTElDTE9VRF9BQ0NFU1NLRVlTRUNSRVQ6IFwi6Kit5a6aS2V5U2VjcmV0XCIsXG4gIFBJQ0JFRF9BTElDTE9VRF9CVUNLRVQ6IFwi6Kit5a6aQnVja2V0XCIsXG4gIFBJQ0JFRF9BTElDTE9VRF9BUkVBOiBcIuioreWumuWEsuWtmOWNgOWfn1wiLFxuICBQSUNCRURfQUxJQ0xPVURfUEFUSDogXCLoqK3lrprlhLLlrZjot6/lvpFcIixcbiAgUElDQkVEX0FMSUNMT1VEX0NVU1RPTVVSTDogXCLoqK3lrproh6roqILntrLlnYBcIixcbiAgUElDQkVEX0FMSUNMT1VEX09QVElPTlM6IFwi6Kit5a6a57ay5Z2A5b6M57a0XCIsXG4gIFBJQ0JFRF9BTElDTE9VRF9NRVNTQUdFX0FSRUE6IFwi5L6L5aaC77yab3NzLWNuLWJlaWppbmdcIixcbiAgUElDQkVEX0FMSUNMT1VEX01FU1NBR0VfUEFUSDogXCLkvovlpoLvvJp0ZXN0L1wiLFxuICBQSUNCRURfQUxJQ0xPVURfTUVTU0FHRV9PUFRJT05TOiBcIuS+i+Wmgu+8mj94LW9zcy1wcm9jZXNzPXh4eFwiLFxuICBQSUNCRURfQUxJQ0xPVURfTUVTU0FHRV9DVVNUT01VUkw6IFwi5L6L5aaC77yaaHR0cHM6Ly90ZXN0LmNvbVwiLFxuXG4gIC8vIFRlbmNlbnQtY2xvdWRcbiAgUElDQkVEX1RFTkNFTlRDTE9VRDogXCLpqLDoqIrkupFDT1NcIixcbiAgUElDQkVEX1RFTkNFTlRDTE9VRF9WRVJTSU9OOiBcIkNPU+eJiOacrFwiLFxuICBQSUNCRURfVEVOQ0VOVENMT1VEX1NFQ1JFVElEOiBcIuioreWumlNlY3JldElkXCIsXG4gIFBJQ0JFRF9URU5DRU5UQ0xPVURfU0VDUkVUS0VZOiBcIuioreWumlNlY3JldEtleVwiLFxuICBQSUNCRURfVEVOQ0VOVENMT1VEX0FQUElEOiBcIuioreWumkFwcElkXCIsXG4gIFBJQ0JFRF9URU5DRU5UQ0xPVURfQlVDS0VUOiBcIuioreWumkJ1Y2tldFwiLFxuICBQSUNCRURfVEVOQ0VOVENMT1VEX0FSRUE6IFwi6Kit5a6a5YSy5a2Y5Y2A5Z+fXCIsXG4gIFBJQ0JFRF9URU5DRU5UQ0xPVURfUEFUSDogXCLoqK3lrprlhLLlrZjot6/lvpFcIixcbiAgUElDQkVEX1RFTkNFTlRDTE9VRF9PUFRJT05TOiBcIuioreWumue2suWdgOW+jOe2tFwiLFxuICBQSUNCRURfVEVOQ0VOVENMT1VEX0NVU1RPTVVSTDogXCLoqK3lrproh6roqILntrLlnYBcIixcbiAgUElDQkVEX1RFTkNFTlRDTE9VRF9NRVNTQUdFX0FQUElEOiBcIuS+i+Wmgu+8mjEyMzQ1Njc4OTBcIixcbiAgUElDQkVEX1RFTkNFTlRDTE9VRF9NRVNTQUdFX0FSRUE6IFwi5L6L5aaC77yaYXAtYmVpamluZ1wiLFxuICBQSUNCRURfVEVOQ0VOVENMT1VEX01FU1NBR0VfUEFUSDogXCLkvovlpoLvvJp0ZXN0L1wiLFxuICBQSUNCRURfVEVOQ0VOVENMT1VEX01FU1NBR0VfQ1VTVE9NVVJMOiBcIuS+i+Wmgu+8mmh0dHBzOi8vdGVzdC5jb21cIixcbiAgUElDQkVEX1RFTkNFTlRDTE9VRF9NRVNTQUdFX09QVElPTlM6IFwi5L6L5aaC77yaP2ltYWdlTW9ncjJcIixcblxuICAvLyBHaXRIdWJcbiAgUElDQkVEX0dJVEhVQjogXCJHaXRIdWJcIixcbiAgUElDQkVEX0dJVEhVQl9UT0tFTjogXCLoqK3lrppUb2tlblwiLFxuICBQSUNCRURfR0lUSFVCX1JFUE86IFwi6Kit5a6a5YCJ5bqr5ZCN56ixXCIsXG4gIFBJQ0JFRF9HSVRIVUJfUEFUSDogXCLoqK3lrprlhLLlrZjot6/lvpFcIixcbiAgUElDQkVEX0dJVEhVQl9CUkFOQ0g6IFwi6Kit5a6a5YiG5pSv5ZCN56ixXCIsXG4gIFBJQ0JFRF9HSVRIVUJfQ1VTVE9NVVJMOiBcIuioreWumuiHquiogue2suWdgFwiLFxuICBQSUNCRURfR0lUSFVCX01FU1NBR0VfUkVQTzogXCLmoLzlvI/vvJp1c2VybmFtZS9yZXBvXCIsXG4gIFBJQ0JFRF9HSVRIVUJfTUVTU0FHRV9CUkFOQ0g6IFwi5L6L5aaC77yabWFpblwiLFxuICBQSUNCRURfR0lUSFVCX01FU1NBR0VfUEFUSDogXCLkvovlpoLvvJp0ZXN0L1wiLFxuICBQSUNCRURfR0lUSFVCX01FU1NBR0VfQ1VTVE9NVVJMOiBcIuS+i+Wmgu+8mmh0dHBzOi8vdGVzdC5jb21cIixcblxuICAvLyBxaW5pdVxuICBQSUNCRURfUUlOSVU6IFwi5LiD54mb5LqRXCIsXG4gIFBJQ0JFRF9RSU5JVV9BQ0NFU1NLRVk6IFwi6Kit5a6aQWNjZXNzS2V5XCIsXG4gIFBJQ0JFRF9RSU5JVV9TRUNSRVRLRVk6IFwi6Kit5a6aU2VjcmV0S2V5XCIsXG4gIFBJQ0JFRF9RSU5JVV9CVUNLRVQ6IFwi6Kit5a6aQnVja2V0XCIsXG4gIFBJQ0JFRF9RSU5JVV9QQVRIOiBcIuioreWumuWEsuWtmOi3r+W+kVwiLFxuICBQSUNCRURfUUlOSVVfVVJMOiBcIuioreWumuioquWVj+e2suWdgFwiLFxuICBQSUNCRURfUUlOSVVfT1BUSU9OUzogXCLoqK3lrprntrLlnYDlvozntrRcIixcbiAgUElDQkVEX1FJTklVX0FSRUE6IFwi6Kit5a6a5YSy5a2Y5Y2A5Z+fXCIsXG4gIFBJQ0JFRF9RSU5JVV9NRVNTQUdFX1BBVEg6IFwi5L6L5aaC77yadGVzdC9cIixcbiAgUElDQkVEX1FJTklVX01FU1NBR0VfQVJFQTogXCLkvovlpoLvvJp6MFwiLFxuICBQSUNCRURfUUlOSVVfTUVTU0FHRV9PUFRJT05TOiBcIuS+i+Wmgu+8mj9pbWFnZXNsaW1cIixcbiAgUElDQkVEX1FJTklVX01FU1NBR0VfVVJMOiBcIuS+i+Wmgu+8mmh0dHBzOi8veHh4Lnl5eS5nbGIuY2xvdWRkbi5jb21cIixcblxuICAvLyBpbWd1clxuICBQSUNCRURfSU1HVVI6IFwiSW1ndXJcIixcbiAgUElDQkVEX0lNR1VSX0NMSUVOVElEOiBcIuioreWumkNsaWVudElkXCIsXG4gIFBJQ0JFRF9JTUdVUl9QUk9YWTogXCLoqK3lrppQUk9YWVwiLFxuICBQSUNCRURfSU1HVVJfTUVTU0FHRV9QUk9YWTogXCLkvovlpoLvvJpodHRwOi8vMTI3LjAuMC4xOjEwODBcIixcblxuICAvLyB1cHl1blxuICBQSUNCRURfVVBZVU46IFwi5Y+I5ouN5LqRXCIsXG4gIFBJQ0JFRF9VUFlVTl9CVUNLRVQ6IFwi6Kit5a6aQnVja2V0XCIsXG4gIFBJQ0JFRF9VUFlVTl9PUEVSQVRPUjogXCLoqK3lrprmk43kvZzlk6FcIixcbiAgUElDQkVEX1VQWVVOX1BBU1NXT1JEOiBcIuioreWumuaTjeS9nOWToeWvhueivFwiLFxuICBQSUNCRURfVVBZVU5fUEFUSDogXCLoqK3lrprlhLLlrZjot6/lvpFcIixcbiAgUElDQkVEX1VQWVVOX1VSTDogXCLoqK3lrprliqDpgJ/ntrLlnYBcIixcbiAgUElDQkVEX1VQWVVOX09QVElPTlM6IFwi6Kit5a6a57ay5Z2A5b6M57a0XCIsXG4gIFBJQ0JFRF9VUFlVTl9NRVNTQUdFX09QRVJBVE9SOiBcIuS+i+Wmgu+8mm1lXCIsXG4gIFBJQ0JFRF9VUFlVTl9NRVNTQUdFX1BBU1NXT1JEOiBcIui8uOWFpeaTjeS9nOWToeWvhueivFwiLFxuICBQSUNCRURfVVBZVU5fTUVTU0FHRV9VUkw6IFwi5L6L5aaC77yaaHR0cDovL3h4eC50ZXN0LnVwY2RuLm5ldFwiLFxuICBQSUNCRURfVVBZVU5fTUVTU0FHRV9PUFRJT05TOiBcIuS+i+Wmgu+8miFpbWdzbGltXCIsXG4gIFBJQ0JFRF9VUFlVTl9NRVNTQUdFX1BBVEg6IFwi5L6L5aaC77yadGVzdC9cIixcblxuICAvLyBQbHVnaW4gSGFuZGxlclxuICBQTFVHSU5fSEFORExFUl9QTFVHSU5fSU5TVEFMTF9TVUNDRVNTOiBcIuaPkuS7tuWuieijneaIkOWKn1wiLFxuICBQTFVHSU5fSEFORExFUl9QTFVHSU5fSU5TVEFMTF9GQUlMRUQ6IFwi5o+S5Lu25a6J6KOd5aSx5pWXXCIsXG4gIFBMVUdJTl9IQU5ETEVSX1BMVUdJTl9JTlNUQUxMX0ZBSUxFRF9SRUFTT046IFwi5o+S5Lu25a6J6KOd5aSx5pWX77yM5aSx5pWX56K854K6JHtjb2Rlfe+8jOmMr+iqpOe0gOmMhOeCuiBcXG4gJHtkYXRhfVwiLFxuICBQTFVHSU5fSEFORExFUl9QTFVHSU5fSU5TVEFMTF9GQUlMRURfUEFUSDogXCLmj5Lku7blronoo53lpLHmlZfvvIzoq4vovLjlhaXmraPnorrnmoTmj5Lku7blkI3nqLHmiJbmraPnorrnmoTlronoo53ot6/lvpFcIixcbiAgUExVR0lOX0hBTkRMRVJfUExVR0lOX1VOSU5TVEFMTF9TVUNDRVNTOiBcIuaPkuS7tuWNuOi8ieaIkOWKn1wiLFxuICBQTFVHSU5fSEFORExFUl9QTFVHSU5fVU5JTlNUQUxMX0ZBSUxFRDogXCLmj5Lku7bljbjovInlpLHmlZdcIixcbiAgUExVR0lOX0hBTkRMRVJfUExVR0lOX1VOSU5TVEFMTF9GQUlMRURfUkVBU09OOiBcIuaPkuS7tuWNuOi8ieWkseaVl++8jOWkseaVl+eivOeCuiR7Y29kZX3vvIzpjK/oqqTntIDpjITngrogXFxuICR7ZGF0YX1cIixcbiAgUExVR0lOX0hBTkRMRVJfUExVR0lOX1VOSU5TVEFMTF9GQUlMRURfVkFMSUQ6IFwi5o+S5Lu25Y246LyJ5aSx5pWX77yM6KuL6Ly45YWl5q2j56K655qE5o+S5Lu25ZCN56ixXCIsXG4gIFBMVUdJTl9IQU5ETEVSX1BMVUdJTl9VUERBVEVfU1VDQ0VTUzogXCLmj5Lku7bmm7TmlrDmiJDlip9cIixcbiAgUExVR0lOX0hBTkRMRVJfUExVR0lOX1VQREFURV9GQUlMRUQ6IFwi5o+S5Lu25pu05paw5aSx5pWXXCIsXG4gIFBMVUdJTl9IQU5ETEVSX1BMVUdJTl9VUERBVEVfRkFJTEVEX1JFQVNPTjogXCLmj5Lku7bmm7TmlrDlpLHmlZfvvIzlpLHmlZfnorzngroke2NvZGV977yM6Yyv6Kqk57SA6YyE54K6IFxcbiAke2RhdGF9XCIsXG4gIFBMVUdJTl9IQU5ETEVSX1BMVUdJTl9VUERBVEVfRkFJTEVEX1ZBTElEOiBcIuaPkuS7tuabtOaWsOWkseaVl++8jOiri+i8uOWFpeato+eiuueahOaPkuS7tuWQjeeosVwiLFxufVxuIiwiaW1wb3J0IHsgSUxvY2FsZXMgfSBmcm9tIFwiLi96aC1DTlwiXG5cbi8qIGVzbGludC1kaXNhYmxlIG5vLXRlbXBsYXRlLWN1cmx5LWluLXN0cmluZyAqL1xuZXhwb3J0IGNvbnN0IEVOOiBJTG9jYWxlcyA9IHtcbiAgVVBMT0FEX0ZBSUxFRDogXCJVcGxvYWQgZmFpbGVkXCIsXG4gIENIRUNLX1NFVFRJTkdTOiBcIlBsZWFzZSBjaGVjayB5b3VyIHNldHRpbmdzXCIsXG4gIENIRUNLX1NFVFRJTkdTX0FORF9ORVRXT1JLOiBcIlBsZWFzZSBjaGVjayB5b3VyIHNldHRpbmdzIGFuZCBuZXR3b3JrXCIsXG4gIFVQTE9BRF9GQUlMRURfUkVBU09OOiBcIkVycm9yIGNvZGU6ICR7Y29kZX0sIHBsZWFzZSBvcGVuIHRoZSBicm93c2VyIGFuZCBwYXN0ZSB0aGUgYWRkcmVzcyB0byBzZWUgdGhlIHJlYXNvblwiLFxuICBTRVJWRVJfRVJST1I6IFwiU2VydmVyIGVycm9yLCBwbGVhc2UgdHJ5IGFnYWluIGxhdGVyXCIsXG4gIEFVVEhfRkFJTEVEOiBcIkF1dGhlbnRpY2F0aW9uIGZhaWxlZFwiLFxuXG4gIC8vIHNtbXNcbiAgUElDQkVEX1NNTVM6IFwiU00uTVNcIixcbiAgUElDQkVEX1NNTVNfVE9LRU46IFwiU2V0IFRva2VuXCIsXG4gIFBJQ0JFRF9TTU1TX0JBQ0tVUF9ET01BSU46IFwiU2V0IEJhY2t1cCBVcGxvYWQgRG9tYWluXCIsXG4gIFBJQ0JFRF9TTU1TX01FU1NBR0VfQkFDS1VQX0RPTUFJTjogXCJFeC4gc21tcy5hcHBcIixcblxuICAvLyBBbGktY2xvdWRcbiAgUElDQkVEX0FMSUNMT1VEOiBcIkFsaSBDbG91ZFwiLFxuICBQSUNCRURfQUxJQ0xPVURfQUNDRVNTS0VZSUQ6IFwiU2V0IEtleUlkXCIsXG4gIFBJQ0JFRF9BTElDTE9VRF9BQ0NFU1NLRVlTRUNSRVQ6IFwiU2V0IEtleVNlY3JldFwiLFxuICBQSUNCRURfQUxJQ0xPVURfQlVDS0VUOiBcIlNldCBCdWNrZXRcIixcbiAgUElDQkVEX0FMSUNMT1VEX0FSRUE6IFwiU2V0IEFyZWFcIixcbiAgUElDQkVEX0FMSUNMT1VEX1BBVEg6IFwiU2V0IFBhdGhcIixcbiAgUElDQkVEX0FMSUNMT1VEX0NVU1RPTVVSTDogXCJTZXQgQ3VzdG9tIFVSTFwiLFxuICBQSUNCRURfQUxJQ0xPVURfT1BUSU9OUzogXCJTZXQgVVJMIFN1ZmZpeFwiLFxuICBQSUNCRURfQUxJQ0xPVURfTUVTU0FHRV9BUkVBOiBcIkV4LiBvc3MtY24tYmVpamluZ1wiLFxuICBQSUNCRURfQUxJQ0xPVURfTUVTU0FHRV9QQVRIOiBcIkV4LiB0ZXN0L1wiLFxuICBQSUNCRURfQUxJQ0xPVURfTUVTU0FHRV9PUFRJT05TOiBcIkV4LiA/eC1vc3MtcHJvY2Vzcz14eHhcIixcbiAgUElDQkVEX0FMSUNMT1VEX01FU1NBR0VfQ1VTVE9NVVJMOiBcIkV4LiBodHRwczovL3Rlc3QuY29tXCIsXG5cbiAgLy8gVGVuY2VudC1jbG91ZFxuICBQSUNCRURfVEVOQ0VOVENMT1VEOiBcIlRlbmNlbnQgQ2xvdWRcIixcbiAgUElDQkVEX1RFTkNFTlRDTE9VRF9WRVJTSU9OOiBcIkNob29zZSBDT1MgdmVyc2lvblwiLFxuICBQSUNCRURfVEVOQ0VOVENMT1VEX1NFQ1JFVElEOiBcIlNldCBTZWNyZXRJZFwiLFxuICBQSUNCRURfVEVOQ0VOVENMT1VEX1NFQ1JFVEtFWTogXCJTZXQgU2VjcmV0S2V5XCIsXG4gIFBJQ0JFRF9URU5DRU5UQ0xPVURfQVBQSUQ6IFwiU2V0IEFwcElkXCIsXG4gIFBJQ0JFRF9URU5DRU5UQ0xPVURfQlVDS0VUOiBcIlNldCBCdWNrZXRcIixcbiAgUElDQkVEX1RFTkNFTlRDTE9VRF9BUkVBOiBcIlNldCBBcmVhXCIsXG4gIFBJQ0JFRF9URU5DRU5UQ0xPVURfUEFUSDogXCJTZXQgUGF0aFwiLFxuICBQSUNCRURfVEVOQ0VOVENMT1VEX09QVElPTlM6IFwiU2V0IFVSTCBTdWZmaXhcIixcbiAgUElDQkVEX1RFTkNFTlRDTE9VRF9DVVNUT01VUkw6IFwiU2V0IEN1c3RvbSBVUkxcIixcbiAgUElDQkVEX1RFTkNFTlRDTE9VRF9NRVNTQUdFX0FQUElEOiBcIkV4LiAxMjM0NTY3ODkwXCIsXG4gIFBJQ0JFRF9URU5DRU5UQ0xPVURfTUVTU0FHRV9BUkVBOiBcIkV4LiBhcC1iZWlqaW5nXCIsXG4gIFBJQ0JFRF9URU5DRU5UQ0xPVURfTUVTU0FHRV9QQVRIOiBcIkV4LiB0ZXN0L1wiLFxuICBQSUNCRURfVEVOQ0VOVENMT1VEX01FU1NBR0VfQ1VTVE9NVVJMOiBcIkV4LiBodHRwOi8vdGVzdC5jb21cIixcbiAgUElDQkVEX1RFTkNFTlRDTE9VRF9NRVNTQUdFX09QVElPTlM6IFwiRXguID9pbWFnZU1vZ3IyXCIsXG5cbiAgLy8gR2l0SHViXG4gIFBJQ0JFRF9HSVRIVUI6IFwiR2l0SHViXCIsXG4gIFBJQ0JFRF9HSVRIVUJfVE9LRU46IFwiU2V0IFRva2VuXCIsXG4gIFBJQ0JFRF9HSVRIVUJfUkVQTzogXCJTZXQgUmVwbyBOYW1lXCIsXG4gIFBJQ0JFRF9HSVRIVUJfUEFUSDogXCJTZXQgUGF0aFwiLFxuICBQSUNCRURfR0lUSFVCX0JSQU5DSDogXCJTZXQgQnJhbmNoXCIsXG4gIFBJQ0JFRF9HSVRIVUJfQ1VTVE9NVVJMOiBcIlNldCBDdXN0b20gVVJMXCIsXG4gIFBJQ0JFRF9HSVRIVUJfTUVTU0FHRV9SRVBPOiBcIkV4LiB1c2VybmFtZS9yZXBvXCIsXG4gIFBJQ0JFRF9HSVRIVUJfTUVTU0FHRV9CUkFOQ0g6IFwiRXguIG1haW5cIixcbiAgUElDQkVEX0dJVEhVQl9NRVNTQUdFX1BBVEg6IFwiRXguIHRlc3QvXCIsXG4gIFBJQ0JFRF9HSVRIVUJfTUVTU0FHRV9DVVNUT01VUkw6IFwiRXguIGh0dHBzOi8vdGVzdC5jb21cIixcblxuICAvLyBxaW5pdVxuICBQSUNCRURfUUlOSVU6IFwiUWluaXVcIixcbiAgUElDQkVEX1FJTklVX0FDQ0VTU0tFWTogXCJTZXQgQWNjZXNzS2V5XCIsXG4gIFBJQ0JFRF9RSU5JVV9TRUNSRVRLRVk6IFwiU2V0IFNlY3JldEtleVwiLFxuICBQSUNCRURfUUlOSVVfQlVDS0VUOiBcIlNldCBCdWNrZXRcIixcbiAgUElDQkVEX1FJTklVX1BBVEg6IFwiU2V0IFBhdGhcIixcbiAgUElDQkVEX1FJTklVX1VSTDogXCJTZXQgVVJMXCIsXG4gIFBJQ0JFRF9RSU5JVV9PUFRJT05TOiBcIlNldCBVUkwgU3VmZml4XCIsXG4gIFBJQ0JFRF9RSU5JVV9BUkVBOiBcIlNldCBBcmVhXCIsXG4gIFBJQ0JFRF9RSU5JVV9NRVNTQUdFX1BBVEg6IFwiRXguIHRlc3QvXCIsXG4gIFBJQ0JFRF9RSU5JVV9NRVNTQUdFX0FSRUE6IFwiRXguIHowXCIsXG4gIFBJQ0JFRF9RSU5JVV9NRVNTQUdFX09QVElPTlM6IFwiRXguID9pbWFnZXNsaW1cIixcbiAgUElDQkVEX1FJTklVX01FU1NBR0VfVVJMOiBcIkV4LiBodHRwczovL3h4eC55eXkuZ2xiLmNsb3VkZG4uY29tXCIsXG5cbiAgLy8gaW1ndXJcbiAgUElDQkVEX0lNR1VSOiBcIkltZ3VyXCIsXG4gIFBJQ0JFRF9JTUdVUl9DTElFTlRJRDogXCJTZXQgQ2xpZW50SWRcIixcbiAgUElDQkVEX0lNR1VSX1BST1hZOiBcIlNldCBQcm94eVwiLFxuICBQSUNCRURfSU1HVVJfTUVTU0FHRV9QUk9YWTogXCJFeC4gaHR0cDovLzEyNy4wLjAuMToxMDgwXCIsXG5cbiAgLy8gdXB5dW5cbiAgUElDQkVEX1VQWVVOOiBcIlVweXVuXCIsXG4gIFBJQ0JFRF9VUFlVTl9CVUNLRVQ6IFwiU2V0IEJ1Y2tldFwiLFxuICBQSUNCRURfVVBZVU5fT1BFUkFUT1I6IFwiU2V0IE9wZXJhdG9yXCIsXG4gIFBJQ0JFRF9VUFlVTl9QQVNTV09SRDogXCJTZXQgT3BlcmF0b3IgUGFzc3dvcmRcIixcbiAgUElDQkVEX1VQWVVOX1BBVEg6IFwiU2V0IFBhdGhcIixcbiAgUElDQkVEX1VQWVVOX1VSTDogXCJTZXQgVVJMXCIsXG4gIFBJQ0JFRF9VUFlVTl9PUFRJT05TOiBcIlNldCBVUkwgU3VmZml4XCIsXG4gIFBJQ0JFRF9VUFlVTl9NRVNTQUdFX09QRVJBVE9SOiBcIkV4LiBtZVwiLFxuICBQSUNCRURfVVBZVU5fTUVTU0FHRV9QQVNTV09SRDogXCJQbGVhc2UgdHlwZSB0aGUgb3BlcmF0b3IgcGFzc3dvcmRcIixcbiAgUElDQkVEX1VQWVVOX01FU1NBR0VfVVJMOiBcIkV4LiBodHRwOi8veHh4LnRlc3QudXBjZG4ubmV0XCIsXG4gIFBJQ0JFRF9VUFlVTl9NRVNTQUdFX09QVElPTlM6IFwiRXguICFpbWdzbGltXCIsXG4gIFBJQ0JFRF9VUFlVTl9NRVNTQUdFX1BBVEg6IFwiRXguIHRlc3QvXCIsXG5cbiAgLy8gUGx1Z2luIEhhbmRsZXJcbiAgUExVR0lOX0hBTkRMRVJfUExVR0lOX0lOU1RBTExfU1VDQ0VTUzogXCJQbHVnaW4gaW5zdGFsbGVkIHN1Y2Nlc3NmdWxseVwiLFxuICBQTFVHSU5fSEFORExFUl9QTFVHSU5fSU5TVEFMTF9GQUlMRUQ6IFwiUGx1Z2luIGluc3RhbGxhdGlvbiBmYWlsZWRcIixcbiAgUExVR0lOX0hBTkRMRVJfUExVR0lOX0lOU1RBTExfRkFJTEVEX1JFQVNPTjpcbiAgICBcIlBsdWdpbiBpbnN0YWxsYXRpb24gZmFpbGVkLCBlcnJvciBjb2RlIGlzICR7Y29kZX0sIGVycm9yIGxvZyBpcyBcXG4gJHtkYXRhfVwiLFxuICBQTFVHSU5fSEFORExFUl9QTFVHSU5fSU5TVEFMTF9GQUlMRURfUEFUSDpcbiAgICBcIlBsdWdpbiBpbnN0YWxsYXRpb24gZmFpbGVkLCBwbGVhc2UgZW50ZXIgYSB2YWxpZCBwbHVnaW4gbmFtZSBvciB2YWxpZCBpbnN0YWxsYXRpb24gcGF0aFwiLFxuICBQTFVHSU5fSEFORExFUl9QTFVHSU5fVU5JTlNUQUxMX1NVQ0NFU1M6IFwiUGx1Z2luIHVuaW5zdGFsbGVkIHN1Y2Nlc3NmdWxseVwiLFxuICBQTFVHSU5fSEFORExFUl9QTFVHSU5fVU5JTlNUQUxMX0ZBSUxFRDogXCJQbHVnaW4gdW5pbnN0YWxsIGZhaWxlZFwiLFxuICBQTFVHSU5fSEFORExFUl9QTFVHSU5fVU5JTlNUQUxMX0ZBSUxFRF9SRUFTT046XG4gICAgXCJQbHVnaW4gdW5pbnN0YWxsIGZhaWxlZCwgZXJyb3IgY29kZSBpcyAke2NvZGV9LCBlcnJvciBsb2cgaXMgXFxuICR7ZGF0YX1cIixcbiAgUExVR0lOX0hBTkRMRVJfUExVR0lOX1VOSU5TVEFMTF9GQUlMRURfVkFMSUQ6IFwiUGx1Z2luIHVuaW5zdGFsbCBmYWlsZWQsIHBsZWFzZSBlbnRlciBhIHZhbGlkIHBsdWdpbiBuYW1lXCIsXG4gIFBMVUdJTl9IQU5ETEVSX1BMVUdJTl9VUERBVEVfU1VDQ0VTUzogXCJQbHVnaW4gdXBkYXRlZCBzdWNjZXNzZnVsbHlcIixcbiAgUExVR0lOX0hBTkRMRVJfUExVR0lOX1VQREFURV9GQUlMRUQ6IFwiUGx1Z2luIHVwZGF0ZSBmYWlsZWRcIixcbiAgUExVR0lOX0hBTkRMRVJfUExVR0lOX1VQREFURV9GQUlMRURfUkVBU09OOiBcIlBsdWdpbiB1cGRhdGUgZmFpbGVkLCBlcnJvciBjb2RlIGlzICR7Y29kZX0sIGVycm9yIGxvZyBpcyBcXG4gJHtkYXRhfVwiLFxuICBQTFVHSU5fSEFORExFUl9QTFVHSU5fVVBEQVRFX0ZBSUxFRF9WQUxJRDogXCJQbHVnaW4gdXBkYXRlIGZhaWxlZCwgcGxlYXNlIGVudGVyIGEgdmFsaWQgcGx1Z2luIG5hbWVcIixcbn1cbiIsImltcG9ydCBmcyBmcm9tIFwiZnMtZXh0cmFcIlxuaW1wb3J0IHBhdGggZnJvbSBcInBhdGhcIlxuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSBcImV2ZW50c1wiXG5pbXBvcnQgeyBob21lZGlyIH0gZnJvbSBcIm9zXCJcbmltcG9ydCBDb21tYW5kZXIgZnJvbSBcIi4uL2xpYi9Db21tYW5kZXJcIlxuaW1wb3J0IHsgTG9nZ2VyIH0gZnJvbSBcIi4uL2xpYi9Mb2dnZXJcIlxuaW1wb3J0IExpZmVjeWNsZSBmcm9tIFwiLi9MaWZlY3ljbGVcIlxuaW1wb3J0IExpZmVjeWNsZVBsdWdpbnMsIHsgc2V0Q3VycmVudFBsdWdpbk5hbWUgfSBmcm9tIFwiLi4vbGliL0xpZmVjeWNsZVBsdWdpbnNcIlxuaW1wb3J0IHVwbG9hZGVycyBmcm9tIFwiLi4vcGx1Z2lucy91cGxvYWRlclwiXG5pbXBvcnQgdHJhbnNmb3JtZXJzIGZyb20gXCIuLi9wbHVnaW5zL3RyYW5zZm9ybWVyXCJcbmltcG9ydCBQbHVnaW5Mb2FkZXIgZnJvbSBcIi4uL2xpYi9QbHVnaW5Mb2FkZXJcIlxuaW1wb3J0IHsgZ2V0LCBzZXQsIHVuc2V0IH0gZnJvbSBcImxvZGFzaFwiXG5pbXBvcnQge1xuICBJSGVscGVyLFxuICBJSW1nSW5mbyxcbiAgSUNvbmZpZyxcbiAgSVBpY0dvLFxuICBJU3RyaW5nS2V5TWFwLFxuICBJUGx1Z2luTG9hZGVyLFxuICBJSTE4bk1hbmFnZXIsXG4gIElQaWNHb1BsdWdpbixcbiAgSVBpY0dvUGx1Z2luSW50ZXJmYWNlLFxuICBJUmVxdWVzdCxcbn0gZnJvbSBcIi4uL3R5cGVzXCJcbmltcG9ydCBnZXRDbGlwYm9hcmRJbWFnZSBmcm9tIFwiLi4vdXRpbHMvZ2V0Q2xpcGJvYXJkSW1hZ2VcIlxuaW1wb3J0IFJlcXVlc3QgZnJvbSBcIi4uL2xpYi9SZXF1ZXN0XCJcbmltcG9ydCBEQiBmcm9tIFwiLi4vdXRpbHMvZGJcIlxuaW1wb3J0IFBsdWdpbkhhbmRsZXIgZnJvbSBcIi4uL2xpYi9QbHVnaW5IYW5kbGVyXCJcbmltcG9ydCB7IElCdWlsZEluRXZlbnQsIElCdXNFdmVudCB9IGZyb20gXCIuLi91dGlscy9lbnVtXCJcbmltcG9ydCB7IGV2ZW50QnVzIH0gZnJvbSBcIi4uL3V0aWxzL2V2ZW50QnVzXCJcbmltcG9ydCB7IGlzQ29uZmlnS2V5SW5CbGFja0xpc3QsIGlzSW5wdXRDb25maWdWYWxpZCB9IGZyb20gXCIuLi91dGlscy9jb21tb25cIlxuaW1wb3J0IHsgSTE4bk1hbmFnZXIgfSBmcm9tIFwiLi4vaTE4blwiXG5cbmV4cG9ydCBjbGFzcyBQaWNHbyBleHRlbmRzIEV2ZW50RW1pdHRlciBpbXBsZW1lbnRzIElQaWNHbyB7XG4gIHByaXZhdGUgX2NvbmZpZyE6IElDb25maWdcbiAgcHJpdmF0ZSBsaWZlY3ljbGUhOiBMaWZlY3ljbGVcbiAgcHJpdmF0ZSBkYiE6IERCXG4gIHByaXZhdGUgX3BsdWdpbkxvYWRlciE6IFBsdWdpbkxvYWRlclxuICBjb25maWdQYXRoOiBzdHJpbmdcbiAgYmFzZURpciE6IHN0cmluZ1xuICBoZWxwZXIhOiBJSGVscGVyXG4gIGxvZzogTG9nZ2VyXG4gIGNtZDogQ29tbWFuZGVyXG4gIG91dHB1dDogSUltZ0luZm9bXVxuICBpbnB1dDogYW55W11cbiAgcGx1Z2luSGFuZGxlcjogUGx1Z2luSGFuZGxlclxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgd2lsbCBiZSByZW1vdmVkIGluIHYxLjUuMCtcbiAgICpcbiAgICogdXNlIHJlcXVlc3QgaW5zdGVhZFxuICAgKi9cbiAgUmVxdWVzdCE6IFJlcXVlc3RcbiAgaTE4biE6IElJMThuTWFuYWdlclxuICBWRVJTSU9OOiBzdHJpbmcgPSBwcm9jZXNzLmVudi5QSUNHT19WRVJTSU9OXG4gIEdVSV9WRVJTSU9OPzogc3RyaW5nXG5cbiAgZ2V0IHBsdWdpbkxvYWRlcigpOiBJUGx1Z2luTG9hZGVyIHtcbiAgICByZXR1cm4gdGhpcy5fcGx1Z2luTG9hZGVyXG4gIH1cblxuICBjb25zdHJ1Y3Rvcihjb25maWdQYXRoID0gXCJcIikge1xuICAgIHN1cGVyKClcbiAgICB0aGlzLmNvbmZpZ1BhdGggPSBjb25maWdQYXRoXG4gICAgdGhpcy5vdXRwdXQgPSBbXVxuICAgIHRoaXMuaW5wdXQgPSBbXVxuICAgIHRoaXMuaGVscGVyID0ge1xuICAgICAgdHJhbnNmb3JtZXI6IG5ldyBMaWZlY3ljbGVQbHVnaW5zKFwidHJhbnNmb3JtZXJcIiksXG4gICAgICB1cGxvYWRlcjogbmV3IExpZmVjeWNsZVBsdWdpbnMoXCJ1cGxvYWRlclwiKSxcbiAgICAgIGJlZm9yZVRyYW5zZm9ybVBsdWdpbnM6IG5ldyBMaWZlY3ljbGVQbHVnaW5zKFwiYmVmb3JlVHJhbnNmb3JtUGx1Z2luc1wiKSxcbiAgICAgIGJlZm9yZVVwbG9hZFBsdWdpbnM6IG5ldyBMaWZlY3ljbGVQbHVnaW5zKFwiYmVmb3JlVXBsb2FkUGx1Z2luc1wiKSxcbiAgICAgIGFmdGVyVXBsb2FkUGx1Z2luczogbmV3IExpZmVjeWNsZVBsdWdpbnMoXCJhZnRlclVwbG9hZFBsdWdpbnNcIiksXG4gICAgfVxuICAgIHRoaXMuaW5pdENvbmZpZ1BhdGgoKVxuICAgIHRoaXMubG9nID0gbmV3IExvZ2dlcih0aGlzKVxuICAgIHRoaXMuY21kID0gbmV3IENvbW1hbmRlcih0aGlzKVxuICAgIHRoaXMucGx1Z2luSGFuZGxlciA9IG5ldyBQbHVnaW5IYW5kbGVyKHRoaXMpXG4gICAgdGhpcy5pbml0Q29uZmlnKClcbiAgICB0aGlzLmluaXQoKVxuICB9XG5cbiAgcHJpdmF0ZSBpbml0Q29uZmlnUGF0aCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5jb25maWdQYXRoID09PSBcIlwiKSB7XG4gICAgICB0aGlzLmNvbmZpZ1BhdGggPSBob21lZGlyKCkgKyBcIi8ucGljZ28vY29uZmlnLmpzb25cIlxuICAgIH1cbiAgICBpZiAocGF0aC5leHRuYW1lKHRoaXMuY29uZmlnUGF0aCkudG9VcHBlckNhc2UoKSAhPT0gXCIuSlNPTlwiKSB7XG4gICAgICB0aGlzLmNvbmZpZ1BhdGggPSBcIlwiXG4gICAgICB0aHJvdyBFcnJvcihcIlRoZSBjb25maWd1cmF0aW9uIGZpbGUgb25seSBzdXBwb3J0cyBKU09OIGZvcm1hdC5cIilcbiAgICB9XG4gICAgdGhpcy5iYXNlRGlyID0gcGF0aC5kaXJuYW1lKHRoaXMuY29uZmlnUGF0aClcbiAgICBjb25zdCBleGlzdCA9IGZzLnBhdGhFeGlzdHNTeW5jKHRoaXMuY29uZmlnUGF0aClcbiAgICBpZiAoIWV4aXN0KSB7XG4gICAgICBmcy5lbnN1cmVGaWxlU3luYyhgJHt0aGlzLmNvbmZpZ1BhdGh9YClcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGluaXRDb25maWcoKTogdm9pZCB7XG4gICAgdGhpcy5kYiA9IG5ldyBEQih0aGlzKVxuICAgIHRoaXMuX2NvbmZpZyA9IHRoaXMuZGIucmVhZCh0cnVlKSBhcyBJQ29uZmlnXG4gIH1cblxuICBwcml2YXRlIGluaXQoKTogdm9pZCB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIGluaXQgMThuIGF0IGZpcnN0XG4gICAgICB0aGlzLmkxOG4gPSBuZXcgSTE4bk1hbmFnZXIodGhpcylcbiAgICAgIHRoaXMuUmVxdWVzdCA9IG5ldyBSZXF1ZXN0KHRoaXMpXG4gICAgICB0aGlzLl9wbHVnaW5Mb2FkZXIgPSBuZXcgUGx1Z2luTG9hZGVyKHRoaXMpXG4gICAgICAvLyBsb2FkIHNlbGYgcGx1Z2luc1xuICAgICAgc2V0Q3VycmVudFBsdWdpbk5hbWUoXCJwaWNnb1wiKVxuICAgICAgdXBsb2FkZXJzKHRoaXMpLnJlZ2lzdGVyKHRoaXMpXG4gICAgICB0cmFuc2Zvcm1lcnModGhpcykucmVnaXN0ZXIodGhpcylcbiAgICAgIHNldEN1cnJlbnRQbHVnaW5OYW1lKFwiXCIpXG4gICAgICAvLyBsb2FkIHRoaXJkLXBhcnR5IHBsdWdpbnNcbiAgICAgIHRoaXMuX3BsdWdpbkxvYWRlci5sb2FkKClcbiAgICAgIHRoaXMubGlmZWN5Y2xlID0gbmV3IExpZmVjeWNsZSh0aGlzKVxuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgdGhpcy5lbWl0KElCdWlsZEluRXZlbnQuVVBMT0FEX1BST0dSRVNTLCAtMSlcbiAgICAgIHRoaXMubG9nLmVycm9yKGUpXG4gICAgICB0aHJvdyBlXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIGVhc2lseSBtYW5udWFsbHkgbG9hZCBhIHBsdWdpblxuICAgKiBpZiBwcm92aWRlIHBsdWdpbiBuYW1lLCB3aWxsIHJlZ2lzdGVyIHBsdWdpbiBieSBuYW1lXG4gICAqIG9yIGp1c3QgaW5zdGFudGlhdGUgYSBwbHVnaW5cbiAgICovXG4gIHVzZShwbHVnaW46IElQaWNHb1BsdWdpbiwgbmFtZT86IHN0cmluZyk6IElQaWNHb1BsdWdpbkludGVyZmFjZSB7XG4gICAgaWYgKG5hbWUpIHtcbiAgICAgIHRoaXMucGx1Z2luTG9hZGVyLnJlZ2lzdGVyUGx1Z2luKG5hbWUsIHBsdWdpbilcbiAgICAgIHJldHVybiB0aGlzLnBsdWdpbkxvYWRlci5nZXRQbHVnaW4obmFtZSkhXG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHBsdWdpbkluc3RhbmNlID0gcGx1Z2luKHRoaXMpXG4gICAgICByZXR1cm4gcGx1Z2luSW5zdGFuY2VcbiAgICB9XG4gIH1cblxuICByZWdpc3RlckNvbW1hbmRzKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmNvbmZpZ1BhdGggIT09IFwiXCIpIHtcbiAgICAgIHRoaXMuY21kLmluaXQoKVxuICAgICAgdGhpcy5jbWQubG9hZENvbW1hbmRzKClcbiAgICB9XG4gIH1cblxuICBnZXRDb25maWc8VD4obmFtZT86IHN0cmluZyk6IFQge1xuICAgIGlmICghbmFtZSkge1xuICAgICAgcmV0dXJuIHRoaXMuX2NvbmZpZyBhcyB1bmtub3duIGFzIFRcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGdldCh0aGlzLl9jb25maWcsIG5hbWUpXG4gICAgfVxuICB9XG5cbiAgc2F2ZUNvbmZpZyhjb25maWc6IElTdHJpbmdLZXlNYXA8YW55Pik6IHZvaWQge1xuICAgIGlmICghaXNJbnB1dENvbmZpZ1ZhbGlkKGNvbmZpZykpIHtcbiAgICAgIHRoaXMubG9nLndhcm4oXCJ0aGUgZm9ybWF0IG9mIGNvbmZpZyBpcyBpbnZhbGlkLCBwbGVhc2UgcHJvdmlkZSBvYmplY3RcIilcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICB0aGlzLnNldENvbmZpZyhjb25maWcpXG4gICAgdGhpcy5kYi5zYXZlQ29uZmlnKGNvbmZpZylcbiAgfVxuXG4gIHJlbW92ZUNvbmZpZyhrZXk6IHN0cmluZywgcHJvcE5hbWU6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICgha2V5IHx8ICFwcm9wTmFtZSkgcmV0dXJuXG4gICAgaWYgKGlzQ29uZmlnS2V5SW5CbGFja0xpc3Qoa2V5KSkge1xuICAgICAgdGhpcy5sb2cud2FybihgdGhlIGNvbmZpZy4ke2tleX0gY2FuJ3QgYmUgcmVtb3ZlZGApXG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgdGhpcy51bnNldENvbmZpZyhrZXksIHByb3BOYW1lKVxuICAgIHRoaXMuZGIudW5zZXQoa2V5LCBwcm9wTmFtZSlcbiAgfVxuXG4gIHNldENvbmZpZyhjb25maWc6IElTdHJpbmdLZXlNYXA8YW55Pik6IHZvaWQge1xuICAgIGlmICghaXNJbnB1dENvbmZpZ1ZhbGlkKGNvbmZpZykpIHtcbiAgICAgIHRoaXMubG9nLndhcm4oXCJ0aGUgZm9ybWF0IG9mIGNvbmZpZyBpcyBpbnZhbGlkLCBwbGVhc2UgcHJvdmlkZSBvYmplY3RcIilcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBPYmplY3Qua2V5cyhjb25maWcpLmZvckVhY2goKG5hbWU6IHN0cmluZykgPT4ge1xuICAgICAgaWYgKGlzQ29uZmlnS2V5SW5CbGFja0xpc3QobmFtZSkpIHtcbiAgICAgICAgdGhpcy5sb2cud2FybihgdGhlIGNvbmZpZy4ke25hbWV9IGNhbid0IGJlIG1vZGlmaWVkYClcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1keW5hbWljLWRlbGV0ZVxuICAgICAgICBkZWxldGUgY29uZmlnW25hbWVdXG4gICAgICB9XG4gICAgICBzZXQodGhpcy5fY29uZmlnLCBuYW1lLCBjb25maWdbbmFtZV0pXG4gICAgICBldmVudEJ1cy5lbWl0KElCdXNFdmVudC5DT05GSUdfQ0hBTkdFLCB7XG4gICAgICAgIGNvbmZpZ05hbWU6IG5hbWUsXG4gICAgICAgIHZhbHVlOiBjb25maWdbbmFtZV0sXG4gICAgICB9KVxuICAgIH0pXG4gIH1cblxuICB1bnNldENvbmZpZyhrZXk6IHN0cmluZywgcHJvcE5hbWU6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICgha2V5IHx8ICFwcm9wTmFtZSkgcmV0dXJuXG4gICAgaWYgKGlzQ29uZmlnS2V5SW5CbGFja0xpc3Qoa2V5KSkge1xuICAgICAgdGhpcy5sb2cud2FybihgdGhlIGNvbmZpZy4ke2tleX0gY2FuJ3QgYmUgdW5zZXRgKVxuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIHVuc2V0KHRoaXMuZ2V0Q29uZmlnKGtleSksIHByb3BOYW1lKVxuICB9XG5cbiAgZ2V0IHJlcXVlc3QoKTogSVJlcXVlc3RbXCJyZXF1ZXN0XCJdIHtcbiAgICByZXR1cm4gdGhpcy5SZXF1ZXN0LnJlcXVlc3QuYmluZCh0aGlzLlJlcXVlc3QpXG4gIH1cblxuICBhc3luYyB1cGxvYWQoaW5wdXQ/OiBhbnlbXSk6IFByb21pc2U8SUltZ0luZm9bXSB8IEVycm9yPiB7XG4gICAgaWYgKHRoaXMuY29uZmlnUGF0aCA9PT0gXCJcIikge1xuICAgICAgdGhpcy5sb2cuZXJyb3IoXCJUaGUgY29uZmlndXJhdGlvbiBmaWxlIG9ubHkgc3VwcG9ydHMgSlNPTiBmb3JtYXQuXCIpXG4gICAgICByZXR1cm4gW11cbiAgICB9XG4gICAgLy8gdXBsb2FkIGZyb20gY2xpcGJvYXJkXG4gICAgaWYgKGlucHV0ID09PSB1bmRlZmluZWQgfHwgaW5wdXQubGVuZ3RoID09PSAwKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCB7IGltZ1BhdGgsIHNob3VsZEtlZXBBZnRlclVwbG9hZGluZyB9ID0gYXdhaXQgZ2V0Q2xpcGJvYXJkSW1hZ2UodGhpcylcbiAgICAgICAgaWYgKGltZ1BhdGggPT09IFwibm8gaW1hZ2VcIikge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImltYWdlIG5vdCBmb3VuZCBpbiBjbGlwYm9hcmRcIilcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLm9uY2UoSUJ1aWxkSW5FdmVudC5GQUlMRUQsICgpID0+IHtcbiAgICAgICAgICAgIGlmICghc2hvdWxkS2VlcEFmdGVyVXBsb2FkaW5nKSB7XG4gICAgICAgICAgICAgIC8vIOWIoOmZpCBwaWNnbyDnlJ/miJDnmoTlm77niYfmlofku7bvvIzkvovlpoIgYH4vLnBpY2dvLzIwMjAwNjIxMjA1NzIwLnBuZ2BcbiAgICAgICAgICAgICAgZnMucmVtb3ZlKGltZ1BhdGgpLmNhdGNoKChlKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2cuZXJyb3IoZSlcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICAgIHRoaXMub25jZShcImZpbmlzaGVkXCIsICgpID0+IHtcbiAgICAgICAgICAgIGlmICghc2hvdWxkS2VlcEFmdGVyVXBsb2FkaW5nKSB7XG4gICAgICAgICAgICAgIGZzLnJlbW92ZShpbWdQYXRoKS5jYXRjaCgoZSkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMubG9nLmVycm9yKGUpXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgICBjb25zdCB7IG91dHB1dCB9ID0gYXdhaXQgdGhpcy5saWZlY3ljbGUuc3RhcnQoW2ltZ1BhdGhdKVxuICAgICAgICAgIHJldHVybiBvdXRwdXRcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB0aGlzLmVtaXQoSUJ1aWxkSW5FdmVudC5GQUlMRUQsIGUpXG4gICAgICAgIHRocm93IGVcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gdXBsb2FkIGZyb20gcGF0aFxuICAgICAgY29uc3QgeyBvdXRwdXQgfSA9IGF3YWl0IHRoaXMubGlmZWN5Y2xlLnN0YXJ0KGlucHV0KVxuICAgICAgcmV0dXJuIG91dHB1dFxuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHsgSVBpY0dvLCBJUGljR29QbHVnaW4gfSBmcm9tIFwiLi4vLi4vdHlwZXNcIlxuaW1wb3J0IEltZ0Zyb21QYXRoIGZyb20gXCIuL3BhdGhcIlxuaW1wb3J0IEltZ0Zyb21CYXNlNjQgZnJvbSBcIi4vYmFzZTY0XCJcblxuY29uc3QgYnVpbGRJblRyYW5zZm9ybWVyczogSVBpY0dvUGx1Z2luID0gKCkgPT4ge1xuICByZXR1cm4ge1xuICAgIHJlZ2lzdGVyKGN0eDogSVBpY0dvKSB7XG4gICAgICBjdHguaGVscGVyLnRyYW5zZm9ybWVyLnJlZ2lzdGVyKFwicGF0aFwiLCBJbWdGcm9tUGF0aClcbiAgICAgIGN0eC5oZWxwZXIudHJhbnNmb3JtZXIucmVnaXN0ZXIoXCJiYXNlNjRcIiwgSW1nRnJvbUJhc2U2NClcbiAgICB9LFxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IGJ1aWxkSW5UcmFuc2Zvcm1lcnNcbiJdLCJuYW1lcyI6WyJwbHVnaW5IYW5kbGVyIiwiaGFuZGxlIiwiY3R4IiwiY21kIiwicHJvZ3JhbSIsImNvbW1hbmQiLCJkZXNjcmlwdGlvbiIsImFsaWFzIiwib3B0aW9uIiwiYWN0aW9uIiwicGx1Z2lucyIsInByb3h5IiwicmVnaXN0cnkiLCJvcHRpb25zIiwiaW5zdGFsbCIsImNhdGNoIiwiZSIsImxvZyIsImVycm9yIiwidW5pbnN0YWxsIiwidXBkYXRlIiwiY29uZmlnIiwiaXNVcmwiLCJ1cmwiLCJzdGFydHNXaXRoIiwiaGFuZGxlVXJsRW5jb2RlIiwiZGVjb2RlVVJJIiwiaXNVcmxFbmNvZGUiLCJlbmNvZGVVUkkiLCJnZXRJbWFnZVNpemUiLCJmaWxlIiwid2lkdGgiLCJoZWlnaHQiLCJpbWFnZVNpemUiLCJyZWFsIiwiZ2V0UGx1Z2luTmFtZVR5cGUiLCJuYW1lIiwidGVzdCIsImlzU2ltcGxlTmFtZSIsIm5hbWVPclBhdGgiLCJwYXRoIiwiaXNBYnNvbHV0ZSIsInBsdWdpblBhdGgiLCJqb2luIiwicHJvY2VzcyIsImN3ZCIsImZzIiwiZXhpc3RzU3luYyIsImluY2x1ZGVzIiwiaGFuZGxlQ29tcGxldGVQbHVnaW5OYW1lIiwic2NvcGUiLCJoYW5kbGVVbml4U3R5bGVQYXRoIiwicGF0aFN0ciIsInNwbGl0Iiwic2VwIiwicmVtb3ZlUGx1Z2luVmVyc2lvbiIsInJlZyIsIm1hdGNoQXJyIiwibWF0Y2giLCJjb25zb2xlIiwid2FybiIsImNvbmZpZ0JsYWNrTGlzdCIsImlzQ29uZmlnS2V5SW5CbGFja0xpc3QiLCJrZXkiLCJzb21lIiwiYmxhY2tJdGVtIiwiaXNJbnB1dENvbmZpZ1ZhbGlkIiwiQXJyYXkiLCJpc0FycmF5IiwiT2JqZWN0Iiwia2V5cyIsImxlbmd0aCIsInNhZmVQYXJzZSIsInN0ciIsIkpTT04iLCJwYXJzZSIsInVwbG9hZCIsImFyZ3VtZW50cyIsImlucHV0IiwiaW5wdXRMaXN0IiwibWFwIiwiaXRlbSIsInJlc29sdmUiLCJmaWx0ZXIiLCJleGlzdCIsImhhbmRsZUNvbmZpZyIsImFzeW5jIiwicHJvbXB0cyIsIm1vZHVsZSIsImFuc3dlciIsImlucXVpcmVyIiwicHJvbXB0IiwiY29uZmlnTmFtZSIsInNhdmVDb25maWciLCJzZXR0aW5nIiwiaGVscGVyIiwiZ2V0IiwidHlwZSIsImNob2ljZXMiLCJnZXRJZExpc3QiLCJtZXNzYWdlIiwiZ2V0Q29uZmlnIiwiX2EiLCJwbHVnaW5Mb2FkZXIiLCJnZXRQbHVnaW4iLCJnZXRGdWxsTGlzdCIsIl9iIiwicGx1Z2luIiwidXNlTW9kdWxlTmFtZSIsInN1Y2Nlc3MiLCJpbmZvIiwiYXJndiIsInVzZSIsInVwbG9hZGVyIiwiZGVmYXVsdCIsInRyYW5zZm9ybWVyIiwicHVzaCIsInBpY2dvUGx1Z2lucyIsInNldENvbmZpZyIsImdlbmVyYXRlIiwib3B0cyIsImdldE9wdGlvbnMiLCJ0bXAiLCJzb3VyY2UiLCJhbnN3ZXJzIiwiX2ZpbGVzIiwiZ2xvYmJ5IiwiZG90IiwiZ2xvYiIsImZpbHRlcnMiLCJmb3JFYWNoIiwiZmlsZXMiLCJyZW5kZXIiLCJ3cml0ZUZpbGVUcmVlIiwiZGVzdCIsImNvbXBsZXRlIiwiY29tcGxldGVNZXNzYWdlIiwiZXhwIiwiZGF0YSIsImZuIiwiRnVuY3Rpb24iLCJzdHJpbmdpZnkiLCJ0ZW1wbGF0ZVBhdGgiLCJvcHRpb25zUGF0aCIsInJlcXVpcmUiLCJmaWxlVHJlZSIsImZpbGVQYXRoIiwicmVhZEZpbGVTeW5jIiwiY29udGVudCIsImVqcyIsIkJ1ZmZlciIsImlzQnVmZmVyIiwiZGlyIiwiZW5zdXJlRGlyU3luYyIsImRpcm5hbWUiLCJ3cml0ZUZpbGVTeW5jIiwicnVuIiwib2ZmbGluZSIsInRlbXBsYXRlIiwiaGFzU2xhc2giLCJkb3dubG9hZEFuZEdlbmVyYXRlIiwicm0iLCJzeW5jIiwiZG93bmxvYWQiLCJjbG9uZSIsImVyciIsImluaXQiLCJwcm9qZWN0IiwiaW5QbGFjZSIsImhvbWVkaXIiLCJyZXBsYWNlIiwidGhlbiIsIm9rIiwib24iLCJjaGFsayIsImdyYXkiLCJpMThuIiwibGFuZyIsImxpc3QiLCJnZXRMYW5ndWFnZUxpc3QiLCJzZXRMYW5ndWFnZSIsIkxpZmVjeWNsZVBsdWdpbnMiLCJjb25zdHJ1Y3RvciIsInRoaXMiLCJNYXAiLCJwbHVnaW5JZE1hcCIsInJlZ2lzdGVyIiwiaWQiLCJUeXBlRXJyb3IiLCJoYXMiLCJzZXQiLCJjdXJyZW50UGx1Z2luIiwidW5yZWdpc3RlciIsInBsdWdpbk5hbWUiLCJwbHVnaW5MaXN0IiwiZGVsZXRlIiwiZ2V0TmFtZSIsImdldExpc3QiLCJ2YWx1ZXMiLCJzZXRDdXJyZW50UGx1Z2luTmFtZSIsIkNvbW1hbmRlciIsIkNvbW1hbmQiLCJ2ZXJzaW9uIiwiZGVidWciLCJzaWxlbnQiLCJhcmdzIiwiZXhpdCIsImN1cnJlbnRQbHVnaW5OYW1lIiwibG9hZENvbW1hbmRzIiwiSUxvZ1R5cGUiLCJJQnVpbGRJbkV2ZW50IiwiSUJ1c0V2ZW50IiwiTG9nZ2VyIiwibGV2ZWwiLCJoYW5kbGVMb2ciLCJtc2ciLCJsb2dIZWFkZXIiLCJ0b1VwcGVyQ2FzZSIsImxvZ0xldmVsIiwibG9nUGF0aCIsImJhc2VEaXIiLCJzZXRUaW1lb3V0IiwicmVzdWx0IiwiY2hlY2tMb2dGaWxlSXNMYXJnZSIsImlzTGFyZ2UiLCJ3YXJuaW5nTXNnIiwibG9nRmlsZVNpemVMaW1pdCIsInllbGxvdyIsInJlY3JlYXRlTG9nRmlsZSIsInVuc2hpZnQiLCJoYW5kbGVXcml0ZUxvZyIsImxvZ0ZpbGVTaXplIiwic3RhdFN5bmMiLCJzaXplIiwibnVtIiwiaXNOYU4iLCJOdW1iZXIiLCJmb3JjZU51bWJlciIsInVubGlua1N5bmMiLCJjcmVhdGVGaWxlU3luYyIsImNoZWNrTG9nTGV2ZWwiLCJkYXlqcyIsImZvcm1hdCIsIkVycm9yIiwidXRpbCIsInN0YWNrIiwiYXBwZW5kRmlsZVN5bmMiLCJ1bmRlZmluZWQiLCJlbnYiLCJOT0RFX0VOViIsIkxpZmVjeWNsZSIsIkV2ZW50RW1pdHRlciIsInN1cGVyIiwic3RhcnQiLCJjb25maWdQYXRoIiwib3V0cHV0IiwiUmVxdWVzdCIsIlZFUlNJT04iLCJHVUlfVkVSU0lPTiIsInJlcXVlc3QiLCJiaW5kIiwicmVtb3ZlQ29uZmlnIiwidW5zZXRDb25maWciLCJhZGRMaXN0ZW5lciIsIm9uY2UiLCJyZW1vdmVMaXN0ZW5lciIsIm9mZiIsInJlbW92ZUFsbExpc3RlbmVycyIsInNldE1heExpc3RlbmVycyIsImdldE1heExpc3RlbmVycyIsImxpc3RlbmVycyIsInJhd0xpc3RlbmVycyIsImVtaXQiLCJsaXN0ZW5lckNvdW50IiwicHJlcGVuZExpc3RlbmVyIiwicHJlcGVuZE9uY2VMaXN0ZW5lciIsImV2ZW50TmFtZXMiLCJjcmVhdGVDb250ZXh0IiwiYmVmb3JlVHJhbnNmb3JtIiwiZG9UcmFuc2Zvcm0iLCJiZWZvcmVVcGxvYWQiLCJkb1VwbG9hZCIsImFmdGVyVXBsb2FkIiwiRkFJTEVEIiwiVVBMT0FEX1BST0dSRVNTIiwiQkVGT1JFX1RSQU5TRk9STSIsImhhbmRsZVBsdWdpbnMiLCJiZWZvcmVUcmFuc2Zvcm1QbHVnaW5zIiwiY3VycmVudFRyYW5zZm9ybWVyIiwiQkVGT1JFX1VQTE9BRCIsImJlZm9yZVVwbG9hZFBsdWdpbnMiLCJvdXRwdXRJbWciLCJBRlRFUl9VUExPQUQiLCJhZnRlclVwbG9hZFBsdWdpbnMiLCJpIiwiaW1nVXJsIiwiYmFzZTY0SW1hZ2UiLCJidWZmZXIiLCJGSU5JU0hFRCIsImxpZmVDeWNsZVBsdWdpbnMiLCJwbHVnaW5OYW1lcyIsImxpZmVDeWNsZU5hbWUiLCJQcm9taXNlIiwiYWxsIiwiaW5kZXgiLCJnZW5lcmF0ZVNpZ25hdHVyZSIsImZpbGVOYW1lIiwic2VjcmV0SWQiLCJzZWNyZXRLZXkiLCJhcHBJZCIsImJ1Y2tldCIsInNpZ25hdHVyZSIsInNpZ25UaW1lIiwidG9kYXkiLCJNYXRoIiwiZmxvb3IiLCJEYXRlIiwiZ2V0VGltZSIsInNpZ25LZXkiLCJjcnlwdG8iLCJjcmVhdGVIbWFjIiwiZGlnZXN0IiwiaHR0cFN0cmluZyIsImFyZWEiLCJzdHJpbmdUb1NpZ24iLCJjcmVhdGVIYXNoIiwicmFuZG9tIiwiY3VycmVudCIsIm11bHRpU2lnbmF0dXJlIiwic2lnbkhleEtleSIsInRlbXBTdHJpbmciLCJjb25jYXQiLCJmcm9tIiwidG9TdHJpbmciLCJwb3N0T3B0aW9ucyIsImltYWdlIiwibWV0aG9kIiwiZW5jb2RlVVJJQ29tcG9uZW50IiwiaGVhZGVycyIsIkF1dGhvcml6YXRpb24iLCJjb250ZW50VHlwZSIsIm1pbWUiLCJsb29rdXAiLCJ1c2VyQWdlbnQiLCJib2R5IiwicmVzb2x2ZVdpdGhGdWxsUmVzcG9uc2UiLCJmb3JtRGF0YSIsIm9wIiwiZmlsZWNvbnRlbnQiLCJ0Y1l1bk9wdGlvbnMiLCJpbWdMaXN0IiwiY3VzdG9tVXJsIiwidXNlVjQiLCJpbWciLCJyZXMiLCJzdGF0dXNDb2RlIiwidHJhbnNsYXRlIiwiX2MiLCJvcHRpb25VcmwiLCJzb3VyY2VfdXJsIiwiTk9USUZJQ0FUSU9OIiwidGl0bGUiLCJjb2RlIiwidGV4dCIsInVzZXJDb25maWciLCJyZXF1aXJlZCIsInByZWZpeCIsInRva2VuIiwicmVwbyIsImpzb24iLCJnaXRodWJPcHRpb25zIiwiYnJhbmNoIiwicG9zdENvbmZpZyIsImRvd25sb2FkX3VybCIsImltZ0Jhc2U2NCIsInNlbGVjdEFyZWEiLCJnZXRUb2tlbiIsInFpbml1T3B0aW9ucyIsImFjY2Vzc0tleSIsIm1hYyIsInFpbml1IiwiYXV0aCIsIk1hYyIsInJzIiwiUHV0UG9saWN5IiwidXBsb2FkVG9rZW4iLCJiYXNlVXJsIiwicmVzcG9uc2UiLCJzdHJlYW1VdGlscyIsImJ1ZiIsImltYWdlQnVmZmVyIiwiQXJyYXlCdWZmZXIiLCJhcnJheUJ1ZmZlclRvQnVmZmVyIiwiZGF0ZSIsInRvVVRDU3RyaW5nIiwibWltZVR5cGUiLCJzaWduU3RyaW5nIiwiYWNjZXNzS2V5U2VjcmV0IiwiYWNjZXNzS2V5SWQiLCJIb3N0IiwiYWxpWXVuT3B0aW9ucyIsImhhbmRsZVJlc3QiLCJzdG9yZSIsIk9TUyIsInJlZ2lvbiIsInJlbW90ZVBhdGgiLCJzdHJlYW0iLCJSZWFkYWJsZSIsInB1dFN0cmVhbSIsInN0YXR1cyIsIm9wZXJhdG9yIiwicGFzc3dvcmQiLCJtZDVQYXNzd29yZCIsIk1ENSIsInZhbHVlIiwidXB5dW5PcHRpb25zIiwic2VydmljZU5hbWUiLCJvcGVyYXRvck5hbWUiLCJvcGVyYXRvclBhc3N3b3JkIiwic2VydmljZSIsInVweXVuIiwiU2VydmljZSIsImNsaWVudCIsIkNsaWVudCIsInB1dEZpbGUiLCJidWlsZEluVXBsb2FkZXJzIiwiYWxpWXVuVXBsb2FkZXIiLCJ0Y1l1blVwbG9hZGVyIiwiZ2l0aHViVXBsb2FkZXIiLCJxaW5pdVVwbG9hZGVyIiwidXBZdW5VcGxvYWRlciIsImdldEltZ1NpemUiLCJJbWdGcm9tUGF0aCIsInJlc3VsdHMiLCJ0aW1lb3V0SWQiLCJpc0ltYWdlIiwiZXh0bmFtZSIsInJlcXVlc3RGbiIsInJlamVjdCIsInJlc3BvbnNlVHlwZSIsInJlc3AiLCJjbGVhclRpbWVvdXQiLCJ1cmxQYXRoIiwiVVJMIiwicGF0aG5hbWUiLCJiYXNlbmFtZSIsInJlYXNvbiIsInRpbWVvdXRQcm9taXNlIiwicmFjZSIsImdldFVSTEZpbGUiLCJyZWFkRmlsZSIsImdldEZTRmlsZSIsImltZ1NpemUiLCJJbWdGcm9tQmFzZTY0IiwiUGx1Z2luTG9hZGVyIiwiZnVsbExpc3QiLCJTZXQiLCJwbHVnaW5NYXAiLCJwYWNrYWdlUGF0aCIsInBrZyIsInJlcG9zaXRvcnkiLCJsaWNlbnNlIiwicmVzb2x2ZVBsdWdpbiIsImJhc2VkaXIiLCJsb2FkIiwicGx1Z2luRGlyIiwicmVhZEpTT05TeW5jIiwiZGVwcyIsImRlcGVuZGVuY2llcyIsImRldkRlcHMiLCJkZXZEZXBlbmRlbmNpZXMiLCJtb2R1bGVzIiwicmVnaXN0ZXJQbHVnaW4iLCJhZGQiLCJwbHVnaW5JbnRlcmZhY2UiLCJ1bnJlZ2lzdGVyUGx1Z2luIiwiaGFzUGx1Z2luIiwiQ0xJUEJPQVJEX0lNQUdFX0ZPTERFUiIsInBsYXRmb3JtMlNjcmlwdENvbnRlbnQiLCJkYXJ3aW4iLCJ3aW4zMiIsIndpbjEwIiwibGludXgiLCJ3c2wiLCJwbGF0Zm9ybTJTY3JpcHRGaWxlbmFtZSIsImdldENsaXBib2FyZEltYWdlIiwiaW1hZ2VQYXRoIiwibWtkaXJTeW5jIiwiY3JlYXRlSW1hZ2VGb2xkZXIiLCJwbGF0Zm9ybSIsImlzV3NsIiwib3MiLCJyZWxlYXNlIiwiZ2V0Q3VycmVudFBsYXRmb3JtIiwic2NyaXB0UGF0aCIsImV4ZWN1dGlvbiIsInNwYXduIiwic3Rkb3V0IiwidHJpbSIsImltZ1BhdGgiLCJzaG91bGRLZWVwQWZ0ZXJVcGxvYWRpbmciLCJldmVudEJ1cyIsImh0dHBzQWdlbnQiLCJodHRwcyIsIkFnZW50IiwibWF4VmVyc2lvbiIsIm1pblZlcnNpb24iLCJhcHBlbmRGb3JtRGF0YSIsImZvcm0iLCJhcHBlbmQiLCJyZXNwb25zZUludGVyY2VwdG9yIiwiYXNzaWduIiwicmVzcG9uc2VFcnJvckhhbmRsZXIiLCJlcnJvck9iaiIsIl9kIiwiX2UiLCJfZiIsIl9nIiwiQ09ORklHX0NIQU5HRSIsImhhbmRsZVByb3h5IiwicHJveHlPcHRpb25zIiwiaG9zdCIsImhvc3RuYW1lIiwicG9ydCIsInBhcnNlSW50IiwicHJvdG9jb2wiLCJtYXhCb2R5TGVuZ3RoIiwiSW5maW5pdHkiLCJtYXhDb250ZW50TGVuZ3RoIiwidHVubmVsIiwiaHR0cHNPdmVySHR0cCIsImluc3RhbmNlIiwiYXhpb3MiLCJjcmVhdGUiLCJpbnRlcmNlcHRvcnMiLCJvcHQiLCJfX2lzT2xkT3B0aW9ucyIsIkZvcm1EYXRhIiwiZ2V0SGVhZGVycyIsInBhcmFtcyIsInFzIiwicmVxdWVzdEludGVyY2VwdG9yIiwib2JqIiwiQ29udGVudFR5cGUiLCJEQiIsImRiIiwiSlNPTlN0b3JlIiwicmVhZCIsImZsdXNoIiwidW5zZXQiLCJQbHVnaW5IYW5kbGVyIiwiaW5zdGFsbGVkUGx1Z2lucyIsInByb2Nlc3NQbHVnaW5zIiwiaGFuZGxlUGx1Z2luTmFtZVByb2Nlc3MiLCJwa2dOYW1lIiwiZnVsbE5hbWVMaXN0IiwiZnVsbE5hbWUiLCJwa2dOYW1lTGlzdCIsImV4ZWNDb21tYW5kIiwid2hlcmUiLCJucG1PcHRpb25zIiwibnBtIiwicGlwZSIsInN0ZGVyciIsImxvZ2dlciIsImdldFByb2Nlc3NQbHVnaW5OYW1lIiwicGFja2FnZUpTT05QYXRoIiwicG9zaXgiLCJnZXROb3JtYWxQbHVnaW5OYW1lIiwibGFuZ3VhZ2VMaXN0IiwiVVBMT0FEX0ZBSUxFRCIsIkNIRUNLX1NFVFRJTkdTIiwiQ0hFQ0tfU0VUVElOR1NfQU5EX05FVFdPUksiLCJVUExPQURfRkFJTEVEX1JFQVNPTiIsIlNFUlZFUl9FUlJPUiIsIkFVVEhfRkFJTEVEIiwiUElDQkVEX1NNTVMiLCJQSUNCRURfU01NU19UT0tFTiIsIlBJQ0JFRF9TTU1TX0JBQ0tVUF9ET01BSU4iLCJQSUNCRURfU01NU19NRVNTQUdFX0JBQ0tVUF9ET01BSU4iLCJQSUNCRURfQUxJQ0xPVUQiLCJQSUNCRURfQUxJQ0xPVURfQUNDRVNTS0VZSUQiLCJQSUNCRURfQUxJQ0xPVURfQUNDRVNTS0VZU0VDUkVUIiwiUElDQkVEX0FMSUNMT1VEX0JVQ0tFVCIsIlBJQ0JFRF9BTElDTE9VRF9BUkVBIiwiUElDQkVEX0FMSUNMT1VEX1BBVEgiLCJQSUNCRURfQUxJQ0xPVURfQ1VTVE9NVVJMIiwiUElDQkVEX0FMSUNMT1VEX09QVElPTlMiLCJQSUNCRURfQUxJQ0xPVURfTUVTU0FHRV9BUkVBIiwiUElDQkVEX0FMSUNMT1VEX01FU1NBR0VfUEFUSCIsIlBJQ0JFRF9BTElDTE9VRF9NRVNTQUdFX09QVElPTlMiLCJQSUNCRURfQUxJQ0xPVURfTUVTU0FHRV9DVVNUT01VUkwiLCJQSUNCRURfVEVOQ0VOVENMT1VEIiwiUElDQkVEX1RFTkNFTlRDTE9VRF9WRVJTSU9OIiwiUElDQkVEX1RFTkNFTlRDTE9VRF9TRUNSRVRJRCIsIlBJQ0JFRF9URU5DRU5UQ0xPVURfU0VDUkVUS0VZIiwiUElDQkVEX1RFTkNFTlRDTE9VRF9BUFBJRCIsIlBJQ0JFRF9URU5DRU5UQ0xPVURfQlVDS0VUIiwiUElDQkVEX1RFTkNFTlRDTE9VRF9BUkVBIiwiUElDQkVEX1RFTkNFTlRDTE9VRF9QQVRIIiwiUElDQkVEX1RFTkNFTlRDTE9VRF9PUFRJT05TIiwiUElDQkVEX1RFTkNFTlRDTE9VRF9DVVNUT01VUkwiLCJQSUNCRURfVEVOQ0VOVENMT1VEX01FU1NBR0VfQVBQSUQiLCJQSUNCRURfVEVOQ0VOVENMT1VEX01FU1NBR0VfQVJFQSIsIlBJQ0JFRF9URU5DRU5UQ0xPVURfTUVTU0FHRV9QQVRIIiwiUElDQkVEX1RFTkNFTlRDTE9VRF9NRVNTQUdFX0NVU1RPTVVSTCIsIlBJQ0JFRF9URU5DRU5UQ0xPVURfTUVTU0FHRV9PUFRJT05TIiwiUElDQkVEX0dJVEhVQiIsIlBJQ0JFRF9HSVRIVUJfVE9LRU4iLCJQSUNCRURfR0lUSFVCX1JFUE8iLCJQSUNCRURfR0lUSFVCX1BBVEgiLCJQSUNCRURfR0lUSFVCX0JSQU5DSCIsIlBJQ0JFRF9HSVRIVUJfQ1VTVE9NVVJMIiwiUElDQkVEX0dJVEhVQl9NRVNTQUdFX1JFUE8iLCJQSUNCRURfR0lUSFVCX01FU1NBR0VfQlJBTkNIIiwiUElDQkVEX0dJVEhVQl9NRVNTQUdFX1BBVEgiLCJQSUNCRURfR0lUSFVCX01FU1NBR0VfQ1VTVE9NVVJMIiwiUElDQkVEX1FJTklVIiwiUElDQkVEX1FJTklVX0FDQ0VTU0tFWSIsIlBJQ0JFRF9RSU5JVV9TRUNSRVRLRVkiLCJQSUNCRURfUUlOSVVfQlVDS0VUIiwiUElDQkVEX1FJTklVX1BBVEgiLCJQSUNCRURfUUlOSVVfVVJMIiwiUElDQkVEX1FJTklVX09QVElPTlMiLCJQSUNCRURfUUlOSVVfQVJFQSIsIlBJQ0JFRF9RSU5JVV9NRVNTQUdFX1BBVEgiLCJQSUNCRURfUUlOSVVfTUVTU0FHRV9BUkVBIiwiUElDQkVEX1FJTklVX01FU1NBR0VfT1BUSU9OUyIsIlBJQ0JFRF9RSU5JVV9NRVNTQUdFX1VSTCIsIlBJQ0JFRF9JTUdVUiIsIlBJQ0JFRF9JTUdVUl9DTElFTlRJRCIsIlBJQ0JFRF9JTUdVUl9QUk9YWSIsIlBJQ0JFRF9JTUdVUl9NRVNTQUdFX1BST1hZIiwiUElDQkVEX1VQWVVOIiwiUElDQkVEX1VQWVVOX0JVQ0tFVCIsIlBJQ0JFRF9VUFlVTl9PUEVSQVRPUiIsIlBJQ0JFRF9VUFlVTl9QQVNTV09SRCIsIlBJQ0JFRF9VUFlVTl9QQVRIIiwiUElDQkVEX1VQWVVOX1VSTCIsIlBJQ0JFRF9VUFlVTl9PUFRJT05TIiwiUElDQkVEX1VQWVVOX01FU1NBR0VfT1BFUkFUT1IiLCJQSUNCRURfVVBZVU5fTUVTU0FHRV9QQVNTV09SRCIsIlBJQ0JFRF9VUFlVTl9NRVNTQUdFX1VSTCIsIlBJQ0JFRF9VUFlVTl9NRVNTQUdFX09QVElPTlMiLCJQSUNCRURfVVBZVU5fTUVTU0FHRV9QQVRIIiwiUExVR0lOX0hBTkRMRVJfUExVR0lOX0lOU1RBTExfU1VDQ0VTUyIsIlBMVUdJTl9IQU5ETEVSX1BMVUdJTl9JTlNUQUxMX0ZBSUxFRCIsIlBMVUdJTl9IQU5ETEVSX1BMVUdJTl9JTlNUQUxMX0ZBSUxFRF9SRUFTT04iLCJQTFVHSU5fSEFORExFUl9QTFVHSU5fSU5TVEFMTF9GQUlMRURfUEFUSCIsIlBMVUdJTl9IQU5ETEVSX1BMVUdJTl9VTklOU1RBTExfU1VDQ0VTUyIsIlBMVUdJTl9IQU5ETEVSX1BMVUdJTl9VTklOU1RBTExfRkFJTEVEIiwiUExVR0lOX0hBTkRMRVJfUExVR0lOX1VOSU5TVEFMTF9GQUlMRURfUkVBU09OIiwiUExVR0lOX0hBTkRMRVJfUExVR0lOX1VOSU5TVEFMTF9GQUlMRURfVkFMSUQiLCJQTFVHSU5fSEFORExFUl9QTFVHSU5fVVBEQVRFX1NVQ0NFU1MiLCJQTFVHSU5fSEFORExFUl9QTFVHSU5fVVBEQVRFX0ZBSUxFRCIsIlBMVUdJTl9IQU5ETEVSX1BMVUdJTl9VUERBVEVfRkFJTEVEX1JFQVNPTiIsIlBMVUdJTl9IQU5ETEVSX1BMVUdJTl9VUERBVEVfRkFJTEVEX1ZBTElEIiwiZW4iLCJJMThuTWFuYWdlciIsIm9iamVjdEFkYXB0ZXIiLCJPYmplY3RBZGFwdGVyIiwibGFuZ3VhZ2UiLCJJMThuIiwiYWRhcHRlciIsImRlZmF1bHRMYW5ndWFnZSIsImxvYWRPdXR0ZXJJMThuIiwiaTE4bkZvbGRlciIsImdldE91dHRlckkxOG5Gb2xkZXIiLCJyZWFkZGlyU3luYyIsIndpdGhGaWxlVHlwZXMiLCJpc0ZpbGUiLCJlbmRzV2l0aCIsImkxOG5GaWxlUGF0aCIsImkxOG5GaWxlIiwiaTE4bkZpbGVPYmoiLCJ5YW1sIiwicGF0aEV4aXN0c1N5bmMiLCJhZGRMb2NhbGUiLCJsb2NhbGVzIiwib3JpZ2luTG9jYWxlcyIsImdldExvY2FsZSIsIm5ld0xvY2FsZXMiLCJtZXJnZSIsInNldExvY2FsZSIsImFkZExhbmd1YWdlIiwiUGljR28iLCJfcGx1Z2luTG9hZGVyIiwiaW5pdENvbmZpZ1BhdGgiLCJpbml0Q29uZmlnIiwiZW5zdXJlRmlsZVN5bmMiLCJfY29uZmlnIiwidXBsb2FkZXJzIiwibGlmZWN5Y2xlIiwicmVnaXN0ZXJDb21tYW5kcyIsInByb3BOYW1lIiwicmVtb3ZlIl0sIm1hcHBpbmdzIjoiNmxDQUVBLE1BQU1BLEdBQXlCLENBQzdCQyxPQUFTQyxJQUVQLE1BQU1DLEVBQU1ELEVBQUlDLElBQ2hCQSxFQUFJQyxRQUNEQyxRQUFRLHdCQUNSQyxZQUFZLHdCQUNaQyxNQUFNLE9BQ05DLE9BQU8sc0JBQXVCLDRCQUM5QkEsT0FBTyw0QkFBNkIsb0NBQ3BDQyxRQUFPLENBQUNDLEVBQW1CTixLQUMxQixNQUFNTyxNQUFFQSxFQUFLQyxTQUFFQSxHQUFhUixFQUN0QlMsRUFBVSxDQUNkRixRQUNBQyxZQUVGVixFQUFJRixjQUFjYyxRQUFRSixFQUFTRyxHQUFTRSxPQUFPQyxJQUNqRGQsRUFBSWUsSUFBSUMsTUFBTUYsRUFBRSxHQUNoQixJQUVOYixFQUFJQyxRQUNEQyxRQUFRLDBCQUNSRSxNQUFNLE1BQ05ELFlBQVksMEJBQ1pHLFFBQVFDLElBQ1BSLEVBQUlGLGNBQWNtQixVQUFVVCxHQUFTSyxPQUFPQyxJQUMxQ2QsRUFBSWUs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
diff --git a/libs/zhi-picgo-core/dist/index.d.ts b/libs/zhi-picgo-core/dist/index.d.ts
deleted file mode 100644
index 0c0cb45..0000000
--- a/libs/zhi-picgo-core/dist/index.d.ts
+++ /dev/null
@@ -1,9 +0,0 @@
-export { PicGo } from "./core/PicGo";
-export { Lifecycle } from "./core/Lifecycle";
-export { Logger } from "./lib/Logger";
-export { PluginHandler } from "./lib/PluginHandler";
-export { LifecyclePlugins } from "./lib/LifecyclePlugins";
-export { Commander } from "./lib/Commander";
-export { PluginLoader } from "./lib/PluginLoader";
-export { Request } from "./lib/Request";
-export * from "./types";
diff --git a/libs/zhi-picgo-core/dist/index.esm.js b/libs/zhi-picgo-core/dist/index.esm.js
deleted file mode 100644
index 29d270d..0000000
--- a/libs/zhi-picgo-core/dist/index.esm.js
+++ /dev/null
@@ -1,2 +0,0 @@
-import e from"fs-extra";import t from"path";import{EventEmitter as n}from"events";import r,{homedir as i}from"os";import{Command as s}from"commander";import o from"inquirer";import{imageSize as a}from"image-size";import{URL as l}from"url";import c from"chalk";import u from"minimatch";import p from"globby";import g from"ejs";import E from"download-git-repo";import d from"rimraf";import _ from"dayjs";import I from"util";import h from"crypto";import m from"mime-types";import f from"qiniu";import P from"ali-oss";import{Readable as C}from"stream";import U from"arraybuffer-to-buffer";import N from"md5";import L from"upyun";import S from"resolve";import{merge as D,get as A,set as T,unset as y}from"lodash";import{spawn as O}from"child_process";import B from"is-wsl";import b from"axios";import x from"form-data";import w from"https";import R from"tunnel";import{JSONStore as G}from"@picgo/store";import $ from"cross-spawn";import M from"js-yaml";import{ObjectAdapter as v,I18n as H}from"@picgo/i18n";const F={handle:e=>{const t=e.cmd;t.program.command("install ").description("install picgo plugin").alias("add").option("-p, --proxy ","Add proxy for installing").option("-r, --registry ","Choose a registry for installing").action(((t,n)=>{const{proxy:r,registry:i}=n,s={proxy:r,registry:i};e.pluginHandler.install(t,s).catch((t=>{e.log.error(t)}))})),t.program.command("uninstall ").alias("rm").description("uninstall picgo plugin").action((t=>{e.pluginHandler.uninstall(t).catch((t=>{e.log.error(t)}))})),t.program.command("update ").description("update picgo plugin").option("-p, --proxy ","Add proxy for installing").option("-r, --registry ","Choose a registry for installing").action(((t,n)=>{const{proxy:r,registry:i}=n,s={proxy:r,registry:i};e.pluginHandler.update(t,s).catch((t=>{e.log.error(t)}))}))}},k={handle:e=>{e.cmd.program.option("-c, --config ","set config path")}},K=e=>e.startsWith("http://")||e.startsWith("https://"),q=e=>((e=>{e=e||"";try{return e!==decodeURI(e)}catch(e){return!0}})(e)||(e=encodeURI(e)),e),Y=e=>{try{const{width:t=0,height:n=0}=a(e);return{real:!0,width:t,height:n}}catch(e){return{real:!1,width:200,height:200}}},j=e=>/^@[^/]+\/picgo-plugin-/.test(e)?"scope":e.startsWith("picgo-plugin-")?"normal":Q(e)?"simple":"unknown",Q=n=>{if(t.isAbsolute(n))return!1;const r=t.join(process.cwd(),n);return!e.existsSync(r)&&(!n.includes("/")&&!n.includes("\\"))},W=(e,t="")=>t?`@${t}/picgo-plugin-${e}`:`picgo-plugin-${e}`,z=e=>e.split(t.sep).join("/"),V=(e,t=!1)=>{if(e.includes("@")){let n=/(.+\/)?(picgo-plugin-\w+)(@.+)*/;t&&(n=/(.+\/)?(^@[^/]+\/picgo-plugin-\w+)(@.+)*/);const r=e.match(n);return r?r[2]:(console.warn("can not remove plugin version"),e)}return e},J=[],X=e=>J.some((t=>e.startsWith(t))),Z=e=>"object"==typeof e&&!Array.isArray(e)&&Object.keys(e).length>0;function ee(e){try{return JSON.parse(e)}catch(t){return e}}const te={handle:n=>{n.cmd.program.command("upload").description("upload, go go go").arguments("[input...]").alias("u").action((r=>{(async()=>{const i=r.map((e=>K(e)?e:t.resolve(e))).filter((t=>{const r=e.existsSync(t)||K(t);return r||n.log.warn(`${t} does not exist.`),r}));await n.upload(i)})().catch((e=>{n.log.error(e)}))}))}},ne=async(e,t,n,r)=>{const i=await e.cmd.inquirer.prompt(t),s="uploader"===n?`picBed.${r}`:"transformer"===n?`transformer.${r}`:r;e.saveConfig({[s]:i})},re={handle:e=>{e.cmd.program.command("set").alias("config").arguments(" [name]").description("configure config of picgo modules").action(((t,n)=>{(async()=>{var r,i;try{switch(t){case"uploader":case"transformer":if(n){const r=e.helper[t].get(n);if(!r)return e.log.error(`No ${t} named ${n}`);r.config&&await ne(e,r.config(e),t,n)}else{const n=[{type:"list",name:`${t}`,choices:e.helper[t].getIdList(),message:`Choose a(n) ${t}`}],r=await e.cmd.inquirer.prompt(n),i=e.helper[t].get(r[t]);(null==i?void 0:i.config)&&await ne(e,i.config(e),t,r[t])}break;case"plugin":if(n){if(n.includes("picgo-plugin-")||(n=`picgo-plugin-${n}`),!Object.keys(e.getConfig("picgoPlugins")).includes(n))return e.log.error(`No plugin named ${n}`);(null===(r=e.pluginLoader.getPlugin(n))||void 0===r?void 0:r.config)&&await ne(e,e.pluginLoader.getPlugin(n).config(e),"plugin",n)}else{const t=[{type:"list",name:"plugin",choices:e.pluginLoader.getFullList(),message:"Choose a plugin"}],n=await e.cmd.inquirer.prompt(t);(null===(i=e.pluginLoader.getPlugin(n.plugin))||void 0===i?void 0:i.config)&&await ne(e,e.pluginLoader.getPlugin(n.plugin).config(e),"plugin",n.plugin)}break;default:return e.log.warn(`No module named ${t}`),e.log.warn("Available modules are uploader|transformer|plugin")}const s="plugin"===t?"plugins":t;e.log.success("Configure config successfully!"),e.log.info(`If you want to use this config, please run 'picgo use ${s}'`)}catch(t){if(e.log.error(t),process.argv.includes("--debug"))throw t}})().catch((t=>{e.log.error(t)}))}))}},ie={handle:async e=>{const t=e.cmd;t.program.command("use").arguments("[module]").description("use modules of picgo").action((n=>{(async()=>{try{let r=[];const i={uploader:{type:"list",name:"uploader",message:"Use an uploader",choices:e.helper.uploader.getIdList(),default:e.getConfig("picBed.uploader")||e.getConfig("picBed.current")||"github"},transformer:{type:"list",name:"transformer",message:"Use a transformer",choices:e.helper.transformer.getIdList(),default:e.getConfig("picBed.transformer")||"path"},plugins:{type:"checkbox",name:"plugins",message:"Use plugins",choices:e.pluginLoader.getFullList(),default:Object.keys(e.getConfig("picgoPlugins")).filter((t=>e.getConfig(`picgoPlugins.${t}`)))}};if(n){if(!i[n])return e.log.warn(`No module named ${n}`),e.log.warn("Available modules are uploader|transformer|plugins");r.push(i[n])}else r=Object.keys(i).map((e=>i[e]));const s=await t.inquirer.prompt(r);if(s.plugins){const t=e.getConfig("picgoPlugins");Object.keys(t).map((e=>{s.plugins.includes(e)?t[e]=!0:t[e]=!1})),e.saveConfig({picgoPlugins:t})}e.saveConfig({"picBed.current":s.uploader||e.getConfig("picBed.current"),"picBed.uploader":s.uploader||e.getConfig("picBed.current"),"picBed.transformer":s.transformer||"path"}),e.log.success("Configure config successfully!")}catch(t){if(e.log.error(t),process.argv.includes("--debug"))throw t}})().catch((t=>{e.log.error(t)}))}))}},se={handle:e=>{e.cmd.program.option("-p, --proxy ","set proxy for uploading",(t=>{e.setConfig({"picBed.proxy":t})}))}},oe=async(e,n)=>{try{const r=le(n.tmp),i=t.join(n.tmp,"template");let s={};r.prompts&&r.prompts.length>0&&(s=await e.cmd.inquirer.prompt(r.prompts));let o=await p(["**/*"],{cwd:i,dot:!0});if(o=o.filter((t=>{let n="";return Object.keys(r.filters).forEach((e=>{u(t,e,{dot:!0})&&(n=t)})),!n||ae(e,r.filters[n],s)})),0===o.length)return e.log.warn("Template files not found!");const a=ce(o,i,s);ue(n.dest,a),"function"==typeof r.complete&&r.complete({answers:s,options:n,files:o,ctx:e}),r.completeMessage&&e.log.success(r.completeMessage),e.log.success("Done!")}catch(t){return e.log.error(t)}},ae=(e,t,n)=>{const r=new Function("data","with (data) { return "+t+"}");try{return r(n)}catch(n){return e.log.error(`Error when evaluating filter condition: ${JSON.stringify(t)}`),!1}},le=n=>{const r=t.join(n,"index.js");if(e.existsSync(r)){return require(r)}return{}},ce=(n,r,i)=>{const s={};return n.forEach((n=>{const o=e.readFileSync(t.join(r,n),"utf8"),a=g.render(o,i);(Buffer.isBuffer(a)||/[^\s]/.test(a))&&(s[n]=a)})),s},ue=(n,r)=>{Object.keys(r).forEach((i=>{const s=t.join(n,i);e.ensureDirSync(t.dirname(s)),e.writeFileSync(s,r[i])}))},pe=(t,n)=>{n.offline?e.existsSync(n.template)?oe(t,n).catch((e=>{t.log.error(e)})):t.log.error(`Local template ${n.template} not found`):(n.template=n.hasSlash?n.template:"PicGo/picgo-template-"+n.template,ge(t,n))},ge=(t,n)=>{e.existsSync(n.tmp)&&d.sync(n.tmp),t.log.info("Template files are downloading..."),E(n.template,n.tmp,{clone:n.clone},(e=>{if(e)return t.log.error(e);t.log.success("Template files are downloaded!"),oe(t,n).catch((e=>{t.log.error(e)}))}))},Ee={handle:async n=>{n.cmd.program.command("init").arguments(" [project]").option("--clone","use git clone").option("--offline","use cached template").description("create picgo plugin's development templates").action(((r,s,o)=>{(async()=>{try{const a=r.includes("/"),l=!s||"."===s,c=t.resolve(s||"."),u=o.clone||!1,p=o.offline||!1,g=t.join(i(),".picgo/templates",r.replace(/[/:]/g,"-"));o.offline&&(r=g);const E={template:r,project:s,hasSlash:a,inPlace:l,dest:c,clone:u,tmp:g,offline:p};l||e.existsSync(c)?await n.cmd.inquirer.prompt([{type:"confirm",message:l?"Generate project in current directory?":"Target directory exists. Continue?",name:"ok"}]).then((e=>{e.ok&&pe(n,E)})):pe(n,E)}catch(e){if(n.log.error(e),process.argv.includes("--debug"))throw e}})().catch((e=>{n.log.error(e)}))})).on("--help",(()=>{console.log(),console.log("Examples:"),console.log(),console.log(c.gray(" # create a new project with an official template")),console.log(" $ picgo init plugin my-project"),console.log(),console.log(c.gray(" # create a new project straight from a github template")),console.log(" $ picgo init username/repo my-project"),console.log()}))}},de={handle:e=>{e.cmd.program.command("i18n").arguments("[lang]").description("change picgo language").action((async(t="")=>{const n=e.i18n.getLanguageList();if(!t){const t=[{type:"list",name:"i18n",choices:n,message:"Choose a language",default:e.getConfig("settings.language")||"zh-CN"}],r=await e.cmd.inquirer.prompt(t);return e.i18n.setLanguage(r.i18n),void e.log.success(`Language set to ${r.i18n}`)}if(!n.includes(t))return e.log.warn("No such language");e.i18n.setLanguage(t),e.log.success(`Language set to ${t}`)}))}};class _e{constructor(e){this.name=e,this.list=new Map,this.pluginIdMap=new Map}register(e,t){var n;if(!e)throw new TypeError("id is required!");if("function"!=typeof t.handle)throw new TypeError("plugin.handle must be a function!");if(this.list.has(e))throw new TypeError(`${this.name} duplicate id: ${e}!`);this.list.set(e,t),_e.currentPlugin&&(this.pluginIdMap.has(_e.currentPlugin)?null===(n=this.pluginIdMap.get(_e.currentPlugin))||void 0===n||n.push(e):this.pluginIdMap.set(_e.currentPlugin,[e]))}unregister(e){if(this.pluginIdMap.has(e)){const t=this.pluginIdMap.get(e);null==t||t.forEach((e=>{this.list.delete(e)}))}}getName(){return this.name}get(e){return this.list.get(e)}getList(){return[...this.list.values()]}getIdList(){return[...this.list.keys()]}}const Ie=(e=null)=>{_e.currentPlugin=e};class he{constructor(e){this.name="commander",this.list=new Map,this.pluginIdMap=new Map,this.program=new s,this.inquirer=o,this.ctx=e}getName(){return this.name}init(){var e;this.program.version("1.7.0","-v, --version").option("-d, --debug","debug mode",(()=>{this.ctx.setConfig({debug:!0})})).option("-s, --silent","silent mode",(()=>{this.ctx.setConfig({silent:!0})})).on("command:*",(()=>{this.ctx.log.error(`Invalid command: ${this.program.args.join(" ")}\nSee --help for a list of available commands.`),process.exit(1)})),(e=this.ctx).cmd.register("pluginHandler",F),e.cmd.register("config",k),e.cmd.register("setting",re),e.cmd.register("upload",te),e.cmd.register("use",ie),e.cmd.register("proxy",se),e.cmd.register("init",Ee),e.cmd.register("i18n",de)}register(e,t){var n;if(!e)throw new TypeError("name is required!");if("function"!=typeof t.handle)throw new TypeError("plugin.handle must be a function!");if(this.list.has(e))throw new TypeError(`${this.name} plugin duplicate id: ${e}!`);this.list.set(e,t);const r=_e.currentPlugin;null!==r&&(this.pluginIdMap.has(r)?null===(n=this.pluginIdMap.get(r))||void 0===n||n.push(e):this.pluginIdMap.set(r,[e]))}unregister(e){if(this.pluginIdMap.has(e)){const t=this.pluginIdMap.get(e);null==t||t.forEach((e=>{this.list.delete(e)}))}}loadCommands(){this.getList().forEach((e=>{try{e.handle(this.ctx)}catch(e){this.ctx.log.error(e)}}))}get(e){return this.list.get(e)}getList(){return[...this.list.values()]}getIdList(){return[...this.list.keys()]}}var me,fe,Pe;!function(e){e.success="success",e.info="info",e.warn="warn",e.error="error"}(me||(me={})),function(e){e.UPLOAD_PROGRESS="uploadProgress",e.FAILED="failed",e.BEFORE_TRANSFORM="beforeTransform",e.BEFORE_UPLOAD="beforeUpload",e.AFTER_UPLOAD="afterUpload",e.FINISHED="finished",e.INSTALL="install",e.UNINSTALL="uninstall",e.UPDATE="update",e.NOTIFICATION="notification"}(fe||(fe={})),function(e){e.CONFIG_CHANGE="CONFIG_CHANGE"}(Pe||(Pe={}));class Ce{constructor(e){this.level={[me.success]:"green",[me.info]:"blue",[me.warn]:"yellow",[me.error]:"red"},this.ctx=e}handleLog(e,...n){if(!this.ctx.getConfig("silent")){const r=c[this.level[e]](`[PicGo ${e.toUpperCase()}]:`);console.log(r,...n),this.logLevel=this.ctx.getConfig("settings.logLevel"),this.logPath=this.ctx.getConfig("settings.logPath")||t.join(this.ctx.baseDir,"./picgo.log"),setTimeout((()=>{try{const t=this.checkLogFileIsLarge(this.logPath);if(t.isLarge){const e=`Log file is too large (> ${t.logFileSizeLimit/1024/1024||"10"} MB), recreate log file`;console.log(c.yellow("[PicGo WARN]:"),e),this.recreateLogFile(this.logPath),n.unshift(e)}this.handleWriteLog(this.logPath,e,...n)}catch(e){console.error("[PicGo Error] on checking log file size",e)}}),0)}}checkLogFileIsLarge(t){if(e.existsSync(t)){const n=e.statSync(t).size,r=1024*((e=0)=>isNaN(Number(e))?0:Number(e))(this.ctx.getConfig("settings.logFileSizeLimit")||10)*1024;return{isLarge:n>r,logFileSize:n,logFileSizeLimit:r}}return{isLarge:!1}}recreateLogFile(t){e.existsSync(t)&&(e.unlinkSync(t),e.createFileSync(t))}handleWriteLog(t,n,...r){try{if(this.checkLogLevel(n,this.logLevel)){let i=`${_().format("YYYY-MM-DD HH:mm:ss")} [PicGo ${n.toUpperCase()}] `;r.forEach((e=>{e instanceof Error&&"error"===n?i+=`\n------Error Stack Begin------\n${I.format(null==e?void 0:e.stack)}\n-------Error Stack End------- `:("object"==typeof e&&(e=JSON.stringify(e,null,2)),i+=`${e} `)})),i+="\n",e.appendFileSync(t,i)}}catch(e){console.error("[PicGo Error] on writing log file",e)}}checkLogLevel(e,t){return void 0===t||"all"===t||(Array.isArray(t)?t.some((t=>t===e||"all"===t)):e===t)}success(...e){return this.handleLog(me.success,...e)}info(...e){return this.handleLog(me.info,...e)}error(...e){return this.handleLog(me.error,...e)}warn(...e){return this.handleLog(me.warn,...e)}debug(...e){"development"===process.env.NODE_ENV&&this.handleLog(me.info,...e)}}class Ue extends n{constructor(e){super(),this.ctx=e}async start(e){const t=(e=>({configPath:e.configPath,baseDir:e.baseDir,log:e.log,cmd:e.cmd,output:[],input:[],pluginLoader:e.pluginLoader,pluginHandler:e.pluginHandler,Request:e.Request,helper:e.helper,VERSION:e.VERSION,GUI_VERSION:e.GUI_VERSION,request:e.request,i18n:e.i18n,getConfig:e.getConfig.bind(e),saveConfig:e.saveConfig.bind(e),removeConfig:e.removeConfig.bind(e),setConfig:e.setConfig.bind(e),unsetConfig:e.unsetConfig.bind(e),upload:e.upload.bind(e),addListener:e.addListener.bind(e),on:e.on.bind(e),once:e.once.bind(e),removeListener:e.removeListener.bind(e),off:e.off.bind(e),removeAllListeners:e.removeAllListeners.bind(e),setMaxListeners:e.setMaxListeners.bind(e),getMaxListeners:e.getMaxListeners.bind(e),listeners:e.listeners.bind(e),rawListeners:e.rawListeners.bind(e),emit:e.emit.bind(e),listenerCount:e.listenerCount.bind(e),prependListener:e.prependListener.bind(e),prependOnceListener:e.prependOnceListener.bind(e),eventNames:e.eventNames.bind(e)}))(this.ctx);try{if(!Array.isArray(e))throw new Error("Input must be an array.");return t.input=e,t.output=[],await this.beforeTransform(t),await this.doTransform(t),await this.beforeUpload(t),await this.doUpload(t),await this.afterUpload(t),t}catch(e){if(t.log.warn(fe.FAILED),t.emit(fe.UPLOAD_PROGRESS,-1),t.emit(fe.FAILED,e),t.log.error(e),t.getConfig("debug"))throw e;return t}}async beforeTransform(e){return e.emit(fe.UPLOAD_PROGRESS,0),e.emit(fe.BEFORE_TRANSFORM,e),e.log.info("Before transform"),await this.handlePlugins(e.helper.beforeTransformPlugins,e),e}async doTransform(e){e.emit(fe.UPLOAD_PROGRESS,30);const t=e.getConfig("picBed.transformer")||"path";let n=t,r=e.helper.transformer.get(t);return r||(r=e.helper.transformer.get("path"),n="path",e.log.warn(`Can't find transformer - ${t}, switch to default transformer - path`)),e.log.info(`Transforming... Current transformer is [${n}]`),await(null==r?void 0:r.handle(e)),e}async beforeUpload(e){return e.emit(fe.UPLOAD_PROGRESS,60),e.log.info("Before upload"),e.emit(fe.BEFORE_UPLOAD,e),await this.handlePlugins(e.helper.beforeUploadPlugins,e),e}async doUpload(e){let t=e.getConfig("picBed.uploader")||e.getConfig("picBed.current")||"github",n=e.helper.uploader.get(t),r=t;n||(t="github",r="github",n=e.helper.uploader.get("github"),e.log.warn(`Can't find uploader - ${t}, switch to default uploader - github`)),e.log.info(`Uploading... Current uploader is [${r}]`),await(null==n?void 0:n.handle(e));for(const n of e.output)n.type=t;return e}async afterUpload(e){e.emit(fe.AFTER_UPLOAD,e),e.emit(fe.UPLOAD_PROGRESS,100),await this.handlePlugins(e.helper.afterUploadPlugins,e);let t="";const n=e.output.length;for(let r=0;r{try{t.log.info(`${i}: ${r[n]} running`),await e.handle(t)}catch(e){throw t.log.error(`${i}: ${r[n]} error`),e}}))),t}}const Ne=(e,t)=>{const n=e.secretId,r=e.secretKey,i=e.appId,s=e.bucket;let o,a="";if(e.version&&"v4"!==e.version){const n=Math.floor((new Date).getTime()/1e3);a=`${n};${n+86400}`;const i=h.createHmac("sha1",r).update(a).digest("hex"),s=`put\n/${e.path}${t}\n\nhost=${e.bucket}.cos.${e.area}.myqcloud.com\n`,l=`sha1\n${a}\n${h.createHash("sha1").update(s).digest("hex")}\n`;o=h.createHmac("sha1",i).update(l).digest("hex")}else{const e=Math.floor(1e10*Math.random()),t=Math.floor((new Date).getTime()/1e3)-1,a=`a=${i}&b=${s}&k=${n}&e=${t+3600}&t=${t}&r=${e}&f=`,l=h.createHmac("sha1",r).update(a).digest(),c=Buffer.concat([l,Buffer.from(a)]);o=Buffer.from(c).toString("base64")}return{signature:o,appId:i,bucket:s,signTime:a}},Le=(e,t,n,r,i)=>{const s=e.area,o=e.path;return e.version&&"v4"!==e.version?{method:"PUT",url:`http://${e.bucket}.cos.${e.area}.myqcloud.com/${encodeURIComponent(o)}${encodeURIComponent(t)}`,headers:{Authorization:`q-sign-algorithm=sha1&q-ak=${e.secretId}&q-sign-time=${n.signTime}&q-key-time=${n.signTime}&q-header-list=host&q-url-param-list=&q-signature=${n.signature}`,contentType:m.lookup(t),userAgent:`PicGo;${i};null;null`},body:r,resolveWithFullResponse:!0}:{method:"POST",url:`http://${s}.file.myqcloud.com/files/v2/${n.appId}/${n.bucket}/${encodeURI(o)}${t}`,headers:{Authorization:n.signature,contentType:"multipart/form-data",userAgent:`PicGo;${i};null;null`},formData:{op:"upload",filecontent:r},resolveWithFullResponse:!0}},Se=async e=>{var t,n,r;const i=e.getConfig("picBed.tcyun");if(!i)throw new Error("Can't find tencent COS config");try{const s=e.output,o=i.customUrl,a=i.path,l=!i.version||"v4"===i.version;for(const c of s)if(c.fileName&&c.buffer){const s=Ne(i,c.fileName);if(!s)return!1;let u=c.buffer;!u&&c.base64Image&&(u=Buffer.from(c.base64Image,"base64"));const p=Le(i,c.fileName,s,u,e.GUI_VERSION||e.VERSION),g=await e.request(p).then((e=>e)).catch((t=>({statusCode:400,body:{msg:e.i18n.translate("AUTH_FAILED"),err:t}})));let E;if(E=l&&"string"==typeof g?JSON.parse(g):g,400===E.statusCode)throw(null===(t=null==E?void 0:E.body)||void 0===t?void 0:t.err)?E.body.err:new Error((null===(n=null==E?void 0:E.body)||void 0===n?void 0:n.msg)||(null===(r=null==E?void 0:E.body)||void 0===r?void 0:r.message));const d=i.options||"";if(l&&"SUCCESS"===E.message)delete c.base64Image,delete c.buffer,c.imgUrl=o?`${o}/${a}${c.fileName}`:`${E.data.source_url}${d}`;else{if(l||!E||200!==E.statusCode)throw new Error(g.body.msg);delete c.base64Image,delete c.buffer,c.imgUrl=o?`${o}/${encodeURI(a)}${encodeURI(c.fileName)}${d}`:`https://${i.bucket}.cos.${i.area}.myqcloud.com/${encodeURI(a)}${encodeURI(c.fileName)}${d}`}}return e}catch(t){if(!i.version||"v4"===i.version)try{const n=JSON.parse(t.error);e.emit(fe.NOTIFICATION,{title:e.i18n.translate("UPLOAD_FAILED"),body:e.i18n.translate("UPLOAD_FAILED_REASON",{code:n.code}),text:"https://cloud.tencent.com/document/product/436/8432"})}catch(e){}throw t}},De=e=>{const t=e.getConfig("picBed.tcyun")||{};return[{name:"version",type:"list",alias:e.i18n.translate("PICBED_TENCENTCLOUD_VERSION"),choices:["v4","v5"],default:"v5",required:!1},{name:"secretId",type:"input",get alias(){return e.i18n.translate("PICBED_TENCENTCLOUD_SECRETID")},default:t.secretId||"",required:!0},{name:"secretKey",type:"password",get alias(){return e.i18n.translate("PICBED_TENCENTCLOUD_SECRETKEY")},default:t.secretKey||"",required:!0},{name:"bucket",type:"input",get alias(){return e.i18n.translate("PICBED_TENCENTCLOUD_BUCKET")},default:t.bucket||"",required:!0},{name:"appId",type:"input",get prefix(){return e.i18n.translate("PICBED_TENCENTCLOUD_APPID")},get alias(){return e.i18n.translate("PICBED_TENCENTCLOUD_APPID")},default:t.appId||"",get message(){return e.i18n.translate("PICBED_TENCENTCLOUD_MESSAGE_APPID")},required:!0},{name:"area",type:"input",get prefix(){return e.i18n.translate("PICBED_TENCENTCLOUD_AREA")},get alias(){return e.i18n.translate("PICBED_TENCENTCLOUD_AREA")},default:t.area||"",get message(){return e.i18n.translate("PICBED_TENCENTCLOUD_MESSAGE_AREA")},required:!0},{name:"path",type:"input",get prefix(){return e.i18n.translate("PICBED_TENCENTCLOUD_PATH")},get alias(){return e.i18n.translate("PICBED_TENCENTCLOUD_PATH")},default:t.path||"",get message(){return e.i18n.translate("PICBED_TENCENTCLOUD_MESSAGE_PATH")},required:!1},{name:"customUrl",type:"input",get prefix(){return e.i18n.translate("PICBED_TENCENTCLOUD_CUSTOMURL")},get alias(){return e.i18n.translate("PICBED_TENCENTCLOUD_CUSTOMURL")},default:t.customUrl||"",get message(){return e.i18n.translate("PICBED_TENCENTCLOUD_MESSAGE_CUSTOMURL")},required:!1},{name:"options",type:"input",default:t.options||"",get prefix(){return e.i18n.translate("PICBED_TENCENTCLOUD_OPTIONS")},get alias(){return e.i18n.translate("PICBED_TENCENTCLOUD_OPTIONS")},get message(){return e.i18n.translate("PICBED_TENCENTCLOUD_MESSAGE_OPTIONS")},required:!1}]};const Ae=(e,t,n)=>{const r=t.path||"",{token:i,repo:s}=t;return{method:"PUT",url:`https://api.github.com/repos/${s}/contents/${encodeURI(r)}${encodeURI(e)}`,headers:{Authorization:`token ${i}`,"User-Agent":"PicGo","Content-Type":m.lookup(e)},body:n,json:!0}},Te=async e=>{const t=e.getConfig("picBed.github");if(!t)throw new Error("Can't find github config");try{const n=e.output;for(const r of n)if(r.fileName&&r.buffer){const n=r.base64Image||Buffer.from(r.buffer).toString("base64"),i={message:"Upload by PicGo",branch:t.branch,content:n,path:t.path+encodeURI(r.fileName)},s=Ae(r.fileName,t,i),o=await e.request(s);if(!o)throw new Error("Server error, please try again");delete r.base64Image,delete r.buffer,t.customUrl?r.imgUrl=`${t.customUrl}/${t.path}${r.fileName}`:r.imgUrl=o.content.download_url}return e}catch(t){throw e.emit(fe.NOTIFICATION,{title:e.i18n.translate("UPLOAD_FAILED"),body:e.i18n.translate("CHECK_SETTINGS_AND_NETWORK")}),t}},ye=e=>{const t=e.getConfig("picBed.github")||{};return[{name:"repo",type:"input",get prefix(){return e.i18n.translate("PICBED_GITHUB_REPO")},get alias(){return e.i18n.translate("PICBED_GITHUB_REPO")},get message(){return e.i18n.translate("PICBED_GITHUB_MESSAGE_REPO")},default:t.repo||"",required:!0},{name:"branch",type:"input",get prefix(){return e.i18n.translate("PICBED_GITHUB_BRANCH")},get alias(){return e.i18n.translate("PICBED_GITHUB_BRANCH")},get message(){return e.i18n.translate("PICBED_GITHUB_MESSAGE_BRANCH")},default:t.branch||"master",required:!0},{name:"token",type:"password",get alias(){return e.i18n.translate("PICBED_GITHUB_TOKEN")},default:t.token||"",required:!0},{name:"path",type:"input",get prefix(){return e.i18n.translate("PICBED_GITHUB_PATH")},get alias(){return e.i18n.translate("PICBED_GITHUB_PATH")},get message(){return e.i18n.translate("PICBED_GITHUB_MESSAGE_PATH")},default:t.path||"",required:!1},{name:"customUrl",type:"input",get prefix(){return e.i18n.translate("PICBED_GITHUB_CUSTOMURL")},get alias(){return e.i18n.translate("PICBED_GITHUB_CUSTOMURL")},get message(){return e.i18n.translate("PICBED_GITHUB_MESSAGE_CUSTOMURL")},default:t.customUrl||"",required:!1}]};function Oe(e,t,n,r){const i=function(e){return"z0"===e?"":"-"+e}(e.area||"z0"),s=e.path||"";return{method:"POST",url:`http://upload${i}.qiniup.com/putb64/-1/key/${Buffer.from(s+t,"utf-8").toString("base64").replace(/\+/g,"-").replace(/\//g,"_")}`,headers:{Authorization:`UpToken ${n}`,"Content-Type":m.lookup(t)||"application/octet-stream"},body:r}}function Be(e){const t=e.accessKey,n=e.secretKey,r=new f.auth.digest.Mac(t,n),i={scope:e.bucket};return new f.rs.PutPolicy(i).uploadToken(r)}const be=async e=>{const t=e.getConfig("picBed.qiniu");if(!t)throw new Error("Can't find qiniu config");try{const n=e.output;for(const r of n)if(r.fileName&&r.buffer){const n=r.base64Image||Buffer.from(r.buffer).toString("base64"),i=Oe(t,r.fileName,Be(t),n),s=await e.request(i),o=JSON.parse(s);if(!(null==o?void 0:o.key))throw e.emit(fe.NOTIFICATION,{title:e.i18n.translate("UPLOAD_FAILED"),body:o.msg}),e.log.error("qiniu error",o),new Error("Upload failed");{delete r.base64Image,delete r.buffer;const e=t.url,n=t.options;r.imgUrl=`${e}/${o.key}${n}`}}return e}catch(t){if("Upload failed"!==t.message&&t.response){const n=t.response.body;e.emit(fe.NOTIFICATION,{title:e.i18n.translate("UPLOAD_FAILED"),body:n.error})}throw t}},xe=e=>{const t=e.getConfig("picBed.qiniu")||{};return[{name:"accessKey",type:"input",get alias(){return e.i18n.translate("PICBED_QINIU_ACCESSKEY")},default:t.accessKey||"",required:!0},{name:"secretKey",type:"password",get alias(){return e.i18n.translate("PICBED_QINIU_SECRETKEY")},default:t.secretKey||"",required:!0},{name:"bucket",type:"input",get alias(){return e.i18n.translate("PICBED_QINIU_BUCKET")},default:t.bucket||"",required:!0},{name:"url",type:"input",get prefix(){return e.i18n.translate("PICBED_QINIU_URL")},get alias(){return e.i18n.translate("PICBED_QINIU_URL")},get message(){return e.i18n.translate("PICBED_QINIU_MESSAGE_URL")},default:t.url||"",required:!0},{name:"area",type:"input",get prefix(){return e.i18n.translate("PICBED_QINIU_AREA")},get alias(){return e.i18n.translate("PICBED_QINIU_AREA")},get message(){return e.i18n.translate("PICBED_QINIU_MESSAGE_AREA")},default:t.area||"",required:!0},{name:"options",type:"input",get prefix(){return e.i18n.translate("PICBED_QINIU_OPTIONS")},get alias(){return e.i18n.translate("PICBED_QINIU_OPTIONS")},get message(){return e.i18n.translate("PICBED_QINIU_MESSAGE_OPTIONS")},default:t.options||"",required:!1},{name:"path",type:"input",get prefix(){return e.i18n.translate("PICBED_QINIU_PATH")},get alias(){return e.i18n.translate("PICBED_QINIU_PATH")},get message(){return e.i18n.translate("PICBED_QINIU_MESSAGE_PATH")},default:t.path||"",required:!1}]};const we=e=>{let t=e;return t instanceof ArrayBuffer&&(t=U(t)),t},Re=(e,t)=>{const n=(new Date).toUTCString(),r=m.lookup(t);if(!r)throw Error(`No mime type found for file ${t}`);const i=`PUT\n\n${r}\n${n}\n/${e.bucket}/${e.path}${t}`,s=h.createHmac("sha1",e.accessKeySecret).update(i).digest("base64");return`OSS ${e.accessKeyId}:${s}`},Ge=(e,t,n,r)=>({method:"PUT",url:`https://${e.bucket}.${e.area}.aliyuncs.com/${encodeURI(e.path)}${encodeURI(t)}`,headers:{Host:`${e.bucket}.${e.area}.aliyuncs.com`,Authorization:n,Date:(new Date).toUTCString(),"Content-Type":m.lookup(t)},body:r,resolveWithFullResponse:!0}),$e=async e=>{var t;e||await(async e=>{const t=e.getConfig("picBed.aliyun");if(!t)throw new Error("Can't find aliYun OSS config");try{const n=e.output,r=t.customUrl,i=t.path;for(const s of n)if(s.fileName&&s.buffer){const n=Re(t,s.fileName);let o=s.buffer;!o&&s.base64Image&&(o=Buffer.from(s.base64Image,"base64"));const a=Ge(t,s.fileName,n,o);if(200!==(await e.request(a)).statusCode)throw new Error("Upload failed");{delete s.base64Image,delete s.buffer;const e=t.options||"";s.imgUrl=r?`${r}/${i}${s.fileName}${e}`:`https://${t.bucket}.${t.area}.aliyuncs.com/${i}${s.fileName}${e}`}}return e}catch(t){throw e.emit(fe.NOTIFICATION,{title:e.i18n.translate("UPLOAD_FAILED"),body:e.i18n.translate("CHECK_SETTINGS")}),t}})(e),console.warn("Using stream mode for aliyun upload, added by terwer, see https://github.com/terwer/Electron-PicGo-Core/blob/dev/src/plugins/uploader/aliyun.ts#L76");const n=e.getConfig("picBed.aliyun");if(!n)throw new Error("Can't find aliYun OSS config");try{const r=new P({region:n.area,accessKeyId:n.accessKeyId,accessKeySecret:n.accessKeySecret,bucket:n.bucket}),i=e.output,s=n.customUrl,o=n.path;for(const e of i)if(e.fileName&&e.buffer){let i=we(e.buffer);!i&&e.base64Image&&(i=Buffer.from(e.base64Image,"base64"));const a=n.options||"",l=`${o}${e.fileName}${a}`,c=C.from(i),u=await r.putStream(l,c);if(console.log("Using aliyun SDK for upload add by terwer, result=>",u),!(null===(t=null==u?void 0:u.res)||void 0===t?void 0:t.status)||200!==u.res.status)throw new Error("Upload failed");delete e.base64Image,delete e.buffer,e.imgUrl=s?`${s}/${o}${e.fileName}${a}`:`https://${n.bucket}.${n.area}.aliyuncs.com/${o}${e.fileName}${a}`}return e}catch(t){throw e.emit(fe.NOTIFICATION,{title:e.i18n.translate("UPLOAD_FAILED"),body:e.i18n.translate("CHECK_SETTINGS")}),t}},Me=e=>{const t=e.getConfig("picBed.aliyun")||{};return[{name:"accessKeyId",type:"input",get alias(){return e.i18n.translate("PICBED_ALICLOUD_ACCESSKEYID")},default:t.accessKeyId||"",required:!0},{name:"accessKeySecret",type:"password",get alias(){return e.i18n.translate("PICBED_ALICLOUD_ACCESSKEYSECRET")},default:t.accessKeySecret||"",required:!0},{name:"bucket",type:"input",get alias(){return e.i18n.translate("PICBED_ALICLOUD_BUCKET")},default:t.bucket||"",required:!0},{name:"area",type:"input",get prefix(){return e.i18n.translate("PICBED_ALICLOUD_AREA")},get alias(){return e.i18n.translate("PICBED_ALICLOUD_AREA")},default:t.area||"",get message(){return e.i18n.translate("PICBED_ALICLOUD_MESSAGE_AREA")},required:!0},{name:"path",type:"input",get prefix(){return e.i18n.translate("PICBED_ALICLOUD_PATH")},get alias(){return e.i18n.translate("PICBED_ALICLOUD_PATH")},get message(){return e.i18n.translate("PICBED_ALICLOUD_MESSAGE_PATH")},default:t.path||"",required:!1},{name:"customUrl",type:"input",get prefix(){return e.i18n.translate("PICBED_ALICLOUD_CUSTOMURL")},get alias(){return e.i18n.translate("PICBED_ALICLOUD_CUSTOMURL")},get message(){return e.i18n.translate("PICBED_ALICLOUD_MESSAGE_CUSTOMURL")},default:t.customUrl||"",required:!1},{name:"options",type:"input",get prefix(){return e.i18n.translate("PICBED_ALICLOUD_OPTIONS")},get alias(){return e.i18n.translate("PICBED_ALICLOUD_OPTIONS")},get message(){return e.i18n.translate("PICBED_ALICLOUD_MESSAGE_OPTIONS")},default:t.options||"",required:!1}]};const ve=(e,t)=>{const n=e.path||"",r=e.operator,i=e.password,s=N(i),o=(new Date).toUTCString(),a=`PUT&${`/${e.bucket}/${encodeURI(n)}${encodeURI(t)}`}&${o}`;return`UPYUN ${r}:${h.createHmac("sha1",s).update(a).digest("base64")}`},He=(e,t,n,r)=>{const i=e.bucket,s=e.path||"";return{method:"PUT",url:`https://v0.api.upyun.com/${i}/${encodeURI(s)}${encodeURI(t)}`,headers:{Authorization:n,Date:(new Date).toUTCString(),"Content-Type":m.lookup(t)||"application/octet-stream"},body:r,resolveWithFullResponse:!0}},Fe=async e=>{e||await(async e=>{const t=e.getConfig("picBed.upyun");if(!t)throw new Error("Can't find upYun config");try{const n=e.output,r=t.path||"";for(const i of n)if(i.fileName&&i.buffer){let n=i.buffer;!n&&i.base64Image&&(n=Buffer.from(i.base64Image,"base64"));const s=ve(t,i.fileName),o=He(t,i.fileName,s,n);if(200!==(await e.request(o)).statusCode)throw new Error("Upload failed");delete i.base64Image,delete i.buffer,i.imgUrl=`${t.url}/${r}${i.fileName}${t.options}`}return e}catch(t){if("Upload failed"===t.message)e.emit(fe.NOTIFICATION,{title:e.i18n.translate("UPLOAD_FAILED"),body:e.i18n.translate("CHECK_SETTINGS")});else{const n=ee(t.error);e.emit(fe.NOTIFICATION,{title:e.i18n.translate("UPLOAD_FAILED"),body:e.i18n.translate("UPLOAD_FAILED_REASON",{code:"object"==typeof n?n.code:n}),text:"http://docs.upyun.com/api/errno/"})}throw t}})(e),console.warn("Using stream mode for upyun upload, added by terwer, see https://github.com/terwer/Electron-PicGo-Core/blob/dev/src/plugins/uploader/upyun.ts#L88");const t=e.getConfig("picBed.upyun");if(!t)throw new Error("Can't find upYun config");try{const n=t.bucket,r=t.operator,i=t.password,s=new L.Service(n,r,i),o=new L.Client(s),a=e.output;for(const e of a)if(e.fileName&&e.buffer){let n=we(e.buffer);!n&&e.base64Image&&(n=Buffer.from(e.base64Image,"base64"));const r=t.path||"",i=`${r}${e.fileName}${t.options}`,s=C.from(n),a=await o.putFile(i,s);if(console.log("Using upyun SDK for upload add by terwer, res=>",a),!a)throw new Error("Upload failed");delete e.base64Image,delete e.buffer,e.imgUrl=`${t.url}/${r}${e.fileName}${t.options}`}return e}catch(t){if("Upload failed"===t.message)e.emit(fe.NOTIFICATION,{title:e.i18n.translate("UPLOAD_FAILED"),body:e.i18n.translate("CHECK_SETTINGS")});else{const n=ee(t.error);e.emit(fe.NOTIFICATION,{title:e.i18n.translate("UPLOAD_FAILED"),body:e.i18n.translate("UPLOAD_FAILED_REASON",{code:"object"==typeof n?n.code:n}),text:"http://docs.upyun.com/api/errno/"})}throw t}},ke=e=>{const t=e.getConfig("picBed.upyun")||{};return[{name:"bucket",type:"input",get alias(){return e.i18n.translate("PICBED_UPYUN_BUCKET")},default:t.bucket||"",required:!0},{name:"operator",type:"input",get alias(){return e.i18n.translate("PICBED_UPYUN_OPERATOR")},get prefix(){return e.i18n.translate("PICBED_UPYUN_OPERATOR")},get message(){return e.i18n.translate("PICBED_UPYUN_MESSAGE_OPERATOR")},default:t.operator||"",required:!0},{name:"password",type:"password",get prefix(){return e.i18n.translate("PICBED_UPYUN_MESSAGE_PASSWORD")},get alias(){return e.i18n.translate("PICBED_UPYUN_PASSWORD")},get message(){return e.i18n.translate("PICBED_UPYUN_MESSAGE_PASSWORD")},default:t.password||"",required:!0},{name:"url",type:"input",get alias(){return e.i18n.translate("PICBED_UPYUN_URL")},get message(){return e.i18n.translate("PICBED_UPYUN_MESSAGE_URL")},default:t.url||"",required:!0},{name:"options",type:"input",get prefix(){return e.i18n.translate("PICBED_UPYUN_OPTIONS")},get alias(){return e.i18n.translate("PICBED_UPYUN_OPTIONS")},get message(){return e.i18n.translate("PICBED_UPYUN_MESSAGE_OPTIONS")},default:t.options||"",required:!1},{name:"path",type:"input",get prefix(){return e.i18n.translate("PICBED_UPYUN_PATH")},get alias(){return e.i18n.translate("PICBED_UPYUN_PATH")},get message(){return e.i18n.translate("PICBED_UPYUN_MESSAGE_PATH")},default:t.path||"",required:!1}]};const Ke=()=>({register(e){!function(e){e.helper.uploader.register("aliyun",{get name(){return e.i18n.translate("PICBED_ALICLOUD")},handle:$e,config:Me})}(e),function(e){e.helper.uploader.register("tcyun",{get name(){return e.i18n.translate("PICBED_TENCENTCLOUD")},handle:Se,config:De})}(e),function(e){e.helper.uploader.register("github",{get name(){return e.i18n.translate("PICBED_GITHUB")},handle:Te,config:ye})}(e),function(e){e.helper.uploader.register("qiniu",{get name(){return e.i18n.translate("PICBED_QINIU")},handle:be,config:xe})}(e),function(e){e.helper.uploader.register("upyun",{get name(){return e.i18n.translate("PICBED_UPYUN")},handle:Fe,config:ke})}(e)}}),qe=(e,t,n)=>{const r=Y(t);return r.real||(e.log.warn(`can't get ${n}'s image size`),e.log.warn("fallback to 200 * 200")),r};var Ye={handle:async n=>{const r=n.output;return await Promise.all(n.input.map((async(i,s)=>{let o;if(o=K(i)?await(async(e,n)=>{e=q(e);let r,i=!1,s="";const o=new Promise(((o,a)=>{(async()=>{var a;try{const a=await n.request({method:"get",url:e,resolveWithFullResponse:!0,responseType:"arraybuffer"}).then((e=>{const t=e.headers["content-type"];return(null==t?void 0:t.includes("image"))&&(i=!0,s=`.${t.split("image/")[1]}`),e.data}));if(clearTimeout(r),i){const n=new l(e).pathname;o({buffer:a,fileName:t.basename(n),extname:s,success:!0})}else o({success:!1,reason:`${e} is not image`})}catch(t){clearTimeout(r),o({success:!1,reason:`request ${e} error, ${null!==(a=null==t?void 0:t.message)&&void 0!==a?a:""}`})}})().catch(a)})),a=new Promise((t=>{r=setTimeout((()=>{t({success:!1,reason:`request ${e} timeout`})}),1e4)}));return Promise.race([o,a])})(i,n):await(async n=>{try{return{extname:t.extname(n),fileName:t.basename(n),buffer:await e.readFile(n),success:!0}}catch(e){return{reason:`read file ${n} error`,success:!1}}})(i),!o.success||!o.buffer)throw new Error(o.reason);{const e=qe(n,o.buffer,i);r[s]={buffer:o.buffer,fileName:o.fileName,width:e.width,height:e.height,extname:o.extname}}}))),n.output=r.filter((e=>e)),n}};var je={handle:async e=>(e.output.push(...e.input),e)};class Qe{constructor(e){this.list=[],this.fullList=new Set,this.pluginMap=new Map,this.ctx=e,this.init()}init(){const n=t.join(this.ctx.baseDir,"package.json");if(!e.existsSync(n)){const t={name:"picgo-plugins",description:"picgo-plugins",repository:"https://github.com/PicGo/PicGo-Core",license:"MIT"};e.writeFileSync(n,JSON.stringify(t),"utf8")}}resolvePlugin(e,n){try{return S.sync(n,{basedir:e.baseDir})}catch(r){return t.join(e.baseDir,"node_modules",n)}}load(){const n=t.join(this.ctx.baseDir,"package.json"),r=t.join(this.ctx.baseDir,"node_modules/");if(!e.existsSync(r))return!1;const i=e.readJSONSync(n),s=Object.keys(i.dependencies||{}),o=Object.keys(i.devDependencies||{}),a=s.concat(o).filter((t=>{if(!/^picgo-plugin-|^@[^/]+\/picgo-plugin-/.test(t))return!1;const n=this.resolvePlugin(this.ctx,t);return e.existsSync(n)}));for(const e of a)this.registerPlugin(e);return!0}registerPlugin(e,t){if(e&&"string"==typeof e){console.log("Start registering plugin "+e+" ..."),this.fullList.add(e);try{if(t){this.list.push(e),Ie(e);const n=t(this.ctx);this.pluginMap.set(e,n),n.register(this.ctx)}else if(!0===this.ctx.getConfig(`picgoPlugins.${e}`)||void 0===this.ctx.getConfig(`picgoPlugins.${e}`)){this.list.push(e),Ie(e),this.getPlugin(e).register(this.ctx);const t=`picgoPlugins[${e}]`;this.ctx.saveConfig({[t]:!0})}}catch(t){this.pluginMap.delete(e),this.list=this.list.filter((t=>t!==e)),this.fullList.delete(e),this.ctx.log.error(t),this.ctx.emit(fe.NOTIFICATION,{title:`Plugin ${e} Load Error`,body:t})}}else this.ctx.log.warn("Please provide valid plugin")}unregisterPlugin(e){this.list=this.list.filter((t=>t!==e)),this.fullList.delete(e),this.pluginMap.delete(e),Ie(e),this.ctx.helper.uploader.unregister(e),this.ctx.helper.transformer.unregister(e),this.ctx.helper.beforeTransformPlugins.unregister(e),this.ctx.helper.beforeUploadPlugins.unregister(e),this.ctx.helper.afterUploadPlugins.unregister(e),this.ctx.cmd.unregister(e),this.ctx.removeConfig("picgoPlugins",e)}getPlugin(e){if(this.pluginMap.has(e))return this.pluginMap.get(e);const n=t.join(this.ctx.baseDir,"node_modules/");console.log("Start requiring plugin lib, pluginDir",n),console.log("Start requiring plugin lib, name",e);const r=require(n+e)(this.ctx);return this.pluginMap.set(e,r),r}getList(){return this.list}hasPlugin(e){return this.fullList.has(e)}getFullList(){return[...this.fullList]}}const We="picgo-clipboard-images",ze={darwin:'-- From https://github.com/mushanshitiancai/vscode-paste-image\nproperty fileTypes : {{«class PNGf», ".png"}}\n\non run argv\n\tif argv is {} then\n\t\treturn ""\n\tend if\n\n\tif ((clipboard info) as string) contains "«class furl»" then\n\t\treturn POSIX path of (the clipboard as «class furl»)\n\telse\n\t\tset imagePath to (item 1 of argv)\n\t\tset theType to getType()\n\n\t\tif theType is not missing value then\n\t\t\ttry\n\t\t\t\tset myFile to (open for access imagePath with write permission)\n\t\t\t\tset eof myFile to 0\n\t\t\t\twrite (the clipboard as (first item of theType)) to myFile\n\t\t\t\tclose access myFile\n\t\t\t\treturn (POSIX path of imagePath)\n\t\t\ton error\n\t\t\t\ttry\n\t\t\t\t\tclose access myFile\n\t\t\t\tend try\n\t\t\t\treturn "no image"\n\t\t\tend try\n\t\telse\n\t\t\treturn "no image"\n\t\tend if\n\tend if\nend run\n\non getType()\n\trepeat with aType in fileTypes\n\t\trepeat with theInfo in (clipboard info)\n\t\t\tif (first item of theInfo) is equal to (first item of aType) then return aType\n\t\tend repeat\n\tend repeat\n\treturn missing value\nend getType\n',win32:'\nparam($imagePath)\n\n# Adapted from https://github.com/octan3/img-clipboard-dump/blob/master/dump-clipboard-png.ps1\n\nAdd-Type -Assembly PresentationCore\n$img = [Windows.Clipboard]::GetImage()\n\nif ($img -eq $null) {\n "no image"\n Exit 1\n}\n\nif (-not $imagePath) {\n "no image"\n Exit 1\n}\n\n$fcb = new-object Windows.Media.Imaging.FormatConvertedBitmap($img, [Windows.Media.PixelFormats]::Rgb24, $null, 0)\n$stream = [IO.File]::Open($imagePath, "OpenOrCreate")\n$encoder = New-Object Windows.Media.Imaging.PngBitmapEncoder\n$encoder.Frames.Add([Windows.Media.Imaging.BitmapFrame]::Create($fcb)) | out-null\n$encoder.Save($stream) | out-null\n$stream.Dispose() | out-null\n\n$imagePath\n',win10:'# Adapted from https://github.com/octan3/img-clipboard-dump/blob/master/dump-clipboard-png.ps1\nparam($imagePath)\n\n# https://github.com/PowerShell/PowerShell/issues/7233\n# fix the output encoding bug\n[console]::InputEncoding = [console]::OutputEncoding = New-Object System.Text.UTF8Encoding\n\nAdd-Type -Assembly PresentationCore\nfunction main {\n $img = [Windows.Clipboard]::GetImage()\n\n if ($img -eq $null) {\n "no image"\n Exit 1\n }\n\n if (-not $imagePath) {\n "no image"\n Exit 1\n }\n\n $fcb = new-object Windows.Media.Imaging.FormatConvertedBitmap($img, [Windows.Media.PixelFormats]::Rgb24, $null, 0)\n $stream = [IO.File]::Open($imagePath, "OpenOrCreate")\n $encoder = New-Object Windows.Media.Imaging.PngBitmapEncoder\n $encoder.Frames.Add([Windows.Media.Imaging.BitmapFrame]::Create($fcb)) | out-null\n $encoder.Save($stream) | out-null\n $stream.Dispose() | out-null\n\n $imagePath\n # fix windows 10 native cmd crash bug when "picgo upload"\n # https://github.com/PicGo/PicGo-Core/issues/32\n Exit 1\n}\n\ntry {\n # For WIN10\n $file = Get-Clipboard -Format FileDropList\n if ($file -ne $null) {\n Convert-Path $file\n Exit 1\n }\n} catch {\n # For WIN7 WIN8 WIN10\n main\n}\n\nmain',linux:'#!/bin/sh\n\nif [ -z "$DISPLAY" ]; then\n echo "no support" >&2\n exit 1\nfi\n\ncase "$XDG_SESSION_TYPE" in\nwayland)\n command -v wl-copy >/dev/null 2>&1 || {\n echo >&2 "no wl-clipboard"\n exit 1\n }\n filePath=$(wl-copy -o 2>/dev/null | grep ^file:// | cut -c8-)\n if [ -z "$filePath" ]; then\n if\n wl-copy -t image/png image/png -o >"$1" 2>/dev/null\n then\n echo "$1"\n else\n rm -f "$1"\n echo "no image"\n fi\n else\n echo "$filePath"\n fi\n ;;\nx11 | tty)\n # require xclip(see http://stackoverflow.com/questions/592620/check-if-a-program-exists-from-a-bash-script/677212#677212)\n command -v xclip >/dev/null 2>&1 || {\n echo >&2 "no xclip"\n exit 1\n }\n # write image in clipboard to file (see http://unix.stackexchange.com/questions/145131/copy-image-from-clipboard-to-file)\n filePath=$(xclip -selection clipboard -o 2>/dev/null | grep ^file:// | cut -c8-)\n if [ -z "$filePath" ]; then\n if\n xclip -selection clipboard -target image/png -o >"$1" 2>/dev/null\n then\n echo "$1"\n else\n rm -f "$1"\n echo "no image"\n fi\n else\n echo "$filePath"\n fi\n ;;\nesac\n',wsl:'#!/bin/sh\n# grab the paths\nscriptPath=$(echo $0 | awk \'{ print substr( $0, 1, length($0)-6 ) }\')"windows10.ps1"\nimagePath=$(echo $1 | awk \'{ print substr( $0, 1, length($0)-18 ) }\')\nimageName=$(echo $1 | awk \'{ print substr( $0, length($0)-17, length($0) ) }\')\n\n# run the powershell script\nres=$(powershell.exe -noprofile -noninteractive -nologo -sta -executionpolicy unrestricted -file $(wslpath -w $scriptPath) $(wslpath -w $imagePath)"\\\\"$imageName)\n\n# note that there is a return symbol in powershell result\nnoImage=$(echo "no image\\r")\n\n# check whether image exists\nif [ "$res" = "$noImage" ] ;then\n echo "no image"\nelse\n echo $(wslpath -u -a "${res}")\nfi\n'},Ve={darwin:"mac.applescript",win32:"windows.ps1",win10:"windows10.ps1",linux:"linux.sh",wsl:"wsl.sh"};const Je=async n=>{!function(n){const r=t.join(n.baseDir,We);e.existsSync(r)||e.mkdirSync(r)}(n);const i=t.join(n.baseDir,We,`${_().format("YYYYMMDDHHmmss")}.png`);return await new Promise(((s,o)=>{const a=(()=>{const e=process.platform;if(B)return"wsl";if("win32"===e)return"10"===r.release().split(".")[0]?"win10":"win32";return"darwin"===e?"darwin":"linux"})(),l=t.join(n.baseDir,Ve[a]);let c;e.existsSync(l)||e.writeFileSync(l,ze[a],"utf8"),c="darwin"===a?O("osascript",[l,i]):"win32"===a||"win10"===a?O("powershell",["-noprofile","-noninteractive","-nologo","-sta","-executionpolicy","unrestricted","-file",l,i]):O("sh",[l,i]),c.stdout.on("data",(r=>{if("linux"===a&&"no xclip or wl-clipboard"===r.toString().trim())return n.emit(fe.NOTIFICATION,{title:"xclip or wl-clipboard not found",body:"Please install xclip(for x11) or wl-clipboard(for wayland) before run picgo"}),o(new Error("Please install xclip(for x11) or wl-clipboard(for wayland) before run picgo"));const l=r.toString().trim();let c=!1;if(t.basename(l)!==t.basename(i)&&e.existsSync(l)&&(c=!0),"no image"!==l&&!e.existsSync(l))return o(new Error(`Can't find ${l}`));s({imgPath:l,shouldKeepAfterUploading:c})}))}))},Xe=new n,Ze=new w.Agent({maxVersion:"TLSv1.2",minVersion:"TLSv1.2"});function et(e,t,n){"object"==typeof n&&"value"in n&&"options"in n?e.append(t,n.value,n.options):e.append(t,n)}function tt(e){return Object.assign(Object.assign({},e),{statusCode:e.status,body:e.data})}function nt(e){var t,n,r,i,s,o,a;const l={method:(null===(n=null===(t=null==e?void 0:e.config)||void 0===t?void 0:t.method)||void 0===n?void 0:n.toUpperCase())||"",url:(null===(r=null==e?void 0:e.config)||void 0===r?void 0:r.url)||"",statusCode:(null===(i=null==e?void 0:e.response)||void 0===i?void 0:i.status)||0,message:(null==e?void 0:e.message)||"",stack:(null==e?void 0:e.stack)||{},response:{status:(null===(s=null==e?void 0:e.response)||void 0===s?void 0:s.status)||0,statusCode:(null===(o=null==e?void 0:e.response)||void 0===o?void 0:o.status)||0,body:(null===(a=null==e?void 0:e.response)||void 0===a?void 0:a.data)||""}};return Promise.reject(l)}class rt{constructor(e){this.proxy="",this.options={},this.ctx=e,this.init(),Xe.on(Pe.CONFIG_CHANGE,(e=>{var t;switch(e.configName){case"picBed":(null===(t=e.value)||void 0===t?void 0:t.proxy)&&(this.proxy=e.value.proxy);break;case"picBed.proxy":this.proxy=e.value}}))}init(){const e=this.ctx.getConfig("picBed.proxy");e&&(this.proxy=e)}handleProxy(){if(this.proxy)try{const e=new l(this.proxy);return{host:e.hostname,port:parseInt(e.port||"0",10),protocol:e.protocol}}catch(e){console.error(e)}return!1}request(e){var t;this.options.proxy=this.handleProxy(),this.options.headers=e.headers||{},this.options.maxBodyLength=1/0,this.options.maxContentLength=1/0,this.options.proxy&&(null===(t=e.url)||void 0===t?void 0:t.startsWith("https://"))?(this.options.httpsAgent=R.httpsOverHttp({proxy:{host:this.options.proxy.host,port:this.options.proxy.port}}),this.options.proxy=!1):this.options.httpsAgent=Ze;const n=b.create(this.options);n.interceptors.response.use(tt,nt);const r=function(e){var t;let n=!1;const r=Object.assign(Object.assign({},e),{url:e.url||"",headers:e.headers||{}});if(e.proxy){let i=e.proxy;if("string"==typeof i){try{i=new l(e.proxy)}catch(e){i=!1,r.proxy=!1,console.error(e)}n=!0}i&&((null===(t=e.url)||void 0===t?void 0:t.startsWith("https://"))?(r.proxy=!1,r.httpsAgent=R.httpsOverHttp({proxy:{host:null==i?void 0:i.hostname,port:parseInt(null==i?void 0:i.port,10)}})):r.proxy={host:i.hostname,port:parseInt(i.port,10),protocol:"http"})}if("formData"in e){const t=new x;for(const n in e.formData)et(t,n,e.formData[n]);r.data=t,r.headers=Object.assign(r.headers||{},t.getHeaders()),n=!0,delete r.formData}return"body"in e&&(r.data=e.body,n=!0,delete r.body),"qs"in e&&(r.params=e.qs,n=!0),r.__isOldOptions=n,r}(e);return n.interceptors.request.use((function(e){var t,n,r;let i="";return(null===(t=null==e?void 0:e.headers)||void 0===t?void 0:t.contentType)?(i=e.headers.contentType,delete e.headers.contentType):(null===(n=null==e?void 0:e.headers)||void 0===n?void 0:n.ContentType)?(i=e.headers.ContentType,delete e.headers.ContentType):(null===(r=null==e?void 0:e.headers)||void 0===r?void 0:r["content-type"])&&(i=e.headers["content-type"],delete e.headers["content-type"]),""!==i&&e.headers&&(e.headers["Content-Type"]=i),e})),"resolveWithFullResponse"in e&&e.resolveWithFullResponse?n.request(r):n.request(r).then((t=>r.__isOldOptions?"json"in e?e.json?t.data:void 0:JSON.stringify(t.data):t.data))}}class it{constructor(e){if(this.ctx=e,this.db=new G(this.ctx.configPath),!this.db.has("picBed"))try{this.db.set("picBed",{uploader:"github",current:"github"})}catch(e){throw this.ctx.log.error(e),e}if(!this.db.has("picgoPlugins"))try{this.db.set("picgoPlugins",{})}catch(e){throw this.ctx.log.error(e),e}}read(e){return this.db.read(e)}get(e=""){return this.read(!0),this.db.get(e)}set(e,t){return this.read(!0),this.db.set(e,t)}has(e){return this.read(!0),this.db.has(e)}unset(e,t){return this.read(!0),this.db.unset(e,t)}saveConfig(e){Object.keys(e).forEach((t=>{this.set(t,e[t])}))}removeConfig(e){Object.keys(e).forEach((t=>{this.unset(t,e[t])}))}}class st{constructor(e){this.ctx=e}async install(e,t,n){t||(t={});const r=[],i=e.map((e=>ot(this.ctx,e))).filter((e=>this.ctx.pluginLoader.hasPlugin(e.pkgName)?(r.push(e.pkgName),this.ctx.log.success(`PicGo has already installed ${e.pkgName}`),!1):!!e.success)),s=i.map((e=>e.fullName)),o=i.map((e=>e.pkgName));if(s.length>0){const e=await this.execCommand("install",s,this.ctx.baseDir,t,n);if(console.log("execCommand install result=>",e),e.code){const t=this.ctx.i18n.translate("PLUGIN_HANDLER_PLUGIN_INSTALL_FAILED_REASON",{code:`${e.code}`,data:e.data});this.ctx.log.error(t),this.ctx.emit("installFailed",{title:this.ctx.i18n.translate("PLUGIN_HANDLER_PLUGIN_INSTALL_FAILED"),body:t});return{success:!1,body:t}}o.forEach((e=>{this.ctx.pluginLoader.registerPlugin(e)})),this.ctx.log.success(this.ctx.i18n.translate("PLUGIN_HANDLER_PLUGIN_INSTALL_SUCCESS")),this.ctx.emit("installSuccess",{title:this.ctx.i18n.translate("PLUGIN_HANDLER_PLUGIN_INSTALL_SUCCESS"),body:[...o,...r]});return{success:!0,body:[...o,...r]}}if(0===r.length){const e=this.ctx.i18n.translate("PLUGIN_HANDLER_PLUGIN_UNINSTALL_FAILED_VALID");this.ctx.log.error(e),this.ctx.emit("installFailed",{title:this.ctx.i18n.translate("PLUGIN_HANDLER_PLUGIN_INSTALL_FAILED"),body:e});return{success:!1,body:e}}this.ctx.log.success(this.ctx.i18n.translate("PLUGIN_HANDLER_PLUGIN_INSTALL_SUCCESS")),this.ctx.emit("installSuccess",{title:this.ctx.i18n.translate("PLUGIN_HANDLER_PLUGIN_INSTALL_SUCCESS"),body:[...o,...r]});return{success:!0,body:[...o,...r]}}async uninstall(e,t,n){t||(t={});const r=e.map((e=>ot(this.ctx,e))).filter((e=>e.success)).map((e=>e.pkgName));if(r.length>0){const e=await this.execCommand("uninstall",r,this.ctx.baseDir,t,n);if(console.log("execCommand uninstall result=>",e),e.code){const t=this.ctx.i18n.translate("PLUGIN_HANDLER_PLUGIN_UNINSTALL_FAILED_REASON",{code:`${e.code}`,data:e.data});this.ctx.log.error(t),this.ctx.emit("uninstallFailed",{title:this.ctx.i18n.translate("PLUGIN_HANDLER_PLUGIN_UNINSTALL_FAILED"),body:t});return{success:!1,body:t}}r.forEach((e=>{this.ctx.pluginLoader.unregisterPlugin(e)})),this.ctx.log.success(this.ctx.i18n.translate("PLUGIN_HANDLER_PLUGIN_UNINSTALL_SUCCESS")),this.ctx.emit("uninstallSuccess",{title:this.ctx.i18n.translate("PLUGIN_HANDLER_PLUGIN_UNINSTALL_SUCCESS"),body:r});return{success:!0,body:r}}{const e=this.ctx.i18n.translate("PLUGIN_HANDLER_PLUGIN_UNINSTALL_FAILED_VALID");this.ctx.log.error(e),this.ctx.emit("uninstallFailed",{title:this.ctx.i18n.translate("PLUGIN_HANDLER_PLUGIN_UNINSTALL_FAILED"),body:e});return{success:!1,body:e}}}async update(e,t,n){t||(t={});const r=e.map((e=>ot(this.ctx,e))).filter((e=>e.success)).map((e=>e.pkgName));if(r.length>0){const e=await this.execCommand("update",r,this.ctx.baseDir,t,n);if(console.log("execCommand update result=>",e),e.code){const t=this.ctx.i18n.translate("PLUGIN_HANDLER_PLUGIN_UPDATE_FAILED_REASON",{code:`${e.code}`,data:e.data});this.ctx.log.error(t),this.ctx.emit("updateFailed",{title:this.ctx.i18n.translate("PLUGIN_HANDLER_PLUGIN_UPDATE_FAILED"),body:t});return{success:!1,body:t}}this.ctx.log.success(this.ctx.i18n.translate("PLUGIN_HANDLER_PLUGIN_UPDATE_SUCCESS")),this.ctx.emit("updateSuccess",{title:this.ctx.i18n.translate("PLUGIN_HANDLER_PLUGIN_UPDATE_SUCCESS"),body:r});return{success:!0,body:r}}{const e=this.ctx.i18n.translate("PLUGIN_HANDLER_PLUGIN_UPDATE_FAILED_VALID");this.ctx.log.error(e),this.ctx.emit("updateFailed",{title:this.ctx.i18n.translate("PLUGIN_HANDLER_PLUGIN_UPDATE_FAILED"),body:e});return{success:!1,body:e}}}async execCommand(e,t,n,r={},i={}){const s=r.registry||this.ctx.getConfig("settings.registry"),o=r.proxy||this.ctx.getConfig("settings.proxy");return await new Promise((r=>{var a,l;let c=[e].concat(t).concat("--color=always").concat("--save");s&&(c=c.concat(`--registry=${s}`)),o&&(c=c.concat(`--proxy=${o}`));try{const e={cwd:n,env:Object.assign({},process.env,i)};console.log("Start run npm, args=>",c),console.log("Start run npm, npmOptions=>",e);const t=$("npm",c,e);let s="";null===(a=t.stdout)||void 0===a||a.on("data",(e=>{s+=e})).pipe(process.stdout),null===(l=t.stderr)||void 0===l||l.on("data",(e=>{s+=e})).pipe(process.stderr),t.on("close",(e=>{r(e?{code:e,data:s}:{code:0,data:s})})),t.on("error",(e=>{this.ctx.log.error(e),this.ctx.log.error("NPM is not installed"),this.ctx.emit(fe.FAILED,"NPM is not installed")}))}catch(e){this.ctx.log.error(e),this.ctx.emit(fe.FAILED,e)}}))}}const ot=(n,r)=>{const i={success:!1,fullName:"",pkgName:""},s=((n,r=console)=>{switch(j(n)){case"normal":case"scope":return n;case"simple":return W(n);default:{let i=n;return t.isAbsolute(n)&&e.existsSync(n)?z(i):(i=t.join(process.cwd(),n),e.existsSync(i)?z(i):(r.warn(`Can't find plugin ${n}`),""))}}})(r,n.log);if(!s)return i;const o=((n,r=console)=>{var i;switch(j(n)){case"normal":return V(n);case"scope":return V(n,!0);case"simple":return V(W(n));default:{if(!e.existsSync(n))return r.warn(`Can't find plugin: ${n}`),"";const s=t.posix.join(n,"package.json");if(e.existsSync(s)){const t=e.readJSONSync(s)||{};return(null===(i=t.name)||void 0===i?void 0:i.includes("picgo-plugin-"))?t.name:(r.warn(`The plugin package.json's name filed is ${t.name||"empty"}, need to include the prefix: picgo-plugin-`),"")}return r.warn(`Can't find plugin: ${n}`),""}}})(s,n.log);return o?{success:!0,fullName:s,pkgName:o}:i},at={"zh-CN":{UPLOAD_FAILED:"上传失败",CHECK_SETTINGS:"请检查你的配置项是否正确",CHECK_SETTINGS_AND_NETWORK:"请检查你的配置项以及网络",UPLOAD_FAILED_REASON:"错误码:${code},请打开浏览器粘贴地址查看相关原因",SERVER_ERROR:"服务端出错,请重试",AUTH_FAILED:"认证失败",PICBED_SMMS:"SM.MS",PICBED_SMMS_TOKEN:"设定Token",PICBED_SMMS_BACKUP_DOMAIN:"备用上传域名",PICBED_SMMS_MESSAGE_BACKUP_DOMAIN:"例如 smms.app",PICBED_ALICLOUD:"阿里云OSS",PICBED_ALICLOUD_ACCESSKEYID:"设定KeyId",PICBED_ALICLOUD_ACCESSKEYSECRET:"设定KeySecret",PICBED_ALICLOUD_BUCKET:"设定Bucket",PICBED_ALICLOUD_AREA:"设定存储区域",PICBED_ALICLOUD_PATH:"设定存储路径",PICBED_ALICLOUD_CUSTOMURL:"设定自定义域名",PICBED_ALICLOUD_OPTIONS:"设定网址后缀",PICBED_ALICLOUD_MESSAGE_AREA:"例如:oss-cn-beijing",PICBED_ALICLOUD_MESSAGE_PATH:"例如:test/",PICBED_ALICLOUD_MESSAGE_OPTIONS:"例如:?x-oss-process=xxx",PICBED_ALICLOUD_MESSAGE_CUSTOMURL:"例如:https://test.com",PICBED_TENCENTCLOUD:"腾讯云COS",PICBED_TENCENTCLOUD_VERSION:"COS版本",PICBED_TENCENTCLOUD_SECRETID:"设定SecretId",PICBED_TENCENTCLOUD_SECRETKEY:"设定SecretKey",PICBED_TENCENTCLOUD_APPID:"设定AppId",PICBED_TENCENTCLOUD_BUCKET:"设定Bucket",PICBED_TENCENTCLOUD_AREA:"设定存储区域",PICBED_TENCENTCLOUD_PATH:"设定存储路径",PICBED_TENCENTCLOUD_OPTIONS:"设定网址后缀",PICBED_TENCENTCLOUD_CUSTOMURL:"设定自定义域名",PICBED_TENCENTCLOUD_MESSAGE_APPID:"例如:1234567890",PICBED_TENCENTCLOUD_MESSAGE_AREA:"例如:ap-beijing",PICBED_TENCENTCLOUD_MESSAGE_PATH:"例如:test/",PICBED_TENCENTCLOUD_MESSAGE_CUSTOMURL:"例如:https://test.com",PICBED_TENCENTCLOUD_MESSAGE_OPTIONS:"例如:?imageMogr2",PICBED_GITHUB:"GitHub",PICBED_GITHUB_TOKEN:"设定Token",PICBED_GITHUB_REPO:"设定仓库名",PICBED_GITHUB_PATH:"设定存储路径",PICBED_GITHUB_BRANCH:"设定分支名",PICBED_GITHUB_CUSTOMURL:"设定自定义域名",PICBED_GITHUB_MESSAGE_REPO:"格式:username/repo",PICBED_GITHUB_MESSAGE_BRANCH:"例如:main",PICBED_GITHUB_MESSAGE_PATH:"例如:test/",PICBED_GITHUB_MESSAGE_CUSTOMURL:"例如:https://test.com",PICBED_QINIU:"七牛云",PICBED_QINIU_ACCESSKEY:"设定AccessKey",PICBED_QINIU_SECRETKEY:"设定SecretKey",PICBED_QINIU_BUCKET:"设定Bucket",PICBED_QINIU_PATH:"设定存储路径",PICBED_QINIU_URL:"设定访问网址",PICBED_QINIU_OPTIONS:"设定网址后缀",PICBED_QINIU_AREA:"设定存储区域",PICBED_QINIU_MESSAGE_PATH:"例如:test/",PICBED_QINIU_MESSAGE_AREA:"例如:z0",PICBED_QINIU_MESSAGE_OPTIONS:"例如:?imageslim",PICBED_QINIU_MESSAGE_URL:"例如:https://xxx.yyy.glb.clouddn.com",PICBED_IMGUR:"Imgur",PICBED_IMGUR_CLIENTID:"设定ClientId",PICBED_IMGUR_PROXY:"设定代理",PICBED_IMGUR_MESSAGE_PROXY:"例如:http://127.0.0.1:1080",PICBED_UPYUN:"又拍云",PICBED_UPYUN_BUCKET:"设定Bucket",PICBED_UPYUN_OPERATOR:"设定操作员",PICBED_UPYUN_PASSWORD:"设定操作员密码",PICBED_UPYUN_PATH:"设定存储路径",PICBED_UPYUN_URL:"设定加速域名",PICBED_UPYUN_OPTIONS:"设定网址后缀",PICBED_UPYUN_MESSAGE_OPERATOR:"例如:me",PICBED_UPYUN_MESSAGE_PASSWORD:"输入操作员密码",PICBED_UPYUN_MESSAGE_URL:"例如:http://xxx.test.upcdn.net",PICBED_UPYUN_MESSAGE_OPTIONS:"例如:!imgslim",PICBED_UPYUN_MESSAGE_PATH:"例如:test/",PLUGIN_HANDLER_PLUGIN_INSTALL_SUCCESS:"插件安装成功",PLUGIN_HANDLER_PLUGIN_INSTALL_FAILED:"插件安装失败",PLUGIN_HANDLER_PLUGIN_INSTALL_FAILED_REASON:"插件安装失败,失败码为${code},错误日志为 \n ${data}",PLUGIN_HANDLER_PLUGIN_INSTALL_FAILED_PATH:"插件安装失败,请输入合法插件名或合法安装路径",PLUGIN_HANDLER_PLUGIN_UNINSTALL_SUCCESS:"插件卸载成功",PLUGIN_HANDLER_PLUGIN_UNINSTALL_FAILED:"插件卸载失败",PLUGIN_HANDLER_PLUGIN_UNINSTALL_FAILED_REASON:"插件卸载失败,失败码为${code},错误日志为 \n ${data}",PLUGIN_HANDLER_PLUGIN_UNINSTALL_FAILED_VALID:"插件卸载失败,请输入合法插件名",PLUGIN_HANDLER_PLUGIN_UPDATE_SUCCESS:"插件更新成功",PLUGIN_HANDLER_PLUGIN_UPDATE_FAILED:"插件更新失败",PLUGIN_HANDLER_PLUGIN_UPDATE_FAILED_REASON:"插件更新失败,失败码为${code},错误日志为 \n ${data}",PLUGIN_HANDLER_PLUGIN_UPDATE_FAILED_VALID:"插件更新失败,请输入合法插件名"},"zh-TW":{UPLOAD_FAILED:"上傳失敗",CHECK_SETTINGS:"請檢查你的設定是否正確",CHECK_SETTINGS_AND_NETWORK:"請檢查你的設定及網路",UPLOAD_FAILED_REASON:"錯誤碼:${code},請打開瀏覽器貼上地址查看相關原因",SERVER_ERROR:"伺服器出錯,請重試",AUTH_FAILED:"認證失敗",PICBED_SMMS:"SM.MS",PICBED_SMMS_TOKEN:"設定Token",PICBED_SMMS_BACKUP_DOMAIN:"備用上傳網址",PICBED_SMMS_MESSAGE_BACKUP_DOMAIN:"例如 smms.app",PICBED_ALICLOUD:"阿里云OSS",PICBED_ALICLOUD_ACCESSKEYID:"設定KeyId",PICBED_ALICLOUD_ACCESSKEYSECRET:"設定KeySecret",PICBED_ALICLOUD_BUCKET:"設定Bucket",PICBED_ALICLOUD_AREA:"設定儲存區域",PICBED_ALICLOUD_PATH:"設定儲存路徑",PICBED_ALICLOUD_CUSTOMURL:"設定自訂網址",PICBED_ALICLOUD_OPTIONS:"設定網址後綴",PICBED_ALICLOUD_MESSAGE_AREA:"例如:oss-cn-beijing",PICBED_ALICLOUD_MESSAGE_PATH:"例如:test/",PICBED_ALICLOUD_MESSAGE_OPTIONS:"例如:?x-oss-process=xxx",PICBED_ALICLOUD_MESSAGE_CUSTOMURL:"例如:https://test.com",PICBED_TENCENTCLOUD:"騰訊云COS",PICBED_TENCENTCLOUD_VERSION:"COS版本",PICBED_TENCENTCLOUD_SECRETID:"設定SecretId",PICBED_TENCENTCLOUD_SECRETKEY:"設定SecretKey",PICBED_TENCENTCLOUD_APPID:"設定AppId",PICBED_TENCENTCLOUD_BUCKET:"設定Bucket",PICBED_TENCENTCLOUD_AREA:"設定儲存區域",PICBED_TENCENTCLOUD_PATH:"設定儲存路徑",PICBED_TENCENTCLOUD_OPTIONS:"設定網址後綴",PICBED_TENCENTCLOUD_CUSTOMURL:"設定自訂網址",PICBED_TENCENTCLOUD_MESSAGE_APPID:"例如:1234567890",PICBED_TENCENTCLOUD_MESSAGE_AREA:"例如:ap-beijing",PICBED_TENCENTCLOUD_MESSAGE_PATH:"例如:test/",PICBED_TENCENTCLOUD_MESSAGE_CUSTOMURL:"例如:https://test.com",PICBED_TENCENTCLOUD_MESSAGE_OPTIONS:"例如:?imageMogr2",PICBED_GITHUB:"GitHub",PICBED_GITHUB_TOKEN:"設定Token",PICBED_GITHUB_REPO:"設定倉庫名稱",PICBED_GITHUB_PATH:"設定儲存路徑",PICBED_GITHUB_BRANCH:"設定分支名稱",PICBED_GITHUB_CUSTOMURL:"設定自訂網址",PICBED_GITHUB_MESSAGE_REPO:"格式:username/repo",PICBED_GITHUB_MESSAGE_BRANCH:"例如:main",PICBED_GITHUB_MESSAGE_PATH:"例如:test/",PICBED_GITHUB_MESSAGE_CUSTOMURL:"例如:https://test.com",PICBED_QINIU:"七牛云",PICBED_QINIU_ACCESSKEY:"設定AccessKey",PICBED_QINIU_SECRETKEY:"設定SecretKey",PICBED_QINIU_BUCKET:"設定Bucket",PICBED_QINIU_PATH:"設定儲存路徑",PICBED_QINIU_URL:"設定訪問網址",PICBED_QINIU_OPTIONS:"設定網址後綴",PICBED_QINIU_AREA:"設定儲存區域",PICBED_QINIU_MESSAGE_PATH:"例如:test/",PICBED_QINIU_MESSAGE_AREA:"例如:z0",PICBED_QINIU_MESSAGE_OPTIONS:"例如:?imageslim",PICBED_QINIU_MESSAGE_URL:"例如:https://xxx.yyy.glb.clouddn.com",PICBED_IMGUR:"Imgur",PICBED_IMGUR_CLIENTID:"設定ClientId",PICBED_IMGUR_PROXY:"設定PROXY",PICBED_IMGUR_MESSAGE_PROXY:"例如:http://127.0.0.1:1080",PICBED_UPYUN:"又拍云",PICBED_UPYUN_BUCKET:"設定Bucket",PICBED_UPYUN_OPERATOR:"設定操作員",PICBED_UPYUN_PASSWORD:"設定操作員密碼",PICBED_UPYUN_PATH:"設定儲存路徑",PICBED_UPYUN_URL:"設定加速網址",PICBED_UPYUN_OPTIONS:"設定網址後綴",PICBED_UPYUN_MESSAGE_OPERATOR:"例如:me",PICBED_UPYUN_MESSAGE_PASSWORD:"輸入操作員密碼",PICBED_UPYUN_MESSAGE_URL:"例如:http://xxx.test.upcdn.net",PICBED_UPYUN_MESSAGE_OPTIONS:"例如:!imgslim",PICBED_UPYUN_MESSAGE_PATH:"例如:test/",PLUGIN_HANDLER_PLUGIN_INSTALL_SUCCESS:"插件安裝成功",PLUGIN_HANDLER_PLUGIN_INSTALL_FAILED:"插件安裝失敗",PLUGIN_HANDLER_PLUGIN_INSTALL_FAILED_REASON:"插件安裝失敗,失敗碼為${code},錯誤紀錄為 \n ${data}",PLUGIN_HANDLER_PLUGIN_INSTALL_FAILED_PATH:"插件安裝失敗,請輸入正確的插件名稱或正確的安裝路徑",PLUGIN_HANDLER_PLUGIN_UNINSTALL_SUCCESS:"插件卸載成功",PLUGIN_HANDLER_PLUGIN_UNINSTALL_FAILED:"插件卸載失敗",PLUGIN_HANDLER_PLUGIN_UNINSTALL_FAILED_REASON:"插件卸載失敗,失敗碼為${code},錯誤紀錄為 \n ${data}",PLUGIN_HANDLER_PLUGIN_UNINSTALL_FAILED_VALID:"插件卸載失敗,請輸入正確的插件名稱",PLUGIN_HANDLER_PLUGIN_UPDATE_SUCCESS:"插件更新成功",PLUGIN_HANDLER_PLUGIN_UPDATE_FAILED:"插件更新失敗",PLUGIN_HANDLER_PLUGIN_UPDATE_FAILED_REASON:"插件更新失敗,失敗碼為${code},錯誤紀錄為 \n ${data}",PLUGIN_HANDLER_PLUGIN_UPDATE_FAILED_VALID:"插件更新失敗,請輸入正確的插件名稱"},en:{UPLOAD_FAILED:"Upload failed",CHECK_SETTINGS:"Please check your settings",CHECK_SETTINGS_AND_NETWORK:"Please check your settings and network",UPLOAD_FAILED_REASON:"Error code: ${code}, please open the browser and paste the address to see the reason",SERVER_ERROR:"Server error, please try again later",AUTH_FAILED:"Authentication failed",PICBED_SMMS:"SM.MS",PICBED_SMMS_TOKEN:"Set Token",PICBED_SMMS_BACKUP_DOMAIN:"Set Backup Upload Domain",PICBED_SMMS_MESSAGE_BACKUP_DOMAIN:"Ex. smms.app",PICBED_ALICLOUD:"Ali Cloud",PICBED_ALICLOUD_ACCESSKEYID:"Set KeyId",PICBED_ALICLOUD_ACCESSKEYSECRET:"Set KeySecret",PICBED_ALICLOUD_BUCKET:"Set Bucket",PICBED_ALICLOUD_AREA:"Set Area",PICBED_ALICLOUD_PATH:"Set Path",PICBED_ALICLOUD_CUSTOMURL:"Set Custom URL",PICBED_ALICLOUD_OPTIONS:"Set URL Suffix",PICBED_ALICLOUD_MESSAGE_AREA:"Ex. oss-cn-beijing",PICBED_ALICLOUD_MESSAGE_PATH:"Ex. test/",PICBED_ALICLOUD_MESSAGE_OPTIONS:"Ex. ?x-oss-process=xxx",PICBED_ALICLOUD_MESSAGE_CUSTOMURL:"Ex. https://test.com",PICBED_TENCENTCLOUD:"Tencent Cloud",PICBED_TENCENTCLOUD_VERSION:"Choose COS version",PICBED_TENCENTCLOUD_SECRETID:"Set SecretId",PICBED_TENCENTCLOUD_SECRETKEY:"Set SecretKey",PICBED_TENCENTCLOUD_APPID:"Set AppId",PICBED_TENCENTCLOUD_BUCKET:"Set Bucket",PICBED_TENCENTCLOUD_AREA:"Set Area",PICBED_TENCENTCLOUD_PATH:"Set Path",PICBED_TENCENTCLOUD_OPTIONS:"Set URL Suffix",PICBED_TENCENTCLOUD_CUSTOMURL:"Set Custom URL",PICBED_TENCENTCLOUD_MESSAGE_APPID:"Ex. 1234567890",PICBED_TENCENTCLOUD_MESSAGE_AREA:"Ex. ap-beijing",PICBED_TENCENTCLOUD_MESSAGE_PATH:"Ex. test/",PICBED_TENCENTCLOUD_MESSAGE_CUSTOMURL:"Ex. http://test.com",PICBED_TENCENTCLOUD_MESSAGE_OPTIONS:"Ex. ?imageMogr2",PICBED_GITHUB:"GitHub",PICBED_GITHUB_TOKEN:"Set Token",PICBED_GITHUB_REPO:"Set Repo Name",PICBED_GITHUB_PATH:"Set Path",PICBED_GITHUB_BRANCH:"Set Branch",PICBED_GITHUB_CUSTOMURL:"Set Custom URL",PICBED_GITHUB_MESSAGE_REPO:"Ex. username/repo",PICBED_GITHUB_MESSAGE_BRANCH:"Ex. main",PICBED_GITHUB_MESSAGE_PATH:"Ex. test/",PICBED_GITHUB_MESSAGE_CUSTOMURL:"Ex. https://test.com",PICBED_QINIU:"Qiniu",PICBED_QINIU_ACCESSKEY:"Set AccessKey",PICBED_QINIU_SECRETKEY:"Set SecretKey",PICBED_QINIU_BUCKET:"Set Bucket",PICBED_QINIU_PATH:"Set Path",PICBED_QINIU_URL:"Set URL",PICBED_QINIU_OPTIONS:"Set URL Suffix",PICBED_QINIU_AREA:"Set Area",PICBED_QINIU_MESSAGE_PATH:"Ex. test/",PICBED_QINIU_MESSAGE_AREA:"Ex. z0",PICBED_QINIU_MESSAGE_OPTIONS:"Ex. ?imageslim",PICBED_QINIU_MESSAGE_URL:"Ex. https://xxx.yyy.glb.clouddn.com",PICBED_IMGUR:"Imgur",PICBED_IMGUR_CLIENTID:"Set ClientId",PICBED_IMGUR_PROXY:"Set Proxy",PICBED_IMGUR_MESSAGE_PROXY:"Ex. http://127.0.0.1:1080",PICBED_UPYUN:"Upyun",PICBED_UPYUN_BUCKET:"Set Bucket",PICBED_UPYUN_OPERATOR:"Set Operator",PICBED_UPYUN_PASSWORD:"Set Operator Password",PICBED_UPYUN_PATH:"Set Path",PICBED_UPYUN_URL:"Set URL",PICBED_UPYUN_OPTIONS:"Set URL Suffix",PICBED_UPYUN_MESSAGE_OPERATOR:"Ex. me",PICBED_UPYUN_MESSAGE_PASSWORD:"Please type the operator password",PICBED_UPYUN_MESSAGE_URL:"Ex. http://xxx.test.upcdn.net",PICBED_UPYUN_MESSAGE_OPTIONS:"Ex. !imgslim",PICBED_UPYUN_MESSAGE_PATH:"Ex. test/",PLUGIN_HANDLER_PLUGIN_INSTALL_SUCCESS:"Plugin installed successfully",PLUGIN_HANDLER_PLUGIN_INSTALL_FAILED:"Plugin installation failed",PLUGIN_HANDLER_PLUGIN_INSTALL_FAILED_REASON:"Plugin installation failed, error code is ${code}, error log is \n ${data}",PLUGIN_HANDLER_PLUGIN_INSTALL_FAILED_PATH:"Plugin installation failed, please enter a valid plugin name or valid installation path",PLUGIN_HANDLER_PLUGIN_UNINSTALL_SUCCESS:"Plugin uninstalled successfully",PLUGIN_HANDLER_PLUGIN_UNINSTALL_FAILED:"Plugin uninstall failed",PLUGIN_HANDLER_PLUGIN_UNINSTALL_FAILED_REASON:"Plugin uninstall failed, error code is ${code}, error log is \n ${data}",PLUGIN_HANDLER_PLUGIN_UNINSTALL_FAILED_VALID:"Plugin uninstall failed, please enter a valid plugin name",PLUGIN_HANDLER_PLUGIN_UPDATE_SUCCESS:"Plugin updated successfully",PLUGIN_HANDLER_PLUGIN_UPDATE_FAILED:"Plugin update failed",PLUGIN_HANDLER_PLUGIN_UPDATE_FAILED_REASON:"Plugin update failed, error code is ${code}, error log is \n ${data}",PLUGIN_HANDLER_PLUGIN_UPDATE_FAILED_VALID:"Plugin update failed, please enter a valid plugin name"}};class lt{constructor(e){this.ctx=e,this.objectAdapter=new v(at);let t=this.ctx.getConfig("settings.language")||"zh-CN";at[t]||(t="zh-CN"),this.i18n=new H({adapter:this.objectAdapter,defaultLanguage:t}),this.loadOutterI18n()}loadOutterI18n(){const n=this.getOutterI18nFolder();e.readdirSync(n,{withFileTypes:!0}).forEach((r=>{if(r.isFile()&&r.name.endsWith(".yml")){const i=t.join(n,r.name),s=e.readFileSync(i,"utf8");try{const e=M.load(s);at[r.name.replace(/\.yml$/,"")]=e}catch(e){console.error(e)}}}))}getOutterI18nFolder(){const n=t.join(this.ctx.baseDir,"i18n-cli");return e.pathExistsSync(n)||e.ensureDirSync(n),n}translate(e,t){return this.i18n.translate(e,t)||e}setLanguage(e){this.i18n.setLanguage(e),this.ctx.saveConfig({"settings.language":e})}addLocale(e,t){const n=this.objectAdapter.getLocale(e);if(!n)return!1;const r=D(n,t);return this.objectAdapter.setLocale(e,r),!0}addLanguage(e,t){return!this.objectAdapter.getLocale(e)&&(this.objectAdapter.setLocale(e,t),at[e]=t,!0)}getLanguageList(){return Object.keys(at)}}class ct extends n{get pluginLoader(){return this._pluginLoader}constructor(e=""){super(),this.VERSION="1.7.0",this.configPath=e,this.output=[],this.input=[],this.helper={transformer:new _e("transformer"),uploader:new _e("uploader"),beforeTransformPlugins:new _e("beforeTransformPlugins"),beforeUploadPlugins:new _e("beforeUploadPlugins"),afterUploadPlugins:new _e("afterUploadPlugins")},this.initConfigPath(),this.log=new Ce(this),this.cmd=new he(this),this.pluginHandler=new st(this),this.initConfig(),this.init()}initConfigPath(){if(""===this.configPath&&(this.configPath=i()+"/.picgo/config.json"),".JSON"!==t.extname(this.configPath).toUpperCase())throw this.configPath="",Error("The configuration file only supports JSON format.");this.baseDir=t.dirname(this.configPath);e.pathExistsSync(this.configPath)||e.ensureFileSync(`${this.configPath}`)}initConfig(){this.db=new it(this),this._config=this.db.read(!0)}init(){try{this.i18n=new lt(this),this.Request=new rt(this),this._pluginLoader=new Qe(this),Ie("picgo"),Ke().register(this),{register(e){e.helper.transformer.register("path",Ye),e.helper.transformer.register("base64",je)}}.register(this),Ie(""),this._pluginLoader.load(),this.lifecycle=new Ue(this)}catch(e){throw this.emit(fe.UPLOAD_PROGRESS,-1),this.log.error(e),e}}use(e,t){if(t)return this.pluginLoader.registerPlugin(t,e),this.pluginLoader.getPlugin(t);return e(this)}registerCommands(){""!==this.configPath&&(this.cmd.init(),this.cmd.loadCommands())}getConfig(e){return e?A(this._config,e):this._config}saveConfig(e){Z(e)?(this.setConfig(e),this.db.saveConfig(e)):this.log.warn("the format of config is invalid, please provide object")}removeConfig(e,t){e&&t&&(X(e)?this.log.warn(`the config.${e} can't be removed`):(this.unsetConfig(e,t),this.db.unset(e,t)))}setConfig(e){Z(e)?Object.keys(e).forEach((t=>{X(t)&&(this.log.warn(`the config.${t} can't be modified`),delete e[t]),T(this._config,t,e[t]),Xe.emit(Pe.CONFIG_CHANGE,{configName:t,value:e[t]})})):this.log.warn("the format of config is invalid, please provide object")}unsetConfig(e,t){e&&t&&(X(e)?this.log.warn(`the config.${e} can't be unset`):y(this.getConfig(e),t))}get request(){return this.Request.request.bind(this.Request)}async upload(t){if(""===this.configPath)return this.log.error("The configuration file only supports JSON format."),[];if(void 0!==t&&0!==t.length){const{output:e}=await this.lifecycle.start(t);return e}try{const{imgPath:t,shouldKeepAfterUploading:n}=await Je(this);if("no image"===t)throw new Error("image not found in clipboard");{this.once(fe.FAILED,(()=>{n||e.remove(t).catch((e=>{this.log.error(e)}))})),this.once("finished",(()=>{n||e.remove(t).catch((e=>{this.log.error(e)}))}));const{output:r}=await this.lifecycle.start([t]);return r}}catch(e){throw this.emit(fe.FAILED,e),e}}}export{he as Commander,Ue as Lifecycle,_e as LifecyclePlugins,Ce as Logger,ct as PicGo,st as PluginHandler,Qe as PluginLoader,rt as Request};
-//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguZXNtLmpzIiwic291cmNlcyI6WyIuLi9zcmMvcGx1Z2lucy9jb21tYW5kZXIvcGx1Z2luSGFuZGxlci50cyIsIi4uL3NyYy9wbHVnaW5zL2NvbW1hbmRlci9jb25maWcudHMiLCIuLi9zcmMvdXRpbHMvY29tbW9uLnRzIiwiLi4vc3JjL3BsdWdpbnMvY29tbWFuZGVyL3VwbG9hZC50cyIsIi4uL3NyYy9wbHVnaW5zL2NvbW1hbmRlci9zZXR0aW5nLnRzIiwiLi4vc3JjL3BsdWdpbnMvY29tbWFuZGVyL3VzZS50cyIsIi4uL3NyYy9wbHVnaW5zL2NvbW1hbmRlci9wcm94eS50cyIsIi4uL3NyYy91dGlscy9pbml0VXRpbHMudHMiLCIuLi9zcmMvcGx1Z2lucy9jb21tYW5kZXIvaW5pdC50cyIsIi4uL3NyYy9wbHVnaW5zL2NvbW1hbmRlci9pMThuLnRzIiwiLi4vc3JjL2xpYi9MaWZlY3ljbGVQbHVnaW5zLnRzIiwiLi4vc3JjL2xpYi9Db21tYW5kZXIudHMiLCIuLi9zcmMvcGx1Z2lucy9jb21tYW5kZXIvaW5kZXgudHMiLCIuLi9zcmMvdXRpbHMvZW51bS50cyIsIi4uL3NyYy9saWIvTG9nZ2VyLnRzIiwiLi4vc3JjL2NvcmUvTGlmZWN5Y2xlLnRzIiwiLi4vc3JjL3V0aWxzL2NyZWF0ZUNvbnRleHQudHMiLCIuLi9zcmMvcGx1Z2lucy91cGxvYWRlci90Y3l1bi50cyIsIi4uL3NyYy9wbHVnaW5zL3VwbG9hZGVyL2dpdGh1Yi50cyIsIi4uL3NyYy9wbHVnaW5zL3VwbG9hZGVyL3Fpbml1LnRzIiwiLi4vc3JjL3V0aWxzL3N0cmVhbVV0aWxzLnRzIiwiLi4vc3JjL3BsdWdpbnMvdXBsb2FkZXIvYWxpeXVuLnRzIiwiLi4vc3JjL3BsdWdpbnMvdXBsb2FkZXIvdXB5dW4udHMiLCIuLi9zcmMvcGx1Z2lucy91cGxvYWRlci9pbmRleC50cyIsIi4uL3NyYy9wbHVnaW5zL3RyYW5zZm9ybWVyL3BhdGgudHMiLCIuLi9zcmMvcGx1Z2lucy90cmFuc2Zvcm1lci9iYXNlNjQudHMiLCIuLi9zcmMvbGliL1BsdWdpbkxvYWRlci50cyIsIi4uL3NyYy91dGlscy9zdGF0aWMudHMiLCIuLi9zcmMvdXRpbHMvZ2V0Q2xpcGJvYXJkSW1hZ2UudHMiLCIuLi9zcmMvdXRpbHMvZXZlbnRCdXMudHMiLCIuLi9zcmMvbGliL1JlcXVlc3QudHMiLCIuLi9zcmMvdXRpbHMvZGIudHMiLCIuLi9zcmMvbGliL1BsdWdpbkhhbmRsZXIudHMiLCIuLi9zcmMvaTE4bi9pbmRleC50cyIsIi4uL3NyYy9pMThuL3poLUNOLnRzIiwiLi4vc3JjL2kxOG4vemgtVFcudHMiLCIuLi9zcmMvaTE4bi9lbi50cyIsIi4uL3NyYy9jb3JlL1BpY0dvLnRzIiwiLi4vc3JjL3BsdWdpbnMvdHJhbnNmb3JtZXIvaW5kZXgudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSVBpY0dvLCBJUGx1Z2luIH0gZnJvbSBcIi4uLy4uL3R5cGVzXCJcblxuY29uc3QgcGx1Z2luSGFuZGxlcjogSVBsdWdpbiA9IHtcbiAgaGFuZGxlOiAoY3R4OiBJUGljR28pID0+IHtcbiAgICAvLyBjb25zdCBwbHVnaW5IYW5kbGVyID0gbmV3IFBsdWdpbkhhbmRsZXIoY3R4KVxuICAgIGNvbnN0IGNtZCA9IGN0eC5jbWRcbiAgICBjbWQucHJvZ3JhbVxuICAgICAgLmNvbW1hbmQoXCJpbnN0YWxsIDxwbHVnaW5zLi4uPlwiKVxuICAgICAgLmRlc2NyaXB0aW9uKFwiaW5zdGFsbCBwaWNnbyBwbHVnaW5cIilcbiAgICAgIC5hbGlhcyhcImFkZFwiKVxuICAgICAgLm9wdGlvbihcIi1wLCAtLXByb3h5IDxwcm94eT5cIiwgXCJBZGQgcHJveHkgZm9yIGluc3RhbGxpbmdcIilcbiAgICAgIC5vcHRpb24oXCItciwgLS1yZWdpc3RyeSA8cmVnaXN0cnk+XCIsIFwiQ2hvb3NlIGEgcmVnaXN0cnkgZm9yIGluc3RhbGxpbmdcIilcbiAgICAgIC5hY3Rpb24oKHBsdWdpbnM6IHN0cmluZ1tdLCBwcm9ncmFtOiBhbnkpID0+IHtcbiAgICAgICAgY29uc3QgeyBwcm94eSwgcmVnaXN0cnkgfSA9IHByb2dyYW1cbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgICBwcm94eSxcbiAgICAgICAgICByZWdpc3RyeSxcbiAgICAgICAgfVxuICAgICAgICBjdHgucGx1Z2luSGFuZGxlci5pbnN0YWxsKHBsdWdpbnMsIG9wdGlvbnMpLmNhdGNoKChlKSA9PiB7XG4gICAgICAgICAgY3R4LmxvZy5lcnJvcihlKVxuICAgICAgICB9KVxuICAgICAgfSlcbiAgICBjbWQucHJvZ3JhbVxuICAgICAgLmNvbW1hbmQoXCJ1bmluc3RhbGwgPHBsdWdpbnMuLi4+XCIpXG4gICAgICAuYWxpYXMoXCJybVwiKVxuICAgICAgLmRlc2NyaXB0aW9uKFwidW5pbnN0YWxsIHBpY2dvIHBsdWdpblwiKVxuICAgICAgLmFjdGlvbigocGx1Z2luczogc3RyaW5nW10pID0+IHtcbiAgICAgICAgY3R4LnBsdWdpbkhhbmRsZXIudW5pbnN0YWxsKHBsdWdpbnMpLmNhdGNoKChlKSA9PiB7XG4gICAgICAgICAgY3R4LmxvZy5lcnJvcihlKVxuICAgICAgICB9KVxuICAgICAgfSlcbiAgICBjbWQucHJvZ3JhbVxuICAgICAgLmNvbW1hbmQoXCJ1cGRhdGUgPHBsdWdpbnMuLi4+XCIpXG4gICAgICAuZGVzY3JpcHRpb24oXCJ1cGRhdGUgcGljZ28gcGx1Z2luXCIpXG4gICAgICAub3B0aW9uKFwiLXAsIC0tcHJveHkgPHByb3h5PlwiLCBcIkFkZCBwcm94eSBmb3IgaW5zdGFsbGluZ1wiKVxuICAgICAgLm9wdGlvbihcIi1yLCAtLXJlZ2lzdHJ5IDxyZWdpc3RyeT5cIiwgXCJDaG9vc2UgYSByZWdpc3RyeSBmb3IgaW5zdGFsbGluZ1wiKVxuICAgICAgLmFjdGlvbigocGx1Z2luczogc3RyaW5nW10sIHByb2dyYW06IGFueSkgPT4ge1xuICAgICAgICBjb25zdCB7IHByb3h5LCByZWdpc3RyeSB9ID0gcHJvZ3JhbVxuICAgICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICAgIHByb3h5LFxuICAgICAgICAgIHJlZ2lzdHJ5LFxuICAgICAgICB9XG4gICAgICAgIGN0eC5wbHVnaW5IYW5kbGVyLnVwZGF0ZShwbHVnaW5zLCBvcHRpb25zKS5jYXRjaCgoZTogRXJyb3IpID0+IHtcbiAgICAgICAgICBjdHgubG9nLmVycm9yKGUpXG4gICAgICAgIH0pXG4gICAgICB9KVxuICB9LFxufVxuXG5leHBvcnQgZGVmYXVsdCBwbHVnaW5IYW5kbGVyXG4iLCJpbXBvcnQgeyBJUGljR28sIElQbHVnaW4gfSBmcm9tIFwiLi4vLi4vdHlwZXNcIlxuXG5jb25zdCBjb25maWc6IElQbHVnaW4gPSB7XG4gIGhhbmRsZTogKGN0eDogSVBpY0dvKSA9PiB7XG4gICAgY29uc3QgY21kID0gY3R4LmNtZFxuICAgIGNtZC5wcm9ncmFtLm9wdGlvbihcIi1jLCAtLWNvbmZpZyA8cGF0aD5cIiwgXCJzZXQgY29uZmlnIHBhdGhcIilcbiAgICAvLyB3aWxsIGhhbmRsZSBpbiBgYmluL3BpY2dvYFxuICB9LFxufVxuXG5leHBvcnQgZGVmYXVsdCBjb25maWdcbiIsImltcG9ydCBmcyBmcm9tIFwiZnMtZXh0cmFcIlxuaW1wb3J0IHBhdGggZnJvbSBcInBhdGhcIlxuaW1wb3J0IHsgaW1hZ2VTaXplIH0gZnJvbSBcImltYWdlLXNpemVcIlxuaW1wb3J0IHsgSUltZ1NpemUsIElQYXRoVHJhbnNmb3JtZWRJbWdJbmZvLCBJUGx1Z2luTmFtZVR5cGUsIElMb2dnZXIsIElQaWNHbyB9IGZyb20gXCIuLi90eXBlc1wiXG5pbXBvcnQgeyBVUkwgfSBmcm9tIFwidXJsXCJcblxuZXhwb3J0IGNvbnN0IGlzVXJsID0gKHVybDogc3RyaW5nKTogYm9vbGVhbiA9PiB1cmwuc3RhcnRzV2l0aChcImh0dHA6Ly9cIikgfHwgdXJsLnN0YXJ0c1dpdGgoXCJodHRwczovL1wiKVxuZXhwb3J0IGNvbnN0IGlzVXJsRW5jb2RlID0gKHVybDogc3RyaW5nKTogYm9vbGVhbiA9PiB7XG4gIHVybCA9IHVybCB8fCBcIlwiXG4gIHRyeSB7XG4gICAgLy8gdGhlIHdob2xlIHVybCBlbmNvZGUgb3IgZGVjb2RlIHNob2xkIG5vdCB1c2UgZW5jb2RlVVJJQ29tcG9uZW50IG9yIGRlY29kZVVSSUNvbXBvbmVudFxuICAgIHJldHVybiB1cmwgIT09IGRlY29kZVVSSSh1cmwpXG4gIH0gY2F0Y2ggKGUpIHtcbiAgICAvLyBpZiBzb21lIGVycm9yIGNhdWdodCwgdHJ5IHRvIGxldCBpdCBnb1xuICAgIHJldHVybiB0cnVlXG4gIH1cbn1cbmV4cG9ydCBjb25zdCBoYW5kbGVVcmxFbmNvZGUgPSAodXJsOiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICBpZiAoIWlzVXJsRW5jb2RlKHVybCkpIHtcbiAgICB1cmwgPSBlbmNvZGVVUkkodXJsKVxuICB9XG4gIHJldHVybiB1cmxcbn1cblxuZXhwb3J0IGNvbnN0IGdldEltYWdlU2l6ZSA9IChmaWxlOiBCdWZmZXIpOiBJSW1nU2l6ZSA9PiB7XG4gIHRyeSB7XG4gICAgY29uc3QgeyB3aWR0aCA9IDAsIGhlaWdodCA9IDAgfSA9IGltYWdlU2l6ZShmaWxlKVxuICAgIHJldHVybiB7XG4gICAgICByZWFsOiB0cnVlLFxuICAgICAgd2lkdGgsXG4gICAgICBoZWlnaHQsXG4gICAgfVxuICB9IGNhdGNoIChlKSB7XG4gICAgLy8gZmFsbGJhY2sgdG8gMjAwICogMjAwXG4gICAgcmV0dXJuIHtcbiAgICAgIHJlYWw6IGZhbHNlLFxuICAgICAgd2lkdGg6IDIwMCxcbiAgICAgIGhlaWdodDogMjAwLFxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY29uc3QgZ2V0RlNGaWxlID0gYXN5bmMgKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPElQYXRoVHJhbnNmb3JtZWRJbWdJbmZvPiA9PiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGV4dG5hbWU6IHBhdGguZXh0bmFtZShmaWxlUGF0aCksXG4gICAgICBmaWxlTmFtZTogcGF0aC5iYXNlbmFtZShmaWxlUGF0aCksXG4gICAgICBidWZmZXI6IGF3YWl0IGZzLnJlYWRGaWxlKGZpbGVQYXRoKSxcbiAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgfVxuICB9IGNhdGNoIHtcbiAgICByZXR1cm4ge1xuICAgICAgcmVhc29uOiBgcmVhZCBmaWxlICR7ZmlsZVBhdGh9IGVycm9yYCxcbiAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY29uc3QgZ2V0VVJMRmlsZSA9IGFzeW5jICh1cmw6IHN0cmluZywgY3R4OiBJUGljR28pOiBQcm9taXNlPElQYXRoVHJhbnNmb3JtZWRJbWdJbmZvPiA9PiB7XG4gIHVybCA9IGhhbmRsZVVybEVuY29kZSh1cmwpXG4gIGxldCBpc0ltYWdlID0gZmFsc2VcbiAgbGV0IGV4dG5hbWUgPSBcIlwiXG4gIGxldCB0aW1lb3V0SWQ6IE5vZGVKUy5UaW1lb3V0XG4gIGNvbnN0IHJlcXVlc3RGbiA9IG5ldyBQcm9taXNlPElQYXRoVHJhbnNmb3JtZWRJbWdJbmZvPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgOyhhc3luYyAoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBjdHhcbiAgICAgICAgICAucmVxdWVzdCh7XG4gICAgICAgICAgICBtZXRob2Q6IFwiZ2V0XCIsXG4gICAgICAgICAgICB1cmwsXG4gICAgICAgICAgICByZXNvbHZlV2l0aEZ1bGxSZXNwb25zZTogdHJ1ZSxcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJhcnJheWJ1ZmZlclwiLFxuICAgICAgICAgIH0pXG4gICAgICAgICAgLnRoZW4oKHJlc3ApID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRlbnRUeXBlID0gcmVzcC5oZWFkZXJzW1wiY29udGVudC10eXBlXCJdXG4gICAgICAgICAgICBpZiAoY29udGVudFR5cGU/LmluY2x1ZGVzKFwiaW1hZ2VcIikpIHtcbiAgICAgICAgICAgICAgaXNJbWFnZSA9IHRydWVcbiAgICAgICAgICAgICAgZXh0bmFtZSA9IGAuJHtjb250ZW50VHlwZS5zcGxpdChcImltYWdlL1wiKVsxXX1gXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzcC5kYXRhIGFzIEJ1ZmZlclxuICAgICAgICAgIH0pXG4gICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0SWQpXG4gICAgICAgIGlmIChpc0ltYWdlKSB7XG4gICAgICAgICAgY29uc3QgdXJsUGF0aCA9IG5ldyBVUkwodXJsKS5wYXRobmFtZVxuICAgICAgICAgIHJlc29sdmUoe1xuICAgICAgICAgICAgYnVmZmVyOiByZXMsXG4gICAgICAgICAgICBmaWxlTmFtZTogcGF0aC5iYXNlbmFtZSh1cmxQYXRoKSxcbiAgICAgICAgICAgIGV4dG5hbWUsXG4gICAgICAgICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgICAgIH0pXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzb2x2ZSh7XG4gICAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICAgIHJlYXNvbjogYCR7dXJsfSBpcyBub3QgaW1hZ2VgLFxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRJZClcbiAgICAgICAgcmVzb2x2ZSh7XG4gICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9yZXN0cmljdC10ZW1wbGF0ZS1leHByZXNzaW9uc1xuICAgICAgICAgIHJlYXNvbjogYHJlcXVlc3QgJHt1cmx9IGVycm9yLCAke2Vycm9yPy5tZXNzYWdlID8/IFwiXCJ9YCxcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9KSgpLmNhdGNoKHJlamVjdClcbiAgfSlcbiAgY29uc3QgdGltZW91dFByb21pc2UgPSBuZXcgUHJvbWlzZTxJUGF0aFRyYW5zZm9ybWVkSW1nSW5mbz4oKHJlc29sdmUpOiB2b2lkID0+IHtcbiAgICB0aW1lb3V0SWQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHJlc29sdmUoe1xuICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgcmVhc29uOiBgcmVxdWVzdCAke3VybH0gdGltZW91dGAsXG4gICAgICB9KVxuICAgIH0sIDEwMDAwKVxuICB9KVxuICByZXR1cm4gUHJvbWlzZS5yYWNlKFtyZXF1ZXN0Rm4sIHRpbWVvdXRQcm9taXNlXSlcbn1cblxuLyoqXG4gKiBkZXRlY3QgdGhlIGlucHV0IHN0cmluZydzIHR5cGVcbiAqIGZvciBleGFtcGxlXG4gKiAxLiBAeHh4L3BpY2dvLXBsdWdpbi14eHggLT4gc2NvcGVcbiAqIDIuIHBpY2dvLXBsdWdpbi14eHggLT4gbm9ybWFsXG4gKiAzLiB4eHggLT4gc2ltcGxlXG4gKiA0LiBub3QgZXhpc3RzIG9yIGlzIGEgcGF0aCAtPiB1bmtub3duXG4gKiBAcGFyYW0gbmFtZVxuICovXG5leHBvcnQgY29uc3QgZ2V0UGx1Z2luTmFtZVR5cGUgPSAobmFtZTogc3RyaW5nKTogSVBsdWdpbk5hbWVUeXBlID0+IHtcbiAgaWYgKC9eQFteL10rXFwvcGljZ28tcGx1Z2luLS8udGVzdChuYW1lKSkge1xuICAgIHJldHVybiBcInNjb3BlXCJcbiAgfSBlbHNlIGlmIChuYW1lLnN0YXJ0c1dpdGgoXCJwaWNnby1wbHVnaW4tXCIpKSB7XG4gICAgcmV0dXJuIFwibm9ybWFsXCJcbiAgfSBlbHNlIGlmIChpc1NpbXBsZU5hbWUobmFtZSkpIHtcbiAgICByZXR1cm4gXCJzaW1wbGVcIlxuICB9XG4gIHJldHVybiBcInVua25vd25cIlxufVxuXG4vKipcbiAqIGRldGVjdCB0aGUgaW5wdXQgc3RyaW5nIGlzIGEgc2ltcGxlIHBsdWdpbiBuYW1lIG9yIG5vdFxuICogZm9yIGV4YW1wbGVcbiAqIDEuIHh4eCAtPiB0cnVlXG4gKiAyLiAvVXNyL3h4L3h4eHgvcGljZ28tcGx1Z2luLXh4eCAtPiBmYWxzZVxuICogQHBhcmFtIG5hbWUgcGx1Z2luTmFtZU9yUGF0aFxuICovXG5leHBvcnQgY29uc3QgaXNTaW1wbGVOYW1lID0gKG5hbWVPclBhdGg6IHN0cmluZyk6IGJvb2xlYW4gPT4ge1xuICBpZiAocGF0aC5pc0Fic29sdXRlKG5hbWVPclBhdGgpKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbiAgY29uc3QgcGx1Z2luUGF0aCA9IHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCBuYW1lT3JQYXRoKVxuICBpZiAoZnMuZXhpc3RzU3luYyhwbHVnaW5QYXRoKSkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG4gIGlmIChuYW1lT3JQYXRoLmluY2x1ZGVzKFwiL1wiKSB8fCBuYW1lT3JQYXRoLmluY2x1ZGVzKFwiXFxcXFwiKSkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG4gIHJldHVybiB0cnVlXG59XG5cbi8qKlxuICogc3RyZWFtbGluZSB0aGUgZnVsbCBwbHVnaW4gbmFtZSB0byBhIHNpbXBsZSBvbmVcbiAqIGZvciBleGFtcGxlOlxuICogMS4gcGljZ28tcGx1Z2luLXh4eCAtPiB4eHhcbiAqIDIuIEB4eHgvcGljZ28tcGx1Z2luLXl5eSAtPiB5eXlcbiAqIEBwYXJhbSBuYW1lIHBsdWdpbkZ1bGxOYW1lXG4gKi9cbmV4cG9ydCBjb25zdCBoYW5kbGVTdHJlYW1saW5lUGx1Z2luTmFtZSA9IChuYW1lOiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICBpZiAoL15AW14vXStcXC9waWNnby1wbHVnaW4tLy50ZXN0KG5hbWUpKSB7XG4gICAgcmV0dXJuIG5hbWUucmVwbGFjZSgvXkBbXi9dK1xcL3BpY2dvLXBsdWdpbi0vLCBcIlwiKVxuICB9IGVsc2Uge1xuICAgIHJldHVybiBuYW1lLnJlcGxhY2UoL3BpY2dvLXBsdWdpbi0vLCBcIlwiKVxuICB9XG59XG5cbi8qKlxuICogY29tcGxldGUgcGx1Z2luIG5hbWUgdG8gZnVsbCBuYW1lXG4gKiBmb3IgZXhhbXBsZTpcbiAqIDEuIHh4eCAtPiBwaWNnby1wbHVnaW4teHh4XG4gKiAyLiBwaWNnby1wbHVnaW4teHh4IC0+IHBpY2dvLXBsdWdpbi14eHhcbiAqIEBwYXJhbSBuYW1lIHBsdWdpblNpbXBsZU5hbWVcbiAqIEBwYXJhbSBzY29wZSBwbHVnaW5TY29wZVxuICovXG5leHBvcnQgY29uc3QgaGFuZGxlQ29tcGxldGVQbHVnaW5OYW1lID0gKG5hbWU6IHN0cmluZywgc2NvcGUgPSBcIlwiKTogc3RyaW5nID0+IHtcbiAgaWYgKHNjb3BlKSB7XG4gICAgcmV0dXJuIGBAJHtzY29wZX0vcGljZ28tcGx1Z2luLSR7bmFtZX1gXG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGBwaWNnby1wbHVnaW4tJHtuYW1lfWBcbiAgfVxufVxuXG4vKipcbiAqIGhhbmRsZSBpbnN0YWxsL3VuaW5zdGFsbC91cGRhdGUgcGx1Z2luIG5hbWUgb3IgcGF0aFxuICogZm9yIGV4YW1wbGVcbiAqIDEuIHBpY2dvLXBsdWdpbi14eHggLT4gcGljZ28tcGx1Z2luLXh4eFxuICogMi4gQHh4eC9waWNnby1wbHVnaW4teHh4IC0+IEB4eHgvcGljZ28tcGx1Z2luLXh4eFxuICogMy4geHh4IC0+IHBpY2dvLXBsdWdpbi14eHhcbiAqIDQuIC4veHh4eC9waWNnby1wbHVnaW4teHh4IC0+IC9hYnNvbHV0ZVBhdGgvLi4uL3h4eHgvcGljZ28tcGx1Z2luLXh4eFxuICogNS4gL2Fic29sdXRlUGF0aC8uLi4vcGljZ28tcGx1Z2luLXh4eCAtPiAvYWJzb2x1dGVQYXRoLy4uLi9waWNnby1wbHVnaW4teHh4XG4gKiBAcGFyYW0gbmFtZU9yUGF0aCBwbHVnaW5OYW1lIG9yIHBsdWdpblBhdGhcbiAqL1xuZXhwb3J0IGNvbnN0IGdldFByb2Nlc3NQbHVnaW5OYW1lID0gKG5hbWVPclBhdGg6IHN0cmluZywgbG9nZ2VyOiBJTG9nZ2VyIHwgQ29uc29sZSA9IGNvbnNvbGUpOiBzdHJpbmcgPT4ge1xuICBjb25zdCBwbHVnaW5OYW1lVHlwZSA9IGdldFBsdWdpbk5hbWVUeXBlKG5hbWVPclBhdGgpXG4gIHN3aXRjaCAocGx1Z2luTmFtZVR5cGUpIHtcbiAgICBjYXNlIFwibm9ybWFsXCI6XG4gICAgY2FzZSBcInNjb3BlXCI6XG4gICAgICByZXR1cm4gbmFtZU9yUGF0aFxuICAgIGNhc2UgXCJzaW1wbGVcIjpcbiAgICAgIHJldHVybiBoYW5kbGVDb21wbGV0ZVBsdWdpbk5hbWUobmFtZU9yUGF0aClcbiAgICBkZWZhdWx0OiB7XG4gICAgICAvLyBub3csIHRoZSBwbHVnaW5OYW1lVHlwZSBpcyB1bmtub3cgaGVyZVxuICAgICAgLy8gMS4gY2hlY2sgaWYgaXMgYW4gYWJzb2x1dGUgcGF0aFxuICAgICAgbGV0IHBsdWdpblBhdGggPSBuYW1lT3JQYXRoXG4gICAgICBpZiAocGF0aC5pc0Fic29sdXRlKG5hbWVPclBhdGgpICYmIGZzLmV4aXN0c1N5bmMobmFtZU9yUGF0aCkpIHtcbiAgICAgICAgcmV0dXJuIGhhbmRsZVVuaXhTdHlsZVBhdGgocGx1Z2luUGF0aClcbiAgICAgIH1cbiAgICAgIC8vIDIuIGNoZWNrIGlmIGlzIGEgcmVsYXRpdmUgcGF0aFxuICAgICAgcGx1Z2luUGF0aCA9IHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCBuYW1lT3JQYXRoKVxuICAgICAgaWYgKGZzLmV4aXN0c1N5bmMocGx1Z2luUGF0aCkpIHtcbiAgICAgICAgcmV0dXJuIGhhbmRsZVVuaXhTdHlsZVBhdGgocGx1Z2luUGF0aClcbiAgICAgIH1cbiAgICAgIC8vIDMuIGludmFsaWQgbmFtZU9yUGF0aFxuICAgICAgbG9nZ2VyLndhcm4oYENhbid0IGZpbmQgcGx1Z2luICR7bmFtZU9yUGF0aH1gKVxuICAgICAgcmV0dXJuIFwiXCJcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBnZXQgdGhlIG5vcm1hbCBwbHVnaW4gbmFtZVxuICogZm9yIGV4YW1wbGU6XG4gKiAxLiBwaWNnby1wbHVnaW4teHh4IC0+IHBpY2dvLXBsdWdpbi14eHhcbiAqIDIuIEB4eHgvcGljZ28tcGx1Z2luLXh4eCAtPiBAeHh4L3BpY2dvLXBsdWdpbi14eHhcbiAqIDMuIC4veHh4eC9waWNnby1wbHVnaW4teHh4IC0+IHBpY2dvLXBsdWdpbi14eHhcbiAqIDQuIC9hYnNvbHV0ZVBhdGgvLi4uL3BpY2dvLXBsdWdpbi14eHggLT4gcGljZ28tcGx1Z2luLXh4eFxuICogNS4gYW4gZXhjZXB0aW9uOiBbcGFja2FnZS5qc29uJ3MgbmFtZV0gIT09IFtmb2xkZXIgbmFtZV1cbiAqIHRoZW4gdXNlIFtwYWNrYWdlLmpzb24ncyBuYW1lXSwgdXN1YWxseSBtYXRjaCB0aGUgc2NvcGUgcGFja2FnZS5cbiAqIDYuIGlmIHBsdWdpbiBuYW1lIGhhcyB2ZXJzaW9uOiBwaWNnby1wbHVnaW4teHh4QHgueC54IHRoZW4gcmVtb3ZlIHRoZSB2ZXJzaW9uXG4gKiBAcGFyYW0gbmFtZU9yUGF0aFxuICovXG5leHBvcnQgY29uc3QgZ2V0Tm9ybWFsUGx1Z2luTmFtZSA9IChuYW1lT3JQYXRoOiBzdHJpbmcsIGxvZ2dlcjogSUxvZ2dlciB8IENvbnNvbGUgPSBjb25zb2xlKTogc3RyaW5nID0+IHtcbiAgY29uc3QgcGx1Z2luTmFtZVR5cGUgPSBnZXRQbHVnaW5OYW1lVHlwZShuYW1lT3JQYXRoKVxuICBzd2l0Y2ggKHBsdWdpbk5hbWVUeXBlKSB7XG4gICAgY2FzZSBcIm5vcm1hbFwiOlxuICAgICAgcmV0dXJuIHJlbW92ZVBsdWdpblZlcnNpb24obmFtZU9yUGF0aClcbiAgICBjYXNlIFwic2NvcGVcIjpcbiAgICAgIHJldHVybiByZW1vdmVQbHVnaW5WZXJzaW9uKG5hbWVPclBhdGgsIHRydWUpXG4gICAgY2FzZSBcInNpbXBsZVwiOlxuICAgICAgcmV0dXJuIHJlbW92ZVBsdWdpblZlcnNpb24oaGFuZGxlQ29tcGxldGVQbHVnaW5OYW1lKG5hbWVPclBhdGgpKVxuICAgIGRlZmF1bHQ6IHtcbiAgICAgIC8vIG5vdywgdGhlIG5hbWVPclBhdGggbXVzdCBiZSBwYXRoXG4gICAgICAvLyB0aGUgbmFtZU9yUGF0aCBoZXJlIHdpbGwgYmUgZW5zdXJlZCB3aXRoIHVuaXggc3R5bGVcbiAgICAgIC8vIHdlIG5lZWQgdG8gZmluZCB0aGUgcGFja2FnZS5qc29uJ3MgbmFtZSBjYXVzZSBucG0gdXNpbmcgdGhlIG5hbWUgaW4gcGFja2FnZS5qc29uJ3MgbmFtZSBmaWxlZFxuICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKG5hbWVPclBhdGgpKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKGBDYW4ndCBmaW5kIHBsdWdpbjogJHtuYW1lT3JQYXRofWApXG4gICAgICAgIHJldHVybiBcIlwiXG4gICAgICB9XG4gICAgICBjb25zdCBwYWNrYWdlSlNPTlBhdGggPSBwYXRoLnBvc2l4LmpvaW4obmFtZU9yUGF0aCwgXCJwYWNrYWdlLmpzb25cIilcbiAgICAgIGlmICghZnMuZXhpc3RzU3luYyhwYWNrYWdlSlNPTlBhdGgpKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKGBDYW4ndCBmaW5kIHBsdWdpbjogJHtuYW1lT3JQYXRofWApXG4gICAgICAgIHJldHVybiBcIlwiXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBwa2cgPSBmcy5yZWFkSlNPTlN5bmMocGFja2FnZUpTT05QYXRoKSB8fCB7fVxuICAgICAgICBpZiAoIXBrZy5uYW1lPy5pbmNsdWRlcyhcInBpY2dvLXBsdWdpbi1cIikpIHtcbiAgICAgICAgICBsb2dnZXIud2FybihcbiAgICAgICAgICAgIGBUaGUgcGx1Z2luIHBhY2thZ2UuanNvbidzIG5hbWUgZmlsZWQgaXMgJHtcbiAgICAgICAgICAgICAgKHBrZy5uYW1lIGFzIHN0cmluZykgfHwgXCJlbXB0eVwiXG4gICAgICAgICAgICB9LCBuZWVkIHRvIGluY2x1ZGUgdGhlIHByZWZpeDogcGljZ28tcGx1Z2luLWBcbiAgICAgICAgICApXG4gICAgICAgICAgcmV0dXJuIFwiXCJcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcGtnLm5hbWVcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBoYW5kbGUgdHJhbnNmb3JtIHRoZSBwYXRoIHRvIHVuaXggc3R5bGVcbiAqIGZvciBleGFtcGxlXG4gKiAxLiBDOlxcXFx4eHhcXFxceHh4IC0+IEM6L3h4eC94eHhcbiAqIDIuIC94eHgveHh4IC0+IC94eHgveHh4XG4gKiBAcGFyYW0gcGF0aFxuICovXG5leHBvcnQgY29uc3QgaGFuZGxlVW5peFN0eWxlUGF0aCA9IChwYXRoU3RyOiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICBjb25zdCBwYXRoQXJyID0gcGF0aFN0ci5zcGxpdChwYXRoLnNlcClcbiAgcmV0dXJuIHBhdGhBcnIuam9pbihcIi9cIilcbn1cblxuLyoqXG4gKiByZW1vdmUgcGx1Z2luIHZlcnNpb24gd2hlbiByZWdpc3RlciBwbHVnaW4gbmFtZVxuICogMS4gcGljZ28tcGx1Z2luLXh4eEAxLjAuMCAtPiBwaWNnby1wbHVnaW4teHh4XG4gKiAyLiBAeHh4L3BpY2dvLXBsdWdpbi14eHhAMS4wLjAgLT4gQHh4eC9waWNnby1wbHVnaW4teHh4XG4gKiBAcGFyYW0gbmFtZU9yUGF0aFxuICogQHBhcmFtIHNjb3BlXG4gKi9cbmV4cG9ydCBjb25zdCByZW1vdmVQbHVnaW5WZXJzaW9uID0gKG5hbWVPclBhdGg6IHN0cmluZywgc2NvcGUgPSBmYWxzZSk6IHN0cmluZyA9PiB7XG4gIGlmICghbmFtZU9yUGF0aC5pbmNsdWRlcyhcIkBcIikpIHtcbiAgICByZXR1cm4gbmFtZU9yUGF0aFxuICB9IGVsc2Uge1xuICAgIGxldCByZWcgPSAvKC4rXFwvKT8ocGljZ28tcGx1Z2luLVxcdyspKEAuKykqL1xuICAgIC8vIGlmIGlzIGEgc2NvcGUgcGtnXG4gICAgaWYgKHNjb3BlKSB7XG4gICAgICByZWcgPSAvKC4rXFwvKT8oXkBbXi9dK1xcL3BpY2dvLXBsdWdpbi1cXHcrKShALispKi9cbiAgICB9XG4gICAgY29uc3QgbWF0Y2hBcnIgPSBuYW1lT3JQYXRoLm1hdGNoKHJlZylcbiAgICBpZiAoIW1hdGNoQXJyKSB7XG4gICAgICBjb25zb2xlLndhcm4oXCJjYW4gbm90IHJlbW92ZSBwbHVnaW4gdmVyc2lvblwiKVxuICAgICAgcmV0dXJuIG5hbWVPclBhdGhcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG1hdGNoQXJyWzJdXG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogdGhlIGNvbmZpZyBibGFjayBpdGVtIGxpc3Qgd2hpY2ggd29uJ3QgYmUgc2V0dGVkXG4gKiBvbmx5IGNhbiBiZSBnb3RcbiAqL1xuZXhwb3J0IGNvbnN0IGNvbmZpZ0JsYWNrTGlzdCA9IFtdXG5cbi8qKlxuICogY2hlY2sgc29tZSBjb25maWcga2V5IGlzIGluIGJsYWNrTGlzdFxuICogQHBhcmFtIGtleVxuICovXG5leHBvcnQgY29uc3QgaXNDb25maWdLZXlJbkJsYWNrTGlzdCA9IChrZXk6IHN0cmluZyk6IGJvb2xlYW4gPT4ge1xuICByZXR1cm4gY29uZmlnQmxhY2tMaXN0LnNvbWUoKGJsYWNrSXRlbSkgPT4ga2V5LnN0YXJ0c1dpdGgoYmxhY2tJdGVtKSlcbn1cblxuLyoqXG4gKiBjaGVjayB0aGUgaW5wdXQgY29uZmlnIGlzIHZhbGlkXG4gKiBjb25maWcgbXVzdCBiZSBvYmplY3Qgc3VjaCBhcyB7IHh4eDogJ3h4eCcgfVxuICogJiYgY2FuJ3QgYmUgYXJyYXlcbiAqIEBwYXJhbSBjb25maWdcbiAqIEByZXR1cm5zXG4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvZXhwbGljaXQtbW9kdWxlLWJvdW5kYXJ5LXR5cGVzXG5leHBvcnQgY29uc3QgaXNJbnB1dENvbmZpZ1ZhbGlkID0gKGNvbmZpZzogYW55KTogYm9vbGVhbiA9PiB7XG4gIGlmICh0eXBlb2YgY29uZmlnID09PSBcIm9iamVjdFwiICYmICFBcnJheS5pc0FycmF5KGNvbmZpZykgJiYgT2JqZWN0LmtleXMoY29uZmlnKS5sZW5ndGggPiAwKSB7XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuICByZXR1cm4gZmFsc2Vcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNhZmVQYXJzZTxUPihzdHI6IHN0cmluZyk6IFQgfCBzdHJpbmcge1xuICB0cnkge1xuICAgIHJldHVybiBKU09OLnBhcnNlKHN0cilcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXR1cm4gc3RyXG4gIH1cbn1cblxuLy8gaG9sZC4uLlxuLy8gZXhwb3J0IGNvbnN0IGNvbmZpZ1doaXRlTGlzdDogUmVnRXhwW10gPSBbXG4vLyAgIC9ecGljQmVkLyxcbi8vICAgL15waWNnb1BsdWdpbnMvLFxuLy8gICAvXkBbXi9dK1xcL3BpY2dvLXBsdWdpbi0vLFxuLy8gICAvZGVidWcvLFxuLy8gICAvc2lsZW50Lyxcbi8vICAgL2NvbmZpZ1BhdGgvLFxuLy8gICAvXnNldHRpbmdzLyxcbi8vIF1cblxuLy8gZXhwb3J0IGNvbnN0IGlzQ29uZmlnS2V5SW5XaGl0ZUxpc3QgPSAoa2V5OiBzdHJpbmcpOiBib29sZWFuID0+IHtcbi8vICAgcmV0dXJuIGNvbmZpZ1doaXRlTGlzdC5zb21lKHdoaXRlSXRlbSA9PiB3aGl0ZUl0ZW0udGVzdChrZXkpKVxuLy8gfVxuXG5leHBvcnQgY29uc3QgZm9yY2VOdW1iZXIgPSAobnVtOiBzdHJpbmcgfCBudW1iZXIgPSAwKTogbnVtYmVyID0+IHtcbiAgcmV0dXJuIGlzTmFOKE51bWJlcihudW0pKSA/IDAgOiBOdW1iZXIobnVtKVxufVxuXG5leHBvcnQgY29uc3QgaXNEZXYgPSAoKTogYm9vbGVhbiA9PiB7XG4gIHJldHVybiBwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJkZXZlbG9wbWVudFwiXG59XG5cbmV4cG9ydCBjb25zdCBpc1Byb2QgPSAoKTogYm9vbGVhbiA9PiB7XG4gIHJldHVybiBwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCJcbn1cbiIsImltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCJcbmltcG9ydCBmcyBmcm9tIFwiZnMtZXh0cmFcIlxuaW1wb3J0IHsgaXNVcmwgfSBmcm9tIFwiLi4vLi4vdXRpbHMvY29tbW9uXCJcbmltcG9ydCB7IElQaWNHbywgSVBsdWdpbiB9IGZyb20gXCIuLi8uLi90eXBlc1wiXG5cbmNvbnN0IHVwbG9hZDogSVBsdWdpbiA9IHtcbiAgaGFuZGxlOiAoY3R4OiBJUGljR28pID0+IHtcbiAgICBjb25zdCBjbWQgPSBjdHguY21kXG4gICAgY21kLnByb2dyYW1cbiAgICAgIC5jb21tYW5kKFwidXBsb2FkXCIpXG4gICAgICAuZGVzY3JpcHRpb24oXCJ1cGxvYWQsIGdvIGdvIGdvXCIpXG4gICAgICAuYXJndW1lbnRzKFwiW2lucHV0Li4uXVwiKVxuICAgICAgLmFsaWFzKFwidVwiKVxuICAgICAgLmFjdGlvbigoaW5wdXQ6IHN0cmluZ1tdKSA9PiB7XG4gICAgICAgIDsoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGlucHV0TGlzdCA9IGlucHV0XG4gICAgICAgICAgICAubWFwKChpdGVtOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgICAgcmV0dXJuIGlzVXJsKGl0ZW0pID8gaXRlbSA6IHBhdGgucmVzb2x2ZShpdGVtKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5maWx0ZXIoKGl0ZW06IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgICBjb25zdCBleGlzdCA9IGZzLmV4aXN0c1N5bmMoaXRlbSkgfHwgaXNVcmwoaXRlbSlcbiAgICAgICAgICAgICAgaWYgKCFleGlzdCkge1xuICAgICAgICAgICAgICAgIGN0eC5sb2cud2FybihgJHtpdGVtfSBkb2VzIG5vdCBleGlzdC5gKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiBleGlzdFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICBhd2FpdCBjdHgudXBsb2FkKGlucHV0TGlzdClcbiAgICAgICAgfSkoKS5jYXRjaCgoZSkgPT4ge1xuICAgICAgICAgIGN0eC5sb2cuZXJyb3IoZSlcbiAgICAgICAgfSlcbiAgICAgIH0pXG4gIH0sXG59XG5cbmV4cG9ydCBkZWZhdWx0IHVwbG9hZFxuIiwiaW1wb3J0IHsgSVBpY0dvLCBJUGx1Z2luQ29uZmlnLCBJU3RyaW5nS2V5TWFwIH0gZnJvbSBcIi4uLy4uL3R5cGVzXCJcblxuLy8gaGFuZGxlIG1vZHVsZXMgY29uZmlnIC0+IHNhdmUgdG8gcGljZ28gY29uZmlnIGZpbGVcbmNvbnN0IGhhbmRsZUNvbmZpZyA9IGFzeW5jIChjdHg6IElQaWNHbywgcHJvbXB0czogSVBsdWdpbkNvbmZpZ1tdLCBtb2R1bGU6IHN0cmluZywgbmFtZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gIGNvbnN0IGFuc3dlciA9IGF3YWl0IGN0eC5jbWQuaW5xdWlyZXIucHJvbXB0KHByb21wdHMpXG4gIGNvbnN0IGNvbmZpZ05hbWUgPSBtb2R1bGUgPT09IFwidXBsb2FkZXJcIiA/IGBwaWNCZWQuJHtuYW1lfWAgOiBtb2R1bGUgPT09IFwidHJhbnNmb3JtZXJcIiA/IGB0cmFuc2Zvcm1lci4ke25hbWV9YCA6IG5hbWVcbiAgY3R4LnNhdmVDb25maWcoe1xuICAgIFtjb25maWdOYW1lXTogYW5zd2VyLFxuICB9KVxufVxuXG5jb25zdCBzZXR0aW5nID0ge1xuICBoYW5kbGU6IChjdHg6IElQaWNHbykgPT4ge1xuICAgIGNvbnN0IGNtZCA9IGN0eC5jbWRcbiAgICBjbWQucHJvZ3JhbVxuICAgICAgLmNvbW1hbmQoXCJzZXRcIilcbiAgICAgIC5hbGlhcyhcImNvbmZpZ1wiKVxuICAgICAgLmFyZ3VtZW50cyhcIjxtb2R1bGU+IFtuYW1lXVwiKVxuICAgICAgLmRlc2NyaXB0aW9uKFwiY29uZmlndXJlIGNvbmZpZyBvZiBwaWNnbyBtb2R1bGVzXCIpXG4gICAgICAuYWN0aW9uKChtb2R1bGU6IHN0cmluZywgbmFtZTogc3RyaW5nKSA9PiB7XG4gICAgICAgIDsoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyAvLyBsb2FkIHRoaXJkLXBhcnR5IHBsdWdpbnNcbiAgICAgICAgICAgIC8vIGF3YWl0IGN0eC5wbHVnaW5Mb2FkZXIubG9hZCgpXG4gICAgICAgICAgICAvLyBpZiBhIG1vZHVsZSBpcyBzcGVjaWZpYywgdGhlbiBqdXN0IHNldCB0aGlzIG9wdGlvbiBpbiBjb25maWdcbiAgICAgICAgICAgIHN3aXRjaCAobW9kdWxlKSB7XG4gICAgICAgICAgICAgIGNhc2UgXCJ1cGxvYWRlclwiOlxuICAgICAgICAgICAgICBjYXNlIFwidHJhbnNmb3JtZXJcIjpcbiAgICAgICAgICAgICAgICBpZiAobmFtZSkge1xuICAgICAgICAgICAgICAgICAgY29uc3QgaXRlbSA9IGN0eC5oZWxwZXJbbW9kdWxlXS5nZXQobmFtZSlcbiAgICAgICAgICAgICAgICAgIGlmICghaXRlbSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY3R4LmxvZy5lcnJvcihgTm8gJHttb2R1bGV9IG5hbWVkICR7bmFtZX1gKVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0uY29uZmlnKSB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGhhbmRsZUNvbmZpZyhjdHgsIGl0ZW0uY29uZmlnKGN0eCksIG1vZHVsZSwgbmFtZSlcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgY29uc3QgcHJvbXB0cyA9IFtcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFwibGlzdFwiLFxuICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IGAke21vZHVsZX1gLFxuICAgICAgICAgICAgICAgICAgICAgIGNob2ljZXM6IGN0eC5oZWxwZXJbbW9kdWxlXS5nZXRJZExpc3QoKSxcbiAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBgQ2hvb3NlIGEobikgJHttb2R1bGV9YCxcbiAgICAgICAgICAgICAgICAgICAgICAvLyBkZWZhdWx0OiBjdHguZ2V0Q29uZmlnKCdwaWNCZWQudXBsb2FkZXInKSB8fCBjdHguZ2V0Q29uZmlnKCdwaWNCZWQuY3VycmVudCcpXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgICBjb25zdCBhbnN3ZXIgPSBhd2FpdCBjdHguY21kLmlucXVpcmVyLnByb21wdDxJU3RyaW5nS2V5TWFwPGFueT4+KHByb21wdHMpXG4gICAgICAgICAgICAgICAgICBjb25zdCBpdGVtID0gY3R4LmhlbHBlclttb2R1bGVdLmdldChhbnN3ZXJbbW9kdWxlXSlcbiAgICAgICAgICAgICAgICAgIGlmIChpdGVtPy5jb25maWcpIHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgaGFuZGxlQ29uZmlnKGN0eCwgaXRlbS5jb25maWcoY3R4KSwgbW9kdWxlLCBhbnN3ZXJbbW9kdWxlXSlcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgY2FzZSBcInBsdWdpblwiOlxuICAgICAgICAgICAgICAgIGlmIChuYW1lKSB7XG4gICAgICAgICAgICAgICAgICBpZiAoIW5hbWUuaW5jbHVkZXMoXCJwaWNnby1wbHVnaW4tXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWUgPSBgcGljZ28tcGx1Z2luLSR7bmFtZX1gXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBpZiAoT2JqZWN0LmtleXMoY3R4LmdldENvbmZpZyhcInBpY2dvUGx1Z2luc1wiKSkuaW5jbHVkZXMobmFtZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGN0eC5wbHVnaW5Mb2FkZXIuZ2V0UGx1Z2luKG5hbWUpPy5jb25maWcpIHtcbiAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBoYW5kbGVDb25maWcoY3R4LCBjdHgucGx1Z2luTG9hZGVyLmdldFBsdWdpbihuYW1lKSEuY29uZmlnIShjdHgpLCBcInBsdWdpblwiLCBuYW1lKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY3R4LmxvZy5lcnJvcihgTm8gcGx1Z2luIG5hbWVkICR7bmFtZX1gKVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBwcm9tcHRzID0gW1xuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJsaXN0XCIsXG4gICAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJwbHVnaW5cIixcbiAgICAgICAgICAgICAgICAgICAgICBjaG9pY2VzOiBjdHgucGx1Z2luTG9hZGVyLmdldEZ1bGxMaXN0KCksXG4gICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogXCJDaG9vc2UgYSBwbHVnaW5cIixcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICAgIGNvbnN0IGFuc3dlciA9IGF3YWl0IGN0eC5jbWQuaW5xdWlyZXIucHJvbXB0PGFueT4ocHJvbXB0cylcbiAgICAgICAgICAgICAgICAgIGlmIChjdHgucGx1Z2luTG9hZGVyLmdldFBsdWdpbihhbnN3ZXIucGx1Z2luKT8uY29uZmlnKSB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGhhbmRsZUNvbmZpZyhcbiAgICAgICAgICAgICAgICAgICAgICBjdHgsXG4gICAgICAgICAgICAgICAgICAgICAgY3R4LnBsdWdpbkxvYWRlci5nZXRQbHVnaW4oYW5zd2VyLnBsdWdpbikhLmNvbmZpZyEoY3R4KSxcbiAgICAgICAgICAgICAgICAgICAgICBcInBsdWdpblwiLFxuICAgICAgICAgICAgICAgICAgICAgIGFuc3dlci5wbHVnaW5cbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIGN0eC5sb2cud2FybihgTm8gbW9kdWxlIG5hbWVkICR7bW9kdWxlfWApXG4gICAgICAgICAgICAgICAgcmV0dXJuIGN0eC5sb2cud2FybihcIkF2YWlsYWJsZSBtb2R1bGVzIGFyZSB1cGxvYWRlcnx0cmFuc2Zvcm1lcnxwbHVnaW5cIilcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHVzZU1vZHVsZU5hbWUgPSBtb2R1bGUgPT09IFwicGx1Z2luXCIgPyBcInBsdWdpbnNcIiA6IG1vZHVsZVxuICAgICAgICAgICAgY3R4LmxvZy5zdWNjZXNzKFwiQ29uZmlndXJlIGNvbmZpZyBzdWNjZXNzZnVsbHkhXCIpXG4gICAgICAgICAgICBjdHgubG9nLmluZm8oYElmIHlvdSB3YW50IHRvIHVzZSB0aGlzIGNvbmZpZywgcGxlYXNlIHJ1biAncGljZ28gdXNlICR7dXNlTW9kdWxlTmFtZX0nYClcbiAgICAgICAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgICAgICAgIGN0eC5sb2cuZXJyb3IoZSlcbiAgICAgICAgICAgIGlmIChwcm9jZXNzLmFyZ3YuaW5jbHVkZXMoXCItLWRlYnVnXCIpKSB7XG4gICAgICAgICAgICAgIHRocm93IGVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pKCkuY2F0Y2goKGUpID0+IHtcbiAgICAgICAgICBjdHgubG9nLmVycm9yKGUpXG4gICAgICAgIH0pXG4gICAgICB9KVxuICB9LFxufVxuXG5leHBvcnQgZGVmYXVsdCBzZXR0aW5nXG4iLCJpbXBvcnQgeyBJUGljR28sIElQbHVnaW4sIFVuZGVmaW5hYmxlLCBJQ0xJQ29uZmlncywgSVN0cmluZ0tleU1hcCB9IGZyb20gXCIuLi8uLi90eXBlc1wiXG5cbmNvbnN0IHVzZTogSVBsdWdpbiA9IHtcbiAgaGFuZGxlOiBhc3luYyAoY3R4OiBJUGljR28pID0+IHtcbiAgICBjb25zdCBjbWQgPSBjdHguY21kXG4gICAgY21kLnByb2dyYW1cbiAgICAgIC5jb21tYW5kKFwidXNlXCIpXG4gICAgICAuYXJndW1lbnRzKFwiW21vZHVsZV1cIilcbiAgICAgIC5kZXNjcmlwdGlvbihcInVzZSBtb2R1bGVzIG9mIHBpY2dvXCIpXG4gICAgICAuYWN0aW9uKChtb2R1bGU6IHN0cmluZykgPT4ge1xuICAgICAgICA7KGFzeW5jICgpID0+IHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gLy8gbG9hZCB0aGlyZC1wYXJ0eSBwbHVnaW5zXG4gICAgICAgICAgICAvLyBhd2FpdCBjdHgucGx1Z2luTG9hZGVyLmxvYWQoKVxuICAgICAgICAgICAgbGV0IHByb21wdHM6IGFueVtdID0gW11cbiAgICAgICAgICAgIGNvbnN0IGNvbmZpZzogSUNMSUNvbmZpZ3MgPSB7XG4gICAgICAgICAgICAgIHVwbG9hZGVyOiB7XG4gICAgICAgICAgICAgICAgdHlwZTogXCJsaXN0XCIsXG4gICAgICAgICAgICAgICAgbmFtZTogXCJ1cGxvYWRlclwiLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IFwiVXNlIGFuIHVwbG9hZGVyXCIsXG4gICAgICAgICAgICAgICAgY2hvaWNlczogY3R4LmhlbHBlci51cGxvYWRlci5nZXRJZExpc3QoKSxcbiAgICAgICAgICAgICAgICBkZWZhdWx0OiBjdHguZ2V0Q29uZmlnKFwicGljQmVkLnVwbG9hZGVyXCIpIHx8IGN0eC5nZXRDb25maWcoXCJwaWNCZWQuY3VycmVudFwiKSB8fCBcImdpdGh1YlwiLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB0cmFuc2Zvcm1lcjoge1xuICAgICAgICAgICAgICAgIHR5cGU6IFwibGlzdFwiLFxuICAgICAgICAgICAgICAgIG5hbWU6IFwidHJhbnNmb3JtZXJcIixcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiBcIlVzZSBhIHRyYW5zZm9ybWVyXCIsXG4gICAgICAgICAgICAgICAgY2hvaWNlczogY3R4LmhlbHBlci50cmFuc2Zvcm1lci5nZXRJZExpc3QoKSxcbiAgICAgICAgICAgICAgICBkZWZhdWx0OiBjdHguZ2V0Q29uZmlnPFVuZGVmaW5hYmxlPHN0cmluZz4+KFwicGljQmVkLnRyYW5zZm9ybWVyXCIpIHx8IFwicGF0aFwiLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBwbHVnaW5zOiB7XG4gICAgICAgICAgICAgICAgdHlwZTogXCJjaGVja2JveFwiLFxuICAgICAgICAgICAgICAgIG5hbWU6IFwicGx1Z2luc1wiLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IFwiVXNlIHBsdWdpbnNcIixcbiAgICAgICAgICAgICAgICBjaG9pY2VzOiBjdHgucGx1Z2luTG9hZGVyLmdldEZ1bGxMaXN0KCksXG4gICAgICAgICAgICAgICAgZGVmYXVsdDogT2JqZWN0LmtleXMoY3R4LmdldENvbmZpZyhcInBpY2dvUGx1Z2luc1wiKSkuZmlsdGVyKChpdGVtOiBzdHJpbmcpID0+XG4gICAgICAgICAgICAgICAgICBjdHguZ2V0Q29uZmlnKGBwaWNnb1BsdWdpbnMuJHtpdGVtfWApXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGlmIGFuIG9wdGlvbiBpcyBzcGVjaWZpYywgdGhlbiBqdXN0IHNldCB0aGlzIG9wdGlvbiBpbiBjb25maWdcbiAgICAgICAgICAgIGlmIChtb2R1bGUpIHtcbiAgICAgICAgICAgICAgaWYgKGNvbmZpZ1ttb2R1bGVdKSB7XG4gICAgICAgICAgICAgICAgcHJvbXB0cy5wdXNoKGNvbmZpZ1ttb2R1bGVdKVxuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGN0eC5sb2cud2FybihgTm8gbW9kdWxlIG5hbWVkICR7bW9kdWxlfWApXG4gICAgICAgICAgICAgICAgcmV0dXJuIGN0eC5sb2cud2FybihcIkF2YWlsYWJsZSBtb2R1bGVzIGFyZSB1cGxvYWRlcnx0cmFuc2Zvcm1lcnxwbHVnaW5zXCIpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHByb21wdHMgPSBPYmplY3Qua2V5cyhjb25maWcpLm1hcCgoaXRlbTogc3RyaW5nKSA9PiBjb25maWdbaXRlbV0pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBhbnN3ZXIgPSBhd2FpdCBjbWQuaW5xdWlyZXIucHJvbXB0PGFueT4ocHJvbXB0cylcblxuICAgICAgICAgICAgLy8gaGFuZGxlIGZvciBwbHVnaW5zIG9wdGlvbiBmcm9tIEFycmF5IHRvIG9iamVjdFxuICAgICAgICAgICAgaWYgKGFuc3dlci5wbHVnaW5zKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHBsdWdpbnMgPSBjdHguZ2V0Q29uZmlnPElTdHJpbmdLZXlNYXA8Ym9vbGVhbj4+KFwicGljZ29QbHVnaW5zXCIpXG4gICAgICAgICAgICAgIE9iamVjdC5rZXlzKHBsdWdpbnMpLm1hcCgoaXRlbTogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGFuc3dlci5wbHVnaW5zLmluY2x1ZGVzKGl0ZW0pKSB7XG4gICAgICAgICAgICAgICAgICBwbHVnaW5zW2l0ZW1dID0gdHJ1ZVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICBwbHVnaW5zW2l0ZW1dID0gZmFsc2VcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIC8vIHNhdmUgY29uZmlnIGZvciBwbHVnaW5zXG4gICAgICAgICAgICAgIGN0eC5zYXZlQ29uZmlnKHtcbiAgICAgICAgICAgICAgICBwaWNnb1BsdWdpbnM6IHBsdWdpbnMsXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBzYXZlIGNvbmZpZyBmb3IgdXBsb2FkZXIgJiB0cmFuc2Zvcm1lclxuICAgICAgICAgICAgY3R4LnNhdmVDb25maWcoe1xuICAgICAgICAgICAgICBcInBpY0JlZC5jdXJyZW50XCI6IGFuc3dlci51cGxvYWRlciB8fCBjdHguZ2V0Q29uZmlnPHN0cmluZz4oXCJwaWNCZWQuY3VycmVudFwiKSxcbiAgICAgICAgICAgICAgXCJwaWNCZWQudXBsb2FkZXJcIjogYW5zd2VyLnVwbG9hZGVyIHx8IGN0eC5nZXRDb25maWc8c3RyaW5nPihcInBpY0JlZC5jdXJyZW50XCIpLFxuICAgICAgICAgICAgICBcInBpY0JlZC50cmFuc2Zvcm1lclwiOiBhbnN3ZXIudHJhbnNmb3JtZXIgfHwgXCJwYXRoXCIsXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgY3R4LmxvZy5zdWNjZXNzKFwiQ29uZmlndXJlIGNvbmZpZyBzdWNjZXNzZnVsbHkhXCIpXG4gICAgICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgICAgICBjdHgubG9nLmVycm9yKGUpXG4gICAgICAgICAgICBpZiAocHJvY2Vzcy5hcmd2LmluY2x1ZGVzKFwiLS1kZWJ1Z1wiKSkge1xuICAgICAgICAgICAgICB0aHJvdyBlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KSgpLmNhdGNoKChlKSA9PiB7XG4gICAgICAgICAgY3R4LmxvZy5lcnJvcihlKVxuICAgICAgICB9KVxuICAgICAgfSlcbiAgfSxcbn1cblxuZXhwb3J0IGRlZmF1bHQgdXNlXG4iLCJpbXBvcnQgeyBJUGljR28sIElQbHVnaW4gfSBmcm9tIFwiLi4vLi4vdHlwZXNcIlxuXG5jb25zdCBwcm94eTogSVBsdWdpbiA9IHtcbiAgaGFuZGxlOiAoY3R4OiBJUGljR28pID0+IHtcbiAgICBjb25zdCBjbWQgPSBjdHguY21kXG4gICAgY21kLnByb2dyYW0ub3B0aW9uKFwiLXAsIC0tcHJveHkgPHVybD5cIiwgXCJzZXQgcHJveHkgZm9yIHVwbG9hZGluZ1wiLCAocHJveHk6IHN0cmluZykgPT4ge1xuICAgICAgY3R4LnNldENvbmZpZyh7XG4gICAgICAgIFwicGljQmVkLnByb3h5XCI6IHByb3h5LFxuICAgICAgfSlcbiAgICB9KVxuICB9LFxufVxuXG5leHBvcnQgZGVmYXVsdCBwcm94eVxuIiwiaW1wb3J0IG1hdGNoIGZyb20gXCJtaW5pbWF0Y2hcIlxuaW1wb3J0IHsgSVBpY0dvLCBJT3B0aW9ucywgSUZpbGVUcmVlIH0gZnJvbSBcIi4uL3R5cGVzXCJcbmltcG9ydCBmcyBmcm9tIFwiZnMtZXh0cmFcIlxuaW1wb3J0IHBhdGggZnJvbSBcInBhdGhcIlxuaW1wb3J0IGdsb2JieSBmcm9tIFwiZ2xvYmJ5XCJcbmltcG9ydCBlanMgZnJvbSBcImVqc1wiXG5cbi8qKlxuICogR2VuZXJhdGUgdGVtcGxhdGUgZmlsZXMgdG8gZGVzdGluYXRpb24gZmlsZXMuXG4gKiBAcGFyYW0ge1BpY0dvfSBjdHhcbiAqIEBwYXJhbSB7SU9wdGlvbnN9IG9wdGlvbnNcbiAqL1xuY29uc3QgZ2VuZXJhdGUgPSBhc3luYyAoY3R4OiBJUGljR28sIG9wdGlvbnM6IElPcHRpb25zKTogUHJvbWlzZTxhbnk+ID0+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBvcHRzID0gZ2V0T3B0aW9ucyhvcHRpb25zLnRtcClcbiAgICBjb25zdCBzb3VyY2UgPSBwYXRoLmpvaW4ob3B0aW9ucy50bXAsIFwidGVtcGxhdGVcIilcbiAgICBsZXQgYW5zd2VycyA9IHt9XG4gICAgaWYgKG9wdHMucHJvbXB0cyAmJiBvcHRzLnByb21wdHMubGVuZ3RoID4gMCkge1xuICAgICAgYW5zd2VycyA9IGF3YWl0IGN0eC5jbWQuaW5xdWlyZXIucHJvbXB0KG9wdHMucHJvbXB0cylcbiAgICB9XG4gICAgbGV0IF9maWxlczogc3RyaW5nW10gPSBhd2FpdCBnbG9iYnkoW1wiKiovKlwiXSwgeyBjd2Q6IHNvdXJjZSwgZG90OiB0cnVlIH0pIC8vIGdldCBmaWxlcycgbmFtZSBhcnJheVxuICAgIF9maWxlcyA9IF9maWxlcy5maWx0ZXIoKGl0ZW06IHN0cmluZykgPT4ge1xuICAgICAgbGV0IGdsb2IgPSBcIlwiXG4gICAgICBPYmplY3Qua2V5cyhvcHRzLmZpbHRlcnMpLmZvckVhY2goKGtleTogc3RyaW5nKSA9PiB7XG4gICAgICAgIGlmIChtYXRjaChpdGVtLCBrZXksIHsgZG90OiB0cnVlIH0pKSB7XG4gICAgICAgICAgZ2xvYiA9IGl0ZW1cbiAgICAgICAgfVxuICAgICAgfSlcbiAgICAgIGlmIChnbG9iKSB7XG4gICAgICAgIC8vIGZpbmQgYSBmaWx0ZXIgZXhwcmVzc2lvblxuICAgICAgICByZXR1cm4gZmlsdGVycyhjdHgsIG9wdHMuZmlsdGVyc1tnbG9iXSwgYW5zd2VycylcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgfSlcbiAgICBpZiAoX2ZpbGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIGN0eC5sb2cud2FybihcIlRlbXBsYXRlIGZpbGVzIG5vdCBmb3VuZCFcIilcbiAgICB9XG4gICAgY29uc3QgZmlsZXMgPSByZW5kZXIoX2ZpbGVzLCBzb3VyY2UsIGFuc3dlcnMpXG4gICAgd3JpdGVGaWxlVHJlZShvcHRpb25zLmRlc3QsIGZpbGVzKVxuICAgIGlmICh0eXBlb2Ygb3B0cy5jb21wbGV0ZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICBvcHRzLmNvbXBsZXRlKHsgYW5zd2Vycywgb3B0aW9ucywgZmlsZXM6IF9maWxlcywgY3R4IH0pXG4gICAgfVxuICAgIGlmIChvcHRzLmNvbXBsZXRlTWVzc2FnZSkge1xuICAgICAgY3R4LmxvZy5zdWNjZXNzKG9wdHMuY29tcGxldGVNZXNzYWdlKVxuICAgIH1cbiAgICBjdHgubG9nLnN1Y2Nlc3MoXCJEb25lIVwiKVxuICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICByZXR1cm4gY3R4LmxvZy5lcnJvcihlKVxuICB9XG59XG5cbi8qKlxuICogUmV0dXJuIHRoZSBmaWx0ZXJzJyByZXN1bHRcbiAqIEBwYXJhbSBjdHggUGljR29cbiAqIEBwYXJhbSBleHAgY29uZGl0aW9uIGV4cHJlc3Npb25cbiAqIEBwYXJhbSBkYXRhIG9wdGlvbnMgZGF0YVxuICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2V4cGxpY2l0LW1vZHVsZS1ib3VuZGFyeS10eXBlc1xuY29uc3QgZmlsdGVycyA9IChjdHg6IElQaWNHbywgZXhwOiBhbnksIGRhdGE6IGFueSk6IGJvb2xlYW4gPT4ge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L3Jlc3RyaWN0LXBsdXMtb3BlcmFuZHMsIG5vLW5ldy1mdW5jLCBAdHlwZXNjcmlwdC1lc2xpbnQvbm8taW1wbGllZC1ldmFsXG4gIGNvbnN0IGZuID0gbmV3IEZ1bmN0aW9uKFwiZGF0YVwiLCBcIndpdGggKGRhdGEpIHsgcmV0dXJuIFwiICsgZXhwICsgXCJ9XCIpXG4gIHRyeSB7XG4gICAgcmV0dXJuIGZuKGRhdGEpXG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBjdHgubG9nLmVycm9yKGBFcnJvciB3aGVuIGV2YWx1YXRpbmcgZmlsdGVyIGNvbmRpdGlvbjogJHtKU09OLnN0cmluZ2lmeShleHApfWApXG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbn1cblxuLyoqXG4gKiBHZXQgdGVtcGxhdGUgb3B0aW9uc1xuICogQHBhcmFtIHtzdHJpbmd9IHRlbXBsYXRlUGF0aFxuICovXG5jb25zdCBnZXRPcHRpb25zID0gKHRlbXBsYXRlUGF0aDogc3RyaW5nKTogYW55ID0+IHtcbiAgY29uc3Qgb3B0aW9uc1BhdGggPSBwYXRoLmpvaW4odGVtcGxhdGVQYXRoLCBcImluZGV4LmpzXCIpXG4gIGlmIChmcy5leGlzdHNTeW5jKG9wdGlvbnNQYXRoKSkge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdmFyLXJlcXVpcmVzXG4gICAgY29uc3Qgb3B0aW9ucyA9IHJlcXVpcmUob3B0aW9uc1BhdGgpXG4gICAgcmV0dXJuIG9wdGlvbnNcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4ge31cbiAgfVxufVxuXG4vKipcbiAqIFJlbmRlciBmaWxlcyB0byBhIHZpcnR1YWwgdHJlZSBvYmplY3RcbiAqIEBwYXJhbSB7YXJyYXl9IGZpbGVzXG4gKiBAcGFyYW0gc291cmNlXG4gKiBAcGFyYW0gb3B0aW9uc1xuICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2V4cGxpY2l0LW1vZHVsZS1ib3VuZGFyeS10eXBlc1xuY29uc3QgcmVuZGVyID0gKGZpbGVzOiBzdHJpbmdbXSwgc291cmNlOiBzdHJpbmcsIG9wdGlvbnM6IGFueSk6IGFueSA9PiB7XG4gIGNvbnN0IGZpbGVUcmVlOiBJRmlsZVRyZWUgPSB7fVxuICBmaWxlcy5mb3JFYWNoKChmaWxlUGF0aDogc3RyaW5nKTogdm9pZCA9PiB7XG4gICAgY29uc3QgZmlsZSA9IGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4oc291cmNlLCBmaWxlUGF0aCksIFwidXRmOFwiKVxuICAgIGNvbnN0IGNvbnRlbnQgPSBlanMucmVuZGVyKGZpbGUsIG9wdGlvbnMpXG4gICAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihjb250ZW50KSB8fCAvW15cXHNdLy50ZXN0KGNvbnRlbnQpKSB7XG4gICAgICBmaWxlVHJlZVtmaWxlUGF0aF0gPSBjb250ZW50XG4gICAgfVxuICB9KVxuICByZXR1cm4gZmlsZVRyZWVcbn1cblxuLyoqXG4gKiBXcml0ZSByZW5kZXJlZCBmaWxlcycgY29udGVudCB0byByZWFsIGZpbGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBkaXJcbiAqIEBwYXJhbSB7b2JqZWN0fSBmaWxlc1xuICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2V4cGxpY2l0LW1vZHVsZS1ib3VuZGFyeS10eXBlc1xuY29uc3Qgd3JpdGVGaWxlVHJlZSA9IChkaXI6IHN0cmluZywgZmlsZXM6IGFueSk6IHZvaWQgPT4ge1xuICBPYmplY3Qua2V5cyhmaWxlcykuZm9yRWFjaCgobmFtZTogc3RyaW5nKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4oZGlyLCBuYW1lKVxuICAgIGZzLmVuc3VyZURpclN5bmMocGF0aC5kaXJuYW1lKGZpbGVQYXRoKSlcbiAgICBmcy53cml0ZUZpbGVTeW5jKGZpbGVQYXRoLCBmaWxlc1tuYW1lXSlcbiAgfSlcbn1cblxuZXhwb3J0IHsgZmlsdGVycywgZ2VuZXJhdGUsIHJlbmRlciwgd3JpdGVGaWxlVHJlZSB9XG4iLCJpbXBvcnQgY2hhbGsgZnJvbSBcImNoYWxrXCJcbmltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCJcbmltcG9ydCBmcyBmcm9tIFwiZnMtZXh0cmFcIlxuaW1wb3J0IHsgZ2VuZXJhdGUgfSBmcm9tIFwiLi4vLi4vdXRpbHMvaW5pdFV0aWxzXCJcbmltcG9ydCB7IGhvbWVkaXIgfSBmcm9tIFwib3NcIlxuaW1wb3J0IGRvd25sb2FkIGZyb20gXCJkb3dubG9hZC1naXQtcmVwb1wiXG5pbXBvcnQgeyBJT3B0aW9ucywgSVBsdWdpbiwgSVBpY0dvIH0gZnJvbSBcIi4uLy4uL3R5cGVzXCJcbmltcG9ydCBybSBmcm9tIFwicmltcmFmXCJcblxuY29uc3QgcnVuID0gKGN0eDogSVBpY0dvLCBvcHRpb25zOiBJT3B0aW9ucyk6IHZvaWQgPT4ge1xuICAvLyBjb25zdCBuYW1lID0gb3B0aW9ucy5pblBsYWNlID8gcGF0aC5yZWxhdGl2ZSgnLi4vJywgcHJvY2Vzcy5jd2QoKSkgOiBvcHRpb25zLnByb2plY3RcbiAgaWYgKG9wdGlvbnMub2ZmbGluZSkge1xuICAgIC8vIG9mZmxpbmUgbW9kZVxuICAgIGlmIChmcy5leGlzdHNTeW5jKG9wdGlvbnMudGVtcGxhdGUpKSB7XG4gICAgICBnZW5lcmF0ZShjdHgsIG9wdGlvbnMpLmNhdGNoKChlKSA9PiB7XG4gICAgICAgIGN0eC5sb2cuZXJyb3IoZSlcbiAgICAgIH0pXG4gICAgfSBlbHNlIHtcbiAgICAgIGN0eC5sb2cuZXJyb3IoYExvY2FsIHRlbXBsYXRlICR7b3B0aW9ucy50ZW1wbGF0ZX0gbm90IGZvdW5kYClcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gb25saW5lIG1vZGVcbiAgICBvcHRpb25zLnRlbXBsYXRlID0gIW9wdGlvbnMuaGFzU2xhc2hcbiAgICAgID8gXCJQaWNHby9waWNnby10ZW1wbGF0ZS1cIiArIG9wdGlvbnMudGVtcGxhdGUgLy8gb2ZmaWNpYWwgdGVtcGxhdGVcbiAgICAgIDogb3B0aW9ucy50ZW1wbGF0ZVxuICAgIGRvd25sb2FkQW5kR2VuZXJhdGUoY3R4LCBvcHRpb25zKVxuICB9XG59XG5cbi8qKlxuICogZG93bmxvYWQgdGVtcGxhdGUgJiBnZW5lcmF0ZVxuICogQHBhcmFtIHsgUGljR28gfSBjdHhcbiAqIEBwYXJhbSB7IElPcHRpb25zIH0gb3B0aW9uc1xuICovXG5jb25zdCBkb3dubG9hZEFuZEdlbmVyYXRlID0gKGN0eDogSVBpY0dvLCBvcHRpb25zOiBJT3B0aW9ucyk6IHZvaWQgPT4ge1xuICBpZiAoZnMuZXhpc3RzU3luYyhvcHRpb25zLnRtcCkpIHtcbiAgICBybS5zeW5jKG9wdGlvbnMudG1wKVxuICB9XG4gIGN0eC5sb2cuaW5mbyhcIlRlbXBsYXRlIGZpbGVzIGFyZSBkb3dubG9hZGluZy4uLlwiKVxuICBkb3dubG9hZChvcHRpb25zLnRlbXBsYXRlLCBvcHRpb25zLnRtcCwgeyBjbG9uZTogb3B0aW9ucy5jbG9uZSB9LCAoZXJyOiBFcnJvcikgPT4ge1xuICAgIGlmIChlcnIpIHtcbiAgICAgIHJldHVybiBjdHgubG9nLmVycm9yKGVycilcbiAgICB9XG4gICAgY3R4LmxvZy5zdWNjZXNzKFwiVGVtcGxhdGUgZmlsZXMgYXJlIGRvd25sb2FkZWQhXCIpXG4gICAgZ2VuZXJhdGUoY3R4LCBvcHRpb25zKS5jYXRjaCgoZSkgPT4ge1xuICAgICAgY3R4LmxvZy5lcnJvcihlKVxuICAgIH0pXG4gIH0pXG59XG5cbmNvbnN0IGluaXQ6IElQbHVnaW4gPSB7XG4gIGhhbmRsZTogYXN5bmMgKGN0eDogSVBpY0dvKSA9PiB7XG4gICAgY29uc3QgY21kID0gY3R4LmNtZFxuICAgIGNtZC5wcm9ncmFtXG4gICAgICAuY29tbWFuZChcImluaXRcIilcbiAgICAgIC5hcmd1bWVudHMoXCI8dGVtcGxhdGU+IFtwcm9qZWN0XVwiKVxuICAgICAgLm9wdGlvbihcIi0tY2xvbmVcIiwgXCJ1c2UgZ2l0IGNsb25lXCIpXG4gICAgICAub3B0aW9uKFwiLS1vZmZsaW5lXCIsIFwidXNlIGNhY2hlZCB0ZW1wbGF0ZVwiKVxuICAgICAgLmRlc2NyaXB0aW9uKFwiY3JlYXRlIHBpY2dvIHBsdWdpbidzIGRldmVsb3BtZW50IHRlbXBsYXRlc1wiKVxuICAgICAgLmFjdGlvbigodGVtcGxhdGU6IHN0cmluZywgcHJvamVjdDogc3RyaW5nLCBwcm9ncmFtOiBhbnkpID0+IHtcbiAgICAgICAgOyhhc3luYyAoKSA9PiB7XG4gICAgICAgICAgLy8gVGhhbmtzIHRvIHZ1ZS1jbGkgaW5pdDogaHR0cHM6Ly9naXRodWIuY29tL3Z1ZWpzL3Z1ZS1jbGkvYmxvYi9tYXN0ZXIvYmluL3Z1ZS1pbml0XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IGhhc1NsYXNoID0gdGVtcGxhdGUuaW5jbHVkZXMoXCIvXCIpXG4gICAgICAgICAgICBjb25zdCBpblBsYWNlID0gIXByb2plY3QgfHwgcHJvamVjdCA9PT0gXCIuXCJcbiAgICAgICAgICAgIGNvbnN0IGRlc3QgPSBwYXRoLnJlc29sdmUocHJvamVjdCB8fCBcIi5cIilcbiAgICAgICAgICAgIGNvbnN0IGNsb25lID0gcHJvZ3JhbS5jbG9uZSB8fCBmYWxzZVxuICAgICAgICAgICAgY29uc3Qgb2ZmbGluZSA9IHByb2dyYW0ub2ZmbGluZSB8fCBmYWxzZVxuICAgICAgICAgICAgY29uc3QgdG1wID0gcGF0aC5qb2luKGhvbWVkaXIoKSwgXCIucGljZ28vdGVtcGxhdGVzXCIsIHRlbXBsYXRlLnJlcGxhY2UoL1svOl0vZywgXCItXCIpKSAvLyBmb3IgY2FjaGluZyB0ZW1wbGF0ZVxuXG4gICAgICAgICAgICBpZiAocHJvZ3JhbS5vZmZsaW5lKSB7XG4gICAgICAgICAgICAgIHRlbXBsYXRlID0gdG1wXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICAgIHRlbXBsYXRlLFxuICAgICAgICAgICAgICBwcm9qZWN0LFxuICAgICAgICAgICAgICBoYXNTbGFzaCxcbiAgICAgICAgICAgICAgaW5QbGFjZSxcbiAgICAgICAgICAgICAgZGVzdCxcbiAgICAgICAgICAgICAgY2xvbmUsXG4gICAgICAgICAgICAgIHRtcCxcbiAgICAgICAgICAgICAgb2ZmbGluZSxcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gY2hlY2sgaWYgcHJvamVjdCBpcyBlbXB0eSBvciBleGlzdFxuICAgICAgICAgICAgaWYgKGluUGxhY2UgfHwgZnMuZXhpc3RzU3luYyhkZXN0KSkge1xuICAgICAgICAgICAgICBhd2FpdCBjdHguY21kLmlucXVpcmVyXG4gICAgICAgICAgICAgICAgLnByb21wdChbXG4gICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IFwiY29uZmlybVwiLFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBpblBsYWNlID8gXCJHZW5lcmF0ZSBwcm9qZWN0IGluIGN1cnJlbnQgZGlyZWN0b3J5P1wiIDogXCJUYXJnZXQgZGlyZWN0b3J5IGV4aXN0cy4gQ29udGludWU/XCIsXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwib2tcIixcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgXSlcbiAgICAgICAgICAgICAgICAudGhlbigoYW5zd2VyOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgIGlmIChhbnN3ZXIub2spIHtcbiAgICAgICAgICAgICAgICAgICAgcnVuKGN0eCwgb3B0aW9ucylcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgLy8gcHJvamVjdCBpcyBnaXZlblxuICAgICAgICAgICAgICBydW4oY3R4LCBvcHRpb25zKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgICAgICAgY3R4LmxvZy5lcnJvcihlKVxuICAgICAgICAgICAgaWYgKHByb2Nlc3MuYXJndi5pbmNsdWRlcyhcIi0tZGVidWdcIikpIHtcbiAgICAgICAgICAgICAgdGhyb3cgZVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSkoKS5jYXRjaCgoZSkgPT4ge1xuICAgICAgICAgIGN0eC5sb2cuZXJyb3IoZSlcbiAgICAgICAgfSlcbiAgICAgIH0pXG4gICAgICAub24oXCItLWhlbHBcIiwgKCkgPT4ge1xuICAgICAgICBjb25zb2xlLmxvZygpXG4gICAgICAgIGNvbnNvbGUubG9nKFwiRXhhbXBsZXM6XCIpXG4gICAgICAgIGNvbnNvbGUubG9nKClcbiAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JheShcIiAgIyBjcmVhdGUgYSBuZXcgcHJvamVjdCB3aXRoIGFuIG9mZmljaWFsIHRlbXBsYXRlXCIpKVxuICAgICAgICBjb25zb2xlLmxvZyhcIiAgJCBwaWNnbyBpbml0IHBsdWdpbiBteS1wcm9qZWN0XCIpXG4gICAgICAgIGNvbnNvbGUubG9nKClcbiAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JheShcIiAgIyBjcmVhdGUgYSBuZXcgcHJvamVjdCBzdHJhaWdodCBmcm9tIGEgZ2l0aHViIHRlbXBsYXRlXCIpKVxuICAgICAgICBjb25zb2xlLmxvZyhcIiAgJCBwaWNnbyBpbml0IHVzZXJuYW1lL3JlcG8gbXktcHJvamVjdFwiKVxuICAgICAgICBjb25zb2xlLmxvZygpXG4gICAgICB9KVxuICB9LFxufVxuXG5leHBvcnQgZGVmYXVsdCBpbml0XG4iLCJpbXBvcnQgeyBJUGx1Z2luLCBJUGljR28sIElTdHJpbmdLZXlNYXAgfSBmcm9tIFwiLi4vLi4vdHlwZXNcIlxuXG5jb25zdCBpMThuOiBJUGx1Z2luID0ge1xuICBoYW5kbGU6IChjdHg6IElQaWNHbykgPT4ge1xuICAgIGNvbnN0IGNtZCA9IGN0eC5jbWRcbiAgICBjbWQucHJvZ3JhbVxuICAgICAgLmNvbW1hbmQoXCJpMThuXCIpXG4gICAgICAuYXJndW1lbnRzKFwiW2xhbmddXCIpXG4gICAgICAuZGVzY3JpcHRpb24oXCJjaGFuZ2UgcGljZ28gbGFuZ3VhZ2VcIilcbiAgICAgIC5hY3Rpb24oYXN5bmMgKGxhbmcgPSBcIlwiKSA9PiB7XG4gICAgICAgIGNvbnN0IGxpc3QgPSBjdHguaTE4bi5nZXRMYW5ndWFnZUxpc3QoKVxuICAgICAgICBpZiAoIWxhbmcpIHtcbiAgICAgICAgICBjb25zdCBwcm9tcHRzID0gW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB0eXBlOiBcImxpc3RcIixcbiAgICAgICAgICAgICAgbmFtZTogXCJpMThuXCIsXG4gICAgICAgICAgICAgIGNob2ljZXM6IGxpc3QsXG4gICAgICAgICAgICAgIG1lc3NhZ2U6IFwiQ2hvb3NlIGEgbGFuZ3VhZ2VcIixcbiAgICAgICAgICAgICAgZGVmYXVsdDogY3R4LmdldENvbmZpZyhcInNldHRpbmdzLmxhbmd1YWdlXCIpIHx8IFwiemgtQ05cIixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXVxuICAgICAgICAgIGNvbnN0IGFuc3dlciA9IGF3YWl0IGN0eC5jbWQuaW5xdWlyZXIucHJvbXB0PElTdHJpbmdLZXlNYXA8c3RyaW5nPj4ocHJvbXB0cylcbiAgICAgICAgICBjdHguaTE4bi5zZXRMYW5ndWFnZShhbnN3ZXIuaTE4bilcbiAgICAgICAgICBjdHgubG9nLnN1Y2Nlc3MoYExhbmd1YWdlIHNldCB0byAke2Fuc3dlci5pMThufWApXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFsaXN0LmluY2x1ZGVzKGxhbmcpKSB7XG4gICAgICAgICAgcmV0dXJuIGN0eC5sb2cud2FybihcIk5vIHN1Y2ggbGFuZ3VhZ2VcIilcbiAgICAgICAgfVxuICAgICAgICBjdHguaTE4bi5zZXRMYW5ndWFnZShsYW5nKVxuICAgICAgICBjdHgubG9nLnN1Y2Nlc3MoYExhbmd1YWdlIHNldCB0byAke2xhbmd9YClcbiAgICAgIH0pXG4gIH0sXG59XG5cbmV4cG9ydCBkZWZhdWx0IGkxOG5cbiIsImltcG9ydCB7IElQbHVnaW4sIElMaWZlY3ljbGVQbHVnaW5zIH0gZnJvbSBcIi4uL3R5cGVzXCJcblxuZXhwb3J0IGNsYXNzIExpZmVjeWNsZVBsdWdpbnMgaW1wbGVtZW50cyBJTGlmZWN5Y2xlUGx1Z2lucyB7XG4gIHN0YXRpYyBjdXJyZW50UGx1Z2luOiBzdHJpbmcgfCBudWxsXG4gIHByaXZhdGUgcmVhZG9ubHkgbGlzdDogTWFwPHN0cmluZywgSVBsdWdpbj5cbiAgcHJpdmF0ZSByZWFkb25seSBwbHVnaW5JZE1hcDogTWFwPHN0cmluZywgc3RyaW5nW10+XG4gIHByaXZhdGUgcmVhZG9ubHkgbmFtZTogc3RyaW5nXG5cbiAgY29uc3RydWN0b3IobmFtZTogc3RyaW5nKSB7XG4gICAgdGhpcy5uYW1lID0gbmFtZVxuICAgIHRoaXMubGlzdCA9IG5ldyBNYXAoKVxuICAgIHRoaXMucGx1Z2luSWRNYXAgPSBuZXcgTWFwKClcbiAgfVxuXG4gIHJlZ2lzdGVyKGlkOiBzdHJpbmcsIHBsdWdpbjogSVBsdWdpbik6IHZvaWQge1xuICAgIGlmICghaWQpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJpZCBpcyByZXF1aXJlZCFcIilcbiAgICBpZiAodHlwZW9mIHBsdWdpbi5oYW5kbGUgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcInBsdWdpbi5oYW5kbGUgbXVzdCBiZSBhIGZ1bmN0aW9uIVwiKVxuICAgIGlmICh0aGlzLmxpc3QuaGFzKGlkKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihgJHt0aGlzLm5hbWV9IGR1cGxpY2F0ZSBpZDogJHtpZH0hYClcbiAgICB0aGlzLmxpc3Quc2V0KGlkLCBwbHVnaW4pXG4gICAgaWYgKExpZmVjeWNsZVBsdWdpbnMuY3VycmVudFBsdWdpbikge1xuICAgICAgaWYgKHRoaXMucGx1Z2luSWRNYXAuaGFzKExpZmVjeWNsZVBsdWdpbnMuY3VycmVudFBsdWdpbikpIHtcbiAgICAgICAgdGhpcy5wbHVnaW5JZE1hcC5nZXQoTGlmZWN5Y2xlUGx1Z2lucy5jdXJyZW50UGx1Z2luKT8ucHVzaChpZClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMucGx1Z2luSWRNYXAuc2V0KExpZmVjeWNsZVBsdWdpbnMuY3VycmVudFBsdWdpbiwgW2lkXSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB1bnJlZ2lzdGVyKHBsdWdpbk5hbWU6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICh0aGlzLnBsdWdpbklkTWFwLmhhcyhwbHVnaW5OYW1lKSkge1xuICAgICAgY29uc3QgcGx1Z2luTGlzdCA9IHRoaXMucGx1Z2luSWRNYXAuZ2V0KHBsdWdpbk5hbWUpXG4gICAgICBwbHVnaW5MaXN0Py5mb3JFYWNoKChwbHVnaW46IHN0cmluZykgPT4ge1xuICAgICAgICB0aGlzLmxpc3QuZGVsZXRlKHBsdWdpbilcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgZ2V0TmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLm5hbWVcbiAgfVxuXG4gIGdldChpZDogc3RyaW5nKTogSVBsdWdpbiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMubGlzdC5nZXQoaWQpXG4gIH1cblxuICBnZXRMaXN0KCk6IElQbHVnaW5bXSB7XG4gICAgcmV0dXJuIFsuLi50aGlzLmxpc3QudmFsdWVzKCldXG4gIH1cblxuICBnZXRJZExpc3QoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBbLi4udGhpcy5saXN0LmtleXMoKV1cbiAgfVxufVxuXG5leHBvcnQgY29uc3Qgc2V0Q3VycmVudFBsdWdpbk5hbWUgPSAobmFtZTogc3RyaW5nIHwgbnVsbCA9IG51bGwpOiB2b2lkID0+IHtcbiAgTGlmZWN5Y2xlUGx1Z2lucy5jdXJyZW50UGx1Z2luID0gbmFtZVxufVxuXG5leHBvcnQgY29uc3QgZ2V0Q3VycmVudFBsdWdpbk5hbWUgPSAoKTogc3RyaW5nIHwgbnVsbCA9PiB7XG4gIHJldHVybiBMaWZlY3ljbGVQbHVnaW5zLmN1cnJlbnRQbHVnaW5cbn1cblxuZXhwb3J0IGRlZmF1bHQgTGlmZWN5Y2xlUGx1Z2luc1xuIiwiLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLW1pc3VzZWQtcHJvbWlzZXMgKi9cbmltcG9ydCB7IENvbW1hbmQgfSBmcm9tIFwiY29tbWFuZGVyXCJcbmltcG9ydCBpbnF1aXJlciwgeyBJbnF1aXJlciB9IGZyb20gXCJpbnF1aXJlclwiXG5pbXBvcnQgeyBJUGx1Z2luLCBJQ29tbWFuZGVyLCBJUGljR28gfSBmcm9tIFwiLi4vdHlwZXNcIlxuaW1wb3J0IGNvbW1hbmRlcnMgZnJvbSBcIi4uL3BsdWdpbnMvY29tbWFuZGVyXCJcbmltcG9ydCB7IGdldEN1cnJlbnRQbHVnaW5OYW1lIH0gZnJvbSBcIi4vTGlmZWN5Y2xlUGx1Z2luc1wiXG5cbmV4cG9ydCBjbGFzcyBDb21tYW5kZXIgaW1wbGVtZW50cyBJQ29tbWFuZGVyIHtcbiAgcHJpdmF0ZSByZWFkb25seSBuYW1lID0gXCJjb21tYW5kZXJcIlxuICBzdGF0aWMgY3VycmVudFBsdWdpbjogc3RyaW5nIHwgbnVsbFxuICBwcml2YXRlIHJlYWRvbmx5IGxpc3Q6IE1hcDxzdHJpbmcsIElQbHVnaW4+ID0gbmV3IE1hcCgpXG4gIHByaXZhdGUgcmVhZG9ubHkgcGx1Z2luSWRNYXA6IE1hcDxzdHJpbmcsIHN0cmluZ1tdPiA9IG5ldyBNYXAoKVxuICBwcml2YXRlIHJlYWRvbmx5IGN0eDogSVBpY0dvXG5cbiAgcHJvZ3JhbTogQ29tbWFuZFxuICBpbnF1aXJlcjogSW5xdWlyZXJcblxuICBjb25zdHJ1Y3RvcihjdHg6IElQaWNHbykge1xuICAgIHRoaXMucHJvZ3JhbSA9IG5ldyBDb21tYW5kKClcbiAgICB0aGlzLmlucXVpcmVyID0gaW5xdWlyZXJcbiAgICB0aGlzLmN0eCA9IGN0eFxuICB9XG5cbiAgZ2V0TmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLm5hbWVcbiAgfVxuXG4gIGluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5wcm9ncmFtXG4gICAgICAudmVyc2lvbihwcm9jZXNzLmVudi5QSUNHT19WRVJTSU9OLCBcIi12LCAtLXZlcnNpb25cIilcbiAgICAgIC5vcHRpb24oXCItZCwgLS1kZWJ1Z1wiLCBcImRlYnVnIG1vZGVcIiwgKCkgPT4ge1xuICAgICAgICB0aGlzLmN0eC5zZXRDb25maWcoe1xuICAgICAgICAgIGRlYnVnOiB0cnVlLFxuICAgICAgICB9KVxuICAgICAgfSlcbiAgICAgIC5vcHRpb24oXCItcywgLS1zaWxlbnRcIiwgXCJzaWxlbnQgbW9kZVwiLCAoKSA9PiB7XG4gICAgICAgIHRoaXMuY3R4LnNldENvbmZpZyh7XG4gICAgICAgICAgc2lsZW50OiB0cnVlLFxuICAgICAgICB9KVxuICAgICAgfSlcbiAgICAgIC5vbihcImNvbW1hbmQ6KlwiLCAoKSA9PiB7XG4gICAgICAgIHRoaXMuY3R4LmxvZy5lcnJvcihcbiAgICAgICAgICBgSW52YWxpZCBjb21tYW5kOiAke3RoaXMucHJvZ3JhbS5hcmdzLmpvaW4oXCIgXCIpfVxcblNlZSAtLWhlbHAgZm9yIGEgbGlzdCBvZiBhdmFpbGFibGUgY29tbWFuZHMuYFxuICAgICAgICApXG4gICAgICAgIHByb2Nlc3MuZXhpdCgxKVxuICAgICAgfSlcblxuICAgIC8vIGJ1aWx0LWluIGNvbW1hbmRzXG4gICAgY29tbWFuZGVycyh0aGlzLmN0eClcbiAgfVxuXG4gIHJlZ2lzdGVyKGlkOiBzdHJpbmcsIHBsdWdpbjogSVBsdWdpbik6IHZvaWQge1xuICAgIGlmICghaWQpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJuYW1lIGlzIHJlcXVpcmVkIVwiKVxuICAgIGlmICh0eXBlb2YgcGx1Z2luLmhhbmRsZSAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwicGx1Z2luLmhhbmRsZSBtdXN0IGJlIGEgZnVuY3Rpb24hXCIpXG4gICAgaWYgKHRoaXMubGlzdC5oYXMoaWQpKSB0aHJvdyBuZXcgVHlwZUVycm9yKGAke3RoaXMubmFtZX0gcGx1Z2luIGR1cGxpY2F0ZSBpZDogJHtpZH0hYClcbiAgICB0aGlzLmxpc3Quc2V0KGlkLCBwbHVnaW4pXG4gICAgY29uc3QgY3VycmVudFBsdWdpbk5hbWUgPSBnZXRDdXJyZW50UGx1Z2luTmFtZSgpXG4gICAgaWYgKGN1cnJlbnRQbHVnaW5OYW1lICE9PSBudWxsKSB7XG4gICAgICBpZiAodGhpcy5wbHVnaW5JZE1hcC5oYXMoY3VycmVudFBsdWdpbk5hbWUpKSB7XG4gICAgICAgIHRoaXMucGx1Z2luSWRNYXAuZ2V0KGN1cnJlbnRQbHVnaW5OYW1lKT8ucHVzaChpZClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMucGx1Z2luSWRNYXAuc2V0KGN1cnJlbnRQbHVnaW5OYW1lLCBbaWRdKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHVucmVnaXN0ZXIocGx1Z2luTmFtZTogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucGx1Z2luSWRNYXAuaGFzKHBsdWdpbk5hbWUpKSB7XG4gICAgICBjb25zdCBwbHVnaW5MaXN0ID0gdGhpcy5wbHVnaW5JZE1hcC5nZXQocGx1Z2luTmFtZSlcbiAgICAgIHBsdWdpbkxpc3Q/LmZvckVhY2goKHBsdWdpbjogc3RyaW5nKSA9PiB7XG4gICAgICAgIHRoaXMubGlzdC5kZWxldGUocGx1Z2luKVxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICBsb2FkQ29tbWFuZHMoKTogdm9pZCB7XG4gICAgdGhpcy5nZXRMaXN0KCkuZm9yRWFjaCgoaXRlbTogSVBsdWdpbikgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaXRlbS5oYW5kbGUodGhpcy5jdHgpXG4gICAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgICAgdGhpcy5jdHgubG9nLmVycm9yKGUpXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIGdldChpZDogc3RyaW5nKTogSVBsdWdpbiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMubGlzdC5nZXQoaWQpXG4gIH1cblxuICBnZXRMaXN0KCk6IElQbHVnaW5bXSB7XG4gICAgcmV0dXJuIFsuLi50aGlzLmxpc3QudmFsdWVzKCldXG4gIH1cblxuICBnZXRJZExpc3QoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBbLi4udGhpcy5saXN0LmtleXMoKV1cbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBDb21tYW5kZXJcbiIsImltcG9ydCBwbHVnaW5IYW5kbGVyIGZyb20gXCIuL3BsdWdpbkhhbmRsZXJcIlxuaW1wb3J0IGNvbmZpZyBmcm9tIFwiLi9jb25maWdcIlxuaW1wb3J0IHVwbG9hZCBmcm9tIFwiLi91cGxvYWRcIlxuaW1wb3J0IHNldHRpbmcgZnJvbSBcIi4vc2V0dGluZ1wiXG5pbXBvcnQgdXNlIGZyb20gXCIuL3VzZVwiXG5pbXBvcnQgcHJveHkgZnJvbSBcIi4vcHJveHlcIlxuaW1wb3J0IGluaXQgZnJvbSBcIi4vaW5pdFwiXG5pbXBvcnQgaTE4biBmcm9tIFwiLi9pMThuXCJcbmltcG9ydCB7IElQaWNHbyB9IGZyb20gXCIuLi8uLi90eXBlc1wiXG5cbmV4cG9ydCBkZWZhdWx0IChjdHg6IElQaWNHbyk6IHZvaWQgPT4ge1xuICBjdHguY21kLnJlZ2lzdGVyKFwicGx1Z2luSGFuZGxlclwiLCBwbHVnaW5IYW5kbGVyKVxuICBjdHguY21kLnJlZ2lzdGVyKFwiY29uZmlnXCIsIGNvbmZpZylcbiAgY3R4LmNtZC5yZWdpc3RlcihcInNldHRpbmdcIiwgc2V0dGluZylcbiAgY3R4LmNtZC5yZWdpc3RlcihcInVwbG9hZFwiLCB1cGxvYWQpXG4gIGN0eC5jbWQucmVnaXN0ZXIoXCJ1c2VcIiwgdXNlKVxuICBjdHguY21kLnJlZ2lzdGVyKFwicHJveHlcIiwgcHJveHkpXG4gIGN0eC5jbWQucmVnaXN0ZXIoXCJpbml0XCIsIGluaXQpXG4gIGN0eC5jbWQucmVnaXN0ZXIoXCJpMThuXCIsIGkxOG4pXG59XG4iLCJleHBvcnQgZW51bSBJTG9nVHlwZSB7XG4gIHN1Y2Nlc3MgPSBcInN1Y2Nlc3NcIixcbiAgaW5mbyA9IFwiaW5mb1wiLFxuICB3YXJuID0gXCJ3YXJuXCIsXG4gIGVycm9yID0gXCJlcnJvclwiLFxufVxuXG4vKipcbiAqIHRoZXNlIGV2ZW50cyB3aWxsIGJlIGNhdGNoZWQgYnkgdXNlcnNcbiAqL1xuZXhwb3J0IGVudW0gSUJ1aWxkSW5FdmVudCB7XG4gIFVQTE9BRF9QUk9HUkVTUyA9IFwidXBsb2FkUHJvZ3Jlc3NcIixcbiAgRkFJTEVEID0gXCJmYWlsZWRcIixcbiAgQkVGT1JFX1RSQU5TRk9STSA9IFwiYmVmb3JlVHJhbnNmb3JtXCIsXG4gIEJFRk9SRV9VUExPQUQgPSBcImJlZm9yZVVwbG9hZFwiLFxuICBBRlRFUl9VUExPQUQgPSBcImFmdGVyVXBsb2FkXCIsXG4gIEZJTklTSEVEID0gXCJmaW5pc2hlZFwiLFxuICBJTlNUQUxMID0gXCJpbnN0YWxsXCIsXG4gIFVOSU5TVEFMTCA9IFwidW5pbnN0YWxsXCIsXG4gIFVQREFURSA9IFwidXBkYXRlXCIsXG4gIE5PVElGSUNBVElPTiA9IFwibm90aWZpY2F0aW9uXCIsXG59XG5cbi8qKlxuICogdGhlc2UgZXZlbnRzIHdpbGwgYmUgY2F0Y2hlZCBvbmx5IGJ5IHBpY2dvXG4gKi9cbmV4cG9ydCBlbnVtIElCdXNFdmVudCB7XG4gIENPTkZJR19DSEFOR0UgPSBcIkNPTkZJR19DSEFOR0VcIixcbn1cbiIsImltcG9ydCBjaGFsayBmcm9tIFwiY2hhbGtcIlxuaW1wb3J0IGRheWpzIGZyb20gXCJkYXlqc1wiXG5pbXBvcnQgZnMgZnJvbSBcImZzLWV4dHJhXCJcbmltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCJcbmltcG9ydCB1dGlsIGZyb20gXCJ1dGlsXCJcbmltcG9ydCB7IElMb2dUeXBlIH0gZnJvbSBcIi4uL3V0aWxzL2VudW1cIlxuaW1wb3J0IHsgSUxvZ0FyZ3ZUeXBlLCBJTG9nQXJndlR5cGVXaXRoRXJyb3IsIFVuZGVmaW5hYmxlLCBJTG9nQ29sb3IsIElMb2dnZXIsIElQaWNHbyB9IGZyb20gXCIuLi90eXBlc1wiXG5pbXBvcnQgeyBmb3JjZU51bWJlciwgaXNEZXYgfSBmcm9tIFwiLi4vdXRpbHMvY29tbW9uXCJcblxuZXhwb3J0IGNsYXNzIExvZ2dlciBpbXBsZW1lbnRzIElMb2dnZXIge1xuICBwcml2YXRlIHJlYWRvbmx5IGxldmVsID0ge1xuICAgIFtJTG9nVHlwZS5zdWNjZXNzXTogXCJncmVlblwiLFxuICAgIFtJTG9nVHlwZS5pbmZvXTogXCJibHVlXCIsXG4gICAgW0lMb2dUeXBlLndhcm5dOiBcInllbGxvd1wiLFxuICAgIFtJTG9nVHlwZS5lcnJvcl06IFwicmVkXCIsXG4gIH1cblxuICBwcml2YXRlIHJlYWRvbmx5IGN0eDogSVBpY0dvXG4gIHByaXZhdGUgbG9nTGV2ZWwhOiBzdHJpbmdcbiAgcHJpdmF0ZSBsb2dQYXRoITogc3RyaW5nXG4gIGNvbnN0cnVjdG9yKGN0eDogSVBpY0dvKSB7XG4gICAgdGhpcy5jdHggPSBjdHhcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlTG9nKHR5cGU6IElMb2dUeXBlLCAuLi5tc2c6IElMb2dBcmd2VHlwZVdpdGhFcnJvcltdKTogdm9pZCB7XG4gICAgLy8gY2hlY2sgY29uZmlnLnNpbGVudFxuICAgIGlmICghdGhpcy5jdHguZ2V0Q29uZmlnPFVuZGVmaW5hYmxlPHN0cmluZz4+KFwic2lsZW50XCIpKSB7XG4gICAgICBjb25zdCBsb2dIZWFkZXIgPSBjaGFsa1t0aGlzLmxldmVsW3R5cGVdIGFzIElMb2dDb2xvcl0oYFtQaWNHbyAke3R5cGUudG9VcHBlckNhc2UoKX1dOmApXG4gICAgICBjb25zb2xlLmxvZyhsb2dIZWFkZXIsIC4uLm1zZylcbiAgICAgIHRoaXMubG9nTGV2ZWwgPSB0aGlzLmN0eC5nZXRDb25maWcoXCJzZXR0aW5ncy5sb2dMZXZlbFwiKVxuICAgICAgdGhpcy5sb2dQYXRoID1cbiAgICAgICAgdGhpcy5jdHguZ2V0Q29uZmlnPFVuZGVmaW5hYmxlPHN0cmluZz4+KFwic2V0dGluZ3MubG9nUGF0aFwiKSB8fCBwYXRoLmpvaW4odGhpcy5jdHguYmFzZURpciwgXCIuL3BpY2dvLmxvZ1wiKVxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIC8vIGZpeCBsb2cgZmlsZSBpcyB0b28gbGFyZ2UsIG5vdyB0aGUgbG9nIGZpbGUncyBkZWZhdWx0IHNpemUgaXMgMTAgTUJcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLmNoZWNrTG9nRmlsZUlzTGFyZ2UodGhpcy5sb2dQYXRoKVxuICAgICAgICAgIGlmIChyZXN1bHQuaXNMYXJnZSkge1xuICAgICAgICAgICAgY29uc3Qgd2FybmluZ01zZyA9IGBMb2cgZmlsZSBpcyB0b28gbGFyZ2UgKD4gJHtcbiAgICAgICAgICAgICAgcmVzdWx0LmxvZ0ZpbGVTaXplTGltaXQhIC8gMTAyNCAvIDEwMjQgfHwgXCIxMFwiXG4gICAgICAgICAgICB9IE1CKSwgcmVjcmVhdGUgbG9nIGZpbGVgXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay55ZWxsb3coXCJbUGljR28gV0FSTl06XCIpLCB3YXJuaW5nTXNnKVxuICAgICAgICAgICAgdGhpcy5yZWNyZWF0ZUxvZ0ZpbGUodGhpcy5sb2dQYXRoKVxuICAgICAgICAgICAgbXNnLnVuc2hpZnQod2FybmluZ01zZylcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5oYW5kbGVXcml0ZUxvZyh0aGlzLmxvZ1BhdGgsIHR5cGUsIC4uLm1zZylcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIC8vIHdoeT8/P1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJbUGljR28gRXJyb3JdIG9uIGNoZWNraW5nIGxvZyBmaWxlIHNpemVcIiwgZSlcbiAgICAgICAgfVxuICAgICAgfSwgMClcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNoZWNrTG9nRmlsZUlzTGFyZ2UobG9nUGF0aDogc3RyaW5nKToge1xuICAgIGlzTGFyZ2U6IGJvb2xlYW5cbiAgICBsb2dGaWxlU2l6ZT86IG51bWJlclxuICAgIGxvZ0ZpbGVTaXplTGltaXQ/OiBudW1iZXJcbiAgfSB7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMobG9nUGF0aCkpIHtcbiAgICAgIGNvbnN0IGxvZ0ZpbGVTaXplID0gZnMuc3RhdFN5bmMobG9nUGF0aCkuc2l6ZVxuICAgICAgY29uc3QgbG9nRmlsZVNpemVMaW1pdCA9XG4gICAgICAgIGZvcmNlTnVtYmVyKHRoaXMuY3R4LmdldENvbmZpZzxVbmRlZmluYWJsZTxudW1iZXI+PihcInNldHRpbmdzLmxvZ0ZpbGVTaXplTGltaXRcIikgfHwgMTApICogMTAyNCAqIDEwMjQgLy8gMTAgTUIgZGVmYXVsdFxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaXNMYXJnZTogbG9nRmlsZVNpemUgPiBsb2dGaWxlU2l6ZUxpbWl0LFxuICAgICAgICBsb2dGaWxlU2l6ZSxcbiAgICAgICAgbG9nRmlsZVNpemVMaW1pdCxcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIGlzTGFyZ2U6IGZhbHNlLFxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcmVjcmVhdGVMb2dGaWxlKGxvZ1BhdGg6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmIChmcy5leGlzdHNTeW5jKGxvZ1BhdGgpKSB7XG4gICAgICBmcy51bmxpbmtTeW5jKGxvZ1BhdGgpXG4gICAgICBmcy5jcmVhdGVGaWxlU3luYyhsb2dQYXRoKVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlV3JpdGVMb2cobG9nUGF0aDogc3RyaW5nLCB0eXBlOiBzdHJpbmcsIC4uLm1zZzogSUxvZ0FyZ3ZUeXBlV2l0aEVycm9yW10pOiB2b2lkIHtcbiAgICB0cnkge1xuICAgICAgaWYgKHRoaXMuY2hlY2tMb2dMZXZlbCh0eXBlLCB0aGlzLmxvZ0xldmVsKSkge1xuICAgICAgICBsZXQgbG9nID0gYCR7ZGF5anMoKS5mb3JtYXQoXCJZWVlZLU1NLUREIEhIOm1tOnNzXCIpfSBbUGljR28gJHt0eXBlLnRvVXBwZXJDYXNlKCl9XSBgXG4gICAgICAgIG1zZy5mb3JFYWNoKChpdGVtOiBJTG9nQXJndlR5cGVXaXRoRXJyb3IpID0+IHtcbiAgICAgICAgICBpZiAoaXRlbSBpbnN0YW5jZW9mIEVycm9yICYmIHR5cGUgPT09IFwiZXJyb3JcIikge1xuICAgICAgICAgICAgbG9nICs9IGBcXG4tLS0tLS1FcnJvciBTdGFjayBCZWdpbi0tLS0tLVxcbiR7dXRpbC5mb3JtYXQoaXRlbT8uc3RhY2spfVxcbi0tLS0tLS1FcnJvciBTdGFjayBFbmQtLS0tLS0tIGBcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBpdGVtID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgICAgIGl0ZW0gPSBKU09OLnN0cmluZ2lmeShpdGVtLCBudWxsLCAyKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbG9nICs9IGAke2l0ZW0gYXMgc3RyaW5nfSBgXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgICBsb2cgKz0gXCJcXG5cIlxuICAgICAgICAvLyBBIHN5bmNocm9uaXplZCBhcHByb2FjaCB0byBhdm9pZCBsb2cgbXNnIHNlcXVlbmNlIGVycm9yc1xuICAgICAgICBmcy5hcHBlbmRGaWxlU3luYyhsb2dQYXRoLCBsb2cpXG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29uc29sZS5lcnJvcihcIltQaWNHbyBFcnJvcl0gb24gd3JpdGluZyBsb2cgZmlsZVwiLCBlKVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY2hlY2tMb2dMZXZlbCh0eXBlOiBzdHJpbmcsIGxldmVsOiB1bmRlZmluZWQgfCBzdHJpbmcgfCBzdHJpbmdbXSk6IGJvb2xlYW4ge1xuICAgIGlmIChsZXZlbCA9PT0gdW5kZWZpbmVkIHx8IGxldmVsID09PSBcImFsbFwiKSB7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgICBpZiAoQXJyYXkuaXNBcnJheShsZXZlbCkpIHtcbiAgICAgIHJldHVybiBsZXZlbC5zb21lKChpdGVtOiBzdHJpbmcpID0+IGl0ZW0gPT09IHR5cGUgfHwgaXRlbSA9PT0gXCJhbGxcIilcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHR5cGUgPT09IGxldmVsXG4gICAgfVxuICB9XG5cbiAgc3VjY2VzcyguLi5tc2c6IElMb2dBcmd2VHlwZVtdKTogdm9pZCB7XG4gICAgcmV0dXJuIHRoaXMuaGFuZGxlTG9nKElMb2dUeXBlLnN1Y2Nlc3MsIC4uLm1zZylcbiAgfVxuXG4gIGluZm8oLi4ubXNnOiBJTG9nQXJndlR5cGVbXSk6IHZvaWQge1xuICAgIHJldHVybiB0aGlzLmhhbmRsZUxvZyhJTG9nVHlwZS5pbmZvLCAuLi5tc2cpXG4gIH1cblxuICBlcnJvciguLi5tc2c6IElMb2dBcmd2VHlwZVdpdGhFcnJvcltdKTogdm9pZCB7XG4gICAgcmV0dXJuIHRoaXMuaGFuZGxlTG9nKElMb2dUeXBlLmVycm9yLCAuLi5tc2cpXG4gIH1cblxuICB3YXJuKC4uLm1zZzogSUxvZ0FyZ3ZUeXBlW10pOiB2b2lkIHtcbiAgICByZXR1cm4gdGhpcy5oYW5kbGVMb2coSUxvZ1R5cGUud2FybiwgLi4ubXNnKVxuICB9XG5cbiAgZGVidWcoLi4ubXNnOiBJTG9nQXJndlR5cGVbXSk6IHZvaWQge1xuICAgIGlmIChpc0RldigpKSB7XG4gICAgICB0aGlzLmhhbmRsZUxvZyhJTG9nVHlwZS5pbmZvLCAuLi5tc2cpXG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IExvZ2dlclxuIiwiaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSBcImV2ZW50c1wiXG5pbXBvcnQgeyBJTGlmZWN5Y2xlUGx1Z2lucywgSVBpY0dvLCBJUGx1Z2luLCBVbmRlZmluYWJsZSB9IGZyb20gXCIuLi90eXBlc1wiXG5pbXBvcnQgeyBoYW5kbGVVcmxFbmNvZGUgfSBmcm9tIFwiLi4vdXRpbHMvY29tbW9uXCJcbmltcG9ydCB7IElCdWlsZEluRXZlbnQgfSBmcm9tIFwiLi4vdXRpbHMvZW51bVwiXG5pbXBvcnQgeyBjcmVhdGVDb250ZXh0IH0gZnJvbSBcIi4uL3V0aWxzL2NyZWF0ZUNvbnRleHRcIlxuXG5leHBvcnQgY2xhc3MgTGlmZWN5Y2xlIGV4dGVuZHMgRXZlbnRFbWl0dGVyIHtcbiAgcHJpdmF0ZSByZWFkb25seSBjdHg6IElQaWNHb1xuXG4gIGNvbnN0cnVjdG9yKGN0eDogSVBpY0dvKSB7XG4gICAgc3VwZXIoKVxuICAgIHRoaXMuY3R4ID0gY3R4XG4gIH1cblxuICBhc3luYyBzdGFydChpbnB1dDogYW55W10pOiBQcm9taXNlPElQaWNHbz4ge1xuICAgIC8vIGVuc3VyZSBldmVyeSB1cGxvYWQgcHJvY2VzcyBoYXMgYW4gdW5pcXVlIGNvbnRleHRcbiAgICBjb25zdCBjdHggPSBjcmVhdGVDb250ZXh0KHRoaXMuY3R4KVxuICAgIHRyeSB7XG4gICAgICAvLyBpbWFnZXMgaW5wdXRcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheShpbnB1dCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW5wdXQgbXVzdCBiZSBhbiBhcnJheS5cIilcbiAgICAgIH1cbiAgICAgIGN0eC5pbnB1dCA9IGlucHV0XG4gICAgICBjdHgub3V0cHV0ID0gW11cblxuICAgICAgLy8gbGlmZWN5Y2xlIG1haW5cbiAgICAgIGF3YWl0IHRoaXMuYmVmb3JlVHJhbnNmb3JtKGN0eClcbiAgICAgIGF3YWl0IHRoaXMuZG9UcmFuc2Zvcm0oY3R4KVxuICAgICAgYXdhaXQgdGhpcy5iZWZvcmVVcGxvYWQoY3R4KVxuICAgICAgYXdhaXQgdGhpcy5kb1VwbG9hZChjdHgpXG4gICAgICBhd2FpdCB0aGlzLmFmdGVyVXBsb2FkKGN0eClcbiAgICAgIHJldHVybiBjdHhcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIGN0eC5sb2cud2FybihJQnVpbGRJbkV2ZW50LkZBSUxFRClcbiAgICAgIGN0eC5lbWl0KElCdWlsZEluRXZlbnQuVVBMT0FEX1BST0dSRVNTLCAtMSlcbiAgICAgIGN0eC5lbWl0KElCdWlsZEluRXZlbnQuRkFJTEVELCBlKVxuICAgICAgY3R4LmxvZy5lcnJvcihlKVxuICAgICAgaWYgKGN0eC5nZXRDb25maWc8VW5kZWZpbmFibGU8c3RyaW5nPj4oXCJkZWJ1Z1wiKSkge1xuICAgICAgICB0aHJvdyBlXG4gICAgICB9XG4gICAgICByZXR1cm4gY3R4XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBiZWZvcmVUcmFuc2Zvcm0oY3R4OiBJUGljR28pOiBQcm9taXNlPElQaWNHbz4ge1xuICAgIGN0eC5lbWl0KElCdWlsZEluRXZlbnQuVVBMT0FEX1BST0dSRVNTLCAwKVxuICAgIGN0eC5lbWl0KElCdWlsZEluRXZlbnQuQkVGT1JFX1RSQU5TRk9STSwgY3R4KVxuICAgIGN0eC5sb2cuaW5mbyhcIkJlZm9yZSB0cmFuc2Zvcm1cIilcbiAgICBhd2FpdCB0aGlzLmhhbmRsZVBsdWdpbnMoY3R4LmhlbHBlci5iZWZvcmVUcmFuc2Zvcm1QbHVnaW5zLCBjdHgpXG4gICAgcmV0dXJuIGN0eFxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBkb1RyYW5zZm9ybShjdHg6IElQaWNHbyk6IFByb21pc2U8SVBpY0dvPiB7XG4gICAgY3R4LmVtaXQoSUJ1aWxkSW5FdmVudC5VUExPQURfUFJPR1JFU1MsIDMwKVxuICAgIGNvbnN0IHR5cGUgPSBjdHguZ2V0Q29uZmlnPFVuZGVmaW5hYmxlPHN0cmluZz4+KFwicGljQmVkLnRyYW5zZm9ybWVyXCIpIHx8IFwicGF0aFwiXG4gICAgbGV0IGN1cnJlbnRUcmFuc2Zvcm1lciA9IHR5cGVcbiAgICBsZXQgdHJhbnNmb3JtZXIgPSBjdHguaGVscGVyLnRyYW5zZm9ybWVyLmdldCh0eXBlKVxuICAgIGlmICghdHJhbnNmb3JtZXIpIHtcbiAgICAgIHRyYW5zZm9ybWVyID0gY3R4LmhlbHBlci50cmFuc2Zvcm1lci5nZXQoXCJwYXRoXCIpXG4gICAgICBjdXJyZW50VHJhbnNmb3JtZXIgPSBcInBhdGhcIlxuICAgICAgY3R4LmxvZy53YXJuKGBDYW4ndCBmaW5kIHRyYW5zZm9ybWVyIC0gJHt0eXBlfSwgc3dpdGNoIHRvIGRlZmF1bHQgdHJhbnNmb3JtZXIgLSBwYXRoYClcbiAgICB9XG4gICAgY3R4LmxvZy5pbmZvKGBUcmFuc2Zvcm1pbmcuLi4gQ3VycmVudCB0cmFuc2Zvcm1lciBpcyBbJHtjdXJyZW50VHJhbnNmb3JtZXJ9XWApXG4gICAgYXdhaXQgdHJhbnNmb3JtZXI/LmhhbmRsZShjdHgpXG4gICAgcmV0dXJuIGN0eFxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBiZWZvcmVVcGxvYWQoY3R4OiBJUGljR28pOiBQcm9taXNlPElQaWNHbz4ge1xuICAgIGN0eC5lbWl0KElCdWlsZEluRXZlbnQuVVBMT0FEX1BST0dSRVNTLCA2MClcbiAgICBjdHgubG9nLmluZm8oXCJCZWZvcmUgdXBsb2FkXCIpXG4gICAgY3R4LmVtaXQoSUJ1aWxkSW5FdmVudC5CRUZPUkVfVVBMT0FELCBjdHgpXG4gICAgYXdhaXQgdGhpcy5oYW5kbGVQbHVnaW5zKGN0eC5oZWxwZXIuYmVmb3JlVXBsb2FkUGx1Z2lucywgY3R4KVxuICAgIHJldHVybiBjdHhcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZG9VcGxvYWQoY3R4OiBJUGljR28pOiBQcm9taXNlPElQaWNHbz4ge1xuICAgIGxldCB0eXBlID1cbiAgICAgIGN0eC5nZXRDb25maWc8VW5kZWZpbmFibGU8c3RyaW5nPj4oXCJwaWNCZWQudXBsb2FkZXJcIikgfHxcbiAgICAgIGN0eC5nZXRDb25maWc8VW5kZWZpbmFibGU8c3RyaW5nPj4oXCJwaWNCZWQuY3VycmVudFwiKSB8fFxuICAgICAgXCJnaXRodWJcIlxuICAgIGxldCB1cGxvYWRlciA9IGN0eC5oZWxwZXIudXBsb2FkZXIuZ2V0KHR5cGUpXG4gICAgbGV0IGN1cnJlbnRUcmFuc2Zvcm1lciA9IHR5cGVcbiAgICBpZiAoIXVwbG9hZGVyKSB7XG4gICAgICB0eXBlID0gXCJnaXRodWJcIlxuICAgICAgY3VycmVudFRyYW5zZm9ybWVyID0gXCJnaXRodWJcIlxuICAgICAgdXBsb2FkZXIgPSBjdHguaGVscGVyLnVwbG9hZGVyLmdldChcImdpdGh1YlwiKVxuICAgICAgY3R4LmxvZy53YXJuKGBDYW4ndCBmaW5kIHVwbG9hZGVyIC0gJHt0eXBlfSwgc3dpdGNoIHRvIGRlZmF1bHQgdXBsb2FkZXIgLSBnaXRodWJgKVxuICAgIH1cbiAgICBjdHgubG9nLmluZm8oYFVwbG9hZGluZy4uLiBDdXJyZW50IHVwbG9hZGVyIGlzIFske2N1cnJlbnRUcmFuc2Zvcm1lcn1dYClcbiAgICBhd2FpdCB1cGxvYWRlcj8uaGFuZGxlKGN0eClcbiAgICBmb3IgKGNvbnN0IG91dHB1dEltZyBvZiBjdHgub3V0cHV0KSB7XG4gICAgICBvdXRwdXRJbWcudHlwZSA9IHR5cGVcbiAgICB9XG4gICAgcmV0dXJuIGN0eFxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBhZnRlclVwbG9hZChjdHg6IElQaWNHbyk6IFByb21pc2U8SVBpY0dvPiB7XG4gICAgY3R4LmVtaXQoSUJ1aWxkSW5FdmVudC5BRlRFUl9VUExPQUQsIGN0eClcbiAgICBjdHguZW1pdChJQnVpbGRJbkV2ZW50LlVQTE9BRF9QUk9HUkVTUywgMTAwKVxuICAgIGF3YWl0IHRoaXMuaGFuZGxlUGx1Z2lucyhjdHguaGVscGVyLmFmdGVyVXBsb2FkUGx1Z2lucywgY3R4KVxuICAgIGxldCBtc2cgPSBcIlwiXG4gICAgY29uc3QgbGVuZ3RoID0gY3R4Lm91dHB1dC5sZW5ndGhcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAodHlwZW9mIGN0eC5vdXRwdXRbaV0uaW1nVXJsICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgIG1zZyArPSBoYW5kbGVVcmxFbmNvZGUoY3R4Lm91dHB1dFtpXS5pbWdVcmwhKVxuICAgICAgICBpZiAoaSAhPT0gbGVuZ3RoIC0gMSkge1xuICAgICAgICAgIG1zZyArPSBcIlxcblwiXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGRlbGV0ZSBjdHgub3V0cHV0W2ldLmJhc2U2NEltYWdlXG4gICAgICBkZWxldGUgY3R4Lm91dHB1dFtpXS5idWZmZXJcbiAgICB9XG4gICAgY3R4LmVtaXQoSUJ1aWxkSW5FdmVudC5GSU5JU0hFRCwgY3R4KVxuICAgIGN0eC5sb2cuc3VjY2VzcyhgXFxuJHttc2d9YClcbiAgICByZXR1cm4gY3R4XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGhhbmRsZVBsdWdpbnMobGlmZUN5Y2xlUGx1Z2luczogSUxpZmVjeWNsZVBsdWdpbnMsIGN0eDogSVBpY0dvKTogUHJvbWlzZTxJUGljR28+IHtcbiAgICBjb25zdCBwbHVnaW5zID0gbGlmZUN5Y2xlUGx1Z2lucy5nZXRMaXN0KClcbiAgICBjb25zdCBwbHVnaW5OYW1lcyA9IGxpZmVDeWNsZVBsdWdpbnMuZ2V0SWRMaXN0KClcbiAgICBjb25zdCBsaWZlQ3ljbGVOYW1lID0gbGlmZUN5Y2xlUGx1Z2lucy5nZXROYW1lKClcbiAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIHBsdWdpbnMubWFwKGFzeW5jIChwbHVnaW46IElQbHVnaW4sIGluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjdHgubG9nLmluZm8oYCR7bGlmZUN5Y2xlTmFtZX06ICR7cGx1Z2luTmFtZXNbaW5kZXhdfSBydW5uaW5nYClcbiAgICAgICAgICBhd2FpdCBwbHVnaW4uaGFuZGxlKGN0eClcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGN0eC5sb2cuZXJyb3IoYCR7bGlmZUN5Y2xlTmFtZX06ICR7cGx1Z2luTmFtZXNbaW5kZXhdfSBlcnJvcmApXG4gICAgICAgICAgdGhyb3cgZVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIClcbiAgICByZXR1cm4gY3R4XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgTGlmZWN5Y2xlXG4iLCJpbXBvcnQgeyBJUGljR28gfSBmcm9tIFwiLi4vdHlwZXNcIlxuXG4vKipcbiAqIGNyZWF0ZSBhbiB1bmlxdWUgY29udGV4dCBmb3IgZWFjaCB1cGxvYWQgcHJvY2Vzc1xuICogQHBhcmFtIGN0eFxuICovXG5leHBvcnQgY29uc3QgY3JlYXRlQ29udGV4dCA9IChjdHg6IElQaWNHbyk6IElQaWNHbyA9PiB7XG4gIHJldHVybiB7XG4gICAgY29uZmlnUGF0aDogY3R4LmNvbmZpZ1BhdGgsXG4gICAgYmFzZURpcjogY3R4LmJhc2VEaXIsXG4gICAgbG9nOiBjdHgubG9nLFxuICAgIGNtZDogY3R4LmNtZCxcbiAgICBvdXRwdXQ6IFtdLFxuICAgIGlucHV0OiBbXSxcbiAgICBwbHVnaW5Mb2FkZXI6IGN0eC5wbHVnaW5Mb2FkZXIsXG4gICAgcGx1Z2luSGFuZGxlcjogY3R4LnBsdWdpbkhhbmRsZXIsXG4gICAgUmVxdWVzdDogY3R4LlJlcXVlc3QsXG4gICAgaGVscGVyOiBjdHguaGVscGVyLFxuICAgIFZFUlNJT046IGN0eC5WRVJTSU9OLFxuICAgIEdVSV9WRVJTSU9OOiBjdHguR1VJX1ZFUlNJT04sXG4gICAgcmVxdWVzdDogY3R4LnJlcXVlc3QsXG4gICAgaTE4bjogY3R4LmkxOG4sXG4gICAgZ2V0Q29uZmlnOiBjdHguZ2V0Q29uZmlnLmJpbmQoY3R4KSxcbiAgICBzYXZlQ29uZmlnOiBjdHguc2F2ZUNvbmZpZy5iaW5kKGN0eCksXG4gICAgcmVtb3ZlQ29uZmlnOiBjdHgucmVtb3ZlQ29uZmlnLmJpbmQoY3R4KSxcbiAgICBzZXRDb25maWc6IGN0eC5zZXRDb25maWcuYmluZChjdHgpLFxuICAgIHVuc2V0Q29uZmlnOiBjdHgudW5zZXRDb25maWcuYmluZChjdHgpLFxuICAgIHVwbG9hZDogY3R4LnVwbG9hZC5iaW5kKGN0eCksXG4gICAgYWRkTGlzdGVuZXI6IGN0eC5hZGRMaXN0ZW5lci5iaW5kKGN0eCksXG4gICAgb246IGN0eC5vbi5iaW5kKGN0eCksXG4gICAgb25jZTogY3R4Lm9uY2UuYmluZChjdHgpLFxuICAgIHJlbW92ZUxpc3RlbmVyOiBjdHgucmVtb3ZlTGlzdGVuZXIuYmluZChjdHgpLFxuICAgIG9mZjogY3R4Lm9mZi5iaW5kKGN0eCksXG4gICAgcmVtb3ZlQWxsTGlzdGVuZXJzOiBjdHgucmVtb3ZlQWxsTGlzdGVuZXJzLmJpbmQoY3R4KSxcbiAgICBzZXRNYXhMaXN0ZW5lcnM6IGN0eC5zZXRNYXhMaXN0ZW5lcnMuYmluZChjdHgpLFxuICAgIGdldE1heExpc3RlbmVyczogY3R4LmdldE1heExpc3RlbmVycy5iaW5kKGN0eCksXG4gICAgbGlzdGVuZXJzOiBjdHgubGlzdGVuZXJzLmJpbmQoY3R4KSxcbiAgICByYXdMaXN0ZW5lcnM6IGN0eC5yYXdMaXN0ZW5lcnMuYmluZChjdHgpLFxuICAgIGVtaXQ6IGN0eC5lbWl0LmJpbmQoY3R4KSxcbiAgICBsaXN0ZW5lckNvdW50OiBjdHgubGlzdGVuZXJDb3VudC5iaW5kKGN0eCksXG4gICAgcHJlcGVuZExpc3RlbmVyOiBjdHgucHJlcGVuZExpc3RlbmVyLmJpbmQoY3R4KSxcbiAgICBwcmVwZW5kT25jZUxpc3RlbmVyOiBjdHgucHJlcGVuZE9uY2VMaXN0ZW5lci5iaW5kKGN0eCksXG4gICAgZXZlbnROYW1lczogY3R4LmV2ZW50TmFtZXMuYmluZChjdHgpLFxuICB9XG59XG4iLCJpbXBvcnQgY3J5cHRvIGZyb20gXCJjcnlwdG9cIlxuaW1wb3J0IG1pbWUgZnJvbSBcIm1pbWUtdHlwZXNcIlxuaW1wb3J0IHsgSU9sZFJlcU9wdGlvbnNXaXRoRnVsbFJlc3BvbnNlLCBJUGljR28sIElQbHVnaW5Db25maWcsIElUY3l1bkNvbmZpZyB9IGZyb20gXCIuLi8uLi90eXBlc1wiXG5pbXBvcnQgeyBJQnVpbGRJbkV2ZW50IH0gZnJvbSBcIi4uLy4uL3V0aWxzL2VudW1cIlxuaW1wb3J0IHsgSUxvY2FsZXNLZXkgfSBmcm9tIFwiLi4vLi4vaTE4bi96aC1DTlwiXG5cbi8vIGdlbmVyYXRlIENPUyBzaWduYXR1cmUgc3RyaW5nXG5cbmV4cG9ydCBpbnRlcmZhY2UgSVNpZ25hdHVyZSB7XG4gIHNpZ25hdHVyZTogc3RyaW5nXG4gIGFwcElkOiBzdHJpbmdcbiAgYnVja2V0OiBzdHJpbmdcbiAgc2lnblRpbWU6IHN0cmluZ1xufVxuXG5jb25zdCBnZW5lcmF0ZVNpZ25hdHVyZSA9IChvcHRpb25zOiBJVGN5dW5Db25maWcsIGZpbGVOYW1lOiBzdHJpbmcpOiBJU2lnbmF0dXJlID0+IHtcbiAgY29uc3Qgc2VjcmV0SWQgPSBvcHRpb25zLnNlY3JldElkXG4gIGNvbnN0IHNlY3JldEtleSA9IG9wdGlvbnMuc2VjcmV0S2V5XG4gIGNvbnN0IGFwcElkID0gb3B0aW9ucy5hcHBJZFxuICBjb25zdCBidWNrZXQgPSBvcHRpb25zLmJ1Y2tldFxuICBsZXQgc2lnbmF0dXJlXG4gIGxldCBzaWduVGltZSA9IFwiXCJcbiAgaWYgKCFvcHRpb25zLnZlcnNpb24gfHwgb3B0aW9ucy52ZXJzaW9uID09PSBcInY0XCIpIHtcbiAgICBjb25zdCByYW5kb20gPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAxMDAwMDAwMDAwMClcbiAgICBjb25zdCBjdXJyZW50ID0gTWF0aC5mbG9vcihuZXcgRGF0ZSgpLmdldFRpbWUoKSAvIDEwMDApIC0gMVxuICAgIGNvbnN0IGV4cGlyZWQgPSBjdXJyZW50ICsgMzYwMFxuXG4gICAgY29uc3QgbXVsdGlTaWduYXR1cmUgPSBgYT0ke2FwcElkfSZiPSR7YnVja2V0fSZrPSR7c2VjcmV0SWR9JmU9JHtleHBpcmVkfSZ0PSR7Y3VycmVudH0mcj0ke3JhbmRvbX0mZj1gXG5cbiAgICBjb25zdCBzaWduSGV4S2V5ID0gY3J5cHRvLmNyZWF0ZUhtYWMoXCJzaGExXCIsIHNlY3JldEtleSkudXBkYXRlKG11bHRpU2lnbmF0dXJlKS5kaWdlc3QoKVxuICAgIGNvbnN0IHRlbXBTdHJpbmcgPSBCdWZmZXIuY29uY2F0KFtzaWduSGV4S2V5LCBCdWZmZXIuZnJvbShtdWx0aVNpZ25hdHVyZSldKVxuICAgIHNpZ25hdHVyZSA9IEJ1ZmZlci5mcm9tKHRlbXBTdHJpbmcpLnRvU3RyaW5nKFwiYmFzZTY0XCIpXG4gIH0gZWxzZSB7XG4gICAgLy8gaHR0cHM6Ly9jbG91ZC50ZW5jZW50LmNvbS9kb2N1bWVudC9wcm9kdWN0LzQzNi83Nzc4I3NpZ25hdHVyZVxuICAgIGNvbnN0IHRvZGF5ID0gTWF0aC5mbG9vcihuZXcgRGF0ZSgpLmdldFRpbWUoKSAvIDEwMDApXG4gICAgY29uc3QgdG9tb3Jyb3cgPSB0b2RheSArIDg2NDAwXG4gICAgc2lnblRpbWUgPSBgJHt0b2RheX07JHt0b21vcnJvd31gXG4gICAgY29uc3Qgc2lnbktleSA9IGNyeXB0by5jcmVhdGVIbWFjKFwic2hhMVwiLCBzZWNyZXRLZXkpLnVwZGF0ZShzaWduVGltZSkuZGlnZXN0KFwiaGV4XCIpXG4gICAgY29uc3QgaHR0cFN0cmluZyA9IGBwdXRcXG4vJHtvcHRpb25zLnBhdGh9JHtmaWxlTmFtZX1cXG5cXG5ob3N0PSR7b3B0aW9ucy5idWNrZXR9LmNvcy4ke29wdGlvbnMuYXJlYX0ubXlxY2xvdWQuY29tXFxuYFxuICAgIGNvbnN0IHNoYTFlZEh0dHBTdHJpbmcgPSBjcnlwdG8uY3JlYXRlSGFzaChcInNoYTFcIikudXBkYXRlKGh0dHBTdHJpbmcpLmRpZ2VzdChcImhleFwiKVxuICAgIGNvbnN0IHN0cmluZ1RvU2lnbiA9IGBzaGExXFxuJHtzaWduVGltZX1cXG4ke3NoYTFlZEh0dHBTdHJpbmd9XFxuYFxuICAgIHNpZ25hdHVyZSA9IGNyeXB0by5jcmVhdGVIbWFjKFwic2hhMVwiLCBzaWduS2V5KS51cGRhdGUoc3RyaW5nVG9TaWduKS5kaWdlc3QoXCJoZXhcIilcbiAgfVxuICByZXR1cm4ge1xuICAgIHNpZ25hdHVyZSxcbiAgICBhcHBJZCxcbiAgICBidWNrZXQsXG4gICAgc2lnblRpbWUsXG4gIH1cbn1cblxuY29uc3QgcG9zdE9wdGlvbnMgPSAoXG4gIG9wdGlvbnM6IElUY3l1bkNvbmZpZyxcbiAgZmlsZU5hbWU6IHN0cmluZyxcbiAgc2lnbmF0dXJlOiBJU2lnbmF0dXJlLFxuICBpbWFnZTogQnVmZmVyLFxuICB2ZXJzaW9uOiBzdHJpbmdcbik6IElPbGRSZXFPcHRpb25zV2l0aEZ1bGxSZXNwb25zZSA9PiB7XG4gIGNvbnN0IGFyZWEgPSBvcHRpb25zLmFyZWFcbiAgY29uc3QgcGF0aCA9IG9wdGlvbnMucGF0aFxuICBpZiAoIW9wdGlvbnMudmVyc2lvbiB8fCBvcHRpb25zLnZlcnNpb24gPT09IFwidjRcIikge1xuICAgIHJldHVybiB7XG4gICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgdXJsOiBgaHR0cDovLyR7YXJlYX0uZmlsZS5teXFjbG91ZC5jb20vZmlsZXMvdjIvJHtzaWduYXR1cmUuYXBwSWR9LyR7c2lnbmF0dXJlLmJ1Y2tldH0vJHtlbmNvZGVVUkkoXG4gICAgICAgIHBhdGhcbiAgICAgICl9JHtmaWxlTmFtZX1gLFxuICAgICAgaGVhZGVyczoge1xuICAgICAgICAvLyB1bnNhZmVcbiAgICAgICAgLy8gSG9zdDogYCR7YXJlYX0uZmlsZS5teXFjbG91ZC5jb21gLFxuICAgICAgICBBdXRob3JpemF0aW9uOiBzaWduYXR1cmUuc2lnbmF0dXJlLFxuICAgICAgICBjb250ZW50VHlwZTogXCJtdWx0aXBhcnQvZm9ybS1kYXRhXCIsXG4gICAgICAgIHVzZXJBZ2VudDogYFBpY0dvOyR7dmVyc2lvbn07bnVsbDtudWxsYCxcbiAgICAgIH0sXG4gICAgICBmb3JtRGF0YToge1xuICAgICAgICBvcDogXCJ1cGxvYWRcIixcbiAgICAgICAgZmlsZWNvbnRlbnQ6IGltYWdlLFxuICAgICAgfSxcbiAgICAgIHJlc29sdmVXaXRoRnVsbFJlc3BvbnNlOiB0cnVlLFxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICByZXR1cm4ge1xuICAgICAgbWV0aG9kOiBcIlBVVFwiLFxuICAgICAgdXJsOiBgaHR0cDovLyR7b3B0aW9ucy5idWNrZXR9LmNvcy4ke29wdGlvbnMuYXJlYX0ubXlxY2xvdWQuY29tLyR7ZW5jb2RlVVJJQ29tcG9uZW50KHBhdGgpfSR7ZW5jb2RlVVJJQ29tcG9uZW50KFxuICAgICAgICBmaWxlTmFtZVxuICAgICAgKX1gLFxuICAgICAgaGVhZGVyczoge1xuICAgICAgICAvLyBIb3N0OiBgJHtvcHRpb25zLmJ1Y2tldH0uY29zLiR7b3B0aW9ucy5hcmVhfS5teXFjbG91ZC5jb21gLFxuICAgICAgICBBdXRob3JpemF0aW9uOiBgcS1zaWduLWFsZ29yaXRobT1zaGExJnEtYWs9JHtvcHRpb25zLnNlY3JldElkfSZxLXNpZ24tdGltZT0ke3NpZ25hdHVyZS5zaWduVGltZX0mcS1rZXktdGltZT0ke3NpZ25hdHVyZS5zaWduVGltZX0mcS1oZWFkZXItbGlzdD1ob3N0JnEtdXJsLXBhcmFtLWxpc3Q9JnEtc2lnbmF0dXJlPSR7c2lnbmF0dXJlLnNpZ25hdHVyZX1gLFxuICAgICAgICBjb250ZW50VHlwZTogbWltZS5sb29rdXAoZmlsZU5hbWUpLFxuICAgICAgICB1c2VyQWdlbnQ6IGBQaWNHbzske3ZlcnNpb259O251bGw7bnVsbGAsXG4gICAgICB9LFxuICAgICAgYm9keTogaW1hZ2UsXG4gICAgICByZXNvbHZlV2l0aEZ1bGxSZXNwb25zZTogdHJ1ZSxcbiAgICB9XG4gIH1cbn1cblxuY29uc3QgaGFuZGxlID0gYXN5bmMgKGN0eDogSVBpY0dvKTogUHJvbWlzZTxJUGljR28gfCBib29sZWFuPiA9PiB7XG4gIGNvbnN0IHRjWXVuT3B0aW9ucyA9IGN0eC5nZXRDb25maWc8SVRjeXVuQ29uZmlnPihcInBpY0JlZC50Y3l1blwiKVxuICBpZiAoIXRjWXVuT3B0aW9ucykge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkNhbid0IGZpbmQgdGVuY2VudCBDT1MgY29uZmlnXCIpXG4gIH1cbiAgdHJ5IHtcbiAgICBjb25zdCBpbWdMaXN0ID0gY3R4Lm91dHB1dFxuICAgIGNvbnN0IGN1c3RvbVVybCA9IHRjWXVuT3B0aW9ucy5jdXN0b21VcmxcbiAgICBjb25zdCBwYXRoID0gdGNZdW5PcHRpb25zLnBhdGhcbiAgICBjb25zdCB1c2VWNCA9ICF0Y1l1bk9wdGlvbnMudmVyc2lvbiB8fCB0Y1l1bk9wdGlvbnMudmVyc2lvbiA9PT0gXCJ2NFwiXG4gICAgZm9yIChjb25zdCBpbWcgb2YgaW1nTGlzdCkge1xuICAgICAgaWYgKGltZy5maWxlTmFtZSAmJiBpbWcuYnVmZmVyKSB7XG4gICAgICAgIGNvbnN0IHNpZ25hdHVyZSA9IGdlbmVyYXRlU2lnbmF0dXJlKHRjWXVuT3B0aW9ucywgaW1nLmZpbGVOYW1lKVxuICAgICAgICBpZiAoIXNpZ25hdHVyZSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICB9XG4gICAgICAgIGxldCBpbWFnZSA9IGltZy5idWZmZXJcbiAgICAgICAgaWYgKCFpbWFnZSAmJiBpbWcuYmFzZTY0SW1hZ2UpIHtcbiAgICAgICAgICBpbWFnZSA9IEJ1ZmZlci5mcm9tKGltZy5iYXNlNjRJbWFnZSwgXCJiYXNlNjRcIilcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBvcHRpb25zID0gcG9zdE9wdGlvbnModGNZdW5PcHRpb25zLCBpbWcuZmlsZU5hbWUsIHNpZ25hdHVyZSwgaW1hZ2UsIGN0eC5HVUlfVkVSU0lPTiB8fCBjdHguVkVSU0lPTilcbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgY3R4XG4gICAgICAgICAgLnJlcXVlc3Qob3B0aW9ucylcbiAgICAgICAgICAudGhlbigocmVzOiBhbnkpID0+IHJlcylcbiAgICAgICAgICAuY2F0Y2goKGVycjogRXJyb3IpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIHN0YXR1c0NvZGU6IDQwMCxcbiAgICAgICAgICAgICAgYm9keToge1xuICAgICAgICAgICAgICAgIG1zZzogY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PihcIkFVVEhfRkFJTEVEXCIpLFxuICAgICAgICAgICAgICAgIGVycixcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICBsZXQgYm9keVxuICAgICAgICBpZiAodXNlVjQgJiYgdHlwZW9mIHJlcyA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgIGJvZHkgPSBKU09OLnBhcnNlKHJlcylcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBib2R5ID0gcmVzXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGJvZHkuc3RhdHVzQ29kZSA9PT0gNDAwKSB7XG4gICAgICAgICAgaWYgKGJvZHk/LmJvZHk/LmVycikge1xuICAgICAgICAgICAgdGhyb3cgYm9keS5ib2R5LmVyclxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYm9keT8uYm9keT8ubXNnIHx8IGJvZHk/LmJvZHk/Lm1lc3NhZ2UpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG9wdGlvblVybCA9IHRjWXVuT3B0aW9ucy5vcHRpb25zIHx8IFwiXCJcbiAgICAgICAgaWYgKHVzZVY0ICYmIGJvZHkubWVzc2FnZSA9PT0gXCJTVUNDRVNTXCIpIHtcbiAgICAgICAgICBkZWxldGUgaW1nLmJhc2U2NEltYWdlXG4gICAgICAgICAgZGVsZXRlIGltZy5idWZmZXJcbiAgICAgICAgICBpZiAoY3VzdG9tVXJsKSB7XG4gICAgICAgICAgICBpbWcuaW1nVXJsID0gYCR7Y3VzdG9tVXJsfS8ke3BhdGh9JHtpbWcuZmlsZU5hbWV9YFxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpbWcuaW1nVXJsID0gYCR7Ym9keS5kYXRhLnNvdXJjZV91cmwgYXMgc3RyaW5nfSR7b3B0aW9uVXJsfWBcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoIXVzZVY0ICYmIGJvZHkgJiYgYm9keS5zdGF0dXNDb2RlID09PSAyMDApIHtcbiAgICAgICAgICBkZWxldGUgaW1nLmJhc2U2NEltYWdlXG4gICAgICAgICAgZGVsZXRlIGltZy5idWZmZXJcbiAgICAgICAgICBpZiAoY3VzdG9tVXJsKSB7XG4gICAgICAgICAgICBpbWcuaW1nVXJsID0gYCR7Y3VzdG9tVXJsfS8ke2VuY29kZVVSSShwYXRoKX0ke2VuY29kZVVSSShpbWcuZmlsZU5hbWUpfSR7b3B0aW9uVXJsfWBcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaW1nLmltZ1VybCA9IGBodHRwczovLyR7dGNZdW5PcHRpb25zLmJ1Y2tldH0uY29zLiR7dGNZdW5PcHRpb25zLmFyZWF9Lm15cWNsb3VkLmNvbS8ke2VuY29kZVVSSShcbiAgICAgICAgICAgICAgcGF0aFxuICAgICAgICAgICAgKX0ke2VuY29kZVVSSShpbWcuZmlsZU5hbWUpfSR7b3B0aW9uVXJsfWBcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKHJlcy5ib2R5Lm1zZylcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY3R4XG4gIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgaWYgKCF0Y1l1bk9wdGlvbnMudmVyc2lvbiB8fCB0Y1l1bk9wdGlvbnMudmVyc2lvbiA9PT0gXCJ2NFwiKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBib2R5ID0gSlNPTi5wYXJzZShlcnIuZXJyb3IpXG4gICAgICAgIGN0eC5lbWl0KElCdWlsZEluRXZlbnQuTk9USUZJQ0FUSU9OLCB7XG4gICAgICAgICAgdGl0bGU6IGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oXCJVUExPQURfRkFJTEVEXCIpLFxuICAgICAgICAgIGJvZHk6IGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oXCJVUExPQURfRkFJTEVEX1JFQVNPTlwiLCB7XG4gICAgICAgICAgICBjb2RlOiBib2R5LmNvZGUgYXMgc3RyaW5nLFxuICAgICAgICAgIH0pLFxuICAgICAgICAgIHRleHQ6IFwiaHR0cHM6Ly9jbG91ZC50ZW5jZW50LmNvbS9kb2N1bWVudC9wcm9kdWN0LzQzNi84NDMyXCIsXG4gICAgICAgIH0pXG4gICAgICB9IGNhdGNoIChlKSB7fVxuICAgIH1cbiAgICB0aHJvdyBlcnJcbiAgfVxufVxuXG5jb25zdCBjb25maWcgPSAoY3R4OiBJUGljR28pOiBJUGx1Z2luQ29uZmlnW10gPT4ge1xuICBjb25zdCB1c2VyQ29uZmlnID0gY3R4LmdldENvbmZpZzxJVGN5dW5Db25maWc+KFwicGljQmVkLnRjeXVuXCIpIHx8IHt9XG4gIGNvbnN0IGNvbmZpZzogSVBsdWdpbkNvbmZpZ1tdID0gW1xuICAgIHtcbiAgICAgIG5hbWU6IFwidmVyc2lvblwiLFxuICAgICAgdHlwZTogXCJsaXN0XCIsXG4gICAgICBhbGlhczogY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PihcIlBJQ0JFRF9URU5DRU5UQ0xPVURfVkVSU0lPTlwiKSxcbiAgICAgIGNob2ljZXM6IFtcInY0XCIsIFwidjVcIl0sXG4gICAgICBkZWZhdWx0OiBcInY1XCIsXG4gICAgICByZXF1aXJlZDogZmFsc2UsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcInNlY3JldElkXCIsXG4gICAgICB0eXBlOiBcImlucHV0XCIsXG4gICAgICBnZXQgYWxpYXMoKSB7XG4gICAgICAgIHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KFwiUElDQkVEX1RFTkNFTlRDTE9VRF9TRUNSRVRJRFwiKVxuICAgICAgfSxcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcuc2VjcmV0SWQgfHwgXCJcIixcbiAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogXCJzZWNyZXRLZXlcIixcbiAgICAgIHR5cGU6IFwicGFzc3dvcmRcIixcbiAgICAgIGdldCBhbGlhcygpIHtcbiAgICAgICAgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oXCJQSUNCRURfVEVOQ0VOVENMT1VEX1NFQ1JFVEtFWVwiKVxuICAgICAgfSxcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcuc2VjcmV0S2V5IHx8IFwiXCIsXG4gICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFwiYnVja2V0XCIsXG4gICAgICB0eXBlOiBcImlucHV0XCIsXG4gICAgICBnZXQgYWxpYXMoKSB7XG4gICAgICAgIHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KFwiUElDQkVEX1RFTkNFTlRDTE9VRF9CVUNLRVRcIilcbiAgICAgIH0sXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLmJ1Y2tldCB8fCBcIlwiLFxuICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcImFwcElkXCIsXG4gICAgICB0eXBlOiBcImlucHV0XCIsXG4gICAgICBnZXQgcHJlZml4KCkge1xuICAgICAgICByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PihcIlBJQ0JFRF9URU5DRU5UQ0xPVURfQVBQSURcIilcbiAgICAgIH0sXG4gICAgICBnZXQgYWxpYXMoKSB7XG4gICAgICAgIHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KFwiUElDQkVEX1RFTkNFTlRDTE9VRF9BUFBJRFwiKVxuICAgICAgfSxcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcuYXBwSWQgfHwgXCJcIixcbiAgICAgIGdldCBtZXNzYWdlKCkge1xuICAgICAgICByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PihcIlBJQ0JFRF9URU5DRU5UQ0xPVURfTUVTU0FHRV9BUFBJRFwiKVxuICAgICAgfSxcbiAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogXCJhcmVhXCIsXG4gICAgICB0eXBlOiBcImlucHV0XCIsXG4gICAgICBnZXQgcHJlZml4KCkge1xuICAgICAgICByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PihcIlBJQ0JFRF9URU5DRU5UQ0xPVURfQVJFQVwiKVxuICAgICAgfSxcbiAgICAgIGdldCBhbGlhcygpIHtcbiAgICAgICAgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oXCJQSUNCRURfVEVOQ0VOVENMT1VEX0FSRUFcIilcbiAgICAgIH0sXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLmFyZWEgfHwgXCJcIixcbiAgICAgIGdldCBtZXNzYWdlKCkge1xuICAgICAgICByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PihcIlBJQ0JFRF9URU5DRU5UQ0xPVURfTUVTU0FHRV9BUkVBXCIpXG4gICAgICB9LFxuICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcInBhdGhcIixcbiAgICAgIHR5cGU6IFwiaW5wdXRcIixcbiAgICAgIGdldCBwcmVmaXgoKSB7XG4gICAgICAgIHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KFwiUElDQkVEX1RFTkNFTlRDTE9VRF9QQVRIXCIpXG4gICAgICB9LFxuICAgICAgZ2V0IGFsaWFzKCkge1xuICAgICAgICByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PihcIlBJQ0JFRF9URU5DRU5UQ0xPVURfUEFUSFwiKVxuICAgICAgfSxcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcucGF0aCB8fCBcIlwiLFxuICAgICAgZ2V0IG1lc3NhZ2UoKSB7XG4gICAgICAgIHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KFwiUElDQkVEX1RFTkNFTlRDTE9VRF9NRVNTQUdFX1BBVEhcIilcbiAgICAgIH0sXG4gICAgICByZXF1aXJlZDogZmFsc2UsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcImN1c3RvbVVybFwiLFxuICAgICAgdHlwZTogXCJpbnB1dFwiLFxuICAgICAgZ2V0IHByZWZpeCgpIHtcbiAgICAgICAgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oXCJQSUNCRURfVEVOQ0VOVENMT1VEX0NVU1RPTVVSTFwiKVxuICAgICAgfSxcbiAgICAgIGdldCBhbGlhcygpIHtcbiAgICAgICAgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oXCJQSUNCRURfVEVOQ0VOVENMT1VEX0NVU1RPTVVSTFwiKVxuICAgICAgfSxcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcuY3VzdG9tVXJsIHx8IFwiXCIsXG4gICAgICBnZXQgbWVzc2FnZSgpIHtcbiAgICAgICAgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oXCJQSUNCRURfVEVOQ0VOVENMT1VEX01FU1NBR0VfQ1VTVE9NVVJMXCIpXG4gICAgICB9LFxuICAgICAgcmVxdWlyZWQ6IGZhbHNlLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogXCJvcHRpb25zXCIsXG4gICAgICB0eXBlOiBcImlucHV0XCIsXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLm9wdGlvbnMgfHwgXCJcIixcbiAgICAgIGdldCBwcmVmaXgoKSB7XG4gICAgICAgIHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KFwiUElDQkVEX1RFTkNFTlRDTE9VRF9PUFRJT05TXCIpXG4gICAgICB9LFxuICAgICAgZ2V0IGFsaWFzKCkge1xuICAgICAgICByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PihcIlBJQ0JFRF9URU5DRU5UQ0xPVURfT1BUSU9OU1wiKVxuICAgICAgfSxcbiAgICAgIGdldCBtZXNzYWdlKCkge1xuICAgICAgICByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PihcIlBJQ0JFRF9URU5DRU5UQ0xPVURfTUVTU0FHRV9PUFRJT05TXCIpXG4gICAgICB9LFxuICAgICAgcmVxdWlyZWQ6IGZhbHNlLFxuICAgIH0sXG4gIF1cbiAgcmV0dXJuIGNvbmZpZ1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiByZWdpc3RlcihjdHg6IElQaWNHbyk6IHZvaWQge1xuICBjdHguaGVscGVyLnVwbG9hZGVyLnJlZ2lzdGVyKFwidGN5dW5cIiwge1xuICAgIGdldCBuYW1lKCkge1xuICAgICAgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oXCJQSUNCRURfVEVOQ0VOVENMT1VEXCIpXG4gICAgfSxcbiAgICBoYW5kbGUsXG4gICAgY29uZmlnLFxuICB9KVxufVxuIiwiaW1wb3J0IHsgSVBpY0dvLCBJUGx1Z2luQ29uZmlnLCBJR2l0aHViQ29uZmlnLCBJT2xkUmVxT3B0aW9uc1dpdGhKU09OIH0gZnJvbSBcIi4uLy4uL3R5cGVzXCJcbmltcG9ydCB7IElCdWlsZEluRXZlbnQgfSBmcm9tIFwiLi4vLi4vdXRpbHMvZW51bVwiXG5pbXBvcnQgeyBJTG9jYWxlc0tleSB9IGZyb20gXCIuLi8uLi9pMThuL3poLUNOXCJcbmltcG9ydCBtaW1lIGZyb20gXCJtaW1lLXR5cGVzXCJcblxuY29uc3QgcG9zdE9wdGlvbnMgPSAoZmlsZU5hbWU6IHN0cmluZywgb3B0aW9uczogSUdpdGh1YkNvbmZpZywgZGF0YTogYW55KTogSU9sZFJlcU9wdGlvbnNXaXRoSlNPTiA9PiB7XG4gIGNvbnN0IHBhdGggPSBvcHRpb25zLnBhdGggfHwgXCJcIlxuICBjb25zdCB7IHRva2VuLCByZXBvIH0gPSBvcHRpb25zXG4gIHJldHVybiB7XG4gICAgbWV0aG9kOiBcIlBVVFwiLFxuICAgIHVybDogYGh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvJHtyZXBvfS9jb250ZW50cy8ke2VuY29kZVVSSShwYXRoKX0ke2VuY29kZVVSSShmaWxlTmFtZSl9YCxcbiAgICBoZWFkZXJzOiB7XG4gICAgICBBdXRob3JpemF0aW9uOiBgdG9rZW4gJHt0b2tlbn1gLFxuICAgICAgXCJVc2VyLUFnZW50XCI6IFwiUGljR29cIixcbiAgICAgIFwiQ29udGVudC1UeXBlXCI6IG1pbWUubG9va3VwKGZpbGVOYW1lKSxcbiAgICB9LFxuICAgIGJvZHk6IGRhdGEsXG4gICAganNvbjogdHJ1ZSxcbiAgfSBhcyBjb25zdFxufVxuXG5jb25zdCBoYW5kbGUgPSBhc3luYyAoY3R4OiBJUGljR28pOiBQcm9taXNlPElQaWNHbz4gPT4ge1xuICBjb25zdCBnaXRodWJPcHRpb25zID0gY3R4LmdldENvbmZpZzxJR2l0aHViQ29uZmlnPihcInBpY0JlZC5naXRodWJcIilcbiAgaWYgKCFnaXRodWJPcHRpb25zKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQ2FuJ3QgZmluZCBnaXRodWIgY29uZmlnXCIpXG4gIH1cbiAgdHJ5IHtcbiAgICBjb25zdCBpbWdMaXN0ID0gY3R4Lm91dHB1dFxuICAgIGZvciAoY29uc3QgaW1nIG9mIGltZ0xpc3QpIHtcbiAgICAgIGlmIChpbWcuZmlsZU5hbWUgJiYgaW1nLmJ1ZmZlcikge1xuICAgICAgICBjb25zdCBiYXNlNjRJbWFnZSA9IGltZy5iYXNlNjRJbWFnZSB8fCBCdWZmZXIuZnJvbShpbWcuYnVmZmVyKS50b1N0cmluZyhcImJhc2U2NFwiKVxuICAgICAgICBjb25zdCBkYXRhID0ge1xuICAgICAgICAgIG1lc3NhZ2U6IFwiVXBsb2FkIGJ5IFBpY0dvXCIsXG4gICAgICAgICAgYnJhbmNoOiBnaXRodWJPcHRpb25zLmJyYW5jaCxcbiAgICAgICAgICBjb250ZW50OiBiYXNlNjRJbWFnZSxcbiAgICAgICAgICBwYXRoOiBnaXRodWJPcHRpb25zLnBhdGggKyBlbmNvZGVVUkkoaW1nLmZpbGVOYW1lKSxcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwb3N0Q29uZmlnID0gcG9zdE9wdGlvbnMoaW1nLmZpbGVOYW1lLCBnaXRodWJPcHRpb25zLCBkYXRhKVxuICAgICAgICBjb25zdCBib2R5OiB7XG4gICAgICAgICAgY29udGVudDoge1xuICAgICAgICAgICAgZG93bmxvYWRfdXJsOiBzdHJpbmdcbiAgICAgICAgICB9XG4gICAgICAgIH0gPSBhd2FpdCBjdHgucmVxdWVzdChwb3N0Q29uZmlnKVxuICAgICAgICBpZiAoYm9keSkge1xuICAgICAgICAgIGRlbGV0ZSBpbWcuYmFzZTY0SW1hZ2VcbiAgICAgICAgICBkZWxldGUgaW1nLmJ1ZmZlclxuICAgICAgICAgIGlmIChnaXRodWJPcHRpb25zLmN1c3RvbVVybCkge1xuICAgICAgICAgICAgaW1nLmltZ1VybCA9IGAke2dpdGh1Yk9wdGlvbnMuY3VzdG9tVXJsfS8ke2dpdGh1Yk9wdGlvbnMucGF0aH0ke2ltZy5maWxlTmFtZX1gXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGltZy5pbWdVcmwgPSBib2R5LmNvbnRlbnQuZG93bmxvYWRfdXJsXG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlNlcnZlciBlcnJvciwgcGxlYXNlIHRyeSBhZ2FpblwiKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjdHhcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgY3R4LmVtaXQoSUJ1aWxkSW5FdmVudC5OT1RJRklDQVRJT04sIHtcbiAgICAgIHRpdGxlOiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KFwiVVBMT0FEX0ZBSUxFRFwiKSxcbiAgICAgIGJvZHk6IGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oXCJDSEVDS19TRVRUSU5HU19BTkRfTkVUV09SS1wiKSxcbiAgICB9KVxuICAgIHRocm93IGVyclxuICB9XG59XG5cbmNvbnN0IGNvbmZpZyA9IChjdHg6IElQaWNHbyk6IElQbHVnaW5Db25maWdbXSA9PiB7XG4gIGNvbnN0IHVzZXJDb25maWcgPSBjdHguZ2V0Q29uZmlnPElHaXRodWJDb25maWc+KFwicGljQmVkLmdpdGh1YlwiKSB8fCB7fVxuICBjb25zdCBjb25maWc6IElQbHVnaW5Db25maWdbXSA9IFtcbiAgICB7XG4gICAgICBuYW1lOiBcInJlcG9cIixcbiAgICAgIHR5cGU6IFwiaW5wdXRcIixcbiAgICAgIGdldCBwcmVmaXgoKSB7XG4gICAgICAgIHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KFwiUElDQkVEX0dJVEhVQl9SRVBPXCIpXG4gICAgICB9LFxuICAgICAgZ2V0IGFsaWFzKCkge1xuICAgICAgICByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PihcIlBJQ0JFRF9HSVRIVUJfUkVQT1wiKVxuICAgICAgfSxcbiAgICAgIGdldCBtZXNzYWdlKCkge1xuICAgICAgICByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PihcIlBJQ0JFRF9HSVRIVUJfTUVTU0FHRV9SRVBPXCIpXG4gICAgICB9LFxuICAgICAgZGVmYXVsdDogdXNlckNvbmZpZy5yZXBvIHx8IFwiXCIsXG4gICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFwiYnJhbmNoXCIsXG4gICAgICB0eXBlOiBcImlucHV0XCIsXG4gICAgICBnZXQgcHJlZml4KCkge1xuICAgICAgICByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PihcIlBJQ0JFRF9HSVRIVUJfQlJBTkNIXCIpXG4gICAgICB9LFxuICAgICAgZ2V0IGFsaWFzKCkge1xuICAgICAgICByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PihcIlBJQ0JFRF9HSVRIVUJfQlJBTkNIXCIpXG4gICAgICB9LFxuICAgICAgZ2V0IG1lc3NhZ2UoKSB7XG4gICAgICAgIHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KFwiUElDQkVEX0dJVEhVQl9NRVNTQUdFX0JSQU5DSFwiKVxuICAgICAgfSxcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcuYnJhbmNoIHx8IFwibWFzdGVyXCIsXG4gICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFwidG9rZW5cIixcbiAgICAgIHR5cGU6IFwicGFzc3dvcmRcIixcbiAgICAgIGdldCBhbGlhcygpIHtcbiAgICAgICAgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oXCJQSUNCRURfR0lUSFVCX1RPS0VOXCIpXG4gICAgICB9LFxuICAgICAgZGVmYXVsdDogdXNlckNvbmZpZy50b2tlbiB8fCBcIlwiLFxuICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcInBhdGhcIixcbiAgICAgIHR5cGU6IFwiaW5wdXRcIixcbiAgICAgIGdldCBwcmVmaXgoKSB7XG4gICAgICAgIHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KFwiUElDQkVEX0dJVEhVQl9QQVRIXCIpXG4gICAgICB9LFxuICAgICAgZ2V0IGFsaWFzKCkge1xuICAgICAgICByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PihcIlBJQ0JFRF9HSVRIVUJfUEFUSFwiKVxuICAgICAgfSxcbiAgICAgIGdldCBtZXNzYWdlKCkge1xuICAgICAgICByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PihcIlBJQ0JFRF9HSVRIVUJfTUVTU0FHRV9QQVRIXCIpXG4gICAgICB9LFxuICAgICAgZGVmYXVsdDogdXNlckNvbmZpZy5wYXRoIHx8IFwiXCIsXG4gICAgICByZXF1aXJlZDogZmFsc2UsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcImN1c3RvbVVybFwiLFxuICAgICAgdHlwZTogXCJpbnB1dFwiLFxuICAgICAgZ2V0IHByZWZpeCgpIHtcbiAgICAgICAgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oXCJQSUNCRURfR0lUSFVCX0NVU1RPTVVSTFwiKVxuICAgICAgfSxcbiAgICAgIGdldCBhbGlhcygpIHtcbiAgICAgICAgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oXCJQSUNCRURfR0lUSFVCX0NVU1RPTVVSTFwiKVxuICAgICAgfSxcbiAgICAgIGdldCBtZXNzYWdlKCkge1xuICAgICAgICByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PihcIlBJQ0JFRF9HSVRIVUJfTUVTU0FHRV9DVVNUT01VUkxcIilcbiAgICAgIH0sXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLmN1c3RvbVVybCB8fCBcIlwiLFxuICAgICAgcmVxdWlyZWQ6IGZhbHNlLFxuICAgIH0sXG4gIF1cbiAgcmV0dXJuIGNvbmZpZ1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiByZWdpc3RlcihjdHg6IElQaWNHbyk6IHZvaWQge1xuICBjdHguaGVscGVyLnVwbG9hZGVyLnJlZ2lzdGVyKFwiZ2l0aHViXCIsIHtcbiAgICBnZXQgbmFtZSgpIHtcbiAgICAgIHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KFwiUElDQkVEX0dJVEhVQlwiKVxuICAgIH0sXG4gICAgaGFuZGxlLFxuICAgIGNvbmZpZyxcbiAgfSlcbn1cbiIsImltcG9ydCBxaW5pdSBmcm9tIFwicWluaXVcIlxuaW1wb3J0IHsgSVBsdWdpbkNvbmZpZywgSVFpbml1Q29uZmlnLCBJUGljR28sIElPbGRSZXFPcHRpb25zIH0gZnJvbSBcIi4uLy4uL3R5cGVzXCJcbmltcG9ydCB7IElCdWlsZEluRXZlbnQgfSBmcm9tIFwiLi4vLi4vdXRpbHMvZW51bVwiXG5pbXBvcnQgeyBJTG9jYWxlc0tleSB9IGZyb20gXCIuLi8uLi9pMThuL3poLUNOXCJcbmltcG9ydCBtaW1lIGZyb20gXCJtaW1lLXR5cGVzXCJcblxuZnVuY3Rpb24gcG9zdE9wdGlvbnMob3B0aW9uczogSVFpbml1Q29uZmlnLCBmaWxlTmFtZTogc3RyaW5nLCB0b2tlbjogc3RyaW5nLCBpbWdCYXNlNjQ6IHN0cmluZyk6IElPbGRSZXFPcHRpb25zIHtcbiAgY29uc3QgYXJlYSA9IHNlbGVjdEFyZWEob3B0aW9ucy5hcmVhIHx8IFwiejBcIilcbiAgY29uc3QgcGF0aCA9IG9wdGlvbnMucGF0aCB8fCBcIlwiXG4gIGNvbnN0IGJhc2U2NEZpbGVOYW1lID0gQnVmZmVyLmZyb20ocGF0aCArIGZpbGVOYW1lLCBcInV0Zi04XCIpXG4gICAgLnRvU3RyaW5nKFwiYmFzZTY0XCIpXG4gICAgLnJlcGxhY2UoL1xcKy9nLCBcIi1cIilcbiAgICAucmVwbGFjZSgvXFwvL2csIFwiX1wiKVxuICByZXR1cm4ge1xuICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgdXJsOiBgaHR0cDovL3VwbG9hZCR7YXJlYX0ucWluaXVwLmNvbS9wdXRiNjQvLTEva2V5LyR7YmFzZTY0RmlsZU5hbWV9YCxcbiAgICBoZWFkZXJzOiB7XG4gICAgICBBdXRob3JpemF0aW9uOiBgVXBUb2tlbiAke3Rva2VufWAsXG4gICAgICBcIkNvbnRlbnQtVHlwZVwiOiBtaW1lLmxvb2t1cChmaWxlTmFtZSkgfHwgXCJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW1cIixcbiAgICB9LFxuICAgIGJvZHk6IGltZ0Jhc2U2NCxcbiAgfVxufVxuXG5mdW5jdGlvbiBzZWxlY3RBcmVhKGFyZWE6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBhcmVhID09PSBcInowXCIgPyBcIlwiIDogXCItXCIgKyBhcmVhXG59XG5cbmZ1bmN0aW9uIGdldFRva2VuKHFpbml1T3B0aW9uczogYW55KTogc3RyaW5nIHtcbiAgY29uc3QgYWNjZXNzS2V5ID0gcWluaXVPcHRpb25zLmFjY2Vzc0tleVxuICBjb25zdCBzZWNyZXRLZXkgPSBxaW5pdU9wdGlvbnMuc2VjcmV0S2V5XG4gIGNvbnN0IG1hYyA9IG5ldyBxaW5pdS5hdXRoLmRpZ2VzdC5NYWMoYWNjZXNzS2V5LCBzZWNyZXRLZXkpXG4gIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgc2NvcGU6IHFpbml1T3B0aW9ucy5idWNrZXQsXG4gIH1cbiAgY29uc3QgcHV0UG9saWN5ID0gbmV3IHFpbml1LnJzLlB1dFBvbGljeShvcHRpb25zKVxuICByZXR1cm4gcHV0UG9saWN5LnVwbG9hZFRva2VuKG1hYylcbn1cblxuY29uc3QgaGFuZGxlID0gYXN5bmMgKGN0eDogSVBpY0dvKTogUHJvbWlzZTxJUGljR28+ID0+IHtcbiAgY29uc3QgcWluaXVPcHRpb25zID0gY3R4LmdldENvbmZpZzxJUWluaXVDb25maWc+KFwicGljQmVkLnFpbml1XCIpXG4gIGlmICghcWluaXVPcHRpb25zKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQ2FuJ3QgZmluZCBxaW5pdSBjb25maWdcIilcbiAgfVxuICB0cnkge1xuICAgIGNvbnN0IGltZ0xpc3QgPSBjdHgub3V0cHV0XG4gICAgZm9yIChjb25zdCBpbWcgb2YgaW1nTGlzdCkge1xuICAgICAgaWYgKGltZy5maWxlTmFtZSAmJiBpbWcuYnVmZmVyKSB7XG4gICAgICAgIGNvbnN0IGJhc2U2NEltYWdlID0gaW1nLmJhc2U2NEltYWdlIHx8IEJ1ZmZlci5mcm9tKGltZy5idWZmZXIpLnRvU3RyaW5nKFwiYmFzZTY0XCIpXG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSBwb3N0T3B0aW9ucyhxaW5pdU9wdGlvbnMsIGltZy5maWxlTmFtZSwgZ2V0VG9rZW4ocWluaXVPcHRpb25zKSwgYmFzZTY0SW1hZ2UpXG4gICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGN0eC5yZXF1ZXN0KG9wdGlvbnMpXG4gICAgICAgIGNvbnN0IGJvZHkgPSBKU09OLnBhcnNlKHJlcylcbiAgICAgICAgaWYgKGJvZHk/LmtleSkge1xuICAgICAgICAgIGRlbGV0ZSBpbWcuYmFzZTY0SW1hZ2VcbiAgICAgICAgICBkZWxldGUgaW1nLmJ1ZmZlclxuICAgICAgICAgIGNvbnN0IGJhc2VVcmwgPSBxaW5pdU9wdGlvbnMudXJsXG4gICAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHFpbml1T3B0aW9ucy5vcHRpb25zXG4gICAgICAgICAgaW1nLmltZ1VybCA9IGAke2Jhc2VVcmx9LyR7Ym9keS5rZXkgYXMgc3RyaW5nfSR7b3B0aW9uc31gXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY3R4LmVtaXQoSUJ1aWxkSW5FdmVudC5OT1RJRklDQVRJT04sIHtcbiAgICAgICAgICAgIHRpdGxlOiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KFwiVVBMT0FEX0ZBSUxFRFwiKSxcbiAgICAgICAgICAgIGJvZHk6IGJvZHkubXNnLFxuICAgICAgICAgIH0pXG4gICAgICAgICAgY3R4LmxvZy5lcnJvcihcInFpbml1IGVycm9yXCIsIGJvZHkpXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVXBsb2FkIGZhaWxlZFwiKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjdHhcbiAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcbiAgICBpZiAoZXJyLm1lc3NhZ2UgIT09IFwiVXBsb2FkIGZhaWxlZFwiKSB7XG4gICAgICAvLyBlcnIucmVzcG9uc2UgbWF5YmUgdW5kZWZpbmVkXG4gICAgICBpZiAoZXJyLnJlc3BvbnNlKSB7XG4gICAgICAgIGNvbnN0IGVycm9yID0gZXJyLnJlc3BvbnNlLmJvZHlcbiAgICAgICAgY3R4LmVtaXQoSUJ1aWxkSW5FdmVudC5OT1RJRklDQVRJT04sIHtcbiAgICAgICAgICB0aXRsZTogY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PihcIlVQTE9BRF9GQUlMRURcIiksXG4gICAgICAgICAgYm9keTogZXJyb3IuZXJyb3IsXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfVxuICAgIHRocm93IGVyclxuICB9XG59XG5cbmNvbnN0IGNvbmZpZyA9IChjdHg6IElQaWNHbyk6IElQbHVnaW5Db25maWdbXSA9PiB7XG4gIGNvbnN0IHVzZXJDb25maWcgPSBjdHguZ2V0Q29uZmlnPElRaW5pdUNvbmZpZz4oXCJwaWNCZWQucWluaXVcIikgfHwge31cbiAgY29uc3QgY29uZmlnOiBJUGx1Z2luQ29uZmlnW10gPSBbXG4gICAge1xuICAgICAgbmFtZTogXCJhY2Nlc3NLZXlcIixcbiAgICAgIHR5cGU6IFwiaW5wdXRcIixcbiAgICAgIGdldCBhbGlhcygpIHtcbiAgICAgICAgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oXCJQSUNCRURfUUlOSVVfQUNDRVNTS0VZXCIpXG4gICAgICB9LFxuICAgICAgZGVmYXVsdDogdXNlckNvbmZpZy5hY2Nlc3NLZXkgfHwgXCJcIixcbiAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogXCJzZWNyZXRLZXlcIixcbiAgICAgIHR5cGU6IFwicGFzc3dvcmRcIixcbiAgICAgIGdldCBhbGlhcygpIHtcbiAgICAgICAgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oXCJQSUNCRURfUUlOSVVfU0VDUkVUS0VZXCIpXG4gICAgICB9LFxuICAgICAgZGVmYXVsdDogdXNlckNvbmZpZy5zZWNyZXRLZXkgfHwgXCJcIixcbiAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogXCJidWNrZXRcIixcbiAgICAgIHR5cGU6IFwiaW5wdXRcIixcbiAgICAgIGdldCBhbGlhcygpIHtcbiAgICAgICAgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oXCJQSUNCRURfUUlOSVVfQlVDS0VUXCIpXG4gICAgICB9LFxuICAgICAgZGVmYXVsdDogdXNlckNvbmZpZy5idWNrZXQgfHwgXCJcIixcbiAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogXCJ1cmxcIixcbiAgICAgIHR5cGU6IFwiaW5wdXRcIixcbiAgICAgIGdldCBwcmVmaXgoKSB7XG4gICAgICAgIHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KFwiUElDQkVEX1FJTklVX1VSTFwiKVxuICAgICAgfSxcbiAgICAgIGdldCBhbGlhcygpIHtcbiAgICAgICAgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oXCJQSUNCRURfUUlOSVVfVVJMXCIpXG4gICAgICB9LFxuICAgICAgZ2V0IG1lc3NhZ2UoKSB7XG4gICAgICAgIHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KFwiUElDQkVEX1FJTklVX01FU1NBR0VfVVJMXCIpXG4gICAgICB9LFxuICAgICAgZGVmYXVsdDogdXNlckNvbmZpZy51cmwgfHwgXCJcIixcbiAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogXCJhcmVhXCIsXG4gICAgICB0eXBlOiBcImlucHV0XCIsXG4gICAgICBnZXQgcHJlZml4KCkge1xuICAgICAgICByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PihcIlBJQ0JFRF9RSU5JVV9BUkVBXCIpXG4gICAgICB9LFxuICAgICAgZ2V0IGFsaWFzKCkge1xuICAgICAgICByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PihcIlBJQ0JFRF9RSU5JVV9BUkVBXCIpXG4gICAgICB9LFxuICAgICAgZ2V0IG1lc3NhZ2UoKSB7XG4gICAgICAgIHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KFwiUElDQkVEX1FJTklVX01FU1NBR0VfQVJFQVwiKVxuICAgICAgfSxcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcuYXJlYSB8fCBcIlwiLFxuICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcIm9wdGlvbnNcIixcbiAgICAgIHR5cGU6IFwiaW5wdXRcIixcbiAgICAgIGdldCBwcmVmaXgoKSB7XG4gICAgICAgIHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KFwiUElDQkVEX1FJTklVX09QVElPTlNcIilcbiAgICAgIH0sXG4gICAgICBnZXQgYWxpYXMoKSB7XG4gICAgICAgIHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KFwiUElDQkVEX1FJTklVX09QVElPTlNcIilcbiAgICAgIH0sXG4gICAgICBnZXQgbWVzc2FnZSgpIHtcbiAgICAgICAgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oXCJQSUNCRURfUUlOSVVfTUVTU0FHRV9PUFRJT05TXCIpXG4gICAgICB9LFxuICAgICAgZGVmYXVsdDogdXNlckNvbmZpZy5vcHRpb25zIHx8IFwiXCIsXG4gICAgICByZXF1aXJlZDogZmFsc2UsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcInBhdGhcIixcbiAgICAgIHR5cGU6IFwiaW5wdXRcIixcbiAgICAgIGdldCBwcmVmaXgoKSB7XG4gICAgICAgIHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KFwiUElDQkVEX1FJTklVX1BBVEhcIilcbiAgICAgIH0sXG4gICAgICBnZXQgYWxpYXMoKSB7XG4gICAgICAgIHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KFwiUElDQkVEX1FJTklVX1BBVEhcIilcbiAgICAgIH0sXG4gICAgICBnZXQgbWVzc2FnZSgpIHtcbiAgICAgICAgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oXCJQSUNCRURfUUlOSVVfTUVTU0FHRV9QQVRIXCIpXG4gICAgICB9LFxuICAgICAgZGVmYXVsdDogdXNlckNvbmZpZy5wYXRoIHx8IFwiXCIsXG4gICAgICByZXF1aXJlZDogZmFsc2UsXG4gICAgfSxcbiAgXVxuICByZXR1cm4gY29uZmlnXG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHJlZ2lzdGVyKGN0eDogSVBpY0dvKTogdm9pZCB7XG4gIGN0eC5oZWxwZXIudXBsb2FkZXIucmVnaXN0ZXIoXCJxaW5pdVwiLCB7XG4gICAgZ2V0IG5hbWUoKSB7XG4gICAgICByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PihcIlBJQ0JFRF9RSU5JVVwiKVxuICAgIH0sXG4gICAgaGFuZGxlLFxuICAgIGNvbmZpZyxcbiAgfSlcbn1cbiIsImltcG9ydCBhcnJheUJ1ZmZlclRvQnVmZmVyIGZyb20gXCJhcnJheWJ1ZmZlci10by1idWZmZXJcIlxuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2V4cGxpY2l0LW1vZHVsZS1ib3VuZGFyeS10eXBlc1xuY29uc3QgcmVhZEJ1ZmZlciA9IChidWY6IGFueSk6IEJ1ZmZlciA9PiB7XG4gIGxldCBpbWFnZUJ1ZmZlciA9IGJ1ZlxuICBpZiAoaW1hZ2VCdWZmZXIgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikge1xuICAgIGltYWdlQnVmZmVyID0gYXJyYXlCdWZmZXJUb0J1ZmZlcihpbWFnZUJ1ZmZlcilcbiAgfVxuICByZXR1cm4gaW1hZ2VCdWZmZXJcbn1cblxuY29uc3Qgc3RyZWFtVXRpbHMgPSB7XG4gIHJlYWRCdWZmZXIsXG59XG5cbmV4cG9ydCBkZWZhdWx0IHN0cmVhbVV0aWxzXG4iLCJpbXBvcnQgeyBJQWxpeXVuQ29uZmlnLCBJT2xkUmVxT3B0aW9uc1dpdGhGdWxsUmVzcG9uc2UsIElQaWNHbywgSVBsdWdpbkNvbmZpZyB9IGZyb20gXCIuLi8uLi90eXBlc1wiXG5pbXBvcnQgY3J5cHRvIGZyb20gXCJjcnlwdG9cIlxuaW1wb3J0IG1pbWUgZnJvbSBcIm1pbWUtdHlwZXNcIlxuaW1wb3J0IHsgSUJ1aWxkSW5FdmVudCB9IGZyb20gXCIuLi8uLi91dGlscy9lbnVtXCJcbmltcG9ydCB7IElMb2NhbGVzS2V5IH0gZnJvbSBcIi4uLy4uL2kxOG4vemgtQ05cIlxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9iYW4tdHMtY29tbWVudFxuLy8gQHRzLWV4cGVjdC1lcnJvclxuaW1wb3J0IE9TUyBmcm9tIFwiYWxpLW9zc1wiXG5pbXBvcnQgeyBSZWFkYWJsZSB9IGZyb20gXCJzdHJlYW1cIlxuaW1wb3J0IHN0cmVhbVV0aWxzIGZyb20gXCIuLi8uLi91dGlscy9zdHJlYW1VdGlsc1wiXG5cbi8vIGdlbmVyYXRlIE9TUyBzaWduYXR1cmVcbmNvbnN0IGdlbmVyYXRlU2lnbmF0dXJlID0gKG9wdGlvbnM6IElBbGl5dW5Db25maWcsIGZpbGVOYW1lOiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICBjb25zdCBkYXRlID0gbmV3IERhdGUoKS50b1VUQ1N0cmluZygpXG4gIGNvbnN0IG1pbWVUeXBlID0gbWltZS5sb29rdXAoZmlsZU5hbWUpXG4gIGlmICghbWltZVR5cGUpIHRocm93IEVycm9yKGBObyBtaW1lIHR5cGUgZm91bmQgZm9yIGZpbGUgJHtmaWxlTmFtZX1gKVxuXG4gIGNvbnN0IHNpZ25TdHJpbmcgPSBgUFVUXFxuXFxuJHttaW1lVHlwZX1cXG4ke2RhdGV9XFxuLyR7b3B0aW9ucy5idWNrZXR9LyR7b3B0aW9ucy5wYXRofSR7ZmlsZU5hbWV9YFxuXG4gIGNvbnN0IHNpZ25hdHVyZSA9IGNyeXB0by5jcmVhdGVIbWFjKFwic2hhMVwiLCBvcHRpb25zLmFjY2Vzc0tleVNlY3JldCkudXBkYXRlKHNpZ25TdHJpbmcpLmRpZ2VzdChcImJhc2U2NFwiKVxuICByZXR1cm4gYE9TUyAke29wdGlvbnMuYWNjZXNzS2V5SWR9OiR7c2lnbmF0dXJlfWBcbn1cblxuY29uc3QgcG9zdE9wdGlvbnMgPSAoXG4gIG9wdGlvbnM6IElBbGl5dW5Db25maWcsXG4gIGZpbGVOYW1lOiBzdHJpbmcsXG4gIHNpZ25hdHVyZTogc3RyaW5nLFxuICBpbWFnZTogQnVmZmVyXG4pOiBJT2xkUmVxT3B0aW9uc1dpdGhGdWxsUmVzcG9uc2UgPT4ge1xuICByZXR1cm4ge1xuICAgIG1ldGhvZDogXCJQVVRcIixcbiAgICB1cmw6IGBodHRwczovLyR7b3B0aW9ucy5idWNrZXR9LiR7b3B0aW9ucy5hcmVhfS5hbGl5dW5jcy5jb20vJHtlbmNvZGVVUkkob3B0aW9ucy5wYXRoKX0ke2VuY29kZVVSSShmaWxlTmFtZSl9YCxcbiAgICBoZWFkZXJzOiB7XG4gICAgICBIb3N0OiBgJHtvcHRpb25zLmJ1Y2tldH0uJHtvcHRpb25zLmFyZWF9LmFsaXl1bmNzLmNvbWAsXG4gICAgICBBdXRob3JpemF0aW9uOiBzaWduYXR1cmUsXG4gICAgICBEYXRlOiBuZXcgRGF0ZSgpLnRvVVRDU3RyaW5nKCksXG4gICAgICBcIkNvbnRlbnQtVHlwZVwiOiBtaW1lLmxvb2t1cChmaWxlTmFtZSksXG4gICAgfSxcbiAgICBib2R5OiBpbWFnZSxcbiAgICByZXNvbHZlV2l0aEZ1bGxSZXNwb25zZTogdHJ1ZSxcbiAgfVxufVxuXG5jb25zdCBoYW5kbGVSZXN0ID0gYXN5bmMgKGN0eDogSVBpY0dvKTogUHJvbWlzZTxJUGljR28+ID0+IHtcbiAgY29uc3QgYWxpWXVuT3B0aW9ucyA9IGN0eC5nZXRDb25maWc8SUFsaXl1bkNvbmZpZz4oXCJwaWNCZWQuYWxpeXVuXCIpXG4gIGlmICghYWxpWXVuT3B0aW9ucykge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkNhbid0IGZpbmQgYWxpWXVuIE9TUyBjb25maWdcIilcbiAgfVxuICB0cnkge1xuICAgIGNvbnN0IGltZ0xpc3QgPSBjdHgub3V0cHV0XG4gICAgY29uc3QgY3VzdG9tVXJsID0gYWxpWXVuT3B0aW9ucy5jdXN0b21VcmxcbiAgICBjb25zdCBwYXRoID0gYWxpWXVuT3B0aW9ucy5wYXRoXG4gICAgZm9yIChjb25zdCBpbWcgb2YgaW1nTGlzdCkge1xuICAgICAgaWYgKGltZy5maWxlTmFtZSAmJiBpbWcuYnVmZmVyKSB7XG4gICAgICAgIGNvbnN0IHNpZ25hdHVyZSA9IGdlbmVyYXRlU2lnbmF0dXJlKGFsaVl1bk9wdGlvbnMsIGltZy5maWxlTmFtZSlcbiAgICAgICAgbGV0IGltYWdlID0gaW1nLmJ1ZmZlclxuICAgICAgICBpZiAoIWltYWdlICYmIGltZy5iYXNlNjRJbWFnZSkge1xuICAgICAgICAgIGltYWdlID0gQnVmZmVyLmZyb20oaW1nLmJhc2U2NEltYWdlLCBcImJhc2U2NFwiKVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSBwb3N0T3B0aW9ucyhhbGlZdW5PcHRpb25zLCBpbWcuZmlsZU5hbWUsIHNpZ25hdHVyZSwgaW1hZ2UpXG4gICAgICAgIGNvbnN0IGJvZHkgPSBhd2FpdCBjdHgucmVxdWVzdChvcHRpb25zKVxuICAgICAgICBpZiAoYm9keS5zdGF0dXNDb2RlID09PSAyMDApIHtcbiAgICAgICAgICBkZWxldGUgaW1nLmJhc2U2NEltYWdlXG4gICAgICAgICAgZGVsZXRlIGltZy5idWZmZXJcbiAgICAgICAgICBjb25zdCBvcHRpb25VcmwgPSBhbGlZdW5PcHRpb25zLm9wdGlvbnMgfHwgXCJcIlxuICAgICAgICAgIGlmIChjdXN0b21VcmwpIHtcbiAgICAgICAgICAgIGltZy5pbWdVcmwgPSBgJHtjdXN0b21Vcmx9LyR7cGF0aH0ke2ltZy5maWxlTmFtZX0ke29wdGlvblVybH1gXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGltZy5pbWdVcmwgPSBgaHR0cHM6Ly8ke2FsaVl1bk9wdGlvbnMuYnVja2V0fS4ke2FsaVl1bk9wdGlvbnMuYXJlYX0uYWxpeXVuY3MuY29tLyR7cGF0aH0ke2ltZy5maWxlTmFtZX0ke29wdGlvblVybH1gXG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVwbG9hZCBmYWlsZWRcIilcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY3R4XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGN0eC5lbWl0KElCdWlsZEluRXZlbnQuTk9USUZJQ0FUSU9OLCB7XG4gICAgICB0aXRsZTogY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PihcIlVQTE9BRF9GQUlMRURcIiksXG4gICAgICBib2R5OiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KFwiQ0hFQ0tfU0VUVElOR1NcIiksXG4gICAgfSlcbiAgICB0aHJvdyBlcnJcbiAgfVxufVxuXG5jb25zdCBoYW5kbGUgPSBhc3luYyAoY3R4OiBJUGljR28pOiBQcm9taXNlPElQaWNHbz4gPT4ge1xuICBpZiAoIWN0eCkge1xuICAgIGF3YWl0IGhhbmRsZVJlc3QoY3R4KVxuICB9XG5cbiAgY29uc29sZS53YXJuKFxuICAgIFwiVXNpbmcgc3RyZWFtIG1vZGUgZm9yIGFsaXl1biB1cGxvYWQsIGFkZGVkIGJ5IHRlcndlciwgc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS90ZXJ3ZXIvRWxlY3Ryb24tUGljR28tQ29yZS9ibG9iL2Rldi9zcmMvcGx1Z2lucy91cGxvYWRlci9hbGl5dW4udHMjTDc2XCJcbiAgKVxuICBjb25zdCBhbGlZdW5PcHRpb25zID0gY3R4LmdldENvbmZpZzxJQWxpeXVuQ29uZmlnPihcInBpY0JlZC5hbGl5dW5cIilcbiAgaWYgKCFhbGlZdW5PcHRpb25zKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQ2FuJ3QgZmluZCBhbGlZdW4gT1NTIGNvbmZpZ1wiKVxuICB9XG4gIHRyeSB7XG4gICAgY29uc3Qgc3RvcmUgPSBuZXcgT1NTKHtcbiAgICAgIHJlZ2lvbjogYWxpWXVuT3B0aW9ucy5hcmVhLFxuICAgICAgYWNjZXNzS2V5SWQ6IGFsaVl1bk9wdGlvbnMuYWNjZXNzS2V5SWQsXG4gICAgICBhY2Nlc3NLZXlTZWNyZXQ6IGFsaVl1bk9wdGlvbnMuYWNjZXNzS2V5U2VjcmV0LFxuICAgICAgYnVja2V0OiBhbGlZdW5PcHRpb25zLmJ1Y2tldCxcbiAgICB9KVxuXG4gICAgY29uc3QgaW1nTGlzdCA9IGN0eC5vdXRwdXRcbiAgICBjb25zdCBjdXN0b21VcmwgPSBhbGlZdW5PcHRpb25zLmN1c3RvbVVybFxuICAgIGNvbnN0IHBhdGggPSBhbGlZdW5PcHRpb25zLnBhdGhcblxuICAgIGZvciAoY29uc3QgaW1nIG9mIGltZ0xpc3QpIHtcbiAgICAgIGlmIChpbWcuZmlsZU5hbWUgJiYgaW1nLmJ1ZmZlcikge1xuICAgICAgICBsZXQgaW1hZ2UgPSBzdHJlYW1VdGlscy5yZWFkQnVmZmVyKGltZy5idWZmZXIpXG4gICAgICAgIGlmICghaW1hZ2UgJiYgaW1nLmJhc2U2NEltYWdlKSB7XG4gICAgICAgICAgaW1hZ2UgPSBCdWZmZXIuZnJvbShpbWcuYmFzZTY0SW1hZ2UsIFwiYmFzZTY0XCIpXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBvcHRpb25VcmwgPSBhbGlZdW5PcHRpb25zLm9wdGlvbnMgfHwgXCJcIlxuICAgICAgICBjb25zdCByZW1vdGVQYXRoID0gYCR7cGF0aH0ke2ltZy5maWxlTmFtZX0ke29wdGlvblVybH1gXG4gICAgICAgIGNvbnN0IHN0cmVhbSA9IFJlYWRhYmxlLmZyb20oaW1hZ2UpXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKCdCZWZvcmUgdXBsb2FkLHJlbW90ZVBhdGg9PicsIHJlbW90ZVBhdGgpXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKCdCZWZvcmUgdXBsb2FkLHN0cmVhbT0+Jywgc3RyZWFtKVxuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHN0b3JlLnB1dFN0cmVhbShyZW1vdGVQYXRoLCBzdHJlYW0pXG4gICAgICAgIGNvbnNvbGUubG9nKFwiVXNpbmcgYWxpeXVuIFNESyBmb3IgdXBsb2FkIGFkZCBieSB0ZXJ3ZXIsIHJlc3VsdD0+XCIsIHJlc3VsdClcblxuICAgICAgICBpZiAocmVzdWx0Py5yZXM/LnN0YXR1cyAmJiByZXN1bHQucmVzLnN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICAgICAgZGVsZXRlIGltZy5iYXNlNjRJbWFnZVxuICAgICAgICAgIGRlbGV0ZSBpbWcuYnVmZmVyXG4gICAgICAgICAgaWYgKGN1c3RvbVVybCkge1xuICAgICAgICAgICAgaW1nLmltZ1VybCA9IGAke2N1c3RvbVVybH0vJHtwYXRofSR7aW1nLmZpbGVOYW1lfSR7b3B0aW9uVXJsfWBcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaW1nLmltZ1VybCA9IGBodHRwczovLyR7YWxpWXVuT3B0aW9ucy5idWNrZXR9LiR7YWxpWXVuT3B0aW9ucy5hcmVhfS5hbGl5dW5jcy5jb20vJHtwYXRofSR7aW1nLmZpbGVOYW1lfSR7b3B0aW9uVXJsfWBcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVXBsb2FkIGZhaWxlZFwiKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjdHhcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgY3R4LmVtaXQoSUJ1aWxkSW5FdmVudC5OT1RJRklDQVRJT04sIHtcbiAgICAgIHRpdGxlOiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KFwiVVBMT0FEX0ZBSUxFRFwiKSxcbiAgICAgIGJvZHk6IGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oXCJDSEVDS19TRVRUSU5HU1wiKSxcbiAgICB9KVxuICAgIHRocm93IGVyclxuICB9XG59XG5cbmNvbnN0IGNvbmZpZyA9IChjdHg6IElQaWNHbyk6IElQbHVnaW5Db25maWdbXSA9PiB7XG4gIGNvbnN0IHVzZXJDb25maWcgPSBjdHguZ2V0Q29uZmlnPElBbGl5dW5Db25maWc+KFwicGljQmVkLmFsaXl1blwiKSB8fCB7fVxuICBjb25zdCBjb25maWc6IElQbHVnaW5Db25maWdbXSA9IFtcbiAgICB7XG4gICAgICBuYW1lOiBcImFjY2Vzc0tleUlkXCIsXG4gICAgICB0eXBlOiBcImlucHV0XCIsXG4gICAgICBnZXQgYWxpYXMoKSB7XG4gICAgICAgIHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KFwiUElDQkVEX0FMSUNMT1VEX0FDQ0VTU0tFWUlEXCIpXG4gICAgICB9LFxuICAgICAgZGVmYXVsdDogdXNlckNvbmZpZy5hY2Nlc3NLZXlJZCB8fCBcIlwiLFxuICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcImFjY2Vzc0tleVNlY3JldFwiLFxuICAgICAgdHlwZTogXCJwYXNzd29yZFwiLFxuICAgICAgZ2V0IGFsaWFzKCkge1xuICAgICAgICByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PihcIlBJQ0JFRF9BTElDTE9VRF9BQ0NFU1NLRVlTRUNSRVRcIilcbiAgICAgIH0sXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLmFjY2Vzc0tleVNlY3JldCB8fCBcIlwiLFxuICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcImJ1Y2tldFwiLFxuICAgICAgdHlwZTogXCJpbnB1dFwiLFxuICAgICAgZ2V0IGFsaWFzKCkge1xuICAgICAgICByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PihcIlBJQ0JFRF9BTElDTE9VRF9CVUNLRVRcIilcbiAgICAgIH0sXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLmJ1Y2tldCB8fCBcIlwiLFxuICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcImFyZWFcIixcbiAgICAgIHR5cGU6IFwiaW5wdXRcIixcbiAgICAgIGdldCBwcmVmaXgoKSB7XG4gICAgICAgIHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KFwiUElDQkVEX0FMSUNMT1VEX0FSRUFcIilcbiAgICAgIH0sXG4gICAgICBnZXQgYWxpYXMoKSB7XG4gICAgICAgIHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KFwiUElDQkVEX0FMSUNMT1VEX0FSRUFcIilcbiAgICAgIH0sXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLmFyZWEgfHwgXCJcIixcbiAgICAgIGdldCBtZXNzYWdlKCkge1xuICAgICAgICByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PihcIlBJQ0JFRF9BTElDTE9VRF9NRVNTQUdFX0FSRUFcIilcbiAgICAgIH0sXG4gICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFwicGF0aFwiLFxuICAgICAgdHlwZTogXCJpbnB1dFwiLFxuICAgICAgZ2V0IHByZWZpeCgpIHtcbiAgICAgICAgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oXCJQSUNCRURfQUxJQ0xPVURfUEFUSFwiKVxuICAgICAgfSxcbiAgICAgIGdldCBhbGlhcygpIHtcbiAgICAgICAgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oXCJQSUNCRURfQUxJQ0xPVURfUEFUSFwiKVxuICAgICAgfSxcbiAgICAgIGdldCBtZXNzYWdlKCkge1xuICAgICAgICByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PihcIlBJQ0JFRF9BTElDTE9VRF9NRVNTQUdFX1BBVEhcIilcbiAgICAgIH0sXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLnBhdGggfHwgXCJcIixcbiAgICAgIHJlcXVpcmVkOiBmYWxzZSxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFwiY3VzdG9tVXJsXCIsXG4gICAgICB0eXBlOiBcImlucHV0XCIsXG4gICAgICBnZXQgcHJlZml4KCkge1xuICAgICAgICByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PihcIlBJQ0JFRF9BTElDTE9VRF9DVVNUT01VUkxcIilcbiAgICAgIH0sXG4gICAgICBnZXQgYWxpYXMoKSB7XG4gICAgICAgIHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KFwiUElDQkVEX0FMSUNMT1VEX0NVU1RPTVVSTFwiKVxuICAgICAgfSxcbiAgICAgIGdldCBtZXNzYWdlKCkge1xuICAgICAgICByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PihcIlBJQ0JFRF9BTElDTE9VRF9NRVNTQUdFX0NVU1RPTVVSTFwiKVxuICAgICAgfSxcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcuY3VzdG9tVXJsIHx8IFwiXCIsXG4gICAgICByZXF1aXJlZDogZmFsc2UsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcIm9wdGlvbnNcIixcbiAgICAgIHR5cGU6IFwiaW5wdXRcIixcbiAgICAgIGdldCBwcmVmaXgoKSB7XG4gICAgICAgIHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KFwiUElDQkVEX0FMSUNMT1VEX09QVElPTlNcIilcbiAgICAgIH0sXG4gICAgICBnZXQgYWxpYXMoKSB7XG4gICAgICAgIHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KFwiUElDQkVEX0FMSUNMT1VEX09QVElPTlNcIilcbiAgICAgIH0sXG4gICAgICBnZXQgbWVzc2FnZSgpIHtcbiAgICAgICAgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oXCJQSUNCRURfQUxJQ0xPVURfTUVTU0FHRV9PUFRJT05TXCIpXG4gICAgICB9LFxuICAgICAgZGVmYXVsdDogdXNlckNvbmZpZy5vcHRpb25zIHx8IFwiXCIsXG4gICAgICByZXF1aXJlZDogZmFsc2UsXG4gICAgfSxcbiAgXVxuICByZXR1cm4gY29uZmlnXG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHJlZ2lzdGVyKGN0eDogSVBpY0dvKTogdm9pZCB7XG4gIGN0eC5oZWxwZXIudXBsb2FkZXIucmVnaXN0ZXIoXCJhbGl5dW5cIiwge1xuICAgIGdldCBuYW1lKCkge1xuICAgICAgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oXCJQSUNCRURfQUxJQ0xPVURcIilcbiAgICB9LFxuICAgIGhhbmRsZSxcbiAgICBjb25maWcsXG4gIH0pXG59XG4iLCJpbXBvcnQgeyBJT2xkUmVxT3B0aW9uc1dpdGhGdWxsUmVzcG9uc2UsIElQaWNHbywgSVBsdWdpbkNvbmZpZywgSVVweXVuQ29uZmlnIH0gZnJvbSBcIi4uLy4uL3R5cGVzXCJcbmltcG9ydCBjcnlwdG8gZnJvbSBcImNyeXB0b1wiXG5pbXBvcnQgTUQ1IGZyb20gXCJtZDVcIlxuaW1wb3J0IHsgSUJ1aWxkSW5FdmVudCB9IGZyb20gXCIuLi8uLi91dGlscy9lbnVtXCJcbmltcG9ydCB7IElMb2NhbGVzS2V5IH0gZnJvbSBcIi4uLy4uL2kxOG4vemgtQ05cIlxuaW1wb3J0IHsgc2FmZVBhcnNlIH0gZnJvbSBcIi4uLy4uL3V0aWxzL2NvbW1vblwiXG5pbXBvcnQgbWltZSBmcm9tIFwibWltZS10eXBlc1wiXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10cy1jb21tZW50XG4vLyBAdHMtZXhwZWN0LWVycm9yXG5pbXBvcnQgdXB5dW4gZnJvbSBcInVweXVuXCJcbmltcG9ydCB7IFJlYWRhYmxlIH0gZnJvbSBcInN0cmVhbVwiXG5pbXBvcnQgc3RyZWFtVXRpbHMgZnJvbSBcIi4uLy4uL3V0aWxzL3N0cmVhbVV0aWxzXCJcblxuLy8gZ2VuZXJhdGUgQ09TIHNpZ25hdHVyZSBzdHJpbmdcbmNvbnN0IGdlbmVyYXRlU2lnbmF0dXJlID0gKG9wdGlvbnM6IElVcHl1bkNvbmZpZywgZmlsZU5hbWU6IHN0cmluZyk6IHN0cmluZyA9PiB7XG4gIGNvbnN0IHBhdGggPSBvcHRpb25zLnBhdGggfHwgXCJcIlxuICBjb25zdCBvcGVyYXRvciA9IG9wdGlvbnMub3BlcmF0b3JcbiAgY29uc3QgcGFzc3dvcmQgPSBvcHRpb25zLnBhc3N3b3JkXG4gIGNvbnN0IG1kNVBhc3N3b3JkID0gTUQ1KHBhc3N3b3JkKVxuICBjb25zdCBkYXRlID0gbmV3IERhdGUoKS50b1VUQ1N0cmluZygpXG4gIGNvbnN0IHVyaSA9IGAvJHtvcHRpb25zLmJ1Y2tldH0vJHtlbmNvZGVVUkkocGF0aCl9JHtlbmNvZGVVUkkoZmlsZU5hbWUpfWBcbiAgY29uc3QgdmFsdWUgPSBgUFVUJiR7dXJpfSYke2RhdGV9YFxuICBjb25zdCBzaWduID0gY3J5cHRvLmNyZWF0ZUhtYWMoXCJzaGExXCIsIG1kNVBhc3N3b3JkKS51cGRhdGUodmFsdWUpLmRpZ2VzdChcImJhc2U2NFwiKVxuICByZXR1cm4gYFVQWVVOICR7b3BlcmF0b3J9OiR7c2lnbn1gXG59XG5cbmNvbnN0IHBvc3RPcHRpb25zID0gKFxuICBvcHRpb25zOiBJVXB5dW5Db25maWcsXG4gIGZpbGVOYW1lOiBzdHJpbmcsXG4gIHNpZ25hdHVyZTogc3RyaW5nLFxuICBpbWFnZTogQnVmZmVyXG4pOiBJT2xkUmVxT3B0aW9uc1dpdGhGdWxsUmVzcG9uc2UgPT4ge1xuICBjb25zdCBidWNrZXQgPSBvcHRpb25zLmJ1Y2tldFxuICBjb25zdCBwYXRoID0gb3B0aW9ucy5wYXRoIHx8IFwiXCJcbiAgcmV0dXJuIHtcbiAgICBtZXRob2Q6IFwiUFVUXCIsXG4gICAgdXJsOiBgaHR0cHM6Ly92MC5hcGkudXB5dW4uY29tLyR7YnVja2V0fS8ke2VuY29kZVVSSShwYXRoKX0ke2VuY29kZVVSSShmaWxlTmFtZSl9YCxcbiAgICBoZWFkZXJzOiB7XG4gICAgICBBdXRob3JpemF0aW9uOiBzaWduYXR1cmUsXG4gICAgICBEYXRlOiBuZXcgRGF0ZSgpLnRvVVRDU3RyaW5nKCksXG4gICAgICBcIkNvbnRlbnQtVHlwZVwiOiBtaW1lLmxvb2t1cChmaWxlTmFtZSkgfHwgXCJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW1cIixcbiAgICB9LFxuICAgIGJvZHk6IGltYWdlLFxuICAgIHJlc29sdmVXaXRoRnVsbFJlc3BvbnNlOiB0cnVlLFxuICB9XG59XG5cbmNvbnN0IGhhbmRsZVJlc3QgPSBhc3luYyAoY3R4OiBJUGljR28pOiBQcm9taXNlPElQaWNHbz4gPT4ge1xuICBjb25zdCB1cHl1bk9wdGlvbnMgPSBjdHguZ2V0Q29uZmlnPElVcHl1bkNvbmZpZz4oXCJwaWNCZWQudXB5dW5cIilcbiAgaWYgKCF1cHl1bk9wdGlvbnMpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW4ndCBmaW5kIHVwWXVuIGNvbmZpZ1wiKVxuICB9XG4gIHRyeSB7XG4gICAgY29uc3QgaW1nTGlzdCA9IGN0eC5vdXRwdXRcbiAgICBjb25zdCBwYXRoID0gdXB5dW5PcHRpb25zLnBhdGggfHwgXCJcIlxuICAgIGZvciAoY29uc3QgaW1nIG9mIGltZ0xpc3QpIHtcbiAgICAgIGlmIChpbWcuZmlsZU5hbWUgJiYgaW1nLmJ1ZmZlcikge1xuICAgICAgICBsZXQgaW1hZ2UgPSBpbWcuYnVmZmVyXG4gICAgICAgIGlmICghaW1hZ2UgJiYgaW1nLmJhc2U2NEltYWdlKSB7XG4gICAgICAgICAgaW1hZ2UgPSBCdWZmZXIuZnJvbShpbWcuYmFzZTY0SW1hZ2UsIFwiYmFzZTY0XCIpXG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc2lnbmF0dXJlID0gZ2VuZXJhdGVTaWduYXR1cmUodXB5dW5PcHRpb25zLCBpbWcuZmlsZU5hbWUpXG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSBwb3N0T3B0aW9ucyh1cHl1bk9wdGlvbnMsIGltZy5maWxlTmFtZSwgc2lnbmF0dXJlLCBpbWFnZSlcbiAgICAgICAgY29uc3QgYm9keSA9IGF3YWl0IGN0eC5yZXF1ZXN0KG9wdGlvbnMpXG4gICAgICAgIGlmIChib2R5LnN0YXR1c0NvZGUgPT09IDIwMCkge1xuICAgICAgICAgIGRlbGV0ZSBpbWcuYmFzZTY0SW1hZ2VcbiAgICAgICAgICBkZWxldGUgaW1nLmJ1ZmZlclxuICAgICAgICAgIGltZy5pbWdVcmwgPSBgJHt1cHl1bk9wdGlvbnMudXJsfS8ke3BhdGh9JHtpbWcuZmlsZU5hbWV9JHt1cHl1bk9wdGlvbnMub3B0aW9uc31gXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVXBsb2FkIGZhaWxlZFwiKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjdHhcbiAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcbiAgICBpZiAoZXJyLm1lc3NhZ2UgPT09IFwiVXBsb2FkIGZhaWxlZFwiKSB7XG4gICAgICBjdHguZW1pdChJQnVpbGRJbkV2ZW50Lk5PVElGSUNBVElPTiwge1xuICAgICAgICB0aXRsZTogY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PihcIlVQTE9BRF9GQUlMRURcIiksXG4gICAgICAgIGJvZHk6IGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oXCJDSEVDS19TRVRUSU5HU1wiKSxcbiAgICAgIH0pXG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGJvZHkgPSBzYWZlUGFyc2U8eyBjb2RlOiBzdHJpbmcgfT4oZXJyLmVycm9yKVxuICAgICAgY3R4LmVtaXQoSUJ1aWxkSW5FdmVudC5OT1RJRklDQVRJT04sIHtcbiAgICAgICAgdGl0bGU6IGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oXCJVUExPQURfRkFJTEVEXCIpLFxuICAgICAgICBib2R5OiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KFwiVVBMT0FEX0ZBSUxFRF9SRUFTT05cIiwge1xuICAgICAgICAgIGNvZGU6IHR5cGVvZiBib2R5ID09PSBcIm9iamVjdFwiID8gYm9keS5jb2RlIDogYm9keSxcbiAgICAgICAgfSksXG4gICAgICAgIHRleHQ6IFwiaHR0cDovL2RvY3MudXB5dW4uY29tL2FwaS9lcnJuby9cIixcbiAgICAgIH0pXG4gICAgfVxuICAgIHRocm93IGVyclxuICB9XG59XG5cbmNvbnN0IGhhbmRsZSA9IGFzeW5jIChjdHg6IElQaWNHbyk6IFByb21pc2U8SVBpY0dvPiA9PiB7XG4gIGlmICghY3R4KSB7XG4gICAgYXdhaXQgaGFuZGxlUmVzdChjdHgpXG4gIH1cblxuICBjb25zb2xlLndhcm4oXG4gICAgXCJVc2luZyBzdHJlYW0gbW9kZSBmb3IgdXB5dW4gdXBsb2FkLCBhZGRlZCBieSB0ZXJ3ZXIsIHNlZSBodHRwczovL2dpdGh1Yi5jb20vdGVyd2VyL0VsZWN0cm9uLVBpY0dvLUNvcmUvYmxvYi9kZXYvc3JjL3BsdWdpbnMvdXBsb2FkZXIvdXB5dW4udHMjTDg4XCJcbiAgKVxuICBjb25zdCB1cHl1bk9wdGlvbnMgPSBjdHguZ2V0Q29uZmlnPElVcHl1bkNvbmZpZz4oXCJwaWNCZWQudXB5dW5cIilcbiAgaWYgKCF1cHl1bk9wdGlvbnMpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW4ndCBmaW5kIHVwWXVuIGNvbmZpZ1wiKVxuICB9XG4gIHRyeSB7XG4gICAgY29uc3Qgc2VydmljZU5hbWUgPSB1cHl1bk9wdGlvbnMuYnVja2V0XG4gICAgY29uc3Qgb3BlcmF0b3JOYW1lID0gdXB5dW5PcHRpb25zLm9wZXJhdG9yXG4gICAgY29uc3Qgb3BlcmF0b3JQYXNzd29yZCA9IHVweXVuT3B0aW9ucy5wYXNzd29yZFxuXG4gICAgLy8gY29uc29sZS5sb2coJ0JlZm9yZSB1cGxvYWQsc2VydmljZU5hbWU9PicsIHNlcnZpY2VOYW1lKVxuICAgIC8vIGNvbnNvbGUubG9nKCdCZWZvcmUgdXBsb2FkLG9wZXJhdG9yTmFtZT0+Jywgb3BlcmF0b3JOYW1lKVxuICAgIC8vIGNvbnNvbGUubG9nKCdCZWZvcmUgdXBsb2FkLG9wZXJhdG9yUGFzc3dvcmQ9PicsIG9wZXJhdG9yUGFzc3dvcmQpXG4gICAgY29uc3Qgc2VydmljZSA9IG5ldyB1cHl1bi5TZXJ2aWNlKHNlcnZpY2VOYW1lLCBvcGVyYXRvck5hbWUsIG9wZXJhdG9yUGFzc3dvcmQpXG4gICAgY29uc3QgY2xpZW50ID0gbmV3IHVweXVuLkNsaWVudChzZXJ2aWNlKVxuXG4gICAgY29uc3QgaW1nTGlzdCA9IGN0eC5vdXRwdXRcbiAgICBmb3IgKGNvbnN0IGltZyBvZiBpbWdMaXN0KSB7XG4gICAgICBpZiAoaW1nLmZpbGVOYW1lICYmIGltZy5idWZmZXIpIHtcbiAgICAgICAgbGV0IGltYWdlID0gc3RyZWFtVXRpbHMucmVhZEJ1ZmZlcihpbWcuYnVmZmVyKVxuICAgICAgICBpZiAoIWltYWdlICYmIGltZy5iYXNlNjRJbWFnZSkge1xuICAgICAgICAgIGltYWdlID0gQnVmZmVyLmZyb20oaW1nLmJhc2U2NEltYWdlLCBcImJhc2U2NFwiKVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcGF0aCA9IHVweXVuT3B0aW9ucy5wYXRoIHx8IFwiXCJcbiAgICAgICAgY29uc3QgcmVtb3RlUGF0aCA9IGAke3BhdGh9JHtpbWcuZmlsZU5hbWV9JHt1cHl1bk9wdGlvbnMub3B0aW9uc31gXG4gICAgICAgIGNvbnN0IHN0cmVhbSA9IFJlYWRhYmxlLmZyb20oaW1hZ2UpXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKCdCZWZvcmUgdXBsb2FkLHJlbW90ZVBhdGg9PicsIHJlbW90ZVBhdGgpXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKCdCZWZvcmUgdXBsb2FkLHN0cmVhbT0+Jywgc3RyZWFtKVxuXG4gICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGNsaWVudC5wdXRGaWxlKHJlbW90ZVBhdGgsIHN0cmVhbSlcbiAgICAgICAgY29uc29sZS5sb2coXCJVc2luZyB1cHl1biBTREsgZm9yIHVwbG9hZCBhZGQgYnkgdGVyd2VyLCByZXM9PlwiLCByZXMpXG5cbiAgICAgICAgaWYgKHJlcykge1xuICAgICAgICAgIGRlbGV0ZSBpbWcuYmFzZTY0SW1hZ2VcbiAgICAgICAgICBkZWxldGUgaW1nLmJ1ZmZlclxuICAgICAgICAgIGltZy5pbWdVcmwgPSBgJHt1cHl1bk9wdGlvbnMudXJsfS8ke3BhdGh9JHtpbWcuZmlsZU5hbWV9JHt1cHl1bk9wdGlvbnMub3B0aW9uc31gXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVXBsb2FkIGZhaWxlZFwiKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGN0eFxuICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgIGlmIChlcnIubWVzc2FnZSA9PT0gXCJVcGxvYWQgZmFpbGVkXCIpIHtcbiAgICAgIGN0eC5lbWl0KElCdWlsZEluRXZlbnQuTk9USUZJQ0FUSU9OLCB7XG4gICAgICAgIHRpdGxlOiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KFwiVVBMT0FEX0ZBSUxFRFwiKSxcbiAgICAgICAgYm9keTogY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PihcIkNIRUNLX1NFVFRJTkdTXCIpLFxuICAgICAgfSlcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgYm9keSA9IHNhZmVQYXJzZTx7IGNvZGU6IHN0cmluZyB9PihlcnIuZXJyb3IpXG4gICAgICBjdHguZW1pdChJQnVpbGRJbkV2ZW50Lk5PVElGSUNBVElPTiwge1xuICAgICAgICB0aXRsZTogY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PihcIlVQTE9BRF9GQUlMRURcIiksXG4gICAgICAgIGJvZHk6IGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oXCJVUExPQURfRkFJTEVEX1JFQVNPTlwiLCB7XG4gICAgICAgICAgY29kZTogdHlwZW9mIGJvZHkgPT09IFwib2JqZWN0XCIgPyBib2R5LmNvZGUgOiBib2R5LFxuICAgICAgICB9KSxcbiAgICAgICAgdGV4dDogXCJodHRwOi8vZG9jcy51cHl1bi5jb20vYXBpL2Vycm5vL1wiLFxuICAgICAgfSlcbiAgICB9XG4gICAgdGhyb3cgZXJyXG4gIH1cbn1cblxuY29uc3QgY29uZmlnID0gKGN0eDogSVBpY0dvKTogSVBsdWdpbkNvbmZpZ1tdID0+IHtcbiAgY29uc3QgdXNlckNvbmZpZyA9IGN0eC5nZXRDb25maWc8SVVweXVuQ29uZmlnPihcInBpY0JlZC51cHl1blwiKSB8fCB7fVxuICBjb25zdCBjb25maWc6IElQbHVnaW5Db25maWdbXSA9IFtcbiAgICB7XG4gICAgICBuYW1lOiBcImJ1Y2tldFwiLFxuICAgICAgdHlwZTogXCJpbnB1dFwiLFxuICAgICAgZ2V0IGFsaWFzKCkge1xuICAgICAgICByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PihcIlBJQ0JFRF9VUFlVTl9CVUNLRVRcIilcbiAgICAgIH0sXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLmJ1Y2tldCB8fCBcIlwiLFxuICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcIm9wZXJhdG9yXCIsXG4gICAgICB0eXBlOiBcImlucHV0XCIsXG4gICAgICBnZXQgYWxpYXMoKSB7XG4gICAgICAgIHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KFwiUElDQkVEX1VQWVVOX09QRVJBVE9SXCIpXG4gICAgICB9LFxuICAgICAgZ2V0IHByZWZpeCgpIHtcbiAgICAgICAgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oXCJQSUNCRURfVVBZVU5fT1BFUkFUT1JcIilcbiAgICAgIH0sXG4gICAgICBnZXQgbWVzc2FnZSgpIHtcbiAgICAgICAgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oXCJQSUNCRURfVVBZVU5fTUVTU0FHRV9PUEVSQVRPUlwiKVxuICAgICAgfSxcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcub3BlcmF0b3IgfHwgXCJcIixcbiAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogXCJwYXNzd29yZFwiLFxuICAgICAgdHlwZTogXCJwYXNzd29yZFwiLFxuICAgICAgZ2V0IHByZWZpeCgpIHtcbiAgICAgICAgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oXCJQSUNCRURfVVBZVU5fTUVTU0FHRV9QQVNTV09SRFwiKVxuICAgICAgfSxcbiAgICAgIGdldCBhbGlhcygpIHtcbiAgICAgICAgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oXCJQSUNCRURfVVBZVU5fUEFTU1dPUkRcIilcbiAgICAgIH0sXG4gICAgICBnZXQgbWVzc2FnZSgpIHtcbiAgICAgICAgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oXCJQSUNCRURfVVBZVU5fTUVTU0FHRV9QQVNTV09SRFwiKVxuICAgICAgfSxcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcucGFzc3dvcmQgfHwgXCJcIixcbiAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogXCJ1cmxcIixcbiAgICAgIHR5cGU6IFwiaW5wdXRcIixcbiAgICAgIGdldCBhbGlhcygpIHtcbiAgICAgICAgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oXCJQSUNCRURfVVBZVU5fVVJMXCIpXG4gICAgICB9LFxuICAgICAgZ2V0IG1lc3NhZ2UoKSB7XG4gICAgICAgIHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KFwiUElDQkVEX1VQWVVOX01FU1NBR0VfVVJMXCIpXG4gICAgICB9LFxuICAgICAgZGVmYXVsdDogdXNlckNvbmZpZy51cmwgfHwgXCJcIixcbiAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogXCJvcHRpb25zXCIsXG4gICAgICB0eXBlOiBcImlucHV0XCIsXG4gICAgICBnZXQgcHJlZml4KCkge1xuICAgICAgICByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PihcIlBJQ0JFRF9VUFlVTl9PUFRJT05TXCIpXG4gICAgICB9LFxuICAgICAgZ2V0IGFsaWFzKCkge1xuICAgICAgICByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PihcIlBJQ0JFRF9VUFlVTl9PUFRJT05TXCIpXG4gICAgICB9LFxuICAgICAgZ2V0IG1lc3NhZ2UoKSB7XG4gICAgICAgIHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KFwiUElDQkVEX1VQWVVOX01FU1NBR0VfT1BUSU9OU1wiKVxuICAgICAgfSxcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcub3B0aW9ucyB8fCBcIlwiLFxuICAgICAgcmVxdWlyZWQ6IGZhbHNlLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogXCJwYXRoXCIsXG4gICAgICB0eXBlOiBcImlucHV0XCIsXG4gICAgICBnZXQgcHJlZml4KCkge1xuICAgICAgICByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PihcIlBJQ0JFRF9VUFlVTl9QQVRIXCIpXG4gICAgICB9LFxuICAgICAgZ2V0IGFsaWFzKCkge1xuICAgICAgICByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PihcIlBJQ0JFRF9VUFlVTl9QQVRIXCIpXG4gICAgICB9LFxuICAgICAgZ2V0IG1lc3NhZ2UoKSB7XG4gICAgICAgIHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KFwiUElDQkVEX1VQWVVOX01FU1NBR0VfUEFUSFwiKVxuICAgICAgfSxcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcucGF0aCB8fCBcIlwiLFxuICAgICAgcmVxdWlyZWQ6IGZhbHNlLFxuICAgIH0sXG4gIF1cbiAgcmV0dXJuIGNvbmZpZ1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiByZWdpc3RlcihjdHg6IElQaWNHbyk6IHZvaWQge1xuICBjdHguaGVscGVyLnVwbG9hZGVyLnJlZ2lzdGVyKFwidXB5dW5cIiwge1xuICAgIGdldCBuYW1lKCkge1xuICAgICAgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oXCJQSUNCRURfVVBZVU5cIilcbiAgICB9LFxuICAgIGhhbmRsZSxcbiAgICBjb25maWcsXG4gIH0pXG59XG4iLCJpbXBvcnQgeyBJUGljR28sIElQaWNHb1BsdWdpbiB9IGZyb20gXCIuLi8uLi90eXBlc1wiXG5pbXBvcnQgdGNZdW5VcGxvYWRlciBmcm9tIFwiLi90Y3l1blwiXG5pbXBvcnQgZ2l0aHViVXBsb2FkZXIgZnJvbSBcIi4vZ2l0aHViXCJcbmltcG9ydCBxaW5pdVVwbG9hZGVyIGZyb20gXCIuL3Fpbml1XCJcbmltcG9ydCBhbGlZdW5VcGxvYWRlciBmcm9tIFwiLi9hbGl5dW5cIlxuaW1wb3J0IHVwWXVuVXBsb2FkZXIgZnJvbSBcIi4vdXB5dW5cIlxuXG5jb25zdCBidWlsZEluVXBsb2FkZXJzOiBJUGljR29QbHVnaW4gPSAoKSA9PiB7XG4gIHJldHVybiB7XG4gICAgcmVnaXN0ZXIoY3R4OiBJUGljR28pIHtcbiAgICAgIGFsaVl1blVwbG9hZGVyKGN0eClcbiAgICAgIHRjWXVuVXBsb2FkZXIoY3R4KVxuICAgICAgLy8gU01NU1VwbG9hZGVyKGN0eClcbiAgICAgIGdpdGh1YlVwbG9hZGVyKGN0eClcbiAgICAgIHFpbml1VXBsb2FkZXIoY3R4KVxuICAgICAgLy8gaW1ndXJVcGxvYWRlcihjdHgpXG4gICAgICB1cFl1blVwbG9hZGVyKGN0eClcbiAgICB9LFxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IGJ1aWxkSW5VcGxvYWRlcnNcbiIsImltcG9ydCB7IGlzVXJsLCBnZXRJbWFnZVNpemUsIGdldEZTRmlsZSwgZ2V0VVJMRmlsZSB9IGZyb20gXCIuLi8uLi91dGlscy9jb21tb25cIlxuaW1wb3J0IHsgSVBpY0dvLCBJUGF0aFRyYW5zZm9ybWVkSW1nSW5mbywgSUltZ0luZm8sIElJbWdTaXplIH0gZnJvbSBcIi4uLy4uL3R5cGVzXCJcblxuY29uc3QgaGFuZGxlID0gYXN5bmMgKGN0eDogSVBpY0dvKTogUHJvbWlzZTxJUGljR28+ID0+IHtcbiAgY29uc3QgcmVzdWx0czogSUltZ0luZm9bXSA9IGN0eC5vdXRwdXRcbiAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgY3R4LmlucHV0Lm1hcChhc3luYyAoaXRlbTogc3RyaW5nLCBpbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICBsZXQgaW5mbzogSVBhdGhUcmFuc2Zvcm1lZEltZ0luZm9cbiAgICAgIGlmIChpc1VybChpdGVtKSkge1xuICAgICAgICBpbmZvID0gYXdhaXQgZ2V0VVJMRmlsZShpdGVtLCBjdHgpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpbmZvID0gYXdhaXQgZ2V0RlNGaWxlKGl0ZW0pXG4gICAgICB9XG4gICAgICBpZiAoaW5mby5zdWNjZXNzICYmIGluZm8uYnVmZmVyKSB7XG4gICAgICAgIGNvbnN0IGltZ1NpemUgPSBnZXRJbWdTaXplKGN0eCwgaW5mby5idWZmZXIsIGl0ZW0pXG4gICAgICAgIHJlc3VsdHNbaW5kZXhdID0ge1xuICAgICAgICAgIGJ1ZmZlcjogaW5mby5idWZmZXIsXG4gICAgICAgICAgZmlsZU5hbWU6IGluZm8uZmlsZU5hbWUsXG4gICAgICAgICAgd2lkdGg6IGltZ1NpemUud2lkdGgsXG4gICAgICAgICAgaGVpZ2h0OiBpbWdTaXplLmhlaWdodCxcbiAgICAgICAgICBleHRuYW1lOiBpbmZvLmV4dG5hbWUsXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihpbmZvLnJlYXNvbilcbiAgICAgIH1cbiAgICB9KVxuICApXG4gIC8vIHJlbW92ZSBlbXB0eSBpdGVtXG4gIGN0eC5vdXRwdXQgPSByZXN1bHRzLmZpbHRlcigoaXRlbSkgPT4gaXRlbSlcbiAgcmV0dXJuIGN0eFxufVxuXG5jb25zdCBnZXRJbWdTaXplID0gKGN0eDogSVBpY0dvLCBmaWxlOiBCdWZmZXIsIHBhdGg6IHN0cmluZyk6IElJbWdTaXplID0+IHtcbiAgY29uc3QgaW1hZ2VTaXplID0gZ2V0SW1hZ2VTaXplKGZpbGUpXG4gIGlmICghaW1hZ2VTaXplLnJlYWwpIHtcbiAgICBjdHgubG9nLndhcm4oYGNhbid0IGdldCAke3BhdGh9J3MgaW1hZ2Ugc2l6ZWApXG4gICAgY3R4LmxvZy53YXJuKFwiZmFsbGJhY2sgdG8gMjAwICogMjAwXCIpXG4gIH1cbiAgcmV0dXJuIGltYWdlU2l6ZVxufVxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIGhhbmRsZSxcbn1cbiIsImltcG9ydCB7IElQaWNHbyB9IGZyb20gXCIuLi8uLi90eXBlc1wiXG5jb25zdCBoYW5kbGUgPSBhc3luYyAoY3R4OiBJUGljR28pOiBQcm9taXNlPElQaWNHbz4gPT4ge1xuICBjdHgub3V0cHV0LnB1c2goLi4uY3R4LmlucHV0KVxuICByZXR1cm4gY3R4XG59XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgaGFuZGxlLFxufVxuIiwiaW1wb3J0IGZzIGZyb20gXCJmcy1leHRyYVwiXG5pbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiXG5pbXBvcnQgcmVzb2x2ZSBmcm9tIFwicmVzb2x2ZVwiXG5pbXBvcnQgeyBJQnVpbGRJbkV2ZW50IH0gZnJvbSBcIi4uL3V0aWxzL2VudW1cIlxuaW1wb3J0IHsgSVBpY0dvLCBJUGljR29QbHVnaW4sIElQbHVnaW5Mb2FkZXIsIElQaWNHb1BsdWdpbkludGVyZmFjZSB9IGZyb20gXCIuLi90eXBlcy9pbmRleFwiXG5pbXBvcnQgeyBzZXRDdXJyZW50UGx1Z2luTmFtZSB9IGZyb20gXCIuL0xpZmVjeWNsZVBsdWdpbnNcIlxuXG4vKipcbiAqIExvY2FsIHBsdWdpbiBsb2FkZXIsIGZpbGUgc3lzdGVtIGlzIHJlcXVpcmVkXG4gKi9cbmV4cG9ydCBjbGFzcyBQbHVnaW5Mb2FkZXIgaW1wbGVtZW50cyBJUGx1Z2luTG9hZGVyIHtcbiAgcHJpdmF0ZSByZWFkb25seSBjdHg6IElQaWNHb1xuICBwcml2YXRlIGxpc3Q6IHN0cmluZ1tdID0gW11cbiAgcHJpdmF0ZSByZWFkb25seSBmdWxsTGlzdDogU2V0PHN0cmluZz4gPSBuZXcgU2V0KClcbiAgcHJpdmF0ZSByZWFkb25seSBwbHVnaW5NYXA6IE1hcDxzdHJpbmcsIElQaWNHb1BsdWdpbkludGVyZmFjZT4gPSBuZXcgTWFwKClcbiAgY29uc3RydWN0b3IoY3R4OiBJUGljR28pIHtcbiAgICB0aGlzLmN0eCA9IGN0eFxuICAgIHRoaXMuaW5pdCgpXG4gIH1cblxuICBwcml2YXRlIGluaXQoKTogdm9pZCB7XG4gICAgY29uc3QgcGFja2FnZVBhdGggPSBwYXRoLmpvaW4odGhpcy5jdHguYmFzZURpciwgXCJwYWNrYWdlLmpzb25cIilcbiAgICBpZiAoIWZzLmV4aXN0c1N5bmMocGFja2FnZVBhdGgpKSB7XG4gICAgICBjb25zdCBwa2cgPSB7XG4gICAgICAgIG5hbWU6IFwicGljZ28tcGx1Z2luc1wiLFxuICAgICAgICBkZXNjcmlwdGlvbjogXCJwaWNnby1wbHVnaW5zXCIsXG4gICAgICAgIHJlcG9zaXRvcnk6IFwiaHR0cHM6Ly9naXRodWIuY29tL1BpY0dvL1BpY0dvLUNvcmVcIixcbiAgICAgICAgbGljZW5zZTogXCJNSVRcIixcbiAgICAgIH1cbiAgICAgIGZzLndyaXRlRmlsZVN5bmMocGFja2FnZVBhdGgsIEpTT04uc3RyaW5naWZ5KHBrZyksIFwidXRmOFwiKVxuICAgIH1cbiAgfVxuXG4gIC8vIGdldCBwbHVnaW4gZW50cnlcbiAgcHJpdmF0ZSByZXNvbHZlUGx1Z2luKGN0eDogSVBpY0dvLCBuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gcmVzb2x2ZS5zeW5jKG5hbWUsIHsgYmFzZWRpcjogY3R4LmJhc2VEaXIgfSlcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHJldHVybiBwYXRoLmpvaW4oY3R4LmJhc2VEaXIsIFwibm9kZV9tb2R1bGVzXCIsIG5hbWUpXG4gICAgfVxuICB9XG5cbiAgLy8gbG9hZCBhbGwgdGhpcmQgcGFydHkgcGx1Z2luXG4gIGxvYWQoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgcGFja2FnZVBhdGggPSBwYXRoLmpvaW4odGhpcy5jdHguYmFzZURpciwgXCJwYWNrYWdlLmpzb25cIilcbiAgICBjb25zdCBwbHVnaW5EaXIgPSBwYXRoLmpvaW4odGhpcy5jdHguYmFzZURpciwgXCJub2RlX21vZHVsZXMvXCIpXG4gICAgLy8gVGhhbmtzIHRvIGhleG8gLT4gaHR0cHM6Ly9naXRodWIuY29tL2hleG9qcy9oZXhvL2Jsb2IvbWFzdGVyL2xpYi9oZXhvL2xvYWRfcGx1Z2lucy5qc1xuICAgIGlmICghZnMuZXhpc3RzU3luYyhwbHVnaW5EaXIpKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gICAgY29uc3QganNvbiA9IGZzLnJlYWRKU09OU3luYyhwYWNrYWdlUGF0aClcbiAgICBjb25zdCBkZXBzID0gT2JqZWN0LmtleXMoanNvbi5kZXBlbmRlbmNpZXMgfHwge30pXG4gICAgY29uc3QgZGV2RGVwcyA9IE9iamVjdC5rZXlzKGpzb24uZGV2RGVwZW5kZW5jaWVzIHx8IHt9KVxuICAgIGNvbnN0IG1vZHVsZXMgPSBkZXBzLmNvbmNhdChkZXZEZXBzKS5maWx0ZXIoKG5hbWU6IHN0cmluZykgPT4ge1xuICAgICAgaWYgKCEvXnBpY2dvLXBsdWdpbi18XkBbXi9dK1xcL3BpY2dvLXBsdWdpbi0vLnRlc3QobmFtZSkpIHJldHVybiBmYWxzZVxuICAgICAgY29uc3QgcGF0aCA9IHRoaXMucmVzb2x2ZVBsdWdpbih0aGlzLmN0eCwgbmFtZSlcbiAgICAgIHJldHVybiBmcy5leGlzdHNTeW5jKHBhdGgpXG4gICAgfSlcbiAgICBmb3IgKGNvbnN0IG1vZHVsZSBvZiBtb2R1bGVzKSB7XG4gICAgICB0aGlzLnJlZ2lzdGVyUGx1Z2luKG1vZHVsZSlcbiAgICB9XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIHJlZ2lzdGVyUGx1Z2luKG5hbWU6IHN0cmluZywgcGx1Z2luPzogSVBpY0dvUGx1Z2luKTogdm9pZCB7XG4gICAgaWYgKCFuYW1lIHx8IHR5cGVvZiBuYW1lICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICB0aGlzLmN0eC5sb2cud2FybihcIlBsZWFzZSBwcm92aWRlIHZhbGlkIHBsdWdpblwiKVxuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGNvbnNvbGUubG9nKFwiU3RhcnQgcmVnaXN0ZXJpbmcgcGx1Z2luIFwiICsgbmFtZSArIFwiIC4uLlwiKVxuICAgIHRoaXMuZnVsbExpc3QuYWRkKG5hbWUpXG4gICAgdHJ5IHtcbiAgICAgIC8vIHJlZ2lzdGVyIGxvY2FsIHBsdWdpblxuICAgICAgaWYgKCFwbHVnaW4pIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHRoaXMuY3R4LmdldENvbmZpZyhgcGljZ29QbHVnaW5zLiR7bmFtZX1gKSA9PT0gdHJ1ZSB8fFxuICAgICAgICAgIHRoaXMuY3R4LmdldENvbmZpZyhgcGljZ29QbHVnaW5zLiR7bmFtZX1gKSA9PT0gdW5kZWZpbmVkXG4gICAgICAgICkge1xuICAgICAgICAgIHRoaXMubGlzdC5wdXNoKG5hbWUpXG4gICAgICAgICAgc2V0Q3VycmVudFBsdWdpbk5hbWUobmFtZSlcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLW5vbi1udWxsLWFzc2VydGlvblxuICAgICAgICAgIHRoaXMuZ2V0UGx1Z2luKG5hbWUpIS5yZWdpc3Rlcih0aGlzLmN0eClcbiAgICAgICAgICBjb25zdCBwbHVnaW4gPSBgcGljZ29QbHVnaW5zWyR7bmFtZX1dYFxuICAgICAgICAgIHRoaXMuY3R4LnNhdmVDb25maWcoe1xuICAgICAgICAgICAgW3BsdWdpbl06IHRydWUsXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gcmVnaXN0ZXIgcHJvdmlkZWQgcGx1Z2luXG4gICAgICAgIC8vICYmIHdvbid0IHdyaXRlIGNvbmZpZyB0byBmaWxlc1xuICAgICAgICB0aGlzLmxpc3QucHVzaChuYW1lKVxuICAgICAgICBzZXRDdXJyZW50UGx1Z2luTmFtZShuYW1lKVxuICAgICAgICBjb25zdCBwbHVnaW5JbnRlcmZhY2UgPSBwbHVnaW4odGhpcy5jdHgpXG4gICAgICAgIHRoaXMucGx1Z2luTWFwLnNldChuYW1lLCBwbHVnaW5JbnRlcmZhY2UpXG4gICAgICAgIHBsdWdpbkludGVyZmFjZS5yZWdpc3Rlcih0aGlzLmN0eClcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aGlzLnBsdWdpbk1hcC5kZWxldGUobmFtZSlcbiAgICAgIHRoaXMubGlzdCA9IHRoaXMubGlzdC5maWx0ZXIoKGl0ZW06IHN0cmluZykgPT4gaXRlbSAhPT0gbmFtZSlcbiAgICAgIHRoaXMuZnVsbExpc3QuZGVsZXRlKG5hbWUpXG4gICAgICB0aGlzLmN0eC5sb2cuZXJyb3IoZSBhcyBFcnJvcilcbiAgICAgIHRoaXMuY3R4LmVtaXQoSUJ1aWxkSW5FdmVudC5OT1RJRklDQVRJT04sIHtcbiAgICAgICAgdGl0bGU6IGBQbHVnaW4gJHtuYW1lfSBMb2FkIEVycm9yYCxcbiAgICAgICAgYm9keTogZSxcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgdW5yZWdpc3RlclBsdWdpbihuYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmxpc3QgPSB0aGlzLmxpc3QuZmlsdGVyKChpdGVtOiBzdHJpbmcpID0+IGl0ZW0gIT09IG5hbWUpXG4gICAgdGhpcy5mdWxsTGlzdC5kZWxldGUobmFtZSlcbiAgICB0aGlzLnBsdWdpbk1hcC5kZWxldGUobmFtZSlcbiAgICBzZXRDdXJyZW50UGx1Z2luTmFtZShuYW1lKVxuICAgIHRoaXMuY3R4LmhlbHBlci51cGxvYWRlci51bnJlZ2lzdGVyKG5hbWUpXG4gICAgdGhpcy5jdHguaGVscGVyLnRyYW5zZm9ybWVyLnVucmVnaXN0ZXIobmFtZSlcbiAgICB0aGlzLmN0eC5oZWxwZXIuYmVmb3JlVHJhbnNmb3JtUGx1Z2lucy51bnJlZ2lzdGVyKG5hbWUpXG4gICAgdGhpcy5jdHguaGVscGVyLmJlZm9yZVVwbG9hZFBsdWdpbnMudW5yZWdpc3RlcihuYW1lKVxuICAgIHRoaXMuY3R4LmhlbHBlci5hZnRlclVwbG9hZFBsdWdpbnMudW5yZWdpc3RlcihuYW1lKVxuICAgIHRoaXMuY3R4LmNtZC51bnJlZ2lzdGVyKG5hbWUpXG4gICAgdGhpcy5jdHgucmVtb3ZlQ29uZmlnKFwicGljZ29QbHVnaW5zXCIsIG5hbWUpXG4gIH1cblxuICAvLyBnZXQgcGx1Z2luIGJ5IG5hbWVcbiAgZ2V0UGx1Z2luKG5hbWU6IHN0cmluZyk6IElQaWNHb1BsdWdpbkludGVyZmFjZSB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHRoaXMucGx1Z2luTWFwLmhhcyhuYW1lKSkge1xuICAgICAgcmV0dXJuIHRoaXMucGx1Z2luTWFwLmdldChuYW1lKVxuICAgIH1cbiAgICBjb25zdCBwbHVnaW5EaXIgPSBwYXRoLmpvaW4odGhpcy5jdHguYmFzZURpciwgXCJub2RlX21vZHVsZXMvXCIpXG4gICAgY29uc29sZS5sb2coXCJTdGFydCByZXF1aXJpbmcgcGx1Z2luIGxpYiwgcGx1Z2luRGlyXCIsIHBsdWdpbkRpcilcbiAgICBjb25zb2xlLmxvZyhcIlN0YXJ0IHJlcXVpcmluZyBwbHVnaW4gbGliLCBuYW1lXCIsIG5hbWUpXG4gICAgY29uc3QgcGx1Z2luID0gcmVxdWlyZShwbHVnaW5EaXIgKyBuYW1lKSh0aGlzLmN0eClcbiAgICB0aGlzLnBsdWdpbk1hcC5zZXQobmFtZSwgcGx1Z2luKVxuICAgIHJldHVybiBwbHVnaW5cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGxpc3Qgb2YgZW5hYmxlZCBwbHVnaW5zXG4gICAqL1xuICBnZXRMaXN0KCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5saXN0XG4gIH1cblxuICBoYXNQbHVnaW4obmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZnVsbExpc3QuaGFzKG5hbWUpXG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBmdWxsIGxpc3Qgb2YgcGx1Z2lucywgd2hldGhlciBpdCBpcyBlbmFibGVkIG9yIG5vdFxuICAgKi9cbiAgZ2V0RnVsbExpc3QoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBbLi4udGhpcy5mdWxsTGlzdF1cbiAgfVxufVxuZXhwb3J0IGRlZmF1bHQgUGx1Z2luTG9hZGVyXG4iLCJleHBvcnQgY29uc3QgQ0xJUEJPQVJEX0lNQUdFX0ZPTERFUiA9IFwicGljZ28tY2xpcGJvYXJkLWltYWdlc1wiXG4iLCJpbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiXG5pbXBvcnQgeyBzcGF3biB9IGZyb20gXCJjaGlsZF9wcm9jZXNzXCJcbmltcG9ydCBkYXlqcyBmcm9tIFwiZGF5anNcIlxuaW1wb3J0IG9zIGZyb20gXCJvc1wiXG5pbXBvcnQgZnMgZnJvbSBcImZzLWV4dHJhXCJcbmltcG9ydCBpc1dzbCBmcm9tIFwiaXMtd3NsXCJcbmltcG9ydCB7IElQaWNHbywgSUNsaXBib2FyZEltYWdlIH0gZnJvbSBcIi4uL3R5cGVzXCJcbmltcG9ydCB7IElCdWlsZEluRXZlbnQgfSBmcm9tIFwiLi9lbnVtXCJcbmltcG9ydCBtYWNDbGlwYm9hcmRTY3JpcHQgZnJvbSBcIi4vY2xpcGJvYXJkL21hYy5hcHBsZXNjcmlwdFwiXG5pbXBvcnQgd2luZG93c0NsaXBib2FyZFNjcmlwdCBmcm9tIFwiLi9jbGlwYm9hcmQvd2luZG93cy5wczFcIlxuaW1wb3J0IHdpbmRvd3MxMENsaXBib2FyZFNjcmlwdCBmcm9tIFwiLi9jbGlwYm9hcmQvd2luZG93czEwLnBzMVwiXG5pbXBvcnQgbGludXhDbGlwYm9hcmRTY3JpcHQgZnJvbSBcIi4vY2xpcGJvYXJkL2xpbnV4LnNoXCJcbmltcG9ydCB3c2xDbGlwYm9hcmRTY3JpcHQgZnJvbSBcIi4vY2xpcGJvYXJkL3dzbC5zaFwiXG5pbXBvcnQgeyBDTElQQk9BUkRfSU1BR0VfRk9MREVSIH0gZnJvbSBcIi4vc3RhdGljXCJcblxuZXhwb3J0IHR5cGUgUGxhdGZvcm0gPSBcImRhcndpblwiIHwgXCJ3aW4zMlwiIHwgXCJ3aW4xMFwiIHwgXCJsaW51eFwiIHwgXCJ3c2xcIlxuXG5jb25zdCBnZXRDdXJyZW50UGxhdGZvcm0gPSAoKTogUGxhdGZvcm0gPT4ge1xuICBjb25zdCBwbGF0Zm9ybSA9IHByb2Nlc3MucGxhdGZvcm1cbiAgaWYgKGlzV3NsKSB7XG4gICAgcmV0dXJuIFwid3NsXCJcbiAgfVxuICBpZiAocGxhdGZvcm0gPT09IFwid2luMzJcIikge1xuICAgIGNvbnN0IGN1cnJlbnRPUyA9IG9zLnJlbGVhc2UoKS5zcGxpdChcIi5cIilbMF1cbiAgICBpZiAoY3VycmVudE9TID09PSBcIjEwXCIpIHtcbiAgICAgIHJldHVybiBcIndpbjEwXCJcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIFwid2luMzJcIlxuICAgIH1cbiAgfSBlbHNlIGlmIChwbGF0Zm9ybSA9PT0gXCJkYXJ3aW5cIikge1xuICAgIHJldHVybiBcImRhcndpblwiXG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIFwibGludXhcIlxuICB9XG59XG5cbmNvbnN0IHBsYXRmb3JtMlNjcmlwdENvbnRlbnQ6IHtcbiAgW2tleSBpbiBQbGF0Zm9ybV06IHN0cmluZ1xufSA9IHtcbiAgZGFyd2luOiBtYWNDbGlwYm9hcmRTY3JpcHQsXG4gIHdpbjMyOiB3aW5kb3dzQ2xpcGJvYXJkU2NyaXB0LFxuICB3aW4xMDogd2luZG93czEwQ2xpcGJvYXJkU2NyaXB0LFxuICBsaW51eDogbGludXhDbGlwYm9hcmRTY3JpcHQsXG4gIHdzbDogd3NsQ2xpcGJvYXJkU2NyaXB0LFxufVxuLyoqXG4gKiBwb3dlcnNoZWxsIHdpbGwgcmVwb3J0IGVycm9yIGlmIGZpbGUgZG9lcyBub3QgaGF2ZSBhICcucHMxJyBleHRlbnNpb24sXG4gKiBzbyB3ZSBzaG91bGQga2VlcCB0aGUgZXh0ZW5zaW9uIG5hbWUgY29uc2lzdGVudCB3aXRoIGNvcnJlc3BvbmRpbmcgc2hlbGxcbiAqL1xuY29uc3QgcGxhdGZvcm0yU2NyaXB0RmlsZW5hbWU6IHtcbiAgW2tleSBpbiBQbGF0Zm9ybV06IHN0cmluZ1xufSA9IHtcbiAgZGFyd2luOiBcIm1hYy5hcHBsZXNjcmlwdFwiLFxuICB3aW4zMjogXCJ3aW5kb3dzLnBzMVwiLFxuICB3aW4xMDogXCJ3aW5kb3dzMTAucHMxXCIsXG4gIGxpbnV4OiBcImxpbnV4LnNoXCIsXG4gIHdzbDogXCJ3c2wuc2hcIixcbn1cblxuZnVuY3Rpb24gY3JlYXRlSW1hZ2VGb2xkZXIoY3R4OiBJUGljR28pOiB2b2lkIHtcbiAgY29uc3QgaW1hZ2VQYXRoID0gcGF0aC5qb2luKGN0eC5iYXNlRGlyLCBDTElQQk9BUkRfSU1BR0VfRk9MREVSKVxuICBpZiAoIWZzLmV4aXN0c1N5bmMoaW1hZ2VQYXRoKSkge1xuICAgIGZzLm1rZGlyU3luYyhpbWFnZVBhdGgpXG4gIH1cbn1cblxuLy8gVGhhbmtzIHRvIHZzLXBpY2dvOiBodHRwczovL2dpdGh1Yi5jb20vU3BhZGVzLVMvdnMtcGljZ28vYmxvYi9tYXN0ZXIvc3JjL2V4dGVuc2lvbi50c1xuY29uc3QgZ2V0Q2xpcGJvYXJkSW1hZ2UgPSBhc3luYyAoY3R4OiBJUGljR28pOiBQcm9taXNlPElDbGlwYm9hcmRJbWFnZT4gPT4ge1xuICBjcmVhdGVJbWFnZUZvbGRlcihjdHgpXG4gIC8vIGFkZCBhbiBjbGlwYm9hcmQgaW1hZ2UgZm9sZGVyIHRvIGNvbnRyb2wgdGhlIGltYWdlIGNhY2hlIGZpbGVcbiAgY29uc3QgaW1hZ2VQYXRoID0gcGF0aC5qb2luKGN0eC5iYXNlRGlyLCBDTElQQk9BUkRfSU1BR0VfRk9MREVSLCBgJHtkYXlqcygpLmZvcm1hdChcIllZWVlNTURESEhtbXNzXCIpfS5wbmdgKVxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10eXBlc1xuICByZXR1cm4gYXdhaXQgbmV3IFByb21pc2U8SUNsaXBib2FyZEltYWdlPigocmVzb2x2ZTogRnVuY3Rpb24sIHJlamVjdDogRnVuY3Rpb24pOiB2b2lkID0+IHtcbiAgICBjb25zdCBwbGF0Zm9ybSA9IGdldEN1cnJlbnRQbGF0Zm9ybSgpXG4gICAgY29uc3Qgc2NyaXB0UGF0aCA9IHBhdGguam9pbihjdHguYmFzZURpciwgcGxhdGZvcm0yU2NyaXB0RmlsZW5hbWVbcGxhdGZvcm1dKVxuICAgIC8vIElmIHRoZSBzY3JpcHQgZG9lcyBub3QgZXhpc3QgeWV0LCB3ZSBuZWVkIHRvIHdyaXRlIHRoZSBjb250ZW50IHRvIHRoZSBzY3JpcHQgZmlsZVxuICAgIGlmICghZnMuZXhpc3RzU3luYyhzY3JpcHRQYXRoKSkge1xuICAgICAgZnMud3JpdGVGaWxlU3luYyhzY3JpcHRQYXRoLCBwbGF0Zm9ybTJTY3JpcHRDb250ZW50W3BsYXRmb3JtXSwgXCJ1dGY4XCIpXG4gICAgfVxuICAgIGxldCBleGVjdXRpb25cbiAgICBpZiAocGxhdGZvcm0gPT09IFwiZGFyd2luXCIpIHtcbiAgICAgIGV4ZWN1dGlvbiA9IHNwYXduKFwib3Nhc2NyaXB0XCIsIFtzY3JpcHRQYXRoLCBpbWFnZVBhdGhdKVxuICAgIH0gZWxzZSBpZiAocGxhdGZvcm0gPT09IFwid2luMzJcIiB8fCBwbGF0Zm9ybSA9PT0gXCJ3aW4xMFwiKSB7XG4gICAgICBleGVjdXRpb24gPSBzcGF3bihcInBvd2Vyc2hlbGxcIiwgW1xuICAgICAgICBcIi1ub3Byb2ZpbGVcIixcbiAgICAgICAgXCItbm9uaW50ZXJhY3RpdmVcIixcbiAgICAgICAgXCItbm9sb2dvXCIsXG4gICAgICAgIFwiLXN0YVwiLFxuICAgICAgICBcIi1leGVjdXRpb25wb2xpY3lcIixcbiAgICAgICAgXCJ1bnJlc3RyaWN0ZWRcIixcbiAgICAgICAgLy8gZml4IHdpbmRvd3MgMTAgbmF0aXZlIGNtZCBjcmFzaCBidWcgd2hlbiBcInBpY2dvIHVwbG9hZFwiXG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9QaWNHby9QaWNHby1Db3JlL2lzc3Vlcy8zMlxuICAgICAgICAvLyAnLXdpbmRvd3N0eWxlJywnaGlkZGVuJyxcbiAgICAgICAgLy8gJy1ub2V4aXQnLFxuICAgICAgICBcIi1maWxlXCIsXG4gICAgICAgIHNjcmlwdFBhdGgsXG4gICAgICAgIGltYWdlUGF0aCxcbiAgICAgIF0pXG4gICAgfSBlbHNlIHtcbiAgICAgIGV4ZWN1dGlvbiA9IHNwYXduKFwic2hcIiwgW3NjcmlwdFBhdGgsIGltYWdlUGF0aF0pXG4gICAgfVxuXG4gICAgZXhlY3V0aW9uLnN0ZG91dC5vbihcImRhdGFcIiwgKGRhdGE6IEJ1ZmZlcikgPT4ge1xuICAgICAgaWYgKHBsYXRmb3JtID09PSBcImxpbnV4XCIpIHtcbiAgICAgICAgaWYgKGRhdGEudG9TdHJpbmcoKS50cmltKCkgPT09IFwibm8geGNsaXAgb3Igd2wtY2xpcGJvYXJkXCIpIHtcbiAgICAgICAgICBjdHguZW1pdChJQnVpbGRJbkV2ZW50Lk5PVElGSUNBVElPTiwge1xuICAgICAgICAgICAgdGl0bGU6IFwieGNsaXAgb3Igd2wtY2xpcGJvYXJkIG5vdCBmb3VuZFwiLFxuICAgICAgICAgICAgYm9keTogXCJQbGVhc2UgaW5zdGFsbCB4Y2xpcChmb3IgeDExKSBvciB3bC1jbGlwYm9hcmQoZm9yIHdheWxhbmQpIGJlZm9yZSBydW4gcGljZ29cIixcbiAgICAgICAgICB9KVxuICAgICAgICAgIHJldHVybiByZWplY3QobmV3IEVycm9yKFwiUGxlYXNlIGluc3RhbGwgeGNsaXAoZm9yIHgxMSkgb3Igd2wtY2xpcGJvYXJkKGZvciB3YXlsYW5kKSBiZWZvcmUgcnVuIHBpY2dvXCIpKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb25zdCBpbWdQYXRoID0gZGF0YS50b1N0cmluZygpLnRyaW0oKVxuXG4gICAgICAvLyBpZiB0aGUgZmlsZVBhdGggaXMgdGhlIHJlYWwgZmlsZSBpbiBzeXN0ZW1cbiAgICAgIC8vIHdlIHNob3VsZCBrZWVwIGl0IGluc3RlYWQgb2YgcmVtb3ZpbmdcbiAgICAgIGxldCBzaG91bGRLZWVwQWZ0ZXJVcGxvYWRpbmcgPSBmYWxzZVxuXG4gICAgICAvLyBpbiBtYWNPUyBpZiB5b3VyIGNvcHkgdGhlIGZpbGUgaW4gc3lzdGVtLCBpdCdzIGJhc2VuYW1lIHdpbGwgbm90IGVxdWFsIHRvIG91ciBkZWZhdWx0IGJhc2VuYW1lXG4gICAgICBpZiAocGF0aC5iYXNlbmFtZShpbWdQYXRoKSAhPT0gcGF0aC5iYXNlbmFtZShpbWFnZVBhdGgpKSB7XG4gICAgICAgIC8vIGlmIHRoZSBwYXRoIGlzIG5vdCBnZW5lcmF0ZSBieSBwaWNnb1xuICAgICAgICAvLyBidXQgdGhlIHBhdGggZXhpc3RzLCB3ZSBzaG91bGQga2VlcCBpdFxuICAgICAgICBpZiAoZnMuZXhpc3RzU3luYyhpbWdQYXRoKSkge1xuICAgICAgICAgIHNob3VsZEtlZXBBZnRlclVwbG9hZGluZyA9IHRydWVcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gaWYgdGhlIGltZ1BhdGggaXMgaW52YWxpZFxuICAgICAgaWYgKGltZ1BhdGggIT09IFwibm8gaW1hZ2VcIiAmJiAhZnMuZXhpc3RzU3luYyhpbWdQYXRoKSkge1xuICAgICAgICByZXR1cm4gcmVqZWN0KG5ldyBFcnJvcihgQ2FuJ3QgZmluZCAke2ltZ1BhdGh9YCkpXG4gICAgICB9XG5cbiAgICAgIHJlc29sdmUoe1xuICAgICAgICBpbWdQYXRoLFxuICAgICAgICBzaG91bGRLZWVwQWZ0ZXJVcGxvYWRpbmcsXG4gICAgICB9KVxuICAgIH0pXG4gIH0pXG59XG5cbmV4cG9ydCBkZWZhdWx0IGdldENsaXBib2FyZEltYWdlXG4iLCJpbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tIFwiZXZlbnRzXCJcblxuY29uc3QgZXZlbnRCdXMgPSBuZXcgRXZlbnRFbWl0dGVyKClcbmV4cG9ydCB7IGV2ZW50QnVzIH1cbiIsIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9leHBsaWNpdC1mdW5jdGlvbi1yZXR1cm4tdHlwZSAqL1xuLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L3Byb21pc2UtZnVuY3Rpb24tYXN5bmMgKi9cbmltcG9ydCBheGlvcywgeyBBeGlvc1JlcXVlc3RDb25maWcsIEF4aW9zUmVzcG9uc2UgfSBmcm9tIFwiYXhpb3NcIlxuaW1wb3J0IHtcbiAgSVBpY0dvLFxuICBVbmRlZmluYWJsZSxcbiAgSUNvbmZpZ0NoYW5nZVBheWxvYWQsXG4gIElDb25maWcsXG4gIElSZXF1ZXN0Q29uZmlnLFxuICBJT2xkUmVxT3B0aW9ucyxcbiAgSVJlc3BvbnNlLFxuICBJRnVsbFJlc3BvbnNlLFxuICBJUmVxdWVzdCxcbn0gZnJvbSBcIi4uL3R5cGVzXCJcbmltcG9ydCB7IElCdXNFdmVudCB9IGZyb20gXCIuLi91dGlscy9lbnVtXCJcbmltcG9ydCB7IGV2ZW50QnVzIH0gZnJvbSBcIi4uL3V0aWxzL2V2ZW50QnVzXCJcbmltcG9ydCB7IFVSTCB9IGZyb20gXCJ1cmxcIlxuaW1wb3J0IEZvcm1EYXRhIGZyb20gXCJmb3JtLWRhdGFcIlxuaW1wb3J0IGh0dHBzIGZyb20gXCJodHRwc1wiXG5pbXBvcnQgdHVubmVsIGZyb20gXCJ0dW5uZWxcIlxuY29uc3QgaHR0cHNBZ2VudCA9IG5ldyBodHRwcy5BZ2VudCh7XG4gIG1heFZlcnNpb246IFwiVExTdjEuMlwiLFxuICBtaW5WZXJzaW9uOiBcIlRMU3YxLjJcIixcbn0pXG5cbi8vIHRoYW5rcyBmb3IgaHR0cHM6Ly9naXRodWIuZGV2L3JlcXVlc3QvcmVxdWVzdC9ibG9iL21hc3Rlci9pbmRleC5qc1xuZnVuY3Rpb24gYXBwZW5kRm9ybURhdGEoZm9ybTogRm9ybURhdGEsIGtleTogc3RyaW5nLCBkYXRhOiBhbnkpOiB2b2lkIHtcbiAgaWYgKHR5cGVvZiBkYXRhID09PSBcIm9iamVjdFwiICYmIFwidmFsdWVcIiBpbiBkYXRhICYmIFwib3B0aW9uc1wiIGluIGRhdGEpIHtcbiAgICBmb3JtLmFwcGVuZChrZXksIGRhdGEudmFsdWUsIGRhdGEub3B0aW9ucylcbiAgfSBlbHNlIHtcbiAgICBmb3JtLmFwcGVuZChrZXksIGRhdGEpXG4gIH1cbn1cblxuZnVuY3Rpb24gcmVxdWVzdEludGVyY2VwdG9yKG9wdGlvbnM6IElPbGRSZXFPcHRpb25zIHwgQXhpb3NSZXF1ZXN0Q29uZmlnKTogQXhpb3NSZXF1ZXN0Q29uZmlnICYge1xuICBfX2lzT2xkT3B0aW9ucz86IGJvb2xlYW5cbn0ge1xuICBsZXQgX19pc09sZE9wdGlvbnMgPSBmYWxzZVxuICBjb25zdCBvcHQ6IEF4aW9zUmVxdWVzdENvbmZpZzxhbnk+ICYge1xuICAgIF9faXNPbGRPcHRpb25zPzogYm9vbGVhblxuICB9ID0ge1xuICAgIC4uLm9wdGlvbnMsXG4gICAgdXJsOiAob3B0aW9ucy51cmwgYXMgc3RyaW5nKSB8fCBcIlwiLFxuICAgIGhlYWRlcnM6IG9wdGlvbnMuaGVhZGVycyB8fCB7fSxcbiAgfVxuICAvLyB1c2VyIHJlcXVlc3QgY29uZmlnIHByb3h5XG4gIGlmIChvcHRpb25zLnByb3h5KSB7XG4gICAgbGV0IHByb3h5T3B0aW9ucyA9IG9wdGlvbnMucHJveHlcbiAgICBpZiAodHlwZW9mIHByb3h5T3B0aW9ucyA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcHJveHlPcHRpb25zID0gbmV3IFVSTChvcHRpb25zLnByb3h5KVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBwcm94eU9wdGlvbnMgPSBmYWxzZVxuICAgICAgICBvcHQucHJveHkgPSBmYWxzZVxuICAgICAgICBjb25zb2xlLmVycm9yKGUpXG4gICAgICB9XG4gICAgICBfX2lzT2xkT3B0aW9ucyA9IHRydWVcbiAgICB9XG4gICAgaWYgKHByb3h5T3B0aW9ucykge1xuICAgICAgaWYgKG9wdGlvbnMudXJsPy5zdGFydHNXaXRoKFwiaHR0cHM6Ly9cIikpIHtcbiAgICAgICAgb3B0LnByb3h5ID0gZmFsc2VcbiAgICAgICAgb3B0Lmh0dHBzQWdlbnQgPSB0dW5uZWwuaHR0cHNPdmVySHR0cCh7XG4gICAgICAgICAgcHJveHk6IHtcbiAgICAgICAgICAgIGhvc3Q6IHByb3h5T3B0aW9ucz8uaG9zdG5hbWUsXG4gICAgICAgICAgICBwb3J0OiBwYXJzZUludChwcm94eU9wdGlvbnM/LnBvcnQsIDEwKSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3B0LnByb3h5ID0ge1xuICAgICAgICAgIGhvc3Q6IHByb3h5T3B0aW9ucy5ob3N0bmFtZSxcbiAgICAgICAgICBwb3J0OiBwYXJzZUludChwcm94eU9wdGlvbnMucG9ydCwgMTApLFxuICAgICAgICAgIHByb3RvY29sOiBcImh0dHBcIixcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICBpZiAoXCJmb3JtRGF0YVwiIGluIG9wdGlvbnMpIHtcbiAgICBjb25zdCBmb3JtID0gbmV3IEZvcm1EYXRhKClcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBvcHRpb25zLmZvcm1EYXRhKSB7XG4gICAgICBjb25zdCBkYXRhID0gb3B0aW9ucy5mb3JtRGF0YVtrZXldXG4gICAgICBhcHBlbmRGb3JtRGF0YShmb3JtLCBrZXksIGRhdGEpXG4gICAgfVxuICAgIG9wdC5kYXRhID0gZm9ybVxuICAgIG9wdC5oZWFkZXJzID0gT2JqZWN0LmFzc2lnbihvcHQuaGVhZGVycyB8fCB7fSwgZm9ybS5nZXRIZWFkZXJzKCkpXG4gICAgX19pc09sZE9wdGlvbnMgPSB0cnVlXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9iYW4tdHMtY29tbWVudFxuICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICBkZWxldGUgb3B0LmZvcm1EYXRhXG4gIH1cbiAgaWYgKFwiYm9keVwiIGluIG9wdGlvbnMpIHtcbiAgICBvcHQuZGF0YSA9IG9wdGlvbnMuYm9keVxuICAgIF9faXNPbGRPcHRpb25zID0gdHJ1ZVxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvYmFuLXRzLWNvbW1lbnRcbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgZGVsZXRlIG9wdC5ib2R5XG4gIH1cbiAgaWYgKFwicXNcIiBpbiBvcHRpb25zKSB7XG4gICAgb3B0LnBhcmFtcyA9IG9wdGlvbnMucXNcbiAgICBfX2lzT2xkT3B0aW9ucyA9IHRydWVcbiAgfVxuICBvcHQuX19pc09sZE9wdGlvbnMgPSBfX2lzT2xkT3B0aW9uc1xuICByZXR1cm4gb3B0XG59XG5cbmZ1bmN0aW9uIHJlc3BvbnNlSW50ZXJjZXB0b3IocmVzcG9uc2U6IEF4aW9zUmVzcG9uc2UpOiBJRnVsbFJlc3BvbnNlIHtcbiAgcmV0dXJuIHtcbiAgICAuLi5yZXNwb25zZSxcbiAgICBzdGF0dXNDb2RlOiByZXNwb25zZS5zdGF0dXMsXG4gICAgYm9keTogcmVzcG9uc2UuZGF0YSxcbiAgfVxufVxuXG5mdW5jdGlvbiByZXNwb25zZUVycm9ySGFuZGxlcihlcnJvcjogYW55KSB7XG4gIC8vIGlmIChlcnJvci5yZXNwb25zZSkge1xuICAvLyAgIC8vIFRoZSByZXF1ZXN0IHdhcyBtYWRlIGFuZCB0aGUgc2VydmVyIHJlc3BvbmRlZCB3aXRoIGEgc3RhdHVzIGNvZGVcbiAgLy8gICAvLyB0aGF0IGZhbGxzIG91dCBvZiB0aGUgcmFuZ2Ugb2YgMnh4XG4gIC8vICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGVycm8pXG4gIC8vIH0gZWxzZSBpZiAoZXJyb3IucmVxdWVzdCkge1xuICAvLyAgIC8vIFRoZSByZXF1ZXN0IHdhcyBtYWRlIGJ1dCBubyByZXNwb25zZSB3YXMgcmVjZWl2ZWRcbiAgLy8gICAvLyBgZXJyb3IucmVxdWVzdGAgaXMgYW4gaW5zdGFuY2Ugb2YgWE1MSHR0cFJlcXVlc3QgaW4gdGhlIGJyb3dzZXIgYW5kIGFuIGluc3RhbmNlIG9mXG4gIC8vICAgLy8gaHR0cC5DbGllbnRSZXF1ZXN0IGluIG5vZGUuanNcbiAgLy8gICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyb3IucmVxdWVzdClcbiAgLy8gfSBlbHNlIHtcbiAgLy8gICAvLyBTb21ldGhpbmcgaGFwcGVuZWQgaW4gc2V0dGluZyB1cCB0aGUgcmVxdWVzdCB0aGF0IHRyaWdnZXJlZCBhbiBFcnJvclxuICAvLyAgIHJldHVybiBQcm9taXNlLnJlamVjdChlcnJvci5tZXNzYWdlKVxuICAvLyB9XG4gIGNvbnN0IGVycm9yT2JqID0ge1xuICAgIG1ldGhvZDogZXJyb3I/LmNvbmZpZz8ubWV0aG9kPy50b1VwcGVyQ2FzZSgpIHx8IFwiXCIsXG4gICAgdXJsOiBlcnJvcj8uY29uZmlnPy51cmwgfHwgXCJcIixcbiAgICBzdGF0dXNDb2RlOiBlcnJvcj8ucmVzcG9uc2U/LnN0YXR1cyB8fCAwLFxuICAgIG1lc3NhZ2U6IGVycm9yPy5tZXNzYWdlIHx8IFwiXCIsXG4gICAgc3RhY2s6IGVycm9yPy5zdGFjayB8fCB7fSxcbiAgICByZXNwb25zZToge1xuICAgICAgc3RhdHVzOiBlcnJvcj8ucmVzcG9uc2U/LnN0YXR1cyB8fCAwLFxuICAgICAgc3RhdHVzQ29kZTogZXJyb3I/LnJlc3BvbnNlPy5zdGF0dXMgfHwgMCxcbiAgICAgIGJvZHk6IGVycm9yPy5yZXNwb25zZT8uZGF0YSB8fCBcIlwiLFxuICAgIH0sXG4gIH1cbiAgcmV0dXJuIFByb21pc2UucmVqZWN0KGVycm9yT2JqKVxufVxuXG5leHBvcnQgY2xhc3MgUmVxdWVzdCBpbXBsZW1lbnRzIElSZXF1ZXN0IHtcbiAgcHJpdmF0ZSByZWFkb25seSBjdHg6IElQaWNHb1xuICBwcml2YXRlIHByb3h5OiBVbmRlZmluYWJsZTxzdHJpbmc+ID0gXCJcIlxuICBvcHRpb25zOiBBeGlvc1JlcXVlc3RDb25maWc8YW55PiA9IHt9XG4gIGNvbnN0cnVjdG9yKGN0eDogSVBpY0dvKSB7XG4gICAgdGhpcy5jdHggPSBjdHhcbiAgICB0aGlzLmluaXQoKVxuICAgIGV2ZW50QnVzLm9uKElCdXNFdmVudC5DT05GSUdfQ0hBTkdFLCAoZGF0YTogSUNvbmZpZ0NoYW5nZVBheWxvYWQ8c3RyaW5nIHwgSUNvbmZpZ1tcInBpY0JlZFwiXT4pID0+IHtcbiAgICAgIHN3aXRjaCAoZGF0YS5jb25maWdOYW1lKSB7XG4gICAgICAgIGNhc2UgXCJwaWNCZWRcIjpcbiAgICAgICAgICBpZiAoKGRhdGEudmFsdWUgYXMgSUNvbmZpZ1tcInBpY0JlZFwiXSk/LnByb3h5KSB7XG4gICAgICAgICAgICB0aGlzLnByb3h5ID0gKGRhdGEudmFsdWUgYXMgSUNvbmZpZ1tcInBpY0JlZFwiXSkucHJveHlcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSBcInBpY0JlZC5wcm94eVwiOlxuICAgICAgICAgIHRoaXMucHJveHkgPSBkYXRhLnZhbHVlIGFzIHN0cmluZ1xuICAgICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIHByaXZhdGUgaW5pdCgpOiB2b2lkIHtcbiAgICBjb25zdCBwcm94eSA9IHRoaXMuY3R4LmdldENvbmZpZzxVbmRlZmluYWJsZTxzdHJpbmc+PihcInBpY0JlZC5wcm94eVwiKVxuICAgIGlmIChwcm94eSkge1xuICAgICAgdGhpcy5wcm94eSA9IHByb3h5XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVQcm94eSgpOiBBeGlvc1JlcXVlc3RDb25maWdbXCJwcm94eVwiXSB8IGZhbHNlIHtcbiAgICBpZiAodGhpcy5wcm94eSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcHJveHlPcHRpb25zID0gbmV3IFVSTCh0aGlzLnByb3h5KVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGhvc3Q6IHByb3h5T3B0aW9ucy5ob3N0bmFtZSxcbiAgICAgICAgICBwb3J0OiBwYXJzZUludChwcm94eU9wdGlvbnMucG9ydCB8fCBcIjBcIiwgMTApLFxuICAgICAgICAgIHByb3RvY29sOiBwcm94eU9wdGlvbnMucHJvdG9jb2wsXG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihlKVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8vICM2NCBkeW5hbWljIGdldCBwcm94eSB2YWx1ZVxuICByZXF1ZXN0PFxuICAgIFQsXG4gICAgVSBleHRlbmRzIElSZXF1ZXN0Q29uZmlnPFU+IGV4dGVuZHMgSU9sZFJlcU9wdGlvbnNcbiAgICAgID8gSU9sZFJlcU9wdGlvbnNcbiAgICAgIDogSVJlcXVlc3RDb25maWc8VT4gZXh0ZW5kcyBBeGlvc1JlcXVlc3RDb25maWdcbiAgICAgID8gQXhpb3NSZXF1ZXN0Q29uZmlnXG4gICAgICA6IG5ldmVyXG4gID4ob3B0aW9uczogVSk6IFByb21pc2U8SVJlc3BvbnNlPFQsIFU+PiB7XG4gICAgdGhpcy5vcHRpb25zLnByb3h5ID0gdGhpcy5oYW5kbGVQcm94eSgpXG4gICAgdGhpcy5vcHRpb25zLmhlYWRlcnMgPSBvcHRpb25zLmhlYWRlcnMgfHwge31cbiAgICB0aGlzLm9wdGlvbnMubWF4Qm9keUxlbmd0aCA9IEluZmluaXR5XG4gICAgdGhpcy5vcHRpb25zLm1heENvbnRlbnRMZW5ndGggPSBJbmZpbml0eVxuICAgIGlmICh0aGlzLm9wdGlvbnMucHJveHkgJiYgb3B0aW9ucy51cmw/LnN0YXJ0c1dpdGgoXCJodHRwczovL1wiKSkge1xuICAgICAgdGhpcy5vcHRpb25zLmh0dHBzQWdlbnQgPSB0dW5uZWwuaHR0cHNPdmVySHR0cCh7XG4gICAgICAgIHByb3h5OiB7XG4gICAgICAgICAgaG9zdDogdGhpcy5vcHRpb25zLnByb3h5Lmhvc3QsXG4gICAgICAgICAgcG9ydDogdGhpcy5vcHRpb25zLnByb3h5LnBvcnQsXG4gICAgICAgIH0sXG4gICAgICB9KVxuICAgICAgdGhpcy5vcHRpb25zLnByb3h5ID0gZmFsc2VcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5vcHRpb25zLmh0dHBzQWdlbnQgPSBodHRwc0FnZW50XG4gICAgfVxuICAgIC8vICFOT1RJQ0UgdGhpcy5vcHRpb25zICE9PSBvcHRpb25zXG4gICAgLy8gdGhpcy5vcHRpb25zIGlzIHRoZSBkZWZhdWx0IG9wdGlvbnNcbiAgICBjb25zdCBpbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSh0aGlzLm9wdGlvbnMpXG4gICAgaW5zdGFuY2UuaW50ZXJjZXB0b3JzLnJlc3BvbnNlLnVzZShyZXNwb25zZUludGVyY2VwdG9yLCByZXNwb25zZUVycm9ySGFuZGxlcilcblxuICAgIC8vIGNvbXBhdGlibGUgd2l0aCBvbGQgcmVxdWVzdCBvcHRpb25zIHRvIG5ldyBvcHRpb25zXG4gICAgY29uc3Qgb3B0ID0gcmVxdWVzdEludGVyY2VwdG9yKG9wdGlvbnMpXG5cbiAgICBpbnN0YW5jZS5pbnRlcmNlcHRvcnMucmVxdWVzdC51c2UoZnVuY3Rpb24gKG9iaikge1xuICAgICAgLy8gaGFuZGxlIENvbnRlbnQtVHlwZVxuICAgICAgbGV0IGNvbnRlbnRUeXBlID0gXCJcIlxuICAgICAgaWYgKG9iaj8uaGVhZGVycz8uY29udGVudFR5cGUpIHtcbiAgICAgICAgY29udGVudFR5cGUgPSBvYmouaGVhZGVycy5jb250ZW50VHlwZSBhcyBzdHJpbmdcbiAgICAgICAgZGVsZXRlIG9iai5oZWFkZXJzLmNvbnRlbnRUeXBlXG4gICAgICB9IGVsc2UgaWYgKG9iaj8uaGVhZGVycz8uQ29udGVudFR5cGUpIHtcbiAgICAgICAgY29udGVudFR5cGUgPSBvYmouaGVhZGVycy5Db250ZW50VHlwZSBhcyBzdHJpbmdcbiAgICAgICAgZGVsZXRlIG9iai5oZWFkZXJzLkNvbnRlbnRUeXBlXG4gICAgICB9IGVsc2UgaWYgKG9iaj8uaGVhZGVycz8uW1wiY29udGVudC10eXBlXCJdKSB7XG4gICAgICAgIGNvbnRlbnRUeXBlID0gb2JqLmhlYWRlcnNbXCJjb250ZW50LXR5cGVcIl0gYXMgc3RyaW5nXG4gICAgICAgIGRlbGV0ZSBvYmouaGVhZGVyc1tcImNvbnRlbnQtdHlwZVwiXVxuICAgICAgfVxuICAgICAgaWYgKGNvbnRlbnRUeXBlICE9PSBcIlwiICYmIG9iai5oZWFkZXJzKSB7XG4gICAgICAgIG9iai5oZWFkZXJzW1wiQ29udGVudC1UeXBlXCJdID0gY29udGVudFR5cGVcbiAgICAgIH1cbiAgICAgIHJldHVybiBvYmpcbiAgICB9KVxuICAgIGlmIChcInJlc29sdmVXaXRoRnVsbFJlc3BvbnNlXCIgaW4gb3B0aW9ucyAmJiBvcHRpb25zLnJlc29sdmVXaXRoRnVsbFJlc3BvbnNlKSB7XG4gICAgICByZXR1cm4gaW5zdGFuY2UucmVxdWVzdChvcHQpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBpbnN0YW5jZS5yZXF1ZXN0KG9wdCkudGhlbigocmVzKSA9PiB7XG4gICAgICAgIC8vIHVzZSBvbGQgcmVxdWVzdCBvcHRpb24gZm9ybWF0XG4gICAgICAgIGlmIChvcHQuX19pc09sZE9wdGlvbnMpIHtcbiAgICAgICAgICBpZiAoXCJqc29uXCIgaW4gb3B0aW9ucykge1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMuanNvbikge1xuICAgICAgICAgICAgICByZXR1cm4gcmVzLmRhdGFcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHJlcy5kYXRhKVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gcmVzLmRhdGFcbiAgICAgICAgfVxuICAgICAgfSkgYXMgUHJvbWlzZTxJUmVzcG9uc2U8VCwgVT4+XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFJlcXVlc3RcbiIsImltcG9ydCB7IElDb25maWcsIElQaWNHbyB9IGZyb20gXCIuLi90eXBlc1wiXG5pbXBvcnQgeyBKU09OU3RvcmUgfSBmcm9tIFwiQHBpY2dvL3N0b3JlXCJcbmltcG9ydCB7IElKU09OIH0gZnJvbSBcIkBwaWNnby9zdG9yZS9kaXN0L3R5cGVzXCJcblxuY2xhc3MgREIge1xuICBwcml2YXRlIHJlYWRvbmx5IGN0eDogSVBpY0dvXG4gIHByaXZhdGUgcmVhZG9ubHkgZGI6IEpTT05TdG9yZVxuICBjb25zdHJ1Y3RvcihjdHg6IElQaWNHbykge1xuICAgIHRoaXMuY3R4ID0gY3R4XG4gICAgdGhpcy5kYiA9IG5ldyBKU09OU3RvcmUodGhpcy5jdHguY29uZmlnUGF0aClcblxuICAgIGlmICghdGhpcy5kYi5oYXMoXCJwaWNCZWRcIikpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHRoaXMuZGIuc2V0KFwicGljQmVkXCIsIHtcbiAgICAgICAgICB1cGxvYWRlcjogXCJnaXRodWJcIixcbiAgICAgICAgICBjdXJyZW50OiBcImdpdGh1YlwiLFxuICAgICAgICB9KVxuICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgIHRoaXMuY3R4LmxvZy5lcnJvcihlKVxuICAgICAgICB0aHJvdyBlXG4gICAgICB9XG4gICAgfVxuICAgIGlmICghdGhpcy5kYi5oYXMoXCJwaWNnb1BsdWdpbnNcIikpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHRoaXMuZGIuc2V0KFwicGljZ29QbHVnaW5zXCIsIHt9KVxuICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgIHRoaXMuY3R4LmxvZy5lcnJvcihlKVxuICAgICAgICB0aHJvdyBlXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmVhZChmbHVzaD86IGJvb2xlYW4pOiBJSlNPTiB7XG4gICAgcmV0dXJuIHRoaXMuZGIucmVhZChmbHVzaClcbiAgfVxuXG4gIGdldChrZXkgPSBcIlwiKTogYW55IHtcbiAgICB0aGlzLnJlYWQodHJ1ZSlcbiAgICByZXR1cm4gdGhpcy5kYi5nZXQoa2V5KVxuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9leHBsaWNpdC1tb2R1bGUtYm91bmRhcnktdHlwZXNcbiAgc2V0KGtleTogc3RyaW5nLCB2YWx1ZTogYW55KTogdm9pZCB7XG4gICAgdGhpcy5yZWFkKHRydWUpXG4gICAgcmV0dXJuIHRoaXMuZGIuc2V0KGtleSwgdmFsdWUpXG4gIH1cblxuICBoYXMoa2V5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICB0aGlzLnJlYWQodHJ1ZSlcbiAgICByZXR1cm4gdGhpcy5kYi5oYXMoa2V5KVxuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9leHBsaWNpdC1tb2R1bGUtYm91bmRhcnktdHlwZXNcbiAgdW5zZXQoa2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpOiBib29sZWFuIHtcbiAgICB0aGlzLnJlYWQodHJ1ZSlcbiAgICByZXR1cm4gdGhpcy5kYi51bnNldChrZXksIHZhbHVlKVxuICB9XG5cbiAgc2F2ZUNvbmZpZyhjb25maWc6IFBhcnRpYWw8SUNvbmZpZz4pOiB2b2lkIHtcbiAgICBPYmplY3Qua2V5cyhjb25maWcpLmZvckVhY2goKG5hbWU6IHN0cmluZykgPT4ge1xuICAgICAgdGhpcy5zZXQobmFtZSwgY29uZmlnW25hbWVdKVxuICAgIH0pXG4gIH1cblxuICByZW1vdmVDb25maWcoY29uZmlnOiBJQ29uZmlnKTogdm9pZCB7XG4gICAgT2JqZWN0LmtleXMoY29uZmlnKS5mb3JFYWNoKChuYW1lOiBzdHJpbmcpID0+IHtcbiAgICAgIHRoaXMudW5zZXQobmFtZSwgY29uZmlnW25hbWVdKVxuICAgIH0pXG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgREJcblxuLy8gY29uc3QgaW5pdENvbmZpZyA9IChjb25maWdQYXRoOiBzdHJpbmcpOiBsb3dkYi5Mb3dkYlN5bmM8YW55PiA9PiB7XG4vLyB9XG5cbi8vIGNvbnN0IHNhdmVDb25maWcgPSAoY29uZmlnUGF0aDogc3RyaW5nLCBjb25maWc6IGFueSk6IHZvaWQgPT4ge1xuLy8gICBjb25zdCBkYiA9IGluaXRDb25maWcoY29uZmlnUGF0aClcbi8vICAgT2JqZWN0LmtleXMoY29uZmlnKS5mb3JFYWNoKChuYW1lOiBzdHJpbmcpID0+IHtcbi8vICAgICBkYi5yZWFkKCkuc2V0KG5hbWUsIGNvbmZpZ1tuYW1lXSkud3JpdGUoKVxuLy8gICB9KVxuLy8gfVxuXG4vLyBleHBvcnQge1xuLy8gaW5pdENvbmZpZyxcbi8vIHNhdmVDb25maWdcbi8vIH1cbiIsImltcG9ydCBzcGF3biBmcm9tIFwiY3Jvc3Mtc3Bhd25cIlxuaW1wb3J0IHtcbiAgSVJlc3VsdCxcbiAgSVByb2Nlc3NFbnYsXG4gIElQbHVnaW5Qcm9jZXNzUmVzdWx0LFxuICBJUGx1Z2luSGFuZGxlcixcbiAgSVBsdWdpbkhhbmRsZXJPcHRpb25zLFxuICBVbmRlZmluYWJsZSxcbiAgSVBpY0dvLFxuICBJUGx1Z2luSGFuZGxlclJlc3VsdCxcbn0gZnJvbSBcIi4uL3R5cGVzXCJcbmltcG9ydCB7IElCdWlsZEluRXZlbnQgfSBmcm9tIFwiLi4vdXRpbHMvZW51bVwiXG5pbXBvcnQgeyBnZXRQcm9jZXNzUGx1Z2luTmFtZSwgZ2V0Tm9ybWFsUGx1Z2luTmFtZSB9IGZyb20gXCIuLi91dGlscy9jb21tb25cIlxuaW1wb3J0IHsgSUxvY2FsZXNLZXkgfSBmcm9tIFwiLi4vaTE4bi96aC1DTlwiXG5cbmV4cG9ydCBjbGFzcyBQbHVnaW5IYW5kbGVyIGltcGxlbWVudHMgSVBsdWdpbkhhbmRsZXIge1xuICAvLyBUaGFua3MgdG8gZmVmbG93IC0+IGh0dHBzOi8vZ2l0aHViLmNvbS9mZWZsb3cvZmVmbG93L2Jsb2IvbWFzdGVyL2xpYi9pbnRlcm5hbC9pbnN0YWxsL3BsdWdpbi5qc1xuICBwcml2YXRlIHJlYWRvbmx5IGN0eDogSVBpY0dvXG4gIGNvbnN0cnVjdG9yKGN0eDogSVBpY0dvKSB7XG4gICAgdGhpcy5jdHggPSBjdHhcbiAgfVxuXG4gIGFzeW5jIGluc3RhbGwoXG4gICAgcGx1Z2luczogc3RyaW5nW10sXG4gICAgb3B0aW9ucz86IElQbHVnaW5IYW5kbGVyT3B0aW9ucyxcbiAgICBlbnY/OiBJUHJvY2Vzc0VudlxuICApOiBQcm9taXNlPElQbHVnaW5IYW5kbGVyUmVzdWx0PGJvb2xlYW4+PiB7XG4gICAgaWYgKCFvcHRpb25zKSB7XG4gICAgICBvcHRpb25zID0ge31cbiAgICB9XG4gICAgY29uc3QgaW5zdGFsbGVkUGx1Z2luczogc3RyaW5nW10gPSBbXVxuICAgIGNvbnN0IHByb2Nlc3NQbHVnaW5zID0gcGx1Z2luc1xuICAgICAgLm1hcCgoaXRlbTogc3RyaW5nKSA9PiBoYW5kbGVQbHVnaW5OYW1lUHJvY2Vzcyh0aGlzLmN0eCwgaXRlbSkpXG4gICAgICAuZmlsdGVyKChpdGVtKSA9PiB7XG4gICAgICAgIC8vIGRldGVjdCBpZiBoYXMgYWxyZWFkeSBpbnN0YWxsZWRcbiAgICAgICAgLy8gb3Igd2lsbCBjYXVzZSBlcnJvclxuICAgICAgICBpZiAodGhpcy5jdHgucGx1Z2luTG9hZGVyLmhhc1BsdWdpbihpdGVtLnBrZ05hbWUpKSB7XG4gICAgICAgICAgaW5zdGFsbGVkUGx1Z2lucy5wdXNoKGl0ZW0ucGtnTmFtZSlcbiAgICAgICAgICB0aGlzLmN0eC5sb2cuc3VjY2VzcyhgUGljR28gaGFzIGFscmVhZHkgaW5zdGFsbGVkICR7aXRlbS5wa2dOYW1lfWApXG4gICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgIH1cbiAgICAgICAgLy8gaWYgc29tZXRoaW5nIHdyb25nLCBmaWx0ZXIgaXQgb3V0XG4gICAgICAgIGlmICghaXRlbS5zdWNjZXNzKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH0pXG4gICAgY29uc3QgZnVsbE5hbWVMaXN0ID0gcHJvY2Vzc1BsdWdpbnMubWFwKChpdGVtKSA9PiBpdGVtLmZ1bGxOYW1lKVxuICAgIGNvbnN0IHBrZ05hbWVMaXN0ID0gcHJvY2Vzc1BsdWdpbnMubWFwKChpdGVtKSA9PiBpdGVtLnBrZ05hbWUpXG4gICAgaWYgKGZ1bGxOYW1lTGlzdC5sZW5ndGggPiAwKSB7XG4gICAgICAvLyBpbnN0YWxsIHBsdWdpbnMgbXVzdCB1c2UgZnVsbE5hbWVMaXN0OlxuICAgICAgLy8gMS4gaW5zdGFsbCByZW1vdGUgcGFjYWdlXG4gICAgICAvLyAyLiBpbnN0YWxsIGxvY2FsIHBhY2FnZVxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5leGVjQ29tbWFuZChcImluc3RhbGxcIiwgZnVsbE5hbWVMaXN0LCB0aGlzLmN0eC5iYXNlRGlyLCBvcHRpb25zLCBlbnYpXG4gICAgICBjb25zb2xlLmxvZyhcImV4ZWNDb21tYW5kIGluc3RhbGwgcmVzdWx0PT5cIiwgcmVzdWx0KVxuICAgICAgaWYgKCFyZXN1bHQuY29kZSkge1xuICAgICAgICBwa2dOYW1lTGlzdC5mb3JFYWNoKChwbHVnaW5OYW1lOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICB0aGlzLmN0eC5wbHVnaW5Mb2FkZXIucmVnaXN0ZXJQbHVnaW4ocGx1Z2luTmFtZSlcbiAgICAgICAgfSlcbiAgICAgICAgdGhpcy5jdHgubG9nLnN1Y2Nlc3ModGhpcy5jdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KFwiUExVR0lOX0hBTkRMRVJfUExVR0lOX0lOU1RBTExfU1VDQ0VTU1wiKSlcbiAgICAgICAgdGhpcy5jdHguZW1pdChcImluc3RhbGxTdWNjZXNzXCIsIHtcbiAgICAgICAgICB0aXRsZTogdGhpcy5jdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KFwiUExVR0lOX0hBTkRMRVJfUExVR0lOX0lOU1RBTExfU1VDQ0VTU1wiKSxcbiAgICAgICAgICBib2R5OiBbLi4ucGtnTmFtZUxpc3QsIC4uLmluc3RhbGxlZFBsdWdpbnNdLFxuICAgICAgICB9KVxuICAgICAgICBjb25zdCByZXM6IElQbHVnaW5IYW5kbGVyUmVzdWx0PHRydWU+ID0ge1xuICAgICAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICAgICAgYm9keTogWy4uLnBrZ05hbWVMaXN0LCAuLi5pbnN0YWxsZWRQbHVnaW5zXSxcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBlcnIgPSB0aGlzLmN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oXCJQTFVHSU5fSEFORExFUl9QTFVHSU5fSU5TVEFMTF9GQUlMRURfUkVBU09OXCIsIHtcbiAgICAgICAgICBjb2RlOiBgJHtyZXN1bHQuY29kZX1gLFxuICAgICAgICAgIGRhdGE6IHJlc3VsdC5kYXRhLFxuICAgICAgICB9KVxuICAgICAgICB0aGlzLmN0eC5sb2cuZXJyb3IoZXJyKVxuICAgICAgICB0aGlzLmN0eC5lbWl0KFwiaW5zdGFsbEZhaWxlZFwiLCB7XG4gICAgICAgICAgdGl0bGU6IHRoaXMuY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PihcIlBMVUdJTl9IQU5ETEVSX1BMVUdJTl9JTlNUQUxMX0ZBSUxFRFwiKSxcbiAgICAgICAgICBib2R5OiBlcnIsXG4gICAgICAgIH0pXG4gICAgICAgIGNvbnN0IHJlczogSVBsdWdpbkhhbmRsZXJSZXN1bHQ8ZmFsc2U+ID0ge1xuICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgIGJvZHk6IGVycixcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChpbnN0YWxsZWRQbHVnaW5zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgY29uc3QgZXJyID0gdGhpcy5jdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KFwiUExVR0lOX0hBTkRMRVJfUExVR0lOX1VOSU5TVEFMTF9GQUlMRURfVkFMSURcIilcbiAgICAgIHRoaXMuY3R4LmxvZy5lcnJvcihlcnIpXG4gICAgICB0aGlzLmN0eC5lbWl0KFwiaW5zdGFsbEZhaWxlZFwiLCB7XG4gICAgICAgIHRpdGxlOiB0aGlzLmN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oXCJQTFVHSU5fSEFORExFUl9QTFVHSU5fSU5TVEFMTF9GQUlMRURcIiksXG4gICAgICAgIGJvZHk6IGVycixcbiAgICAgIH0pXG4gICAgICBjb25zdCByZXM6IElQbHVnaW5IYW5kbGVyUmVzdWx0PGZhbHNlPiA9IHtcbiAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgIGJvZHk6IGVycixcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXNcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jdHgubG9nLnN1Y2Nlc3ModGhpcy5jdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KFwiUExVR0lOX0hBTkRMRVJfUExVR0lOX0lOU1RBTExfU1VDQ0VTU1wiKSlcbiAgICAgIHRoaXMuY3R4LmVtaXQoXCJpbnN0YWxsU3VjY2Vzc1wiLCB7XG4gICAgICAgIHRpdGxlOiB0aGlzLmN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oXCJQTFVHSU5fSEFORExFUl9QTFVHSU5fSU5TVEFMTF9TVUNDRVNTXCIpLFxuICAgICAgICBib2R5OiBbLi4ucGtnTmFtZUxpc3QsIC4uLmluc3RhbGxlZFBsdWdpbnNdLFxuICAgICAgfSlcbiAgICAgIGNvbnN0IHJlczogSVBsdWdpbkhhbmRsZXJSZXN1bHQ8dHJ1ZT4gPSB7XG4gICAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICAgIGJvZHk6IFsuLi5wa2dOYW1lTGlzdCwgLi4uaW5zdGFsbGVkUGx1Z2luc10sXG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzXG4gICAgfVxuICB9XG5cbiAgYXN5bmMgdW5pbnN0YWxsKFxuICAgIHBsdWdpbnM6IHN0cmluZ1tdLFxuICAgIG9wdGlvbnM/OiBJUGx1Z2luSGFuZGxlck9wdGlvbnMsXG4gICAgZW52PzogSVByb2Nlc3NFbnZcbiAgKTogUHJvbWlzZTxJUGx1Z2luSGFuZGxlclJlc3VsdDxib29sZWFuPj4ge1xuICAgIGlmICghb3B0aW9ucykge1xuICAgICAgb3B0aW9ucyA9IHt9XG4gICAgfVxuICAgIGNvbnN0IHByb2Nlc3NQbHVnaW5zID0gcGx1Z2luc1xuICAgICAgLm1hcCgoaXRlbTogc3RyaW5nKSA9PiBoYW5kbGVQbHVnaW5OYW1lUHJvY2Vzcyh0aGlzLmN0eCwgaXRlbSkpXG4gICAgICAuZmlsdGVyKChpdGVtKSA9PiBpdGVtLnN1Y2Nlc3MpXG4gICAgY29uc3QgcGtnTmFtZUxpc3QgPSBwcm9jZXNzUGx1Z2lucy5tYXAoKGl0ZW0pID0+IGl0ZW0ucGtnTmFtZSlcbiAgICBpZiAocGtnTmFtZUxpc3QubGVuZ3RoID4gMCkge1xuICAgICAgLy8gdW5pbnN0YWxsIHBsdWdpbnMgbXVzdCB1c2UgcGtnTmFtZUxpc3Q6XG4gICAgICAvLyBucG0gdW5pbnN0YWxsIHdpbGwgdXNlIHRoZSBwYWNrYWdlLmpzb24ncyBuYW1lXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmV4ZWNDb21tYW5kKFwidW5pbnN0YWxsXCIsIHBrZ05hbWVMaXN0LCB0aGlzLmN0eC5iYXNlRGlyLCBvcHRpb25zLCBlbnYpXG4gICAgICBjb25zb2xlLmxvZyhcImV4ZWNDb21tYW5kIHVuaW5zdGFsbCByZXN1bHQ9PlwiLCByZXN1bHQpXG4gICAgICBpZiAoIXJlc3VsdC5jb2RlKSB7XG4gICAgICAgIHBrZ05hbWVMaXN0LmZvckVhY2goKHBsdWdpbk5hbWU6IHN0cmluZykgPT4ge1xuICAgICAgICAgIHRoaXMuY3R4LnBsdWdpbkxvYWRlci51bnJlZ2lzdGVyUGx1Z2luKHBsdWdpbk5hbWUpXG4gICAgICAgIH0pXG4gICAgICAgIHRoaXMuY3R4LmxvZy5zdWNjZXNzKHRoaXMuY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PihcIlBMVUdJTl9IQU5ETEVSX1BMVUdJTl9VTklOU1RBTExfU1VDQ0VTU1wiKSlcbiAgICAgICAgdGhpcy5jdHguZW1pdChcInVuaW5zdGFsbFN1Y2Nlc3NcIiwge1xuICAgICAgICAgIHRpdGxlOiB0aGlzLmN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oXCJQTFVHSU5fSEFORExFUl9QTFVHSU5fVU5JTlNUQUxMX1NVQ0NFU1NcIiksXG4gICAgICAgICAgYm9keTogcGtnTmFtZUxpc3QsXG4gICAgICAgIH0pXG4gICAgICAgIGNvbnN0IHJlczogSVBsdWdpbkhhbmRsZXJSZXN1bHQ8dHJ1ZT4gPSB7XG4gICAgICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgICAgICBib2R5OiBwa2dOYW1lTGlzdCxcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBlcnIgPSB0aGlzLmN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oXCJQTFVHSU5fSEFORExFUl9QTFVHSU5fVU5JTlNUQUxMX0ZBSUxFRF9SRUFTT05cIiwge1xuICAgICAgICAgIGNvZGU6IGAke3Jlc3VsdC5jb2RlfWAsXG4gICAgICAgICAgZGF0YTogcmVzdWx0LmRhdGEsXG4gICAgICAgIH0pXG4gICAgICAgIHRoaXMuY3R4LmxvZy5lcnJvcihlcnIpXG4gICAgICAgIHRoaXMuY3R4LmVtaXQoXCJ1bmluc3RhbGxGYWlsZWRcIiwge1xuICAgICAgICAgIHRpdGxlOiB0aGlzLmN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oXCJQTFVHSU5fSEFORExFUl9QTFVHSU5fVU5JTlNUQUxMX0ZBSUxFRFwiKSxcbiAgICAgICAgICBib2R5OiBlcnIsXG4gICAgICAgIH0pXG4gICAgICAgIGNvbnN0IHJlczogSVBsdWdpbkhhbmRsZXJSZXN1bHQ8ZmFsc2U+ID0ge1xuICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgIGJvZHk6IGVycixcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGVyciA9IHRoaXMuY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PihcIlBMVUdJTl9IQU5ETEVSX1BMVUdJTl9VTklOU1RBTExfRkFJTEVEX1ZBTElEXCIpXG4gICAgICB0aGlzLmN0eC5sb2cuZXJyb3IoZXJyKVxuICAgICAgdGhpcy5jdHguZW1pdChcInVuaW5zdGFsbEZhaWxlZFwiLCB7XG4gICAgICAgIHRpdGxlOiB0aGlzLmN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oXCJQTFVHSU5fSEFORExFUl9QTFVHSU5fVU5JTlNUQUxMX0ZBSUxFRFwiKSxcbiAgICAgICAgYm9keTogZXJyLFxuICAgICAgfSlcbiAgICAgIGNvbnN0IHJlczogSVBsdWdpbkhhbmRsZXJSZXN1bHQ8ZmFsc2U+ID0ge1xuICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgYm9keTogZXJyLFxuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHVwZGF0ZShcbiAgICBwbHVnaW5zOiBzdHJpbmdbXSxcbiAgICBvcHRpb25zPzogSVBsdWdpbkhhbmRsZXJPcHRpb25zLFxuICAgIGVudj86IElQcm9jZXNzRW52XG4gICk6IFByb21pc2U8SVBsdWdpbkhhbmRsZXJSZXN1bHQ8Ym9vbGVhbj4+IHtcbiAgICBpZiAoIW9wdGlvbnMpIHtcbiAgICAgIG9wdGlvbnMgPSB7fVxuICAgIH1cbiAgICBjb25zdCBwcm9jZXNzUGx1Z2lucyA9IHBsdWdpbnNcbiAgICAgIC5tYXAoKGl0ZW06IHN0cmluZykgPT4gaGFuZGxlUGx1Z2luTmFtZVByb2Nlc3ModGhpcy5jdHgsIGl0ZW0pKVxuICAgICAgLmZpbHRlcigoaXRlbSkgPT4gaXRlbS5zdWNjZXNzKVxuICAgIGNvbnN0IHBrZ05hbWVMaXN0ID0gcHJvY2Vzc1BsdWdpbnMubWFwKChpdGVtKSA9PiBpdGVtLnBrZ05hbWUpXG4gICAgaWYgKHBrZ05hbWVMaXN0Lmxlbmd0aCA+IDApIHtcbiAgICAgIC8vIHVwZGF0ZSBwbHVnaW5zIG11c3QgdXNlIHBrZ05hbWVMaXN0OlxuICAgICAgLy8gbnBtIHVwZGF0ZSB3aWxsIHVzZSB0aGUgcGFja2FnZS5qc29uJ3MgbmFtZVxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5leGVjQ29tbWFuZChcInVwZGF0ZVwiLCBwa2dOYW1lTGlzdCwgdGhpcy5jdHguYmFzZURpciwgb3B0aW9ucywgZW52KVxuICAgICAgY29uc29sZS5sb2coXCJleGVjQ29tbWFuZCB1cGRhdGUgcmVzdWx0PT5cIiwgcmVzdWx0KVxuICAgICAgaWYgKCFyZXN1bHQuY29kZSkge1xuICAgICAgICB0aGlzLmN0eC5sb2cuc3VjY2Vzcyh0aGlzLmN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oXCJQTFVHSU5fSEFORExFUl9QTFVHSU5fVVBEQVRFX1NVQ0NFU1NcIikpXG4gICAgICAgIHRoaXMuY3R4LmVtaXQoXCJ1cGRhdGVTdWNjZXNzXCIsIHtcbiAgICAgICAgICB0aXRsZTogdGhpcy5jdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KFwiUExVR0lOX0hBTkRMRVJfUExVR0lOX1VQREFURV9TVUNDRVNTXCIpLFxuICAgICAgICAgIGJvZHk6IHBrZ05hbWVMaXN0LFxuICAgICAgICB9KVxuICAgICAgICBjb25zdCByZXM6IElQbHVnaW5IYW5kbGVyUmVzdWx0PHRydWU+ID0ge1xuICAgICAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICAgICAgYm9keTogcGtnTmFtZUxpc3QsXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgZXJyID0gdGhpcy5jdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KFwiUExVR0lOX0hBTkRMRVJfUExVR0lOX1VQREFURV9GQUlMRURfUkVBU09OXCIsIHtcbiAgICAgICAgICBjb2RlOiBgJHtyZXN1bHQuY29kZX1gLFxuICAgICAgICAgIGRhdGE6IHJlc3VsdC5kYXRhLFxuICAgICAgICB9KVxuICAgICAgICB0aGlzLmN0eC5sb2cuZXJyb3IoZXJyKVxuICAgICAgICB0aGlzLmN0eC5lbWl0KFwidXBkYXRlRmFpbGVkXCIsIHtcbiAgICAgICAgICB0aXRsZTogdGhpcy5jdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KFwiUExVR0lOX0hBTkRMRVJfUExVR0lOX1VQREFURV9GQUlMRURcIiksXG4gICAgICAgICAgYm9keTogZXJyLFxuICAgICAgICB9KVxuICAgICAgICBjb25zdCByZXM6IElQbHVnaW5IYW5kbGVyUmVzdWx0PGZhbHNlPiA9IHtcbiAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICBib2R5OiBlcnIsXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBlcnIgPSB0aGlzLmN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oXCJQTFVHSU5fSEFORExFUl9QTFVHSU5fVVBEQVRFX0ZBSUxFRF9WQUxJRFwiKVxuICAgICAgdGhpcy5jdHgubG9nLmVycm9yKGVycilcbiAgICAgIHRoaXMuY3R4LmVtaXQoXCJ1cGRhdGVGYWlsZWRcIiwge1xuICAgICAgICB0aXRsZTogdGhpcy5jdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KFwiUExVR0lOX0hBTkRMRVJfUExVR0lOX1VQREFURV9GQUlMRURcIiksXG4gICAgICAgIGJvZHk6IGVycixcbiAgICAgIH0pXG4gICAgICBjb25zdCByZXM6IElQbHVnaW5IYW5kbGVyUmVzdWx0PGZhbHNlPiA9IHtcbiAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgIGJvZHk6IGVycixcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXNcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGV4ZWNDb21tYW5kKFxuICAgIGNtZDogc3RyaW5nLFxuICAgIG1vZHVsZXM6IHN0cmluZ1tdLFxuICAgIHdoZXJlOiBzdHJpbmcsXG4gICAgb3B0aW9uczogSVBsdWdpbkhhbmRsZXJPcHRpb25zID0ge30sXG4gICAgZW52OiBJUHJvY2Vzc0VudiA9IHt9XG4gICk6IFByb21pc2U8SVJlc3VsdD4ge1xuICAgIC8vIG9wdGlvbnMgZmlyc3RcbiAgICBjb25zdCByZWdpc3RyeSA9IG9wdGlvbnMucmVnaXN0cnkgfHwgdGhpcy5jdHguZ2V0Q29uZmlnPFVuZGVmaW5hYmxlPHN0cmluZz4+KFwic2V0dGluZ3MucmVnaXN0cnlcIilcbiAgICBjb25zdCBwcm94eSA9IG9wdGlvbnMucHJveHkgfHwgdGhpcy5jdHguZ2V0Q29uZmlnPFVuZGVmaW5hYmxlPHN0cmluZz4+KFwic2V0dGluZ3MucHJveHlcIilcbiAgICByZXR1cm4gYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmU6IGFueSk6IHZvaWQgPT4ge1xuICAgICAgbGV0IGFyZ3MgPSBbY21kXS5jb25jYXQobW9kdWxlcykuY29uY2F0KFwiLS1jb2xvcj1hbHdheXNcIikuY29uY2F0KFwiLS1zYXZlXCIpXG4gICAgICBpZiAocmVnaXN0cnkpIHtcbiAgICAgICAgYXJncyA9IGFyZ3MuY29uY2F0KGAtLXJlZ2lzdHJ5PSR7cmVnaXN0cnl9YClcbiAgICAgIH1cbiAgICAgIGlmIChwcm94eSkge1xuICAgICAgICBhcmdzID0gYXJncy5jb25jYXQoYC0tcHJveHk9JHtwcm94eX1gKVxuICAgICAgfVxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgbnBtT3B0aW9ucyA9IHsgY3dkOiB3aGVyZSwgZW52OiBPYmplY3QuYXNzaWduKHt9LCBwcm9jZXNzLmVudiwgZW52KSB9XG4gICAgICAgIGNvbnNvbGUubG9nKFwiU3RhcnQgcnVuIG5wbSwgYXJncz0+XCIsIGFyZ3MpXG4gICAgICAgIGNvbnNvbGUubG9nKFwiU3RhcnQgcnVuIG5wbSwgbnBtT3B0aW9ucz0+XCIsIG5wbU9wdGlvbnMpXG4gICAgICAgIGNvbnN0IG5wbSA9IHNwYXduKFwibnBtXCIsIGFyZ3MsIG5wbU9wdGlvbnMpXG5cbiAgICAgICAgbGV0IG91dHB1dCA9IFwiXCJcbiAgICAgICAgbnBtLnN0ZG91dFxuICAgICAgICAgID8ub24oXCJkYXRhXCIsIChkYXRhOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgIG91dHB1dCArPSBkYXRhXG4gICAgICAgICAgfSlcbiAgICAgICAgICAucGlwZShwcm9jZXNzLnN0ZG91dClcblxuICAgICAgICBucG0uc3RkZXJyXG4gICAgICAgICAgPy5vbihcImRhdGFcIiwgKGRhdGE6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgb3V0cHV0ICs9IGRhdGFcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5waXBlKHByb2Nlc3Muc3RkZXJyKVxuXG4gICAgICAgIG5wbS5vbihcImNsb3NlXCIsIChjb2RlOiBudW1iZXIpID0+IHtcbiAgICAgICAgICBpZiAoIWNvZGUpIHtcbiAgICAgICAgICAgIHJlc29sdmUoeyBjb2RlOiAwLCBkYXRhOiBvdXRwdXQgfSlcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzb2x2ZSh7IGNvZGU6IGNvZGUsIGRhdGE6IG91dHB1dCB9KVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgLy8gZm9yIHVzZXJzIHdobyBoYXZlbid0IGluc3RhbGxlZCBub2RlLmpzXG4gICAgICAgIG5wbS5vbihcImVycm9yXCIsIChlcnI6IEVycm9yKSA9PiB7XG4gICAgICAgICAgdGhpcy5jdHgubG9nLmVycm9yKGVycilcbiAgICAgICAgICB0aGlzLmN0eC5sb2cuZXJyb3IoXCJOUE0gaXMgbm90IGluc3RhbGxlZFwiKVxuICAgICAgICAgIHRoaXMuY3R4LmVtaXQoSUJ1aWxkSW5FdmVudC5GQUlMRUQsIFwiTlBNIGlzIG5vdCBpbnN0YWxsZWRcIilcbiAgICAgICAgfSlcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdGhpcy5jdHgubG9nLmVycm9yKGUgYXMgRXJyb3IpXG4gICAgICAgIHRoaXMuY3R4LmVtaXQoSUJ1aWxkSW5FdmVudC5GQUlMRUQsIGUpXG4gICAgICB9XG4gICAgfSlcbiAgfVxufVxuXG4vKipcbiAqIHRyYW5zZm9ybSB0aGUgaW5wdXQgcGx1Z2luIG5hbWUgb3IgcGF0aCBzdHJpbmcgdG8gdmFsaWQgcmVzdWx0XG4gKiBAcGFyYW0gY3R4XG4gKiBAcGFyYW0gbmFtZU9yUGF0aFxuICovXG5jb25zdCBoYW5kbGVQbHVnaW5OYW1lUHJvY2VzcyA9IChjdHg6IElQaWNHbywgbmFtZU9yUGF0aDogc3RyaW5nKTogSVBsdWdpblByb2Nlc3NSZXN1bHQgPT4ge1xuICBjb25zdCByZXMgPSB7XG4gICAgc3VjY2VzczogZmFsc2UsXG4gICAgZnVsbE5hbWU6IFwiXCIsXG4gICAgcGtnTmFtZTogXCJcIixcbiAgfVxuICBjb25zdCByZXN1bHQgPSBnZXRQcm9jZXNzUGx1Z2luTmFtZShuYW1lT3JQYXRoLCBjdHgubG9nKVxuICBpZiAoIXJlc3VsdCkge1xuICAgIHJldHVybiByZXNcbiAgfVxuICAvLyBmaXJzdCBnZXQgcmVzdWx0IHRoZW4gZG8gdGhpcyBwcm9jZXNzXG4gIC8vIG9yIHNvbWUgZXJyb3Igd2lsbCBsb2cgdHdpY2VcbiAgY29uc3QgcGtnTmFtZSA9IGdldE5vcm1hbFBsdWdpbk5hbWUocmVzdWx0LCBjdHgubG9nKVxuICBpZiAoIXBrZ05hbWUpIHtcbiAgICByZXR1cm4gcmVzXG4gIH1cbiAgcmV0dXJuIHtcbiAgICBzdWNjZXNzOiB0cnVlLFxuICAgIGZ1bGxOYW1lOiByZXN1bHQsXG4gICAgcGtnTmFtZSxcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBQbHVnaW5IYW5kbGVyXG4iLCJpbXBvcnQgeyBaSF9DTiwgSUxvY2FsZXNLZXksIElMb2NhbGVzIH0gZnJvbSBcIi4vemgtQ05cIlxuaW1wb3J0IHsgbWVyZ2UgfSBmcm9tIFwibG9kYXNoXCJcbmltcG9ydCB7IElQaWNHbyB9IGZyb20gXCIuLi90eXBlc1wiXG5pbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiXG5pbXBvcnQgZnMgZnJvbSBcImZzLWV4dHJhXCJcbmltcG9ydCB5YW1sIGZyb20gXCJqcy15YW1sXCJcblxuaW1wb3J0IHsgT2JqZWN0QWRhcHRlciwgSTE4biB9IGZyb20gXCJAcGljZ28vaTE4blwiXG5pbXBvcnQgeyBJU3RyaW5nS2V5TWFwLCBJSTE4bk1hbmFnZXIgfSBmcm9tIFwiLi4vdHlwZXMvaW5kZXhcIlxuaW1wb3J0IHsgSUxvY2FsZSB9IGZyb20gXCJAcGljZ28vaTE4bi9kaXN0L3R5cGVzXCJcbmltcG9ydCB7IEVOIH0gZnJvbSBcIi4vZW5cIlxuaW1wb3J0IHsgWkhfVFcgfSBmcm9tIFwiLi96aC1UV1wiXG5cbmNvbnN0IGxhbmd1YWdlTGlzdDogSVN0cmluZ0tleU1hcDxJU3RyaW5nS2V5TWFwPHN0cmluZz4+ID0ge1xuICBcInpoLUNOXCI6IFpIX0NOLFxuICBcInpoLVRXXCI6IFpIX1RXLFxuICBlbjogRU4sXG59XG5cbmNsYXNzIEkxOG5NYW5hZ2VyIGltcGxlbWVudHMgSUkxOG5NYW5hZ2VyIHtcbiAgcHJpdmF0ZSByZWFkb25seSBpMThuOiBJMThuXG4gIHByaXZhdGUgcmVhZG9ubHkgb2JqZWN0QWRhcHRlcjogT2JqZWN0QWRhcHRlclxuICBwcml2YXRlIHJlYWRvbmx5IGN0eDogSVBpY0dvXG4gIGNvbnN0cnVjdG9yKGN0eDogSVBpY0dvKSB7XG4gICAgdGhpcy5jdHggPSBjdHhcbiAgICB0aGlzLm9iamVjdEFkYXB0ZXIgPSBuZXcgT2JqZWN0QWRhcHRlcihsYW5ndWFnZUxpc3QpXG4gICAgbGV0IGxhbmd1YWdlID0gdGhpcy5jdHguZ2V0Q29uZmlnPHN0cmluZz4oXCJzZXR0aW5ncy5sYW5ndWFnZVwiKSB8fCBcInpoLUNOXCJcbiAgICBpZiAoIWxhbmd1YWdlTGlzdFtsYW5ndWFnZV0pIHtcbiAgICAgIGxhbmd1YWdlID0gXCJ6aC1DTlwiIC8vIHVzZSBkZWZhdWx0XG4gICAgfVxuICAgIHRoaXMuaTE4biA9IG5ldyBJMThuKHtcbiAgICAgIGFkYXB0ZXI6IHRoaXMub2JqZWN0QWRhcHRlcixcbiAgICAgIGRlZmF1bHRMYW5ndWFnZTogbGFuZ3VhZ2UsXG4gICAgfSlcbiAgICB0aGlzLmxvYWRPdXR0ZXJJMThuKClcbiAgfVxuXG4gIHByaXZhdGUgbG9hZE91dHRlckkxOG4oKTogdm9pZCB7XG4gICAgY29uc3QgaTE4bkZvbGRlciA9IHRoaXMuZ2V0T3V0dGVySTE4bkZvbGRlcigpXG4gICAgY29uc3QgZmlsZXMgPSBmcy5yZWFkZGlyU3luYyhpMThuRm9sZGVyLCB7XG4gICAgICB3aXRoRmlsZVR5cGVzOiB0cnVlLFxuICAgIH0pXG4gICAgZmlsZXMuZm9yRWFjaCgoZmlsZSkgPT4ge1xuICAgICAgaWYgKGZpbGUuaXNGaWxlKCkgJiYgZmlsZS5uYW1lLmVuZHNXaXRoKFwiLnltbFwiKSkge1xuICAgICAgICBjb25zdCBpMThuRmlsZVBhdGggPSBwYXRoLmpvaW4oaTE4bkZvbGRlciwgZmlsZS5uYW1lKVxuICAgICAgICBjb25zdCBpMThuRmlsZSA9IGZzLnJlYWRGaWxlU3luYyhpMThuRmlsZVBhdGgsIFwidXRmOFwiKVxuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IGkxOG5GaWxlT2JqID0geWFtbC5sb2FkKGkxOG5GaWxlKSBhcyBJTG9jYWxlc1xuICAgICAgICAgIGxhbmd1YWdlTGlzdFtmaWxlLm5hbWUucmVwbGFjZSgvXFwueW1sJC8sIFwiXCIpXSA9IGkxOG5GaWxlT2JqXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGUpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRPdXR0ZXJJMThuRm9sZGVyKCk6IHN0cmluZyB7XG4gICAgY29uc3QgaTE4bkZvbGRlciA9IHBhdGguam9pbih0aGlzLmN0eC5iYXNlRGlyLCBcImkxOG4tY2xpXCIpXG4gICAgaWYgKCFmcy5wYXRoRXhpc3RzU3luYyhpMThuRm9sZGVyKSkge1xuICAgICAgZnMuZW5zdXJlRGlyU3luYyhpMThuRm9sZGVyKVxuICAgIH1cbiAgICByZXR1cm4gaTE4bkZvbGRlclxuICB9XG5cbiAgdHJhbnNsYXRlPFQgZXh0ZW5kcyBzdHJpbmc+KGtleTogSUxvY2FsZXNLZXkgfCBULCBhcmdzPzogSVN0cmluZ0tleU1hcDxzdHJpbmc+KTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5pMThuLnRyYW5zbGF0ZShrZXksIGFyZ3MpIHx8IGtleVxuICB9XG5cbiAgc2V0TGFuZ3VhZ2UobGFuZ3VhZ2U6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuaTE4bi5zZXRMYW5ndWFnZShsYW5ndWFnZSlcbiAgICB0aGlzLmN0eC5zYXZlQ29uZmlnKHtcbiAgICAgIFwic2V0dGluZ3MubGFuZ3VhZ2VcIjogbGFuZ3VhZ2UsXG4gICAgfSlcbiAgfVxuXG4gIGFkZExvY2FsZShsYW5ndWFnZTogc3RyaW5nLCBsb2NhbGVzOiBJTG9jYWxlKTogYm9vbGVhbiB7XG4gICAgY29uc3Qgb3JpZ2luTG9jYWxlcyA9IHRoaXMub2JqZWN0QWRhcHRlci5nZXRMb2NhbGUobGFuZ3VhZ2UpXG4gICAgaWYgKCFvcmlnaW5Mb2NhbGVzKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gICAgY29uc3QgbmV3TG9jYWxlcyA9IG1lcmdlKG9yaWdpbkxvY2FsZXMsIGxvY2FsZXMpXG4gICAgdGhpcy5vYmplY3RBZGFwdGVyLnNldExvY2FsZShsYW5ndWFnZSwgbmV3TG9jYWxlcylcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgYWRkTGFuZ3VhZ2UobGFuZ3VhZ2U6IHN0cmluZywgbG9jYWxlczogSUxvY2FsZSk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IG9yaWdpbkxvY2FsZXMgPSB0aGlzLm9iamVjdEFkYXB0ZXIuZ2V0TG9jYWxlKGxhbmd1YWdlKVxuICAgIGlmIChvcmlnaW5Mb2NhbGVzKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gICAgdGhpcy5vYmplY3RBZGFwdGVyLnNldExvY2FsZShsYW5ndWFnZSwgbG9jYWxlcylcbiAgICBsYW5ndWFnZUxpc3RbbGFuZ3VhZ2VdID0gbG9jYWxlc1xuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICBnZXRMYW5ndWFnZUxpc3QoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBPYmplY3Qua2V5cyhsYW5ndWFnZUxpc3QpXG4gIH1cbn1cblxuZXhwb3J0IHsgSTE4bk1hbmFnZXIgfVxuIiwiLyogZXNsaW50LWRpc2FibGUgbm8tdGVtcGxhdGUtY3VybHktaW4tc3RyaW5nICovXG5leHBvcnQgY29uc3QgWkhfQ04gPSB7XG4gIFVQTE9BRF9GQUlMRUQ6IFwi5LiK5Lyg5aSx6LSlXCIsXG4gIENIRUNLX1NFVFRJTkdTOiBcIuivt+ajgOafpeS9oOeahOmFjee9rumhueaYr+WQpuato+ehrlwiLFxuICBDSEVDS19TRVRUSU5HU19BTkRfTkVUV09SSzogXCLor7fmo4Dmn6XkvaDnmoTphY3nva7pobnku6Xlj4rnvZHnu5xcIixcbiAgVVBMT0FEX0ZBSUxFRF9SRUFTT046IFwi6ZSZ6K+v56CB77yaJHtjb2Rlfe+8jOivt+aJk+W8gOa1j+iniOWZqOeymOi0tOWcsOWdgOafpeeci+ebuOWFs+WOn+WboFwiLFxuICBTRVJWRVJfRVJST1I6IFwi5pyN5Yqh56uv5Ye66ZSZ77yM6K+36YeN6K+VXCIsXG4gIEFVVEhfRkFJTEVEOiBcIuiupOivgeWksei0pVwiLFxuXG4gIC8vIHNtbXNcbiAgUElDQkVEX1NNTVM6IFwiU00uTVNcIixcbiAgUElDQkVEX1NNTVNfVE9LRU46IFwi6K6+5a6aVG9rZW5cIixcbiAgUElDQkVEX1NNTVNfQkFDS1VQX0RPTUFJTjogXCLlpIfnlKjkuIrkvKDln5/lkI1cIixcbiAgUElDQkVEX1NNTVNfTUVTU0FHRV9CQUNLVVBfRE9NQUlOOiBcIuS+i+WmgiBzbW1zLmFwcFwiLFxuXG4gIC8vIEFsaS1jbG91ZFxuICBQSUNCRURfQUxJQ0xPVUQ6IFwi6Zi/6YeM5LqRT1NTXCIsXG4gIFBJQ0JFRF9BTElDTE9VRF9BQ0NFU1NLRVlJRDogXCLorr7lrppLZXlJZFwiLFxuICBQSUNCRURfQUxJQ0xPVURfQUNDRVNTS0VZU0VDUkVUOiBcIuiuvuWumktleVNlY3JldFwiLFxuICBQSUNCRURfQUxJQ0xPVURfQlVDS0VUOiBcIuiuvuWumkJ1Y2tldFwiLFxuICBQSUNCRURfQUxJQ0xPVURfQVJFQTogXCLorr7lrprlrZjlgqjljLrln59cIixcbiAgUElDQkVEX0FMSUNMT1VEX1BBVEg6IFwi6K6+5a6a5a2Y5YKo6Lev5b6EXCIsXG4gIFBJQ0JFRF9BTElDTE9VRF9DVVNUT01VUkw6IFwi6K6+5a6a6Ieq5a6a5LmJ5Z+f5ZCNXCIsXG4gIFBJQ0JFRF9BTElDTE9VRF9PUFRJT05TOiBcIuiuvuWumue9keWdgOWQjue8gFwiLFxuICBQSUNCRURfQUxJQ0xPVURfTUVTU0FHRV9BUkVBOiBcIuS+i+Wmgu+8mm9zcy1jbi1iZWlqaW5nXCIsXG4gIFBJQ0JFRF9BTElDTE9VRF9NRVNTQUdFX1BBVEg6IFwi5L6L5aaC77yadGVzdC9cIixcbiAgUElDQkVEX0FMSUNMT1VEX01FU1NBR0VfT1BUSU9OUzogXCLkvovlpoLvvJo/eC1vc3MtcHJvY2Vzcz14eHhcIixcbiAgUElDQkVEX0FMSUNMT1VEX01FU1NBR0VfQ1VTVE9NVVJMOiBcIuS+i+Wmgu+8mmh0dHBzOi8vdGVzdC5jb21cIixcblxuICAvLyBUZW5jZW50LWNsb3VkXG4gIFBJQ0JFRF9URU5DRU5UQ0xPVUQ6IFwi6IW+6K6v5LqRQ09TXCIsXG4gIFBJQ0JFRF9URU5DRU5UQ0xPVURfVkVSU0lPTjogXCJDT1PniYjmnKxcIixcbiAgUElDQkVEX1RFTkNFTlRDTE9VRF9TRUNSRVRJRDogXCLorr7lrppTZWNyZXRJZFwiLFxuICBQSUNCRURfVEVOQ0VOVENMT1VEX1NFQ1JFVEtFWTogXCLorr7lrppTZWNyZXRLZXlcIixcbiAgUElDQkVEX1RFTkNFTlRDTE9VRF9BUFBJRDogXCLorr7lrppBcHBJZFwiLFxuICBQSUNCRURfVEVOQ0VOVENMT1VEX0JVQ0tFVDogXCLorr7lrppCdWNrZXRcIixcbiAgUElDQkVEX1RFTkNFTlRDTE9VRF9BUkVBOiBcIuiuvuWumuWtmOWCqOWMuuWfn1wiLFxuICBQSUNCRURfVEVOQ0VOVENMT1VEX1BBVEg6IFwi6K6+5a6a5a2Y5YKo6Lev5b6EXCIsXG4gIFBJQ0JFRF9URU5DRU5UQ0xPVURfT1BUSU9OUzogXCLorr7lrprnvZHlnYDlkI7nvIBcIixcbiAgUElDQkVEX1RFTkNFTlRDTE9VRF9DVVNUT01VUkw6IFwi6K6+5a6a6Ieq5a6a5LmJ5Z+f5ZCNXCIsXG4gIFBJQ0JFRF9URU5DRU5UQ0xPVURfTUVTU0FHRV9BUFBJRDogXCLkvovlpoLvvJoxMjM0NTY3ODkwXCIsXG4gIFBJQ0JFRF9URU5DRU5UQ0xPVURfTUVTU0FHRV9BUkVBOiBcIuS+i+Wmgu+8mmFwLWJlaWppbmdcIixcbiAgUElDQkVEX1RFTkNFTlRDTE9VRF9NRVNTQUdFX1BBVEg6IFwi5L6L5aaC77yadGVzdC9cIixcbiAgUElDQkVEX1RFTkNFTlRDTE9VRF9NRVNTQUdFX0NVU1RPTVVSTDogXCLkvovlpoLvvJpodHRwczovL3Rlc3QuY29tXCIsXG4gIFBJQ0JFRF9URU5DRU5UQ0xPVURfTUVTU0FHRV9PUFRJT05TOiBcIuS+i+Wmgu+8mj9pbWFnZU1vZ3IyXCIsXG5cbiAgLy8gR2l0SHViXG4gIFBJQ0JFRF9HSVRIVUI6IFwiR2l0SHViXCIsXG4gIFBJQ0JFRF9HSVRIVUJfVE9LRU46IFwi6K6+5a6aVG9rZW5cIixcbiAgUElDQkVEX0dJVEhVQl9SRVBPOiBcIuiuvuWumuS7k+W6k+WQjVwiLFxuICBQSUNCRURfR0lUSFVCX1BBVEg6IFwi6K6+5a6a5a2Y5YKo6Lev5b6EXCIsXG4gIFBJQ0JFRF9HSVRIVUJfQlJBTkNIOiBcIuiuvuWumuWIhuaUr+WQjVwiLFxuICBQSUNCRURfR0lUSFVCX0NVU1RPTVVSTDogXCLorr7lrproh6rlrprkuYnln5/lkI1cIixcbiAgUElDQkVEX0dJVEhVQl9NRVNTQUdFX1JFUE86IFwi5qC85byP77yadXNlcm5hbWUvcmVwb1wiLFxuICBQSUNCRURfR0lUSFVCX01FU1NBR0VfQlJBTkNIOiBcIuS+i+Wmgu+8mm1haW5cIixcbiAgUElDQkVEX0dJVEhVQl9NRVNTQUdFX1BBVEg6IFwi5L6L5aaC77yadGVzdC9cIixcbiAgUElDQkVEX0dJVEhVQl9NRVNTQUdFX0NVU1RPTVVSTDogXCLkvovlpoLvvJpodHRwczovL3Rlc3QuY29tXCIsXG5cbiAgLy8gcWluaXVcbiAgUElDQkVEX1FJTklVOiBcIuS4g+eJm+S6kVwiLFxuICBQSUNCRURfUUlOSVVfQUNDRVNTS0VZOiBcIuiuvuWumkFjY2Vzc0tleVwiLFxuICBQSUNCRURfUUlOSVVfU0VDUkVUS0VZOiBcIuiuvuWumlNlY3JldEtleVwiLFxuICBQSUNCRURfUUlOSVVfQlVDS0VUOiBcIuiuvuWumkJ1Y2tldFwiLFxuICBQSUNCRURfUUlOSVVfUEFUSDogXCLorr7lrprlrZjlgqjot6/lvoRcIixcbiAgUElDQkVEX1FJTklVX1VSTDogXCLorr7lrprorr/pl67nvZHlnYBcIixcbiAgUElDQkVEX1FJTklVX09QVElPTlM6IFwi6K6+5a6a572R5Z2A5ZCO57yAXCIsXG4gIFBJQ0JFRF9RSU5JVV9BUkVBOiBcIuiuvuWumuWtmOWCqOWMuuWfn1wiLFxuICBQSUNCRURfUUlOSVVfTUVTU0FHRV9QQVRIOiBcIuS+i+Wmgu+8mnRlc3QvXCIsXG4gIFBJQ0JFRF9RSU5JVV9NRVNTQUdFX0FSRUE6IFwi5L6L5aaC77yaejBcIixcbiAgUElDQkVEX1FJTklVX01FU1NBR0VfT1BUSU9OUzogXCLkvovlpoLvvJo/aW1hZ2VzbGltXCIsXG4gIFBJQ0JFRF9RSU5JVV9NRVNTQUdFX1VSTDogXCLkvovlpoLvvJpodHRwczovL3h4eC55eXkuZ2xiLmNsb3VkZG4uY29tXCIsXG5cbiAgLy8gaW1ndXJcbiAgUElDQkVEX0lNR1VSOiBcIkltZ3VyXCIsXG4gIFBJQ0JFRF9JTUdVUl9DTElFTlRJRDogXCLorr7lrppDbGllbnRJZFwiLFxuICBQSUNCRURfSU1HVVJfUFJPWFk6IFwi6K6+5a6a5Luj55CGXCIsXG4gIFBJQ0JFRF9JTUdVUl9NRVNTQUdFX1BST1hZOiBcIuS+i+Wmgu+8mmh0dHA6Ly8xMjcuMC4wLjE6MTA4MFwiLFxuXG4gIC8vIHVweXVuXG4gIFBJQ0JFRF9VUFlVTjogXCLlj4jmi43kupFcIixcbiAgUElDQkVEX1VQWVVOX0JVQ0tFVDogXCLorr7lrppCdWNrZXRcIixcbiAgUElDQkVEX1VQWVVOX09QRVJBVE9SOiBcIuiuvuWumuaTjeS9nOWRmFwiLFxuICBQSUNCRURfVVBZVU5fUEFTU1dPUkQ6IFwi6K6+5a6a5pON5L2c5ZGY5a+G56CBXCIsXG4gIFBJQ0JFRF9VUFlVTl9QQVRIOiBcIuiuvuWumuWtmOWCqOi3r+W+hFwiLFxuICBQSUNCRURfVVBZVU5fVVJMOiBcIuiuvuWumuWKoOmAn+Wfn+WQjVwiLFxuICBQSUNCRURfVVBZVU5fT1BUSU9OUzogXCLorr7lrprnvZHlnYDlkI7nvIBcIixcbiAgUElDQkVEX1VQWVVOX01FU1NBR0VfT1BFUkFUT1I6IFwi5L6L5aaC77yabWVcIixcbiAgUElDQkVEX1VQWVVOX01FU1NBR0VfUEFTU1dPUkQ6IFwi6L6T5YWl5pON5L2c5ZGY5a+G56CBXCIsXG4gIFBJQ0JFRF9VUFlVTl9NRVNTQUdFX1VSTDogXCLkvovlpoLvvJpodHRwOi8veHh4LnRlc3QudXBjZG4ubmV0XCIsXG4gIFBJQ0JFRF9VUFlVTl9NRVNTQUdFX09QVElPTlM6IFwi5L6L5aaC77yaIWltZ3NsaW1cIixcbiAgUElDQkVEX1VQWVVOX01FU1NBR0VfUEFUSDogXCLkvovlpoLvvJp0ZXN0L1wiLFxuXG4gIC8vIFBsdWdpbiBIYW5kbGVyXG4gIFBMVUdJTl9IQU5ETEVSX1BMVUdJTl9JTlNUQUxMX1NVQ0NFU1M6IFwi5o+S5Lu25a6J6KOF5oiQ5YqfXCIsXG4gIFBMVUdJTl9IQU5ETEVSX1BMVUdJTl9JTlNUQUxMX0ZBSUxFRDogXCLmj5Lku7blronoo4XlpLHotKVcIixcbiAgUExVR0lOX0hBTkRMRVJfUExVR0lOX0lOU1RBTExfRkFJTEVEX1JFQVNPTjogXCLmj5Lku7blronoo4XlpLHotKXvvIzlpLHotKXnoIHkuLoke2NvZGV977yM6ZSZ6K+v5pel5b+X5Li6IFxcbiAke2RhdGF9XCIsXG4gIFBMVUdJTl9IQU5ETEVSX1BMVUdJTl9JTlNUQUxMX0ZBSUxFRF9QQVRIOiBcIuaPkuS7tuWuieijheWksei0pe+8jOivt+i+k+WFpeWQiOazleaPkuS7tuWQjeaIluWQiOazleWuieijhei3r+W+hFwiLFxuICBQTFVHSU5fSEFORExFUl9QTFVHSU5fVU5JTlNUQUxMX1NVQ0NFU1M6IFwi5o+S5Lu25Y246L295oiQ5YqfXCIsXG4gIFBMVUdJTl9IQU5ETEVSX1BMVUdJTl9VTklOU1RBTExfRkFJTEVEOiBcIuaPkuS7tuWNuOi9veWksei0pVwiLFxuICBQTFVHSU5fSEFORExFUl9QTFVHSU5fVU5JTlNUQUxMX0ZBSUxFRF9SRUFTT046IFwi5o+S5Lu25Y246L295aSx6LSl77yM5aSx6LSl56CB5Li6JHtjb2Rlfe+8jOmUmeivr+aXpeW/l+S4uiBcXG4gJHtkYXRhfVwiLFxuICBQTFVHSU5fSEFORExFUl9QTFVHSU5fVU5JTlNUQUxMX0ZBSUxFRF9WQUxJRDogXCLmj5Lku7bljbjovb3lpLHotKXvvIzor7fovpPlhaXlkIjms5Xmj5Lku7blkI1cIixcbiAgUExVR0lOX0hBTkRMRVJfUExVR0lOX1VQREFURV9TVUNDRVNTOiBcIuaPkuS7tuabtOaWsOaIkOWKn1wiLFxuICBQTFVHSU5fSEFORExFUl9QTFVHSU5fVVBEQVRFX0ZBSUxFRDogXCLmj5Lku7bmm7TmlrDlpLHotKVcIixcbiAgUExVR0lOX0hBTkRMRVJfUExVR0lOX1VQREFURV9GQUlMRURfUkVBU09OOiBcIuaPkuS7tuabtOaWsOWksei0pe+8jOWksei0peeggeS4uiR7Y29kZX3vvIzplJnor6/ml6Xlv5fkuLogXFxuICR7ZGF0YX1cIixcbiAgUExVR0lOX0hBTkRMRVJfUExVR0lOX1VQREFURV9GQUlMRURfVkFMSUQ6IFwi5o+S5Lu25pu05paw5aSx6LSl77yM6K+36L6T5YWl5ZCI5rOV5o+S5Lu25ZCNXCIsXG59XG5cbmV4cG9ydCB0eXBlIElMb2NhbGVzS2V5ID0ga2V5b2YgdHlwZW9mIFpIX0NOXG5leHBvcnQgdHlwZSBJTG9jYWxlcyA9IHR5cGVvZiBaSF9DTlxuIiwiaW1wb3J0IHsgSUxvY2FsZXMgfSBmcm9tIFwiLi96aC1DTlwiXG5cbi8qIGVzbGludC1kaXNhYmxlIG5vLXRlbXBsYXRlLWN1cmx5LWluLXN0cmluZyAqL1xuZXhwb3J0IGNvbnN0IFpIX1RXOiBJTG9jYWxlcyA9IHtcbiAgVVBMT0FEX0ZBSUxFRDogXCLkuIrlgrPlpLHmlZdcIixcbiAgQ0hFQ0tfU0VUVElOR1M6IFwi6KuL5qqi5p+l5L2g55qE6Kit5a6a5piv5ZCm5q2j56K6XCIsXG4gIENIRUNLX1NFVFRJTkdTX0FORF9ORVRXT1JLOiBcIuiri+aqouafpeS9oOeahOioreWumuWPiue2sui3r1wiLFxuICBVUExPQURfRkFJTEVEX1JFQVNPTjogXCLpjK/oqqTnorzvvJoke2NvZGV977yM6KuL5omT6ZaL54CP6Ka95Zmo6LK85LiK5Zyw5Z2A5p+l55yL55u46Zec5Y6f5ZugXCIsXG4gIFNFUlZFUl9FUlJPUjogXCLkvLrmnI3lmajlh7rpjK/vvIzoq4vph43oqaZcIixcbiAgQVVUSF9GQUlMRUQ6IFwi6KqN6K2J5aSx5pWXXCIsXG5cbiAgLy8gc21tc1xuICBQSUNCRURfU01NUzogXCJTTS5NU1wiLFxuICBQSUNCRURfU01NU19UT0tFTjogXCLoqK3lrppUb2tlblwiLFxuICBQSUNCRURfU01NU19CQUNLVVBfRE9NQUlOOiBcIuWCmeeUqOS4iuWCs+e2suWdgFwiLFxuICBQSUNCRURfU01NU19NRVNTQUdFX0JBQ0tVUF9ET01BSU46IFwi5L6L5aaCIHNtbXMuYXBwXCIsXG5cbiAgLy8gQWxpLWNsb3VkXG4gIFBJQ0JFRF9BTElDTE9VRDogXCLpmL/ph4zkupFPU1NcIixcbiAgUElDQkVEX0FMSUNMT1VEX0FDQ0VTU0tFWUlEOiBcIuioreWumktleUlkXCIsXG4gIFBJQ0JFRF9BTElDTE9VRF9BQ0NFU1NLRVlTRUNSRVQ6IFwi6Kit5a6aS2V5U2VjcmV0XCIsXG4gIFBJQ0JFRF9BTElDTE9VRF9CVUNLRVQ6IFwi6Kit5a6aQnVja2V0XCIsXG4gIFBJQ0JFRF9BTElDTE9VRF9BUkVBOiBcIuioreWumuWEsuWtmOWNgOWfn1wiLFxuICBQSUNCRURfQUxJQ0xPVURfUEFUSDogXCLoqK3lrprlhLLlrZjot6/lvpFcIixcbiAgUElDQkVEX0FMSUNMT1VEX0NVU1RPTVVSTDogXCLoqK3lrproh6roqILntrLlnYBcIixcbiAgUElDQkVEX0FMSUNMT1VEX09QVElPTlM6IFwi6Kit5a6a57ay5Z2A5b6M57a0XCIsXG4gIFBJQ0JFRF9BTElDTE9VRF9NRVNTQUdFX0FSRUE6IFwi5L6L5aaC77yab3NzLWNuLWJlaWppbmdcIixcbiAgUElDQkVEX0FMSUNMT1VEX01FU1NBR0VfUEFUSDogXCLkvovlpoLvvJp0ZXN0L1wiLFxuICBQSUNCRURfQUxJQ0xPVURfTUVTU0FHRV9PUFRJT05TOiBcIuS+i+Wmgu+8mj94LW9zcy1wcm9jZXNzPXh4eFwiLFxuICBQSUNCRURfQUxJQ0xPVURfTUVTU0FHRV9DVVNUT01VUkw6IFwi5L6L5aaC77yaaHR0cHM6Ly90ZXN0LmNvbVwiLFxuXG4gIC8vIFRlbmNlbnQtY2xvdWRcbiAgUElDQkVEX1RFTkNFTlRDTE9VRDogXCLpqLDoqIrkupFDT1NcIixcbiAgUElDQkVEX1RFTkNFTlRDTE9VRF9WRVJTSU9OOiBcIkNPU+eJiOacrFwiLFxuICBQSUNCRURfVEVOQ0VOVENMT1VEX1NFQ1JFVElEOiBcIuioreWumlNlY3JldElkXCIsXG4gIFBJQ0JFRF9URU5DRU5UQ0xPVURfU0VDUkVUS0VZOiBcIuioreWumlNlY3JldEtleVwiLFxuICBQSUNCRURfVEVOQ0VOVENMT1VEX0FQUElEOiBcIuioreWumkFwcElkXCIsXG4gIFBJQ0JFRF9URU5DRU5UQ0xPVURfQlVDS0VUOiBcIuioreWumkJ1Y2tldFwiLFxuICBQSUNCRURfVEVOQ0VOVENMT1VEX0FSRUE6IFwi6Kit5a6a5YSy5a2Y5Y2A5Z+fXCIsXG4gIFBJQ0JFRF9URU5DRU5UQ0xPVURfUEFUSDogXCLoqK3lrprlhLLlrZjot6/lvpFcIixcbiAgUElDQkVEX1RFTkNFTlRDTE9VRF9PUFRJT05TOiBcIuioreWumue2suWdgOW+jOe2tFwiLFxuICBQSUNCRURfVEVOQ0VOVENMT1VEX0NVU1RPTVVSTDogXCLoqK3lrproh6roqILntrLlnYBcIixcbiAgUElDQkVEX1RFTkNFTlRDTE9VRF9NRVNTQUdFX0FQUElEOiBcIuS+i+Wmgu+8mjEyMzQ1Njc4OTBcIixcbiAgUElDQkVEX1RFTkNFTlRDTE9VRF9NRVNTQUdFX0FSRUE6IFwi5L6L5aaC77yaYXAtYmVpamluZ1wiLFxuICBQSUNCRURfVEVOQ0VOVENMT1VEX01FU1NBR0VfUEFUSDogXCLkvovlpoLvvJp0ZXN0L1wiLFxuICBQSUNCRURfVEVOQ0VOVENMT1VEX01FU1NBR0VfQ1VTVE9NVVJMOiBcIuS+i+Wmgu+8mmh0dHBzOi8vdGVzdC5jb21cIixcbiAgUElDQkVEX1RFTkNFTlRDTE9VRF9NRVNTQUdFX09QVElPTlM6IFwi5L6L5aaC77yaP2ltYWdlTW9ncjJcIixcblxuICAvLyBHaXRIdWJcbiAgUElDQkVEX0dJVEhVQjogXCJHaXRIdWJcIixcbiAgUElDQkVEX0dJVEhVQl9UT0tFTjogXCLoqK3lrppUb2tlblwiLFxuICBQSUNCRURfR0lUSFVCX1JFUE86IFwi6Kit5a6a5YCJ5bqr5ZCN56ixXCIsXG4gIFBJQ0JFRF9HSVRIVUJfUEFUSDogXCLoqK3lrprlhLLlrZjot6/lvpFcIixcbiAgUElDQkVEX0dJVEhVQl9CUkFOQ0g6IFwi6Kit5a6a5YiG5pSv5ZCN56ixXCIsXG4gIFBJQ0JFRF9HSVRIVUJfQ1VTVE9NVVJMOiBcIuioreWumuiHquiogue2suWdgFwiLFxuICBQSUNCRURfR0lUSFVCX01FU1NBR0VfUkVQTzogXCLmoLzlvI/vvJp1c2VybmFtZS9yZXBvXCIsXG4gIFBJQ0JFRF9HSVRIVUJfTUVTU0FHRV9CUkFOQ0g6IFwi5L6L5aaC77yabWFpblwiLFxuICBQSUNCRURfR0lUSFVCX01FU1NBR0VfUEFUSDogXCLkvovlpoLvvJp0ZXN0L1wiLFxuICBQSUNCRURfR0lUSFVCX01FU1NBR0VfQ1VTVE9NVVJMOiBcIuS+i+Wmgu+8mmh0dHBzOi8vdGVzdC5jb21cIixcblxuICAvLyBxaW5pdVxuICBQSUNCRURfUUlOSVU6IFwi5LiD54mb5LqRXCIsXG4gIFBJQ0JFRF9RSU5JVV9BQ0NFU1NLRVk6IFwi6Kit5a6aQWNjZXNzS2V5XCIsXG4gIFBJQ0JFRF9RSU5JVV9TRUNSRVRLRVk6IFwi6Kit5a6aU2VjcmV0S2V5XCIsXG4gIFBJQ0JFRF9RSU5JVV9CVUNLRVQ6IFwi6Kit5a6aQnVja2V0XCIsXG4gIFBJQ0JFRF9RSU5JVV9QQVRIOiBcIuioreWumuWEsuWtmOi3r+W+kVwiLFxuICBQSUNCRURfUUlOSVVfVVJMOiBcIuioreWumuioquWVj+e2suWdgFwiLFxuICBQSUNCRURfUUlOSVVfT1BUSU9OUzogXCLoqK3lrprntrLlnYDlvozntrRcIixcbiAgUElDQkVEX1FJTklVX0FSRUE6IFwi6Kit5a6a5YSy5a2Y5Y2A5Z+fXCIsXG4gIFBJQ0JFRF9RSU5JVV9NRVNTQUdFX1BBVEg6IFwi5L6L5aaC77yadGVzdC9cIixcbiAgUElDQkVEX1FJTklVX01FU1NBR0VfQVJFQTogXCLkvovlpoLvvJp6MFwiLFxuICBQSUNCRURfUUlOSVVfTUVTU0FHRV9PUFRJT05TOiBcIuS+i+Wmgu+8mj9pbWFnZXNsaW1cIixcbiAgUElDQkVEX1FJTklVX01FU1NBR0VfVVJMOiBcIuS+i+Wmgu+8mmh0dHBzOi8veHh4Lnl5eS5nbGIuY2xvdWRkbi5jb21cIixcblxuICAvLyBpbWd1clxuICBQSUNCRURfSU1HVVI6IFwiSW1ndXJcIixcbiAgUElDQkVEX0lNR1VSX0NMSUVOVElEOiBcIuioreWumkNsaWVudElkXCIsXG4gIFBJQ0JFRF9JTUdVUl9QUk9YWTogXCLoqK3lrppQUk9YWVwiLFxuICBQSUNCRURfSU1HVVJfTUVTU0FHRV9QUk9YWTogXCLkvovlpoLvvJpodHRwOi8vMTI3LjAuMC4xOjEwODBcIixcblxuICAvLyB1cHl1blxuICBQSUNCRURfVVBZVU46IFwi5Y+I5ouN5LqRXCIsXG4gIFBJQ0JFRF9VUFlVTl9CVUNLRVQ6IFwi6Kit5a6aQnVja2V0XCIsXG4gIFBJQ0JFRF9VUFlVTl9PUEVSQVRPUjogXCLoqK3lrprmk43kvZzlk6FcIixcbiAgUElDQkVEX1VQWVVOX1BBU1NXT1JEOiBcIuioreWumuaTjeS9nOWToeWvhueivFwiLFxuICBQSUNCRURfVVBZVU5fUEFUSDogXCLoqK3lrprlhLLlrZjot6/lvpFcIixcbiAgUElDQkVEX1VQWVVOX1VSTDogXCLoqK3lrprliqDpgJ/ntrLlnYBcIixcbiAgUElDQkVEX1VQWVVOX09QVElPTlM6IFwi6Kit5a6a57ay5Z2A5b6M57a0XCIsXG4gIFBJQ0JFRF9VUFlVTl9NRVNTQUdFX09QRVJBVE9SOiBcIuS+i+Wmgu+8mm1lXCIsXG4gIFBJQ0JFRF9VUFlVTl9NRVNTQUdFX1BBU1NXT1JEOiBcIui8uOWFpeaTjeS9nOWToeWvhueivFwiLFxuICBQSUNCRURfVVBZVU5fTUVTU0FHRV9VUkw6IFwi5L6L5aaC77yaaHR0cDovL3h4eC50ZXN0LnVwY2RuLm5ldFwiLFxuICBQSUNCRURfVVBZVU5fTUVTU0FHRV9PUFRJT05TOiBcIuS+i+Wmgu+8miFpbWdzbGltXCIsXG4gIFBJQ0JFRF9VUFlVTl9NRVNTQUdFX1BBVEg6IFwi5L6L5aaC77yadGVzdC9cIixcblxuICAvLyBQbHVnaW4gSGFuZGxlclxuICBQTFVHSU5fSEFORExFUl9QTFVHSU5fSU5TVEFMTF9TVUNDRVNTOiBcIuaPkuS7tuWuieijneaIkOWKn1wiLFxuICBQTFVHSU5fSEFORExFUl9QTFVHSU5fSU5TVEFMTF9GQUlMRUQ6IFwi5o+S5Lu25a6J6KOd5aSx5pWXXCIsXG4gIFBMVUdJTl9IQU5ETEVSX1BMVUdJTl9JTlNUQUxMX0ZBSUxFRF9SRUFTT046IFwi5o+S5Lu25a6J6KOd5aSx5pWX77yM5aSx5pWX56K854K6JHtjb2Rlfe+8jOmMr+iqpOe0gOmMhOeCuiBcXG4gJHtkYXRhfVwiLFxuICBQTFVHSU5fSEFORExFUl9QTFVHSU5fSU5TVEFMTF9GQUlMRURfUEFUSDogXCLmj5Lku7blronoo53lpLHmlZfvvIzoq4vovLjlhaXmraPnorrnmoTmj5Lku7blkI3nqLHmiJbmraPnorrnmoTlronoo53ot6/lvpFcIixcbiAgUExVR0lOX0hBTkRMRVJfUExVR0lOX1VOSU5TVEFMTF9TVUNDRVNTOiBcIuaPkuS7tuWNuOi8ieaIkOWKn1wiLFxuICBQTFVHSU5fSEFORExFUl9QTFVHSU5fVU5JTlNUQUxMX0ZBSUxFRDogXCLmj5Lku7bljbjovInlpLHmlZdcIixcbiAgUExVR0lOX0hBTkRMRVJfUExVR0lOX1VOSU5TVEFMTF9GQUlMRURfUkVBU09OOiBcIuaPkuS7tuWNuOi8ieWkseaVl++8jOWkseaVl+eivOeCuiR7Y29kZX3vvIzpjK/oqqTntIDpjITngrogXFxuICR7ZGF0YX1cIixcbiAgUExVR0lOX0hBTkRMRVJfUExVR0lOX1VOSU5TVEFMTF9GQUlMRURfVkFMSUQ6IFwi5o+S5Lu25Y246LyJ5aSx5pWX77yM6KuL6Ly45YWl5q2j56K655qE5o+S5Lu25ZCN56ixXCIsXG4gIFBMVUdJTl9IQU5ETEVSX1BMVUdJTl9VUERBVEVfU1VDQ0VTUzogXCLmj5Lku7bmm7TmlrDmiJDlip9cIixcbiAgUExVR0lOX0hBTkRMRVJfUExVR0lOX1VQREFURV9GQUlMRUQ6IFwi5o+S5Lu25pu05paw5aSx5pWXXCIsXG4gIFBMVUdJTl9IQU5ETEVSX1BMVUdJTl9VUERBVEVfRkFJTEVEX1JFQVNPTjogXCLmj5Lku7bmm7TmlrDlpLHmlZfvvIzlpLHmlZfnorzngroke2NvZGV977yM6Yyv6Kqk57SA6YyE54K6IFxcbiAke2RhdGF9XCIsXG4gIFBMVUdJTl9IQU5ETEVSX1BMVUdJTl9VUERBVEVfRkFJTEVEX1ZBTElEOiBcIuaPkuS7tuabtOaWsOWkseaVl++8jOiri+i8uOWFpeato+eiuueahOaPkuS7tuWQjeeosVwiLFxufVxuIiwiaW1wb3J0IHsgSUxvY2FsZXMgfSBmcm9tIFwiLi96aC1DTlwiXG5cbi8qIGVzbGludC1kaXNhYmxlIG5vLXRlbXBsYXRlLWN1cmx5LWluLXN0cmluZyAqL1xuZXhwb3J0IGNvbnN0IEVOOiBJTG9jYWxlcyA9IHtcbiAgVVBMT0FEX0ZBSUxFRDogXCJVcGxvYWQgZmFpbGVkXCIsXG4gIENIRUNLX1NFVFRJTkdTOiBcIlBsZWFzZSBjaGVjayB5b3VyIHNldHRpbmdzXCIsXG4gIENIRUNLX1NFVFRJTkdTX0FORF9ORVRXT1JLOiBcIlBsZWFzZSBjaGVjayB5b3VyIHNldHRpbmdzIGFuZCBuZXR3b3JrXCIsXG4gIFVQTE9BRF9GQUlMRURfUkVBU09OOiBcIkVycm9yIGNvZGU6ICR7Y29kZX0sIHBsZWFzZSBvcGVuIHRoZSBicm93c2VyIGFuZCBwYXN0ZSB0aGUgYWRkcmVzcyB0byBzZWUgdGhlIHJlYXNvblwiLFxuICBTRVJWRVJfRVJST1I6IFwiU2VydmVyIGVycm9yLCBwbGVhc2UgdHJ5IGFnYWluIGxhdGVyXCIsXG4gIEFVVEhfRkFJTEVEOiBcIkF1dGhlbnRpY2F0aW9uIGZhaWxlZFwiLFxuXG4gIC8vIHNtbXNcbiAgUElDQkVEX1NNTVM6IFwiU00uTVNcIixcbiAgUElDQkVEX1NNTVNfVE9LRU46IFwiU2V0IFRva2VuXCIsXG4gIFBJQ0JFRF9TTU1TX0JBQ0tVUF9ET01BSU46IFwiU2V0IEJhY2t1cCBVcGxvYWQgRG9tYWluXCIsXG4gIFBJQ0JFRF9TTU1TX01FU1NBR0VfQkFDS1VQX0RPTUFJTjogXCJFeC4gc21tcy5hcHBcIixcblxuICAvLyBBbGktY2xvdWRcbiAgUElDQkVEX0FMSUNMT1VEOiBcIkFsaSBDbG91ZFwiLFxuICBQSUNCRURfQUxJQ0xPVURfQUNDRVNTS0VZSUQ6IFwiU2V0IEtleUlkXCIsXG4gIFBJQ0JFRF9BTElDTE9VRF9BQ0NFU1NLRVlTRUNSRVQ6IFwiU2V0IEtleVNlY3JldFwiLFxuICBQSUNCRURfQUxJQ0xPVURfQlVDS0VUOiBcIlNldCBCdWNrZXRcIixcbiAgUElDQkVEX0FMSUNMT1VEX0FSRUE6IFwiU2V0IEFyZWFcIixcbiAgUElDQkVEX0FMSUNMT1VEX1BBVEg6IFwiU2V0IFBhdGhcIixcbiAgUElDQkVEX0FMSUNMT1VEX0NVU1RPTVVSTDogXCJTZXQgQ3VzdG9tIFVSTFwiLFxuICBQSUNCRURfQUxJQ0xPVURfT1BUSU9OUzogXCJTZXQgVVJMIFN1ZmZpeFwiLFxuICBQSUNCRURfQUxJQ0xPVURfTUVTU0FHRV9BUkVBOiBcIkV4LiBvc3MtY24tYmVpamluZ1wiLFxuICBQSUNCRURfQUxJQ0xPVURfTUVTU0FHRV9QQVRIOiBcIkV4LiB0ZXN0L1wiLFxuICBQSUNCRURfQUxJQ0xPVURfTUVTU0FHRV9PUFRJT05TOiBcIkV4LiA/eC1vc3MtcHJvY2Vzcz14eHhcIixcbiAgUElDQkVEX0FMSUNMT1VEX01FU1NBR0VfQ1VTVE9NVVJMOiBcIkV4LiBodHRwczovL3Rlc3QuY29tXCIsXG5cbiAgLy8gVGVuY2VudC1jbG91ZFxuICBQSUNCRURfVEVOQ0VOVENMT1VEOiBcIlRlbmNlbnQgQ2xvdWRcIixcbiAgUElDQkVEX1RFTkNFTlRDTE9VRF9WRVJTSU9OOiBcIkNob29zZSBDT1MgdmVyc2lvblwiLFxuICBQSUNCRURfVEVOQ0VOVENMT1VEX1NFQ1JFVElEOiBcIlNldCBTZWNyZXRJZFwiLFxuICBQSUNCRURfVEVOQ0VOVENMT1VEX1NFQ1JFVEtFWTogXCJTZXQgU2VjcmV0S2V5XCIsXG4gIFBJQ0JFRF9URU5DRU5UQ0xPVURfQVBQSUQ6IFwiU2V0IEFwcElkXCIsXG4gIFBJQ0JFRF9URU5DRU5UQ0xPVURfQlVDS0VUOiBcIlNldCBCdWNrZXRcIixcbiAgUElDQkVEX1RFTkNFTlRDTE9VRF9BUkVBOiBcIlNldCBBcmVhXCIsXG4gIFBJQ0JFRF9URU5DRU5UQ0xPVURfUEFUSDogXCJTZXQgUGF0aFwiLFxuICBQSUNCRURfVEVOQ0VOVENMT1VEX09QVElPTlM6IFwiU2V0IFVSTCBTdWZmaXhcIixcbiAgUElDQkVEX1RFTkNFTlRDTE9VRF9DVVNUT01VUkw6IFwiU2V0IEN1c3RvbSBVUkxcIixcbiAgUElDQkVEX1RFTkNFTlRDTE9VRF9NRVNTQUdFX0FQUElEOiBcIkV4LiAxMjM0NTY3ODkwXCIsXG4gIFBJQ0JFRF9URU5DRU5UQ0xPVURfTUVTU0FHRV9BUkVBOiBcIkV4LiBhcC1iZWlqaW5nXCIsXG4gIFBJQ0JFRF9URU5DRU5UQ0xPVURfTUVTU0FHRV9QQVRIOiBcIkV4LiB0ZXN0L1wiLFxuICBQSUNCRURfVEVOQ0VOVENMT1VEX01FU1NBR0VfQ1VTVE9NVVJMOiBcIkV4LiBodHRwOi8vdGVzdC5jb21cIixcbiAgUElDQkVEX1RFTkNFTlRDTE9VRF9NRVNTQUdFX09QVElPTlM6IFwiRXguID9pbWFnZU1vZ3IyXCIsXG5cbiAgLy8gR2l0SHViXG4gIFBJQ0JFRF9HSVRIVUI6IFwiR2l0SHViXCIsXG4gIFBJQ0JFRF9HSVRIVUJfVE9LRU46IFwiU2V0IFRva2VuXCIsXG4gIFBJQ0JFRF9HSVRIVUJfUkVQTzogXCJTZXQgUmVwbyBOYW1lXCIsXG4gIFBJQ0JFRF9HSVRIVUJfUEFUSDogXCJTZXQgUGF0aFwiLFxuICBQSUNCRURfR0lUSFVCX0JSQU5DSDogXCJTZXQgQnJhbmNoXCIsXG4gIFBJQ0JFRF9HSVRIVUJfQ1VTVE9NVVJMOiBcIlNldCBDdXN0b20gVVJMXCIsXG4gIFBJQ0JFRF9HSVRIVUJfTUVTU0FHRV9SRVBPOiBcIkV4LiB1c2VybmFtZS9yZXBvXCIsXG4gIFBJQ0JFRF9HSVRIVUJfTUVTU0FHRV9CUkFOQ0g6IFwiRXguIG1haW5cIixcbiAgUElDQkVEX0dJVEhVQl9NRVNTQUdFX1BBVEg6IFwiRXguIHRlc3QvXCIsXG4gIFBJQ0JFRF9HSVRIVUJfTUVTU0FHRV9DVVNUT01VUkw6IFwiRXguIGh0dHBzOi8vdGVzdC5jb21cIixcblxuICAvLyBxaW5pdVxuICBQSUNCRURfUUlOSVU6IFwiUWluaXVcIixcbiAgUElDQkVEX1FJTklVX0FDQ0VTU0tFWTogXCJTZXQgQWNjZXNzS2V5XCIsXG4gIFBJQ0JFRF9RSU5JVV9TRUNSRVRLRVk6IFwiU2V0IFNlY3JldEtleVwiLFxuICBQSUNCRURfUUlOSVVfQlVDS0VUOiBcIlNldCBCdWNrZXRcIixcbiAgUElDQkVEX1FJTklVX1BBVEg6IFwiU2V0IFBhdGhcIixcbiAgUElDQkVEX1FJTklVX1VSTDogXCJTZXQgVVJMXCIsXG4gIFBJQ0JFRF9RSU5JVV9PUFRJT05TOiBcIlNldCBVUkwgU3VmZml4XCIsXG4gIFBJQ0JFRF9RSU5JVV9BUkVBOiBcIlNldCBBcmVhXCIsXG4gIFBJQ0JFRF9RSU5JVV9NRVNTQUdFX1BBVEg6IFwiRXguIHRlc3QvXCIsXG4gIFBJQ0JFRF9RSU5JVV9NRVNTQUdFX0FSRUE6IFwiRXguIHowXCIsXG4gIFBJQ0JFRF9RSU5JVV9NRVNTQUdFX09QVElPTlM6IFwiRXguID9pbWFnZXNsaW1cIixcbiAgUElDQkVEX1FJTklVX01FU1NBR0VfVVJMOiBcIkV4LiBodHRwczovL3h4eC55eXkuZ2xiLmNsb3VkZG4uY29tXCIsXG5cbiAgLy8gaW1ndXJcbiAgUElDQkVEX0lNR1VSOiBcIkltZ3VyXCIsXG4gIFBJQ0JFRF9JTUdVUl9DTElFTlRJRDogXCJTZXQgQ2xpZW50SWRcIixcbiAgUElDQkVEX0lNR1VSX1BST1hZOiBcIlNldCBQcm94eVwiLFxuICBQSUNCRURfSU1HVVJfTUVTU0FHRV9QUk9YWTogXCJFeC4gaHR0cDovLzEyNy4wLjAuMToxMDgwXCIsXG5cbiAgLy8gdXB5dW5cbiAgUElDQkVEX1VQWVVOOiBcIlVweXVuXCIsXG4gIFBJQ0JFRF9VUFlVTl9CVUNLRVQ6IFwiU2V0IEJ1Y2tldFwiLFxuICBQSUNCRURfVVBZVU5fT1BFUkFUT1I6IFwiU2V0IE9wZXJhdG9yXCIsXG4gIFBJQ0JFRF9VUFlVTl9QQVNTV09SRDogXCJTZXQgT3BlcmF0b3IgUGFzc3dvcmRcIixcbiAgUElDQkVEX1VQWVVOX1BBVEg6IFwiU2V0IFBhdGhcIixcbiAgUElDQkVEX1VQWVVOX1VSTDogXCJTZXQgVVJMXCIsXG4gIFBJQ0JFRF9VUFlVTl9PUFRJT05TOiBcIlNldCBVUkwgU3VmZml4XCIsXG4gIFBJQ0JFRF9VUFlVTl9NRVNTQUdFX09QRVJBVE9SOiBcIkV4LiBtZVwiLFxuICBQSUNCRURfVVBZVU5fTUVTU0FHRV9QQVNTV09SRDogXCJQbGVhc2UgdHlwZSB0aGUgb3BlcmF0b3IgcGFzc3dvcmRcIixcbiAgUElDQkVEX1VQWVVOX01FU1NBR0VfVVJMOiBcIkV4LiBodHRwOi8veHh4LnRlc3QudXBjZG4ubmV0XCIsXG4gIFBJQ0JFRF9VUFlVTl9NRVNTQUdFX09QVElPTlM6IFwiRXguICFpbWdzbGltXCIsXG4gIFBJQ0JFRF9VUFlVTl9NRVNTQUdFX1BBVEg6IFwiRXguIHRlc3QvXCIsXG5cbiAgLy8gUGx1Z2luIEhhbmRsZXJcbiAgUExVR0lOX0hBTkRMRVJfUExVR0lOX0lOU1RBTExfU1VDQ0VTUzogXCJQbHVnaW4gaW5zdGFsbGVkIHN1Y2Nlc3NmdWxseVwiLFxuICBQTFVHSU5fSEFORExFUl9QTFVHSU5fSU5TVEFMTF9GQUlMRUQ6IFwiUGx1Z2luIGluc3RhbGxhdGlvbiBmYWlsZWRcIixcbiAgUExVR0lOX0hBTkRMRVJfUExVR0lOX0lOU1RBTExfRkFJTEVEX1JFQVNPTjpcbiAgICBcIlBsdWdpbiBpbnN0YWxsYXRpb24gZmFpbGVkLCBlcnJvciBjb2RlIGlzICR7Y29kZX0sIGVycm9yIGxvZyBpcyBcXG4gJHtkYXRhfVwiLFxuICBQTFVHSU5fSEFORExFUl9QTFVHSU5fSU5TVEFMTF9GQUlMRURfUEFUSDpcbiAgICBcIlBsdWdpbiBpbnN0YWxsYXRpb24gZmFpbGVkLCBwbGVhc2UgZW50ZXIgYSB2YWxpZCBwbHVnaW4gbmFtZSBvciB2YWxpZCBpbnN0YWxsYXRpb24gcGF0aFwiLFxuICBQTFVHSU5fSEFORExFUl9QTFVHSU5fVU5JTlNUQUxMX1NVQ0NFU1M6IFwiUGx1Z2luIHVuaW5zdGFsbGVkIHN1Y2Nlc3NmdWxseVwiLFxuICBQTFVHSU5fSEFORExFUl9QTFVHSU5fVU5JTlNUQUxMX0ZBSUxFRDogXCJQbHVnaW4gdW5pbnN0YWxsIGZhaWxlZFwiLFxuICBQTFVHSU5fSEFORExFUl9QTFVHSU5fVU5JTlNUQUxMX0ZBSUxFRF9SRUFTT046XG4gICAgXCJQbHVnaW4gdW5pbnN0YWxsIGZhaWxlZCwgZXJyb3IgY29kZSBpcyAke2NvZGV9LCBlcnJvciBsb2cgaXMgXFxuICR7ZGF0YX1cIixcbiAgUExVR0lOX0hBTkRMRVJfUExVR0lOX1VOSU5TVEFMTF9GQUlMRURfVkFMSUQ6IFwiUGx1Z2luIHVuaW5zdGFsbCBmYWlsZWQsIHBsZWFzZSBlbnRlciBhIHZhbGlkIHBsdWdpbiBuYW1lXCIsXG4gIFBMVUdJTl9IQU5ETEVSX1BMVUdJTl9VUERBVEVfU1VDQ0VTUzogXCJQbHVnaW4gdXBkYXRlZCBzdWNjZXNzZnVsbHlcIixcbiAgUExVR0lOX0hBTkRMRVJfUExVR0lOX1VQREFURV9GQUlMRUQ6IFwiUGx1Z2luIHVwZGF0ZSBmYWlsZWRcIixcbiAgUExVR0lOX0hBTkRMRVJfUExVR0lOX1VQREFURV9GQUlMRURfUkVBU09OOiBcIlBsdWdpbiB1cGRhdGUgZmFpbGVkLCBlcnJvciBjb2RlIGlzICR7Y29kZX0sIGVycm9yIGxvZyBpcyBcXG4gJHtkYXRhfVwiLFxuICBQTFVHSU5fSEFORExFUl9QTFVHSU5fVVBEQVRFX0ZBSUxFRF9WQUxJRDogXCJQbHVnaW4gdXBkYXRlIGZhaWxlZCwgcGxlYXNlIGVudGVyIGEgdmFsaWQgcGx1Z2luIG5hbWVcIixcbn1cbiIsImltcG9ydCBmcyBmcm9tIFwiZnMtZXh0cmFcIlxuaW1wb3J0IHBhdGggZnJvbSBcInBhdGhcIlxuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSBcImV2ZW50c1wiXG5pbXBvcnQgeyBob21lZGlyIH0gZnJvbSBcIm9zXCJcbmltcG9ydCBDb21tYW5kZXIgZnJvbSBcIi4uL2xpYi9Db21tYW5kZXJcIlxuaW1wb3J0IHsgTG9nZ2VyIH0gZnJvbSBcIi4uL2xpYi9Mb2dnZXJcIlxuaW1wb3J0IExpZmVjeWNsZSBmcm9tIFwiLi9MaWZlY3ljbGVcIlxuaW1wb3J0IExpZmVjeWNsZVBsdWdpbnMsIHsgc2V0Q3VycmVudFBsdWdpbk5hbWUgfSBmcm9tIFwiLi4vbGliL0xpZmVjeWNsZVBsdWdpbnNcIlxuaW1wb3J0IHVwbG9hZGVycyBmcm9tIFwiLi4vcGx1Z2lucy91cGxvYWRlclwiXG5pbXBvcnQgdHJhbnNmb3JtZXJzIGZyb20gXCIuLi9wbHVnaW5zL3RyYW5zZm9ybWVyXCJcbmltcG9ydCBQbHVnaW5Mb2FkZXIgZnJvbSBcIi4uL2xpYi9QbHVnaW5Mb2FkZXJcIlxuaW1wb3J0IHsgZ2V0LCBzZXQsIHVuc2V0IH0gZnJvbSBcImxvZGFzaFwiXG5pbXBvcnQge1xuICBJSGVscGVyLFxuICBJSW1nSW5mbyxcbiAgSUNvbmZpZyxcbiAgSVBpY0dvLFxuICBJU3RyaW5nS2V5TWFwLFxuICBJUGx1Z2luTG9hZGVyLFxuICBJSTE4bk1hbmFnZXIsXG4gIElQaWNHb1BsdWdpbixcbiAgSVBpY0dvUGx1Z2luSW50ZXJmYWNlLFxuICBJUmVxdWVzdCxcbn0gZnJvbSBcIi4uL3R5cGVzXCJcbmltcG9ydCBnZXRDbGlwYm9hcmRJbWFnZSBmcm9tIFwiLi4vdXRpbHMvZ2V0Q2xpcGJvYXJkSW1hZ2VcIlxuaW1wb3J0IFJlcXVlc3QgZnJvbSBcIi4uL2xpYi9SZXF1ZXN0XCJcbmltcG9ydCBEQiBmcm9tIFwiLi4vdXRpbHMvZGJcIlxuaW1wb3J0IFBsdWdpbkhhbmRsZXIgZnJvbSBcIi4uL2xpYi9QbHVnaW5IYW5kbGVyXCJcbmltcG9ydCB7IElCdWlsZEluRXZlbnQsIElCdXNFdmVudCB9IGZyb20gXCIuLi91dGlscy9lbnVtXCJcbmltcG9ydCB7IGV2ZW50QnVzIH0gZnJvbSBcIi4uL3V0aWxzL2V2ZW50QnVzXCJcbmltcG9ydCB7IGlzQ29uZmlnS2V5SW5CbGFja0xpc3QsIGlzSW5wdXRDb25maWdWYWxpZCB9IGZyb20gXCIuLi91dGlscy9jb21tb25cIlxuaW1wb3J0IHsgSTE4bk1hbmFnZXIgfSBmcm9tIFwiLi4vaTE4blwiXG5cbmV4cG9ydCBjbGFzcyBQaWNHbyBleHRlbmRzIEV2ZW50RW1pdHRlciBpbXBsZW1lbnRzIElQaWNHbyB7XG4gIHByaXZhdGUgX2NvbmZpZyE6IElDb25maWdcbiAgcHJpdmF0ZSBsaWZlY3ljbGUhOiBMaWZlY3ljbGVcbiAgcHJpdmF0ZSBkYiE6IERCXG4gIHByaXZhdGUgX3BsdWdpbkxvYWRlciE6IFBsdWdpbkxvYWRlclxuICBjb25maWdQYXRoOiBzdHJpbmdcbiAgYmFzZURpciE6IHN0cmluZ1xuICBoZWxwZXIhOiBJSGVscGVyXG4gIGxvZzogTG9nZ2VyXG4gIGNtZDogQ29tbWFuZGVyXG4gIG91dHB1dDogSUltZ0luZm9bXVxuICBpbnB1dDogYW55W11cbiAgcGx1Z2luSGFuZGxlcjogUGx1Z2luSGFuZGxlclxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgd2lsbCBiZSByZW1vdmVkIGluIHYxLjUuMCtcbiAgICpcbiAgICogdXNlIHJlcXVlc3QgaW5zdGVhZFxuICAgKi9cbiAgUmVxdWVzdCE6IFJlcXVlc3RcbiAgaTE4biE6IElJMThuTWFuYWdlclxuICBWRVJTSU9OOiBzdHJpbmcgPSBwcm9jZXNzLmVudi5QSUNHT19WRVJTSU9OXG4gIEdVSV9WRVJTSU9OPzogc3RyaW5nXG5cbiAgZ2V0IHBsdWdpbkxvYWRlcigpOiBJUGx1Z2luTG9hZGVyIHtcbiAgICByZXR1cm4gdGhpcy5fcGx1Z2luTG9hZGVyXG4gIH1cblxuICBjb25zdHJ1Y3Rvcihjb25maWdQYXRoID0gXCJcIikge1xuICAgIHN1cGVyKClcbiAgICB0aGlzLmNvbmZpZ1BhdGggPSBjb25maWdQYXRoXG4gICAgdGhpcy5vdXRwdXQgPSBbXVxuICAgIHRoaXMuaW5wdXQgPSBbXVxuICAgIHRoaXMuaGVscGVyID0ge1xuICAgICAgdHJhbnNmb3JtZXI6IG5ldyBMaWZlY3ljbGVQbHVnaW5zKFwidHJhbnNmb3JtZXJcIiksXG4gICAgICB1cGxvYWRlcjogbmV3IExpZmVjeWNsZVBsdWdpbnMoXCJ1cGxvYWRlclwiKSxcbiAgICAgIGJlZm9yZVRyYW5zZm9ybVBsdWdpbnM6IG5ldyBMaWZlY3ljbGVQbHVnaW5zKFwiYmVmb3JlVHJhbnNmb3JtUGx1Z2luc1wiKSxcbiAgICAgIGJlZm9yZVVwbG9hZFBsdWdpbnM6IG5ldyBMaWZlY3ljbGVQbHVnaW5zKFwiYmVmb3JlVXBsb2FkUGx1Z2luc1wiKSxcbiAgICAgIGFmdGVyVXBsb2FkUGx1Z2luczogbmV3IExpZmVjeWNsZVBsdWdpbnMoXCJhZnRlclVwbG9hZFBsdWdpbnNcIiksXG4gICAgfVxuICAgIHRoaXMuaW5pdENvbmZpZ1BhdGgoKVxuICAgIHRoaXMubG9nID0gbmV3IExvZ2dlcih0aGlzKVxuICAgIHRoaXMuY21kID0gbmV3IENvbW1hbmRlcih0aGlzKVxuICAgIHRoaXMucGx1Z2luSGFuZGxlciA9IG5ldyBQbHVnaW5IYW5kbGVyKHRoaXMpXG4gICAgdGhpcy5pbml0Q29uZmlnKClcbiAgICB0aGlzLmluaXQoKVxuICB9XG5cbiAgcHJpdmF0ZSBpbml0Q29uZmlnUGF0aCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5jb25maWdQYXRoID09PSBcIlwiKSB7XG4gICAgICB0aGlzLmNvbmZpZ1BhdGggPSBob21lZGlyKCkgKyBcIi8ucGljZ28vY29uZmlnLmpzb25cIlxuICAgIH1cbiAgICBpZiAocGF0aC5leHRuYW1lKHRoaXMuY29uZmlnUGF0aCkudG9VcHBlckNhc2UoKSAhPT0gXCIuSlNPTlwiKSB7XG4gICAgICB0aGlzLmNvbmZpZ1BhdGggPSBcIlwiXG4gICAgICB0aHJvdyBFcnJvcihcIlRoZSBjb25maWd1cmF0aW9uIGZpbGUgb25seSBzdXBwb3J0cyBKU09OIGZvcm1hdC5cIilcbiAgICB9XG4gICAgdGhpcy5iYXNlRGlyID0gcGF0aC5kaXJuYW1lKHRoaXMuY29uZmlnUGF0aClcbiAgICBjb25zdCBleGlzdCA9IGZzLnBhdGhFeGlzdHNTeW5jKHRoaXMuY29uZmlnUGF0aClcbiAgICBpZiAoIWV4aXN0KSB7XG4gICAgICBmcy5lbnN1cmVGaWxlU3luYyhgJHt0aGlzLmNvbmZpZ1BhdGh9YClcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGluaXRDb25maWcoKTogdm9pZCB7XG4gICAgdGhpcy5kYiA9IG5ldyBEQih0aGlzKVxuICAgIHRoaXMuX2NvbmZpZyA9IHRoaXMuZGIucmVhZCh0cnVlKSBhcyBJQ29uZmlnXG4gIH1cblxuICBwcml2YXRlIGluaXQoKTogdm9pZCB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIGluaXQgMThuIGF0IGZpcnN0XG4gICAgICB0aGlzLmkxOG4gPSBuZXcgSTE4bk1hbmFnZXIodGhpcylcbiAgICAgIHRoaXMuUmVxdWVzdCA9IG5ldyBSZXF1ZXN0KHRoaXMpXG4gICAgICB0aGlzLl9wbHVnaW5Mb2FkZXIgPSBuZXcgUGx1Z2luTG9hZGVyKHRoaXMpXG4gICAgICAvLyBsb2FkIHNlbGYgcGx1Z2luc1xuICAgICAgc2V0Q3VycmVudFBsdWdpbk5hbWUoXCJwaWNnb1wiKVxuICAgICAgdXBsb2FkZXJzKHRoaXMpLnJlZ2lzdGVyKHRoaXMpXG4gICAgICB0cmFuc2Zvcm1lcnModGhpcykucmVnaXN0ZXIodGhpcylcbiAgICAgIHNldEN1cnJlbnRQbHVnaW5OYW1lKFwiXCIpXG4gICAgICAvLyBsb2FkIHRoaXJkLXBhcnR5IHBsdWdpbnNcbiAgICAgIHRoaXMuX3BsdWdpbkxvYWRlci5sb2FkKClcbiAgICAgIHRoaXMubGlmZWN5Y2xlID0gbmV3IExpZmVjeWNsZSh0aGlzKVxuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgdGhpcy5lbWl0KElCdWlsZEluRXZlbnQuVVBMT0FEX1BST0dSRVNTLCAtMSlcbiAgICAgIHRoaXMubG9nLmVycm9yKGUpXG4gICAgICB0aHJvdyBlXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIGVhc2lseSBtYW5udWFsbHkgbG9hZCBhIHBsdWdpblxuICAgKiBpZiBwcm92aWRlIHBsdWdpbiBuYW1lLCB3aWxsIHJlZ2lzdGVyIHBsdWdpbiBieSBuYW1lXG4gICAqIG9yIGp1c3QgaW5zdGFudGlhdGUgYSBwbHVnaW5cbiAgICovXG4gIHVzZShwbHVnaW46IElQaWNHb1BsdWdpbiwgbmFtZT86IHN0cmluZyk6IElQaWNHb1BsdWdpbkludGVyZmFjZSB7XG4gICAgaWYgKG5hbWUpIHtcbiAgICAgIHRoaXMucGx1Z2luTG9hZGVyLnJlZ2lzdGVyUGx1Z2luKG5hbWUsIHBsdWdpbilcbiAgICAgIHJldHVybiB0aGlzLnBsdWdpbkxvYWRlci5nZXRQbHVnaW4obmFtZSkhXG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHBsdWdpbkluc3RhbmNlID0gcGx1Z2luKHRoaXMpXG4gICAgICByZXR1cm4gcGx1Z2luSW5zdGFuY2VcbiAgICB9XG4gIH1cblxuICByZWdpc3RlckNvbW1hbmRzKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmNvbmZpZ1BhdGggIT09IFwiXCIpIHtcbiAgICAgIHRoaXMuY21kLmluaXQoKVxuICAgICAgdGhpcy5jbWQubG9hZENvbW1hbmRzKClcbiAgICB9XG4gIH1cblxuICBnZXRDb25maWc8VD4obmFtZT86IHN0cmluZyk6IFQge1xuICAgIGlmICghbmFtZSkge1xuICAgICAgcmV0dXJuIHRoaXMuX2NvbmZpZyBhcyB1bmtub3duIGFzIFRcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGdldCh0aGlzLl9jb25maWcsIG5hbWUpXG4gICAgfVxuICB9XG5cbiAgc2F2ZUNvbmZpZyhjb25maWc6IElTdHJpbmdLZXlNYXA8YW55Pik6IHZvaWQge1xuICAgIGlmICghaXNJbnB1dENvbmZpZ1ZhbGlkKGNvbmZpZykpIHtcbiAgICAgIHRoaXMubG9nLndhcm4oXCJ0aGUgZm9ybWF0IG9mIGNvbmZpZyBpcyBpbnZhbGlkLCBwbGVhc2UgcHJvdmlkZSBvYmplY3RcIilcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICB0aGlzLnNldENvbmZpZyhjb25maWcpXG4gICAgdGhpcy5kYi5zYXZlQ29uZmlnKGNvbmZpZylcbiAgfVxuXG4gIHJlbW92ZUNvbmZpZyhrZXk6IHN0cmluZywgcHJvcE5hbWU6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICgha2V5IHx8ICFwcm9wTmFtZSkgcmV0dXJuXG4gICAgaWYgKGlzQ29uZmlnS2V5SW5CbGFja0xpc3Qoa2V5KSkge1xuICAgICAgdGhpcy5sb2cud2FybihgdGhlIGNvbmZpZy4ke2tleX0gY2FuJ3QgYmUgcmVtb3ZlZGApXG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgdGhpcy51bnNldENvbmZpZyhrZXksIHByb3BOYW1lKVxuICAgIHRoaXMuZGIudW5zZXQoa2V5LCBwcm9wTmFtZSlcbiAgfVxuXG4gIHNldENvbmZpZyhjb25maWc6IElTdHJpbmdLZXlNYXA8YW55Pik6IHZvaWQge1xuICAgIGlmICghaXNJbnB1dENvbmZpZ1ZhbGlkKGNvbmZpZykpIHtcbiAgICAgIHRoaXMubG9nLndhcm4oXCJ0aGUgZm9ybWF0IG9mIGNvbmZpZyBpcyBpbnZhbGlkLCBwbGVhc2UgcHJvdmlkZSBvYmplY3RcIilcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBPYmplY3Qua2V5cyhjb25maWcpLmZvckVhY2goKG5hbWU6IHN0cmluZykgPT4ge1xuICAgICAgaWYgKGlzQ29uZmlnS2V5SW5CbGFja0xpc3QobmFtZSkpIHtcbiAgICAgICAgdGhpcy5sb2cud2FybihgdGhlIGNvbmZpZy4ke25hbWV9IGNhbid0IGJlIG1vZGlmaWVkYClcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1keW5hbWljLWRlbGV0ZVxuICAgICAgICBkZWxldGUgY29uZmlnW25hbWVdXG4gICAgICB9XG4gICAgICBzZXQodGhpcy5fY29uZmlnLCBuYW1lLCBjb25maWdbbmFtZV0pXG4gICAgICBldmVudEJ1cy5lbWl0KElCdXNFdmVudC5DT05GSUdfQ0hBTkdFLCB7XG4gICAgICAgIGNvbmZpZ05hbWU6IG5hbWUsXG4gICAgICAgIHZhbHVlOiBjb25maWdbbmFtZV0sXG4gICAgICB9KVxuICAgIH0pXG4gIH1cblxuICB1bnNldENvbmZpZyhrZXk6IHN0cmluZywgcHJvcE5hbWU6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICgha2V5IHx8ICFwcm9wTmFtZSkgcmV0dXJuXG4gICAgaWYgKGlzQ29uZmlnS2V5SW5CbGFja0xpc3Qoa2V5KSkge1xuICAgICAgdGhpcy5sb2cud2FybihgdGhlIGNvbmZpZy4ke2tleX0gY2FuJ3QgYmUgdW5zZXRgKVxuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIHVuc2V0KHRoaXMuZ2V0Q29uZmlnKGtleSksIHByb3BOYW1lKVxuICB9XG5cbiAgZ2V0IHJlcXVlc3QoKTogSVJlcXVlc3RbXCJyZXF1ZXN0XCJdIHtcbiAgICByZXR1cm4gdGhpcy5SZXF1ZXN0LnJlcXVlc3QuYmluZCh0aGlzLlJlcXVlc3QpXG4gIH1cblxuICBhc3luYyB1cGxvYWQoaW5wdXQ/OiBhbnlbXSk6IFByb21pc2U8SUltZ0luZm9bXSB8IEVycm9yPiB7XG4gICAgaWYgKHRoaXMuY29uZmlnUGF0aCA9PT0gXCJcIikge1xuICAgICAgdGhpcy5sb2cuZXJyb3IoXCJUaGUgY29uZmlndXJhdGlvbiBmaWxlIG9ubHkgc3VwcG9ydHMgSlNPTiBmb3JtYXQuXCIpXG4gICAgICByZXR1cm4gW11cbiAgICB9XG4gICAgLy8gdXBsb2FkIGZyb20gY2xpcGJvYXJkXG4gICAgaWYgKGlucHV0ID09PSB1bmRlZmluZWQgfHwgaW5wdXQubGVuZ3RoID09PSAwKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCB7IGltZ1BhdGgsIHNob3VsZEtlZXBBZnRlclVwbG9hZGluZyB9ID0gYXdhaXQgZ2V0Q2xpcGJvYXJkSW1hZ2UodGhpcylcbiAgICAgICAgaWYgKGltZ1BhdGggPT09IFwibm8gaW1hZ2VcIikge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImltYWdlIG5vdCBmb3VuZCBpbiBjbGlwYm9hcmRcIilcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLm9uY2UoSUJ1aWxkSW5FdmVudC5GQUlMRUQsICgpID0+IHtcbiAgICAgICAgICAgIGlmICghc2hvdWxkS2VlcEFmdGVyVXBsb2FkaW5nKSB7XG4gICAgICAgICAgICAgIC8vIOWIoOmZpCBwaWNnbyDnlJ/miJDnmoTlm77niYfmlofku7bvvIzkvovlpoIgYH4vLnBpY2dvLzIwMjAwNjIxMjA1NzIwLnBuZ2BcbiAgICAgICAgICAgICAgZnMucmVtb3ZlKGltZ1BhdGgpLmNhdGNoKChlKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2cuZXJyb3IoZSlcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICAgIHRoaXMub25jZShcImZpbmlzaGVkXCIsICgpID0+IHtcbiAgICAgICAgICAgIGlmICghc2hvdWxkS2VlcEFmdGVyVXBsb2FkaW5nKSB7XG4gICAgICAgICAgICAgIGZzLnJlbW92ZShpbWdQYXRoKS5jYXRjaCgoZSkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMubG9nLmVycm9yKGUpXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgICBjb25zdCB7IG91dHB1dCB9ID0gYXdhaXQgdGhpcy5saWZlY3ljbGUuc3RhcnQoW2ltZ1BhdGhdKVxuICAgICAgICAgIHJldHVybiBvdXRwdXRcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB0aGlzLmVtaXQoSUJ1aWxkSW5FdmVudC5GQUlMRUQsIGUpXG4gICAgICAgIHRocm93IGVcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gdXBsb2FkIGZyb20gcGF0aFxuICAgICAgY29uc3QgeyBvdXRwdXQgfSA9IGF3YWl0IHRoaXMubGlmZWN5Y2xlLnN0YXJ0KGlucHV0KVxuICAgICAgcmV0dXJuIG91dHB1dFxuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHsgSVBpY0dvLCBJUGljR29QbHVnaW4gfSBmcm9tIFwiLi4vLi4vdHlwZXNcIlxuaW1wb3J0IEltZ0Zyb21QYXRoIGZyb20gXCIuL3BhdGhcIlxuaW1wb3J0IEltZ0Zyb21CYXNlNjQgZnJvbSBcIi4vYmFzZTY0XCJcblxuY29uc3QgYnVpbGRJblRyYW5zZm9ybWVyczogSVBpY0dvUGx1Z2luID0gKCkgPT4ge1xuICByZXR1cm4ge1xuICAgIHJlZ2lzdGVyKGN0eDogSVBpY0dvKSB7XG4gICAgICBjdHguaGVscGVyLnRyYW5zZm9ybWVyLnJlZ2lzdGVyKFwicGF0aFwiLCBJbWdGcm9tUGF0aClcbiAgICAgIGN0eC5oZWxwZXIudHJhbnNmb3JtZXIucmVnaXN0ZXIoXCJiYXNlNjRcIiwgSW1nRnJvbUJhc2U2NClcbiAgICB9LFxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IGJ1aWxkSW5UcmFuc2Zvcm1lcnNcbiJdLCJuYW1lcyI6WyJwbHVnaW5IYW5kbGVyIiwiaGFuZGxlIiwiY3R4IiwiY21kIiwicHJvZ3JhbSIsImNvbW1hbmQiLCJkZXNjcmlwdGlvbiIsImFsaWFzIiwib3B0aW9uIiwiYWN0aW9uIiwicGx1Z2lucyIsInByb3h5IiwicmVnaXN0cnkiLCJvcHRpb25zIiwiaW5zdGFsbCIsImNhdGNoIiwiZSIsImxvZyIsImVycm9yIiwidW5pbnN0YWxsIiwidXBkYXRlIiwiY29uZmlnIiwiaXNVcmwiLCJ1cmwiLCJzdGFydHNXaXRoIiwiaGFuZGxlVXJsRW5jb2RlIiwiZGVjb2RlVVJJIiwiaXNVcmxFbmNvZGUiLCJlbmNvZGVVUkkiLCJnZXRJbWFnZVNpemUiLCJmaWxlIiwid2lkdGgiLCJoZWlnaHQiLCJpbWFnZVNpemUiLCJyZWFsIiwiZ2V0UGx1Z2luTmFtZVR5cGUiLCJuYW1lIiwidGVzdCIsImlzU2ltcGxlTmFtZSIsIm5hbWVPclBhdGgiLCJwYXRoIiwiaXNBYnNvbHV0ZSIsInBsdWdpblBhdGgiLCJqb2luIiwicHJvY2VzcyIsImN3ZCIsImZzIiwiZXhpc3RzU3luYyIsImluY2x1ZGVzIiwiaGFuZGxlQ29tcGxldGVQbHVnaW5OYW1lIiwic2NvcGUiLCJoYW5kbGVVbml4U3R5bGVQYXRoIiwicGF0aFN0ciIsInNwbGl0Iiwic2VwIiwicmVtb3ZlUGx1Z2luVmVyc2lvbiIsInJlZyIsIm1hdGNoQXJyIiwibWF0Y2giLCJjb25zb2xlIiwid2FybiIsImNvbmZpZ0JsYWNrTGlzdCIsImlzQ29uZmlnS2V5SW5CbGFja0xpc3QiLCJrZXkiLCJzb21lIiwiYmxhY2tJdGVtIiwiaXNJbnB1dENvbmZpZ1ZhbGlkIiwiQXJyYXkiLCJpc0FycmF5IiwiT2JqZWN0Iiwia2V5cyIsImxlbmd0aCIsInNhZmVQYXJzZSIsInN0ciIsIkpTT04iLCJwYXJzZSIsInVwbG9hZCIsImFyZ3VtZW50cyIsImlucHV0IiwiaW5wdXRMaXN0IiwibWFwIiwiaXRlbSIsInJlc29sdmUiLCJmaWx0ZXIiLCJleGlzdCIsImhhbmRsZUNvbmZpZyIsImFzeW5jIiwicHJvbXB0cyIsIm1vZHVsZSIsImFuc3dlciIsImlucXVpcmVyIiwicHJvbXB0IiwiY29uZmlnTmFtZSIsInNhdmVDb25maWciLCJzZXR0aW5nIiwiaGVscGVyIiwiZ2V0IiwidHlwZSIsImNob2ljZXMiLCJnZXRJZExpc3QiLCJtZXNzYWdlIiwiZ2V0Q29uZmlnIiwiX2EiLCJwbHVnaW5Mb2FkZXIiLCJnZXRQbHVnaW4iLCJnZXRGdWxsTGlzdCIsIl9iIiwicGx1Z2luIiwidXNlTW9kdWxlTmFtZSIsInN1Y2Nlc3MiLCJpbmZvIiwiYXJndiIsInVzZSIsInVwbG9hZGVyIiwiZGVmYXVsdCIsInRyYW5zZm9ybWVyIiwicHVzaCIsInBpY2dvUGx1Z2lucyIsInNldENvbmZpZyIsImdlbmVyYXRlIiwib3B0cyIsImdldE9wdGlvbnMiLCJ0bXAiLCJzb3VyY2UiLCJhbnN3ZXJzIiwiX2ZpbGVzIiwiZ2xvYmJ5IiwiZG90IiwiZ2xvYiIsImZpbHRlcnMiLCJmb3JFYWNoIiwiZmlsZXMiLCJyZW5kZXIiLCJ3cml0ZUZpbGVUcmVlIiwiZGVzdCIsImNvbXBsZXRlIiwiY29tcGxldGVNZXNzYWdlIiwiZXhwIiwiZGF0YSIsImZuIiwiRnVuY3Rpb24iLCJzdHJpbmdpZnkiLCJ0ZW1wbGF0ZVBhdGgiLCJvcHRpb25zUGF0aCIsInJlcXVpcmUiLCJmaWxlVHJlZSIsImZpbGVQYXRoIiwicmVhZEZpbGVTeW5jIiwiY29udGVudCIsImVqcyIsIkJ1ZmZlciIsImlzQnVmZmVyIiwiZGlyIiwiZW5zdXJlRGlyU3luYyIsImRpcm5hbWUiLCJ3cml0ZUZpbGVTeW5jIiwicnVuIiwib2ZmbGluZSIsInRlbXBsYXRlIiwiaGFzU2xhc2giLCJkb3dubG9hZEFuZEdlbmVyYXRlIiwicm0iLCJzeW5jIiwiZG93bmxvYWQiLCJjbG9uZSIsImVyciIsImluaXQiLCJwcm9qZWN0IiwiaW5QbGFjZSIsImhvbWVkaXIiLCJyZXBsYWNlIiwidGhlbiIsIm9rIiwib24iLCJjaGFsayIsImdyYXkiLCJpMThuIiwibGFuZyIsImxpc3QiLCJnZXRMYW5ndWFnZUxpc3QiLCJzZXRMYW5ndWFnZSIsIkxpZmVjeWNsZVBsdWdpbnMiLCJjb25zdHJ1Y3RvciIsInRoaXMiLCJNYXAiLCJwbHVnaW5JZE1hcCIsInJlZ2lzdGVyIiwiaWQiLCJUeXBlRXJyb3IiLCJoYXMiLCJzZXQiLCJjdXJyZW50UGx1Z2luIiwidW5yZWdpc3RlciIsInBsdWdpbk5hbWUiLCJwbHVnaW5MaXN0IiwiZGVsZXRlIiwiZ2V0TmFtZSIsImdldExpc3QiLCJ2YWx1ZXMiLCJzZXRDdXJyZW50UGx1Z2luTmFtZSIsIkNvbW1hbmRlciIsIkNvbW1hbmQiLCJ2ZXJzaW9uIiwiZGVidWciLCJzaWxlbnQiLCJhcmdzIiwiZXhpdCIsImN1cnJlbnRQbHVnaW5OYW1lIiwibG9hZENvbW1hbmRzIiwiSUxvZ1R5cGUiLCJJQnVpbGRJbkV2ZW50IiwiSUJ1c0V2ZW50IiwiTG9nZ2VyIiwibGV2ZWwiLCJoYW5kbGVMb2ciLCJtc2ciLCJsb2dIZWFkZXIiLCJ0b1VwcGVyQ2FzZSIsImxvZ0xldmVsIiwibG9nUGF0aCIsImJhc2VEaXIiLCJzZXRUaW1lb3V0IiwicmVzdWx0IiwiY2hlY2tMb2dGaWxlSXNMYXJnZSIsImlzTGFyZ2UiLCJ3YXJuaW5nTXNnIiwibG9nRmlsZVNpemVMaW1pdCIsInllbGxvdyIsInJlY3JlYXRlTG9nRmlsZSIsInVuc2hpZnQiLCJoYW5kbGVXcml0ZUxvZyIsImxvZ0ZpbGVTaXplIiwic3RhdFN5bmMiLCJzaXplIiwibnVtIiwiaXNOYU4iLCJOdW1iZXIiLCJmb3JjZU51bWJlciIsInVubGlua1N5bmMiLCJjcmVhdGVGaWxlU3luYyIsImNoZWNrTG9nTGV2ZWwiLCJkYXlqcyIsImZvcm1hdCIsIkVycm9yIiwidXRpbCIsInN0YWNrIiwiYXBwZW5kRmlsZVN5bmMiLCJ1bmRlZmluZWQiLCJlbnYiLCJOT0RFX0VOViIsIkxpZmVjeWNsZSIsIkV2ZW50RW1pdHRlciIsInN1cGVyIiwic3RhcnQiLCJjb25maWdQYXRoIiwib3V0cHV0IiwiUmVxdWVzdCIsIlZFUlNJT04iLCJHVUlfVkVSU0lPTiIsInJlcXVlc3QiLCJiaW5kIiwicmVtb3ZlQ29uZmlnIiwidW5zZXRDb25maWciLCJhZGRMaXN0ZW5lciIsIm9uY2UiLCJyZW1vdmVMaXN0ZW5lciIsIm9mZiIsInJlbW92ZUFsbExpc3RlbmVycyIsInNldE1heExpc3RlbmVycyIsImdldE1heExpc3RlbmVycyIsImxpc3RlbmVycyIsInJhd0xpc3RlbmVycyIsImVtaXQiLCJsaXN0ZW5lckNvdW50IiwicHJlcGVuZExpc3RlbmVyIiwicHJlcGVuZE9uY2VMaXN0ZW5lciIsImV2ZW50TmFtZXMiLCJjcmVhdGVDb250ZXh0IiwiYmVmb3JlVHJhbnNmb3JtIiwiZG9UcmFuc2Zvcm0iLCJiZWZvcmVVcGxvYWQiLCJkb1VwbG9hZCIsImFmdGVyVXBsb2FkIiwiRkFJTEVEIiwiVVBMT0FEX1BST0dSRVNTIiwiQkVGT1JFX1RSQU5TRk9STSIsImhhbmRsZVBsdWdpbnMiLCJiZWZvcmVUcmFuc2Zvcm1QbHVnaW5zIiwiY3VycmVudFRyYW5zZm9ybWVyIiwiQkVGT1JFX1VQTE9BRCIsImJlZm9yZVVwbG9hZFBsdWdpbnMiLCJvdXRwdXRJbWciLCJBRlRFUl9VUExPQUQiLCJhZnRlclVwbG9hZFBsdWdpbnMiLCJpIiwiaW1nVXJsIiwiYmFzZTY0SW1hZ2UiLCJidWZmZXIiLCJGSU5JU0hFRCIsImxpZmVDeWNsZVBsdWdpbnMiLCJwbHVnaW5OYW1lcyIsImxpZmVDeWNsZU5hbWUiLCJQcm9taXNlIiwiYWxsIiwiaW5kZXgiLCJnZW5lcmF0ZVNpZ25hdHVyZSIsImZpbGVOYW1lIiwic2VjcmV0SWQiLCJzZWNyZXRLZXkiLCJhcHBJZCIsImJ1Y2tldCIsInNpZ25hdHVyZSIsInNpZ25UaW1lIiwidG9kYXkiLCJNYXRoIiwiZmxvb3IiLCJEYXRlIiwiZ2V0VGltZSIsInNpZ25LZXkiLCJjcnlwdG8iLCJjcmVhdGVIbWFjIiwiZGlnZXN0IiwiaHR0cFN0cmluZyIsImFyZWEiLCJzdHJpbmdUb1NpZ24iLCJjcmVhdGVIYXNoIiwicmFuZG9tIiwiY3VycmVudCIsIm11bHRpU2lnbmF0dXJlIiwic2lnbkhleEtleSIsInRlbXBTdHJpbmciLCJjb25jYXQiLCJmcm9tIiwidG9TdHJpbmciLCJwb3N0T3B0aW9ucyIsImltYWdlIiwibWV0aG9kIiwiZW5jb2RlVVJJQ29tcG9uZW50IiwiaGVhZGVycyIsIkF1dGhvcml6YXRpb24iLCJjb250ZW50VHlwZSIsIm1pbWUiLCJsb29rdXAiLCJ1c2VyQWdlbnQiLCJib2R5IiwicmVzb2x2ZVdpdGhGdWxsUmVzcG9uc2UiLCJmb3JtRGF0YSIsIm9wIiwiZmlsZWNvbnRlbnQiLCJ0Y1l1bk9wdGlvbnMiLCJpbWdMaXN0IiwiY3VzdG9tVXJsIiwidXNlVjQiLCJpbWciLCJyZXMiLCJzdGF0dXNDb2RlIiwidHJhbnNsYXRlIiwiX2MiLCJvcHRpb25VcmwiLCJzb3VyY2VfdXJsIiwiTk9USUZJQ0FUSU9OIiwidGl0bGUiLCJjb2RlIiwidGV4dCIsInVzZXJDb25maWciLCJyZXF1aXJlZCIsInByZWZpeCIsInRva2VuIiwicmVwbyIsImpzb24iLCJnaXRodWJPcHRpb25zIiwiYnJhbmNoIiwicG9zdENvbmZpZyIsImRvd25sb2FkX3VybCIsImltZ0Jhc2U2NCIsInNlbGVjdEFyZWEiLCJnZXRUb2tlbiIsInFpbml1T3B0aW9ucyIsImFjY2Vzc0tleSIsIm1hYyIsInFpbml1IiwiYXV0aCIsIk1hYyIsInJzIiwiUHV0UG9saWN5IiwidXBsb2FkVG9rZW4iLCJiYXNlVXJsIiwicmVzcG9uc2UiLCJzdHJlYW1VdGlscyIsImJ1ZiIsImltYWdlQnVmZmVyIiwiQXJyYXlCdWZmZXIiLCJhcnJheUJ1ZmZlclRvQnVmZmVyIiwiZGF0ZSIsInRvVVRDU3RyaW5nIiwibWltZVR5cGUiLCJzaWduU3RyaW5nIiwiYWNjZXNzS2V5U2VjcmV0IiwiYWNjZXNzS2V5SWQiLCJIb3N0IiwiYWxpWXVuT3B0aW9ucyIsImhhbmRsZVJlc3QiLCJzdG9yZSIsIk9TUyIsInJlZ2lvbiIsInJlbW90ZVBhdGgiLCJzdHJlYW0iLCJSZWFkYWJsZSIsInB1dFN0cmVhbSIsInN0YXR1cyIsIm9wZXJhdG9yIiwicGFzc3dvcmQiLCJtZDVQYXNzd29yZCIsIk1ENSIsInZhbHVlIiwidXB5dW5PcHRpb25zIiwic2VydmljZU5hbWUiLCJvcGVyYXRvck5hbWUiLCJvcGVyYXRvclBhc3N3b3JkIiwic2VydmljZSIsInVweXVuIiwiU2VydmljZSIsImNsaWVudCIsIkNsaWVudCIsInB1dEZpbGUiLCJidWlsZEluVXBsb2FkZXJzIiwiYWxpWXVuVXBsb2FkZXIiLCJ0Y1l1blVwbG9hZGVyIiwiZ2l0aHViVXBsb2FkZXIiLCJxaW5pdVVwbG9hZGVyIiwidXBZdW5VcGxvYWRlciIsImdldEltZ1NpemUiLCJJbWdGcm9tUGF0aCIsInJlc3VsdHMiLCJ0aW1lb3V0SWQiLCJpc0ltYWdlIiwiZXh0bmFtZSIsInJlcXVlc3RGbiIsInJlamVjdCIsInJlc3BvbnNlVHlwZSIsInJlc3AiLCJjbGVhclRpbWVvdXQiLCJ1cmxQYXRoIiwiVVJMIiwicGF0aG5hbWUiLCJiYXNlbmFtZSIsInJlYXNvbiIsInRpbWVvdXRQcm9taXNlIiwicmFjZSIsImdldFVSTEZpbGUiLCJyZWFkRmlsZSIsImdldEZTRmlsZSIsImltZ1NpemUiLCJJbWdGcm9tQmFzZTY0IiwiUGx1Z2luTG9hZGVyIiwiZnVsbExpc3QiLCJTZXQiLCJwbHVnaW5NYXAiLCJwYWNrYWdlUGF0aCIsInBrZyIsInJlcG9zaXRvcnkiLCJsaWNlbnNlIiwicmVzb2x2ZVBsdWdpbiIsImJhc2VkaXIiLCJsb2FkIiwicGx1Z2luRGlyIiwicmVhZEpTT05TeW5jIiwiZGVwcyIsImRlcGVuZGVuY2llcyIsImRldkRlcHMiLCJkZXZEZXBlbmRlbmNpZXMiLCJtb2R1bGVzIiwicmVnaXN0ZXJQbHVnaW4iLCJhZGQiLCJwbHVnaW5JbnRlcmZhY2UiLCJ1bnJlZ2lzdGVyUGx1Z2luIiwiaGFzUGx1Z2luIiwiQ0xJUEJPQVJEX0lNQUdFX0ZPTERFUiIsInBsYXRmb3JtMlNjcmlwdENvbnRlbnQiLCJkYXJ3aW4iLCJ3aW4zMiIsIndpbjEwIiwibGludXgiLCJ3c2wiLCJwbGF0Zm9ybTJTY3JpcHRGaWxlbmFtZSIsImdldENsaXBib2FyZEltYWdlIiwiaW1hZ2VQYXRoIiwibWtkaXJTeW5jIiwiY3JlYXRlSW1hZ2VGb2xkZXIiLCJwbGF0Zm9ybSIsImlzV3NsIiwib3MiLCJyZWxlYXNlIiwiZ2V0Q3VycmVudFBsYXRmb3JtIiwic2NyaXB0UGF0aCIsImV4ZWN1dGlvbiIsInNwYXduIiwic3Rkb3V0IiwidHJpbSIsImltZ1BhdGgiLCJzaG91bGRLZWVwQWZ0ZXJVcGxvYWRpbmciLCJldmVudEJ1cyIsImh0dHBzQWdlbnQiLCJodHRwcyIsIkFnZW50IiwibWF4VmVyc2lvbiIsIm1pblZlcnNpb24iLCJhcHBlbmRGb3JtRGF0YSIsImZvcm0iLCJhcHBlbmQiLCJyZXNwb25zZUludGVyY2VwdG9yIiwiYXNzaWduIiwicmVzcG9uc2VFcnJvckhhbmRsZXIiLCJlcnJvck9iaiIsIl9kIiwiX2UiLCJfZiIsIl9nIiwiQ09ORklHX0NIQU5HRSIsImhhbmRsZVByb3h5IiwicHJveHlPcHRpb25zIiwiaG9zdCIsImhvc3RuYW1lIiwicG9ydCIsInBhcnNlSW50IiwicHJvdG9jb2wiLCJtYXhCb2R5TGVuZ3RoIiwiSW5maW5pdHkiLCJtYXhDb250ZW50TGVuZ3RoIiwidHVubmVsIiwiaHR0cHNPdmVySHR0cCIsImluc3RhbmNlIiwiYXhpb3MiLCJjcmVhdGUiLCJpbnRlcmNlcHRvcnMiLCJvcHQiLCJfX2lzT2xkT3B0aW9ucyIsIkZvcm1EYXRhIiwiZ2V0SGVhZGVycyIsInBhcmFtcyIsInFzIiwicmVxdWVzdEludGVyY2VwdG9yIiwib2JqIiwiQ29udGVudFR5cGUiLCJEQiIsImRiIiwiSlNPTlN0b3JlIiwicmVhZCIsImZsdXNoIiwidW5zZXQiLCJQbHVnaW5IYW5kbGVyIiwiaW5zdGFsbGVkUGx1Z2lucyIsInByb2Nlc3NQbHVnaW5zIiwiaGFuZGxlUGx1Z2luTmFtZVByb2Nlc3MiLCJwa2dOYW1lIiwiZnVsbE5hbWVMaXN0IiwiZnVsbE5hbWUiLCJwa2dOYW1lTGlzdCIsImV4ZWNDb21tYW5kIiwid2hlcmUiLCJucG1PcHRpb25zIiwibnBtIiwicGlwZSIsInN0ZGVyciIsImxvZ2dlciIsImdldFByb2Nlc3NQbHVnaW5OYW1lIiwicGFja2FnZUpTT05QYXRoIiwicG9zaXgiLCJnZXROb3JtYWxQbHVnaW5OYW1lIiwibGFuZ3VhZ2VMaXN0IiwiVVBMT0FEX0ZBSUxFRCIsIkNIRUNLX1NFVFRJTkdTIiwiQ0hFQ0tfU0VUVElOR1NfQU5EX05FVFdPUksiLCJVUExPQURfRkFJTEVEX1JFQVNPTiIsIlNFUlZFUl9FUlJPUiIsIkFVVEhfRkFJTEVEIiwiUElDQkVEX1NNTVMiLCJQSUNCRURfU01NU19UT0tFTiIsIlBJQ0JFRF9TTU1TX0JBQ0tVUF9ET01BSU4iLCJQSUNCRURfU01NU19NRVNTQUdFX0JBQ0tVUF9ET01BSU4iLCJQSUNCRURfQUxJQ0xPVUQiLCJQSUNCRURfQUxJQ0xPVURfQUNDRVNTS0VZSUQiLCJQSUNCRURfQUxJQ0xPVURfQUNDRVNTS0VZU0VDUkVUIiwiUElDQkVEX0FMSUNMT1VEX0JVQ0tFVCIsIlBJQ0JFRF9BTElDTE9VRF9BUkVBIiwiUElDQkVEX0FMSUNMT1VEX1BBVEgiLCJQSUNCRURfQUxJQ0xPVURfQ1VTVE9NVVJMIiwiUElDQkVEX0FMSUNMT1VEX09QVElPTlMiLCJQSUNCRURfQUxJQ0xPVURfTUVTU0FHRV9BUkVBIiwiUElDQkVEX0FMSUNMT1VEX01FU1NBR0VfUEFUSCIsIlBJQ0JFRF9BTElDTE9VRF9NRVNTQUdFX09QVElPTlMiLCJQSUNCRURfQUxJQ0xPVURfTUVTU0FHRV9DVVNUT01VUkwiLCJQSUNCRURfVEVOQ0VOVENMT1VEIiwiUElDQkVEX1RFTkNFTlRDTE9VRF9WRVJTSU9OIiwiUElDQkVEX1RFTkNFTlRDTE9VRF9TRUNSRVRJRCIsIlBJQ0JFRF9URU5DRU5UQ0xPVURfU0VDUkVUS0VZIiwiUElDQkVEX1RFTkNFTlRDTE9VRF9BUFBJRCIsIlBJQ0JFRF9URU5DRU5UQ0xPVURfQlVDS0VUIiwiUElDQkVEX1RFTkNFTlRDTE9VRF9BUkVBIiwiUElDQkVEX1RFTkNFTlRDTE9VRF9QQVRIIiwiUElDQkVEX1RFTkNFTlRDTE9VRF9PUFRJT05TIiwiUElDQkVEX1RFTkNFTlRDTE9VRF9DVVNUT01VUkwiLCJQSUNCRURfVEVOQ0VOVENMT1VEX01FU1NBR0VfQVBQSUQiLCJQSUNCRURfVEVOQ0VOVENMT1VEX01FU1NBR0VfQVJFQSIsIlBJQ0JFRF9URU5DRU5UQ0xPVURfTUVTU0FHRV9QQVRIIiwiUElDQkVEX1RFTkNFTlRDTE9VRF9NRVNTQUdFX0NVU1RPTVVSTCIsIlBJQ0JFRF9URU5DRU5UQ0xPVURfTUVTU0FHRV9PUFRJT05TIiwiUElDQkVEX0dJVEhVQiIsIlBJQ0JFRF9HSVRIVUJfVE9LRU4iLCJQSUNCRURfR0lUSFVCX1JFUE8iLCJQSUNCRURfR0lUSFVCX1BBVEgiLCJQSUNCRURfR0lUSFVCX0JSQU5DSCIsIlBJQ0JFRF9HSVRIVUJfQ1VTVE9NVVJMIiwiUElDQkVEX0dJVEhVQl9NRVNTQUdFX1JFUE8iLCJQSUNCRURfR0lUSFVCX01FU1NBR0VfQlJBTkNIIiwiUElDQkVEX0dJVEhVQl9NRVNTQUdFX1BBVEgiLCJQSUNCRURfR0lUSFVCX01FU1NBR0VfQ1VTVE9NVVJMIiwiUElDQkVEX1FJTklVIiwiUElDQkVEX1FJTklVX0FDQ0VTU0tFWSIsIlBJQ0JFRF9RSU5JVV9TRUNSRVRLRVkiLCJQSUNCRURfUUlOSVVfQlVDS0VUIiwiUElDQkVEX1FJTklVX1BBVEgiLCJQSUNCRURfUUlOSVVfVVJMIiwiUElDQkVEX1FJTklVX09QVElPTlMiLCJQSUNCRURfUUlOSVVfQVJFQSIsIlBJQ0JFRF9RSU5JVV9NRVNTQUdFX1BBVEgiLCJQSUNCRURfUUlOSVVfTUVTU0FHRV9BUkVBIiwiUElDQkVEX1FJTklVX01FU1NBR0VfT1BUSU9OUyIsIlBJQ0JFRF9RSU5JVV9NRVNTQUdFX1VSTCIsIlBJQ0JFRF9JTUdVUiIsIlBJQ0JFRF9JTUdVUl9DTElFTlRJRCIsIlBJQ0JFRF9JTUdVUl9QUk9YWSIsIlBJQ0JFRF9JTUdVUl9NRVNTQUdFX1BST1hZIiwiUElDQkVEX1VQWVVOIiwiUElDQkVEX1VQWVVOX0JVQ0tFVCIsIlBJQ0JFRF9VUFlVTl9PUEVSQVRPUiIsIlBJQ0JFRF9VUFlVTl9QQVNTV09SRCIsIlBJQ0JFRF9VUFlVTl9QQVRIIiwiUElDQkVEX1VQWVVOX1VSTCIsIlBJQ0JFRF9VUFlVTl9PUFRJT05TIiwiUElDQkVEX1VQWVVOX01FU1NBR0VfT1BFUkFUT1IiLCJQSUNCRURfVVBZVU5fTUVTU0FHRV9QQVNTV09SRCIsIlBJQ0JFRF9VUFlVTl9NRVNTQUdFX1VSTCIsIlBJQ0JFRF9VUFlVTl9NRVNTQUdFX09QVElPTlMiLCJQSUNCRURfVVBZVU5fTUVTU0FHRV9QQVRIIiwiUExVR0lOX0hBTkRMRVJfUExVR0lOX0lOU1RBTExfU1VDQ0VTUyIsIlBMVUdJTl9IQU5ETEVSX1BMVUdJTl9JTlNUQUxMX0ZBSUxFRCIsIlBMVUdJTl9IQU5ETEVSX1BMVUdJTl9JTlNUQUxMX0ZBSUxFRF9SRUFTT04iLCJQTFVHSU5fSEFORExFUl9QTFVHSU5fSU5TVEFMTF9GQUlMRURfUEFUSCIsIlBMVUdJTl9IQU5ETEVSX1BMVUdJTl9VTklOU1RBTExfU1VDQ0VTUyIsIlBMVUdJTl9IQU5ETEVSX1BMVUdJTl9VTklOU1RBTExfRkFJTEVEIiwiUExVR0lOX0hBTkRMRVJfUExVR0lOX1VOSU5TVEFMTF9GQUlMRURfUkVBU09OIiwiUExVR0lOX0hBTkRMRVJfUExVR0lOX1VOSU5TVEFMTF9GQUlMRURfVkFMSUQiLCJQTFVHSU5fSEFORExFUl9QTFVHSU5fVVBEQVRFX1NVQ0NFU1MiLCJQTFVHSU5fSEFORExFUl9QTFVHSU5fVVBEQVRFX0ZBSUxFRCIsIlBMVUdJTl9IQU5ETEVSX1BMVUdJTl9VUERBVEVfRkFJTEVEX1JFQVNPTiIsIlBMVUdJTl9IQU5ETEVSX1BMVUdJTl9VUERBVEVfRkFJTEVEX1ZBTElEIiwiZW4iLCJJMThuTWFuYWdlciIsIm9iamVjdEFkYXB0ZXIiLCJPYmplY3RBZGFwdGVyIiwibGFuZ3VhZ2UiLCJJMThuIiwiYWRhcHRlciIsImRlZmF1bHRMYW5ndWFnZSIsImxvYWRPdXR0ZXJJMThuIiwiaTE4bkZvbGRlciIsImdldE91dHRlckkxOG5Gb2xkZXIiLCJyZWFkZGlyU3luYyIsIndpdGhGaWxlVHlwZXMiLCJpc0ZpbGUiLCJlbmRzV2l0aCIsImkxOG5GaWxlUGF0aCIsImkxOG5GaWxlIiwiaTE4bkZpbGVPYmoiLCJ5YW1sIiwicGF0aEV4aXN0c1N5bmMiLCJhZGRMb2NhbGUiLCJsb2NhbGVzIiwib3JpZ2luTG9jYWxlcyIsImdldExvY2FsZSIsIm5ld0xvY2FsZXMiLCJtZXJnZSIsInNldExvY2FsZSIsImFkZExhbmd1YWdlIiwiUGljR28iLCJfcGx1Z2luTG9hZGVyIiwiaW5pdENvbmZpZ1BhdGgiLCJpbml0Q29uZmlnIiwiZW5zdXJlRmlsZVN5bmMiLCJfY29uZmlnIiwidXBsb2FkZXJzIiwibGlmZWN5Y2xlIiwicmVnaXN0ZXJDb21tYW5kcyIsInByb3BOYW1lIiwicmVtb3ZlIl0sIm1hcHBpbmdzIjoiMCtCQUVBLE1BQU1BLEVBQXlCLENBQzdCQyxPQUFTQyxJQUVQLE1BQU1DLEVBQU1ELEVBQUlDLElBQ2hCQSxFQUFJQyxRQUNEQyxRQUFRLHdCQUNSQyxZQUFZLHdCQUNaQyxNQUFNLE9BQ05DLE9BQU8sc0JBQXVCLDRCQUM5QkEsT0FBTyw0QkFBNkIsb0NBQ3BDQyxRQUFPLENBQUNDLEVBQW1CTixLQUMxQixNQUFNTyxNQUFFQSxFQUFLQyxTQUFFQSxHQUFhUixFQUN0QlMsRUFBVSxDQUNkRixRQUNBQyxZQUVGVixFQUFJRixjQUFjYyxRQUFRSixFQUFTRyxHQUFTRSxPQUFPQyxJQUNqRGQsRUFBSWUsSUFBSUMsTUFBTUYsRUFBRSxHQUNoQixJQUVOYixFQUFJQyxRQUNEQyxRQUFRLDBCQUNSRSxNQUFNLE1BQ05ELFlBQVksMEJBQ1pHLFFBQVFDLElBQ1BSLEVBQUlGLGNBQWNtQixVQUFVVCxHQUFTSyxPQUFPQyxJQUMxQ2QsRUFBSWUs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
diff --git a/libs/zhi-picgo-core/dist/lib/Commander.d.ts b/libs/zhi-picgo-core/dist/lib/Commander.d.ts
deleted file mode 100644
index 56163a6..0000000
--- a/libs/zhi-picgo-core/dist/lib/Commander.d.ts
+++ /dev/null
@@ -1,22 +0,0 @@
-import { Command } from "commander";
-import { Inquirer } from "inquirer";
-import { IPlugin, ICommander, IPicGo } from "../types";
-export declare class Commander implements ICommander {
- private readonly name;
- static currentPlugin: string | null;
- private readonly list;
- private readonly pluginIdMap;
- private readonly ctx;
- program: Command;
- inquirer: Inquirer;
- constructor(ctx: IPicGo);
- getName(): string;
- init(): void;
- register(id: string, plugin: IPlugin): void;
- unregister(pluginName: string): void;
- loadCommands(): void;
- get(id: string): IPlugin | undefined;
- getList(): IPlugin[];
- getIdList(): string[];
-}
-export default Commander;
diff --git a/libs/zhi-picgo-core/dist/lib/LifecyclePlugins.d.ts b/libs/zhi-picgo-core/dist/lib/LifecyclePlugins.d.ts
deleted file mode 100644
index 2c0e585..0000000
--- a/libs/zhi-picgo-core/dist/lib/LifecyclePlugins.d.ts
+++ /dev/null
@@ -1,17 +0,0 @@
-import { IPlugin, ILifecyclePlugins } from "../types";
-export declare class LifecyclePlugins implements ILifecyclePlugins {
- static currentPlugin: string | null;
- private readonly list;
- private readonly pluginIdMap;
- private readonly name;
- constructor(name: string);
- register(id: string, plugin: IPlugin): void;
- unregister(pluginName: string): void;
- getName(): string;
- get(id: string): IPlugin | undefined;
- getList(): IPlugin[];
- getIdList(): string[];
-}
-export declare const setCurrentPluginName: (name?: string | null) => void;
-export declare const getCurrentPluginName: () => string | null;
-export default LifecyclePlugins;
diff --git a/libs/zhi-picgo-core/dist/lib/Logger.d.ts b/libs/zhi-picgo-core/dist/lib/Logger.d.ts
deleted file mode 100644
index 98576f8..0000000
--- a/libs/zhi-picgo-core/dist/lib/Logger.d.ts
+++ /dev/null
@@ -1,19 +0,0 @@
-import { ILogArgvType, ILogArgvTypeWithError, ILogger, IPicGo } from "../types";
-export declare class Logger implements ILogger {
- private readonly level;
- private readonly ctx;
- private logLevel;
- private logPath;
- constructor(ctx: IPicGo);
- private handleLog;
- private checkLogFileIsLarge;
- private recreateLogFile;
- private handleWriteLog;
- private checkLogLevel;
- success(...msg: ILogArgvType[]): void;
- info(...msg: ILogArgvType[]): void;
- error(...msg: ILogArgvTypeWithError[]): void;
- warn(...msg: ILogArgvType[]): void;
- debug(...msg: ILogArgvType[]): void;
-}
-export default Logger;
diff --git a/libs/zhi-picgo-core/dist/lib/PluginHandler.d.ts b/libs/zhi-picgo-core/dist/lib/PluginHandler.d.ts
deleted file mode 100644
index 297967f..0000000
--- a/libs/zhi-picgo-core/dist/lib/PluginHandler.d.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-import { IProcessEnv, IPluginHandler, IPluginHandlerOptions, IPicGo, IPluginHandlerResult } from "../types";
-export declare class PluginHandler implements IPluginHandler {
- private readonly ctx;
- constructor(ctx: IPicGo);
- install(plugins: string[], options?: IPluginHandlerOptions, env?: IProcessEnv): Promise>;
- uninstall(plugins: string[], options?: IPluginHandlerOptions, env?: IProcessEnv): Promise>;
- update(plugins: string[], options?: IPluginHandlerOptions, env?: IProcessEnv): Promise>;
- private execCommand;
-}
-export default PluginHandler;
diff --git a/libs/zhi-picgo-core/dist/lib/PluginLoader.d.ts b/libs/zhi-picgo-core/dist/lib/PluginLoader.d.ts
deleted file mode 100644
index b65a076..0000000
--- a/libs/zhi-picgo-core/dist/lib/PluginLoader.d.ts
+++ /dev/null
@@ -1,27 +0,0 @@
-import { IPicGo, IPicGoPlugin, IPluginLoader, IPicGoPluginInterface } from "../types/index";
-/**
- * Local plugin loader, file system is required
- */
-export declare class PluginLoader implements IPluginLoader {
- private readonly ctx;
- private list;
- private readonly fullList;
- private readonly pluginMap;
- constructor(ctx: IPicGo);
- private init;
- private resolvePlugin;
- load(): boolean;
- registerPlugin(name: string, plugin?: IPicGoPlugin): void;
- unregisterPlugin(name: string): void;
- getPlugin(name: string): IPicGoPluginInterface | undefined;
- /**
- * Get the list of enabled plugins
- */
- getList(): string[];
- hasPlugin(name: string): boolean;
- /**
- * Get the full list of plugins, whether it is enabled or not
- */
- getFullList(): string[];
-}
-export default PluginLoader;
diff --git a/libs/zhi-picgo-core/dist/lib/Request.d.ts b/libs/zhi-picgo-core/dist/lib/Request.d.ts
deleted file mode 100644
index 1950dba..0000000
--- a/libs/zhi-picgo-core/dist/lib/Request.d.ts
+++ /dev/null
@@ -1,12 +0,0 @@
-import { AxiosRequestConfig } from "axios";
-import { IPicGo, IRequestConfig, IOldReqOptions, IResponse, IRequest } from "../types";
-export declare class Request implements IRequest {
- private readonly ctx;
- private proxy;
- options: AxiosRequestConfig;
- constructor(ctx: IPicGo);
- private init;
- private handleProxy;
- request extends IOldReqOptions ? IOldReqOptions : IRequestConfig extends AxiosRequestConfig ? AxiosRequestConfig : never>(options: U): Promise>;
-}
-export default Request;
diff --git a/libs/zhi-picgo-core/dist/plugins/commander/config.d.ts b/libs/zhi-picgo-core/dist/plugins/commander/config.d.ts
deleted file mode 100644
index ec2c821..0000000
--- a/libs/zhi-picgo-core/dist/plugins/commander/config.d.ts
+++ /dev/null
@@ -1,3 +0,0 @@
-import { IPlugin } from "../../types";
-declare const config: IPlugin;
-export default config;
diff --git a/libs/zhi-picgo-core/dist/plugins/commander/i18n.d.ts b/libs/zhi-picgo-core/dist/plugins/commander/i18n.d.ts
deleted file mode 100644
index fd51ec6..0000000
--- a/libs/zhi-picgo-core/dist/plugins/commander/i18n.d.ts
+++ /dev/null
@@ -1,3 +0,0 @@
-import { IPlugin } from "../../types";
-declare const i18n: IPlugin;
-export default i18n;
diff --git a/libs/zhi-picgo-core/dist/plugins/commander/index.d.ts b/libs/zhi-picgo-core/dist/plugins/commander/index.d.ts
deleted file mode 100644
index f96cd89..0000000
--- a/libs/zhi-picgo-core/dist/plugins/commander/index.d.ts
+++ /dev/null
@@ -1,3 +0,0 @@
-import { IPicGo } from "../../types";
-declare const _default: (ctx: IPicGo) => void;
-export default _default;
diff --git a/libs/zhi-picgo-core/dist/plugins/commander/init.d.ts b/libs/zhi-picgo-core/dist/plugins/commander/init.d.ts
deleted file mode 100644
index e0ddc58..0000000
--- a/libs/zhi-picgo-core/dist/plugins/commander/init.d.ts
+++ /dev/null
@@ -1,3 +0,0 @@
-import { IPlugin } from "../../types";
-declare const init: IPlugin;
-export default init;
diff --git a/libs/zhi-picgo-core/dist/plugins/commander/pluginHandler.d.ts b/libs/zhi-picgo-core/dist/plugins/commander/pluginHandler.d.ts
deleted file mode 100644
index fe2d20a..0000000
--- a/libs/zhi-picgo-core/dist/plugins/commander/pluginHandler.d.ts
+++ /dev/null
@@ -1,3 +0,0 @@
-import { IPlugin } from "../../types";
-declare const pluginHandler: IPlugin;
-export default pluginHandler;
diff --git a/libs/zhi-picgo-core/dist/plugins/commander/proxy.d.ts b/libs/zhi-picgo-core/dist/plugins/commander/proxy.d.ts
deleted file mode 100644
index de6e65a..0000000
--- a/libs/zhi-picgo-core/dist/plugins/commander/proxy.d.ts
+++ /dev/null
@@ -1,3 +0,0 @@
-import { IPlugin } from "../../types";
-declare const proxy: IPlugin;
-export default proxy;
diff --git a/libs/zhi-picgo-core/dist/plugins/commander/setting.d.ts b/libs/zhi-picgo-core/dist/plugins/commander/setting.d.ts
deleted file mode 100644
index 88a0263..0000000
--- a/libs/zhi-picgo-core/dist/plugins/commander/setting.d.ts
+++ /dev/null
@@ -1,5 +0,0 @@
-import { IPicGo } from "../../types";
-declare const setting: {
- handle: (ctx: IPicGo) => void;
-};
-export default setting;
diff --git a/libs/zhi-picgo-core/dist/plugins/commander/upload.d.ts b/libs/zhi-picgo-core/dist/plugins/commander/upload.d.ts
deleted file mode 100644
index 56c29e9..0000000
--- a/libs/zhi-picgo-core/dist/plugins/commander/upload.d.ts
+++ /dev/null
@@ -1,3 +0,0 @@
-import { IPlugin } from "../../types";
-declare const upload: IPlugin;
-export default upload;
diff --git a/libs/zhi-picgo-core/dist/plugins/commander/use.d.ts b/libs/zhi-picgo-core/dist/plugins/commander/use.d.ts
deleted file mode 100644
index 63b6734..0000000
--- a/libs/zhi-picgo-core/dist/plugins/commander/use.d.ts
+++ /dev/null
@@ -1,3 +0,0 @@
-import { IPlugin } from "../../types";
-declare const use: IPlugin;
-export default use;
diff --git a/libs/zhi-picgo-core/dist/plugins/transformer/base64.d.ts b/libs/zhi-picgo-core/dist/plugins/transformer/base64.d.ts
deleted file mode 100644
index 7a290ef..0000000
--- a/libs/zhi-picgo-core/dist/plugins/transformer/base64.d.ts
+++ /dev/null
@@ -1,5 +0,0 @@
-import { IPicGo } from "../../types";
-declare const _default: {
- handle: (ctx: IPicGo) => Promise;
-};
-export default _default;
diff --git a/libs/zhi-picgo-core/dist/plugins/transformer/index.d.ts b/libs/zhi-picgo-core/dist/plugins/transformer/index.d.ts
deleted file mode 100644
index 321b424..0000000
--- a/libs/zhi-picgo-core/dist/plugins/transformer/index.d.ts
+++ /dev/null
@@ -1,3 +0,0 @@
-import { IPicGoPlugin } from "../../types";
-declare const buildInTransformers: IPicGoPlugin;
-export default buildInTransformers;
diff --git a/libs/zhi-picgo-core/dist/plugins/transformer/path.d.ts b/libs/zhi-picgo-core/dist/plugins/transformer/path.d.ts
deleted file mode 100644
index 7a290ef..0000000
--- a/libs/zhi-picgo-core/dist/plugins/transformer/path.d.ts
+++ /dev/null
@@ -1,5 +0,0 @@
-import { IPicGo } from "../../types";
-declare const _default: {
- handle: (ctx: IPicGo) => Promise;
-};
-export default _default;
diff --git a/libs/zhi-picgo-core/dist/plugins/uploader/aliyun.d.ts b/libs/zhi-picgo-core/dist/plugins/uploader/aliyun.d.ts
deleted file mode 100644
index 76f111a..0000000
--- a/libs/zhi-picgo-core/dist/plugins/uploader/aliyun.d.ts
+++ /dev/null
@@ -1,2 +0,0 @@
-import { IPicGo } from "../../types";
-export default function register(ctx: IPicGo): void;
diff --git a/libs/zhi-picgo-core/dist/plugins/uploader/github.d.ts b/libs/zhi-picgo-core/dist/plugins/uploader/github.d.ts
deleted file mode 100644
index 76f111a..0000000
--- a/libs/zhi-picgo-core/dist/plugins/uploader/github.d.ts
+++ /dev/null
@@ -1,2 +0,0 @@
-import { IPicGo } from "../../types";
-export default function register(ctx: IPicGo): void;
diff --git a/libs/zhi-picgo-core/dist/plugins/uploader/imgur.d.ts b/libs/zhi-picgo-core/dist/plugins/uploader/imgur.d.ts
deleted file mode 100644
index 76f111a..0000000
--- a/libs/zhi-picgo-core/dist/plugins/uploader/imgur.d.ts
+++ /dev/null
@@ -1,2 +0,0 @@
-import { IPicGo } from "../../types";
-export default function register(ctx: IPicGo): void;
diff --git a/libs/zhi-picgo-core/dist/plugins/uploader/index.d.ts b/libs/zhi-picgo-core/dist/plugins/uploader/index.d.ts
deleted file mode 100644
index 9aa1e69..0000000
--- a/libs/zhi-picgo-core/dist/plugins/uploader/index.d.ts
+++ /dev/null
@@ -1,3 +0,0 @@
-import { IPicGoPlugin } from "../../types";
-declare const buildInUploaders: IPicGoPlugin;
-export default buildInUploaders;
diff --git a/libs/zhi-picgo-core/dist/plugins/uploader/qiniu.d.ts b/libs/zhi-picgo-core/dist/plugins/uploader/qiniu.d.ts
deleted file mode 100644
index 76f111a..0000000
--- a/libs/zhi-picgo-core/dist/plugins/uploader/qiniu.d.ts
+++ /dev/null
@@ -1,2 +0,0 @@
-import { IPicGo } from "../../types";
-export default function register(ctx: IPicGo): void;
diff --git a/libs/zhi-picgo-core/dist/plugins/uploader/smms.d.ts b/libs/zhi-picgo-core/dist/plugins/uploader/smms.d.ts
deleted file mode 100644
index 76f111a..0000000
--- a/libs/zhi-picgo-core/dist/plugins/uploader/smms.d.ts
+++ /dev/null
@@ -1,2 +0,0 @@
-import { IPicGo } from "../../types";
-export default function register(ctx: IPicGo): void;
diff --git a/libs/zhi-picgo-core/dist/plugins/uploader/tcyun.d.ts b/libs/zhi-picgo-core/dist/plugins/uploader/tcyun.d.ts
deleted file mode 100644
index a6e2587..0000000
--- a/libs/zhi-picgo-core/dist/plugins/uploader/tcyun.d.ts
+++ /dev/null
@@ -1,8 +0,0 @@
-import { IPicGo } from "../../types";
-export interface ISignature {
- signature: string;
- appId: string;
- bucket: string;
- signTime: string;
-}
-export default function register(ctx: IPicGo): void;
diff --git a/libs/zhi-picgo-core/dist/plugins/uploader/upyun.d.ts b/libs/zhi-picgo-core/dist/plugins/uploader/upyun.d.ts
deleted file mode 100644
index 76f111a..0000000
--- a/libs/zhi-picgo-core/dist/plugins/uploader/upyun.d.ts
+++ /dev/null
@@ -1,2 +0,0 @@
-import { IPicGo } from "../../types";
-export default function register(ctx: IPicGo): void;
diff --git a/libs/zhi-picgo-core/dist/types/index.d.ts b/libs/zhi-picgo-core/dist/types/index.d.ts
deleted file mode 100644
index e4746c2..0000000
--- a/libs/zhi-picgo-core/dist/types/index.d.ts
+++ /dev/null
@@ -1,537 +0,0 @@
-///
-///
-import { Command } from "commander";
-import { Inquirer } from "inquirer";
-import { IRequestPromiseOptions } from "./oldRequest";
-export interface IPicGo extends NodeJS.EventEmitter {
- /**
- * picgo configPath
- *
- * if do not provide, then it will use default configPath
- */
- configPath: string;
- /**
- * the picgo configPath's baseDir
- */
- baseDir: string;
- /**
- * picgo logger factory
- */
- log: ILogger;
- /**
- * picgo commander, for cli
- */
- cmd: ICommander;
- /**
- * after transformer, the input will be output
- */
- output: IImgInfo[];
- /**
- * the origin input
- */
- input: any[];
- /**
- * register\unregister\get picgo's plugin
- */
- pluginLoader: IPluginLoader;
- /**
- * install\uninstall\update picgo's plugin via npm
- */
- pluginHandler: IPluginHandler;
- /**
- * @deprecated will be removed in v1.5.0+
- *
- * use request instead.
- *
- * http request tool
- */
- Request: IRequest;
- /**
- * plugin system core part transformer\uploader\beforeTransformPlugins...
- */
- helper: IHelper;
- /**
- * picgo-core version
- */
- VERSION: string;
- /**
- * electron picgo's version
- */
- GUI_VERSION?: string;
- /**
- * will be released in v1.5.0+
- *
- * replace old Request
- *
- * http request tool
- */
- request: IRequest["request"];
- i18n: II18nManager;
- /**
- * get picgo config
- */
- getConfig: (name?: string) => T;
- /**
- * save picgo config to configPath
- */
- saveConfig: (config: IStringKeyMap) => void;
- /**
- * remove some [propName] in config[key] && save config to configPath
- */
- removeConfig: (key: string, propName: string) => void;
- /**
- * set picgo config to ctx && will not save to configPath
- */
- setConfig: (config: IStringKeyMap) => void;
- /**
- * unset picgo config to ctx && will not save to configPath
- */
- unsetConfig: (key: string, propName: string) => void;
- /**
- * upload gogogo
- */
- upload: (input?: any[]) => Promise;
-}
-/**
- * for plugin config
- */
-export interface IPluginConfig {
- name: string;
- type: string;
- required: boolean;
- default?: any;
- alias?: string;
- message?: string;
- prefix?: string;
- [propName: string]: any;
-}
-/**
- * for lifecycle plugins
- */
-export interface ILifecyclePlugins {
- register: (id: string, plugin: IPlugin) => void;
- unregister: (id: string) => void;
- getName: () => string;
- get: (id: string) => IPlugin | undefined;
- getList: () => IPlugin[];
- getIdList: () => string[];
-}
-export interface IHelper {
- transformer: ILifecyclePlugins;
- uploader: ILifecyclePlugins;
- beforeTransformPlugins: ILifecyclePlugins;
- beforeUploadPlugins: ILifecyclePlugins;
- afterUploadPlugins: ILifecyclePlugins;
-}
-export interface ICommander extends ILifecyclePlugins {
- program: Command;
- inquirer: Inquirer;
-}
-export interface IPluginLoader {
- /**
- * register [local plugin] or [provided plugin]
- *
- * if the second param (plugin) is provided
- *
- * then picgo will register this plugin and enable it by default
- *
- * but picgo won't write any config to config file
- *
- * you should use ctx.setConfig to change the config context
- */
- registerPlugin: (name: string, plugin?: IPicGoPlugin) => void;
- unregisterPlugin: (name: string) => void;
- getPlugin: (name: string) => IPicGoPluginInterface | undefined;
- /**
- * get enabled plugin list
- */
- getList: () => string[];
- /**
- * get all plugin list (enabled or not)
- */
- getFullList: () => string[];
- hasPlugin: (name: string) => boolean;
-}
-export interface IRequestOld {
- request: import("axios").AxiosInstance;
-}
-export type IOldReqOptions = Omit;
-export type IOldReqOptionsWithFullResponse = IOldReqOptions & {
- resolveWithFullResponse: true;
-};
-export type IOldReqOptionsWithJSON = IOldReqOptions & {
- json: true;
-};
-/**
- * for PicGo new request api, the response will be json format
- */
-export type IReqOptions = AxiosRequestConfig & {
- resolveWithFullResponse: true;
-};
-/**
- * for PicGo new request api, the response will be Buffer
- */
-export type IReqOptionsWithArrayBufferRes = IReqOptions & {
- responseType: "arraybuffer";
-};
-/**
- * for PicGo new request api, the response will be just response data. (not statusCode, headers, etc.)
- */
-export type IReqOptionsWithBodyResOnly = AxiosRequestConfig;
-export type IFullResponse = AxiosResponse & {
- statusCode: number;
- body: T;
-};
-type AxiosResponse = import("axios").AxiosResponse;
-type AxiosRequestConfig = import("axios").AxiosRequestConfig;
-interface IRequestOptionsWithFullResponse {
- resolveWithFullResponse: true;
-}
-interface IRequestOptionsWithJSON {
- json: true;
-}
-interface IRequestOptionsWithResponseTypeArrayBuffer {
- responseType: "arraybuffer";
-}
-/**
- * T is the response data type
- * U is the config type
- */
-export type IResponse = U extends IRequestOptionsWithFullResponse ? IFullResponse : U extends IRequestOptionsWithJSON ? T : U extends IRequestOptionsWithResponseTypeArrayBuffer ? Buffer : U extends IOldReqOptionsWithFullResponse ? IFullResponse : U extends IOldReqOptionsWithJSON ? T : U extends IOldReqOptions ? string : U extends IReqOptionsWithBodyResOnly ? T : string;
-/**
- * the old request lib will be removed in v1.5.0+
- * the request options have the following properties
- */
-export interface IRequestLibOnlyOptions {
- proxy?: string;
- body?: any;
- formData?: {
- [key: string]: any;
- } | undefined;
- form?: {
- [key: string]: any;
- } | string | undefined;
-}
-export type IRequestConfig = T extends IRequestLibOnlyOptions ? IOldReqOptions : AxiosRequestConfig;
-export interface IRequest {
- request: extends IOldReqOptions ? IOldReqOptions : IRequestConfig extends AxiosRequestConfig ? AxiosRequestConfig : never>(config: U) => Promise>;
-}
-export type ILogColor = "blue" | "green" | "yellow" | "red";
-/**
- * for uploading image info
- */
-export interface IImgInfo {
- buffer?: Buffer;
- base64Image?: string;
- fileName?: string;
- width?: number;
- height?: number;
- extname?: string;
- imgUrl?: string;
- [propName: string]: any;
-}
-export interface IPathTransformedImgInfo extends IImgInfo {
- success: boolean;
-}
-export interface IStringKeyMap {
- [key: string]: T extends T ? T : any;
-}
-export interface ICLIConfigs {
- [module: string]: IStringKeyMap;
-}
-/** SM.MS 图床配置项 */
-export interface ISmmsConfig {
- token: string;
- backupDomain?: string;
-}
-/** 七牛云图床配置项 */
-export interface IQiniuConfig {
- accessKey: string;
- secretKey: string;
- /** 存储空间名 */
- bucket: string;
- /** 自定义域名 */
- url: string;
- /** 存储区域编号 */
- area: "z0" | "z1" | "z2" | "na0" | "as0" | string;
- /** 网址后缀,比如使用 `?imageslim` 可进行[图片瘦身](https://developer.qiniu.com/dora/api/1271/image-thin-body-imageslim) */
- options: string;
- /** 自定义存储路径,比如 `img/` */
- path: string;
-}
-/** 又拍云图床配置项 */
-export interface IUpyunConfig {
- /** 存储空间名,及你的服务名 */
- bucket: string;
- /** 操作员 */
- operator: string;
- /** 密码 */
- password: string;
- /** 针对图片的一些后缀处理参数 */
- options: string;
- /** 自定义存储路径,比如 `img/` */
- path: string;
- /** 加速域名,注意要加 `http://` 或者 `https://` */
- url: string;
-}
-/** 腾讯云图床配置项 */
-export interface ITcyunConfig {
- secretId: string;
- secretKey: string;
- /** 存储桶名,v4 和 v5 版本不一样 */
- bucket: string;
- appId: string;
- /** 存储区域,例如 ap-beijing-1 */
- area: string;
- /** 自定义存储路径,比如 img/ */
- path: string;
- /** 自定义域名,注意要加 `http://` 或者 `https://` */
- customUrl: string;
- /** COS 版本,v4 或者 v5 */
- version: "v5" | "v4";
- /** 针对图片的一些后缀处理参数 PicGo 2.4.0+ PicGo-Core 1.5.0+ */
- options: string;
-}
-/** GitHub 图床配置项 */
-export interface IGithubConfig {
- /** 仓库名,格式是 `username/reponame` */
- repo: string;
- /** github token */
- token: string;
- /** 自定义存储路径,比如 `img/` */
- path: string;
- /** 自定义域名,注意要加 `http://` 或者 `https://` */
- customUrl: string;
- /** 分支名,默认是 `main` */
- branch: string;
-}
-/** 阿里云图床配置项 */
-export interface IAliyunConfig {
- accessKeyId: string;
- accessKeySecret: string;
- /** 存储空间名 */
- bucket: string;
- /** 存储区域代号 */
- area: string;
- /** 自定义存储路径 */
- path: string;
- /** 自定义域名,注意要加 `http://` 或者 `https://` */
- customUrl: string;
- /** 针对图片的一些后缀处理参数 PicGo 2.2.0+ PicGo-Core 1.4.0+ */
- options: string;
-}
-/** Imgur 图床配置项 */
-export interface IImgurConfig {
- /** imgur 的 `clientId` */
- clientId: string;
- /** 代理地址,仅支持 http 代理 */
- proxy: string;
-}
-/** PicGo 配置文件类型定义 */
-export interface IConfig {
- picBed: {
- uploader: string;
- current?: string;
- smms?: ISmmsConfig;
- qiniu?: IQiniuConfig;
- upyun?: IUpyunConfig;
- tcyun?: ITcyunConfig;
- github?: IGithubConfig;
- aliyun?: IAliyunConfig;
- imgur?: IImgurConfig;
- transformer?: string;
- /** for uploader */
- proxy?: string;
- [others: string]: any;
- };
- picgoPlugins: {
- [pluginName: string]: boolean;
- };
- debug?: boolean;
- silent?: boolean;
- settings?: {
- logLevel?: string;
- logPath?: string;
- /** for npm */
- registry?: string;
- /** for npm */
- proxy?: string;
- [others: string]: any;
- };
- [configOptions: string]: any;
-}
-/**
- * for an uploader/transformer/beforeTransformHandler/beforeUploadHandler/afterUploadHandler
- */
-export interface IPlugin {
- handle: ((ctx: IPicGo) => Promise) | ((ctx: IPicGo) => void);
- /** The name of this handler */
- name?: string;
- /** The config of this handler */
- config?: (ctx: IPicGo) => IPluginConfig[];
- [propName: string]: any;
-}
-export type IPluginNameType = "simple" | "scope" | "normal" | "unknown";
-export interface IPluginProcessResult {
- success: boolean;
- /**
- * the package.json's name filed
- */
- pkgName: string;
- /**
- * the plugin name or the fs absolute path
- */
- fullName: string;
-}
-export interface IPluginHandler {
- install: (plugins: string[], options?: IPluginHandlerOptions, env?: IProcessEnv) => Promise>;
- update: (plugins: string[], options?: IPluginHandlerOptions, env?: IProcessEnv) => Promise>;
- uninstall: (plugins: string[], options?: IPluginHandlerOptions, env?: IProcessEnv) => Promise>;
-}
-export interface IPluginHandlerResult {
- success: T;
- body: T extends true ? string[] : string;
-}
-export interface IPluginHandlerOptions {
- proxy?: string;
- registry?: string;
-}
-/**
- * for picgo npm plugins
- */
-export type IPicGoPlugin = (ctx: IPicGo) => IPicGoPluginInterface;
-/**
- * interfaces for PicGo plugin
- */
-export interface IPicGoPluginInterface {
- /**
- * since PicGo-Core v1.5, register will inject ctx
- */
- register: (ctx: IPicGo) => void;
- /**
- * this plugin's config
- */
- config?: (ctx: IPicGo) => IPluginConfig[];
- /**
- * register uploader name
- */
- uploader?: string;
- /**
- * register transformer name
- */
- transformer?: string;
- /**
- * for picgo gui plugins
- */
- guiMenu?: (ctx: IPicGo) => IGuiMenuItem[];
- /**
- * for picgo gui plugins
- * short key -> command
- */
- commands?: (ctx: IPicGo) => ICommandItem[];
- [propName: string]: any;
-}
-export interface IGuiMenuItem {
- label: string;
- handle: (ctx: IPicGo, guiApi: any) => Promise;
-}
-export interface ICommandItem {
- label: string;
- name: string;
- key: string;
- handle: (ctx: IPicGo, guiApi: any) => Promise;
-}
-/**
- * for spawn output
- */
-export interface IResult {
- code: number;
- data: string;
-}
-/**
- * for transformer - path
- */
-export interface IImgSize {
- width: number;
- height: number;
- real?: boolean;
-}
-/**
- * for initUtils
- */
-export interface IFileTree {
- [filePath: string]: string | Buffer;
-}
-export interface IOptions {
- template: string;
- dest: string;
- hasSlash: boolean;
- inPlace: boolean;
- clone: boolean;
- offline: boolean;
- tmp: string;
- project: string;
-}
-/**
- * for clipboard image
- */
-export interface IClipboardImage {
- imgPath: string;
- /**
- * if the path is generate by picgo -> false
- * if the path is a real file path in system -> true
- */
- shouldKeepAfterUploading: boolean;
-}
-/**
- * for install command environment variable
- */
-export interface IProcessEnv {
- [propName: string]: Undefinable;
-}
-export type ILogArgvType = string | number;
-export type ILogArgvTypeWithError = ILogArgvType | Error;
-export type Nullable = T | null;
-export type Undefinable = T | undefined;
-export interface ILogger {
- success: (...msg: ILogArgvType[]) => void;
- info: (...msg: ILogArgvType[]) => void;
- error: (...msg: ILogArgvTypeWithError[]) => void;
- warn: (...msg: ILogArgvType[]) => void;
- debug: (...msg: ILogArgvType[]) => void;
-}
-export interface IConfigChangePayload {
- configName: string;
- value: T;
-}
-export interface ILocale {
- [key: string]: any;
-}
-export interface II18nManager {
- /**
- * translate text
- */
- translate: (key: T, args?: IStringKeyMap) => string;
- /**
- * add locale to current i18n language
- * default locale list
- * - zh-CN
- * - en
- */
- addLocale: (language: string, locales: ILocale) => boolean;
- /**
- * set current language
- */
- setLanguage: (language: string) => void;
- /**
- * dynamic add new language & locales
- */
- addLanguage: (language: string, locales: ILocale) => boolean;
- /**
- * get language list
- */
- getLanguageList: () => string[];
-}
-export {};
diff --git a/libs/zhi-picgo-core/dist/types/oldRequest.d.ts b/libs/zhi-picgo-core/dist/types/oldRequest.d.ts
deleted file mode 100644
index 9468fa8..0000000
--- a/libs/zhi-picgo-core/dist/types/oldRequest.d.ts
+++ /dev/null
@@ -1,19 +0,0 @@
-export type IMethod = "get" | "GET" | "delete" | "DELETE" | "head" | "HEAD" | "options" | "OPTIONS" | "post" | "POST" | "put" | "PUT" | "patch" | "PATCH" | "purge" | "PURGE" | "link" | "LINK" | "unlink" | "UNLINK";
-export interface IHeaders {
- [key: string]: any;
-}
-export interface IRequestPromiseOptions {
- baseUrl?: string | undefined;
- url?: string;
- method?: IMethod;
- formData?: {
- [key: string]: any;
- } | undefined;
- qs?: any;
- json?: boolean;
- body?: any;
- resolveWithFullResponse?: boolean;
- headers?: IHeaders;
- proxy?: any;
- timeout?: number;
-}
diff --git a/libs/zhi-picgo-core/dist/utils/common.d.ts b/libs/zhi-picgo-core/dist/utils/common.d.ts
deleted file mode 100644
index 31041eb..0000000
--- a/libs/zhi-picgo-core/dist/utils/common.d.ts
+++ /dev/null
@@ -1,106 +0,0 @@
-///
-///
-import { IImgSize, IPathTransformedImgInfo, IPluginNameType, ILogger, IPicGo } from "../types";
-export declare const isUrl: (url: string) => boolean;
-export declare const isUrlEncode: (url: string) => boolean;
-export declare const handleUrlEncode: (url: string) => string;
-export declare const getImageSize: (file: Buffer) => IImgSize;
-export declare const getFSFile: (filePath: string) => Promise;
-export declare const getURLFile: (url: string, ctx: IPicGo) => Promise;
-/**
- * detect the input string's type
- * for example
- * 1. @xxx/picgo-plugin-xxx -> scope
- * 2. picgo-plugin-xxx -> normal
- * 3. xxx -> simple
- * 4. not exists or is a path -> unknown
- * @param name
- */
-export declare const getPluginNameType: (name: string) => IPluginNameType;
-/**
- * detect the input string is a simple plugin name or not
- * for example
- * 1. xxx -> true
- * 2. /Usr/xx/xxxx/picgo-plugin-xxx -> false
- * @param name pluginNameOrPath
- */
-export declare const isSimpleName: (nameOrPath: string) => boolean;
-/**
- * streamline the full plugin name to a simple one
- * for example:
- * 1. picgo-plugin-xxx -> xxx
- * 2. @xxx/picgo-plugin-yyy -> yyy
- * @param name pluginFullName
- */
-export declare const handleStreamlinePluginName: (name: string) => string;
-/**
- * complete plugin name to full name
- * for example:
- * 1. xxx -> picgo-plugin-xxx
- * 2. picgo-plugin-xxx -> picgo-plugin-xxx
- * @param name pluginSimpleName
- * @param scope pluginScope
- */
-export declare const handleCompletePluginName: (name: string, scope?: string) => string;
-/**
- * handle install/uninstall/update plugin name or path
- * for example
- * 1. picgo-plugin-xxx -> picgo-plugin-xxx
- * 2. @xxx/picgo-plugin-xxx -> @xxx/picgo-plugin-xxx
- * 3. xxx -> picgo-plugin-xxx
- * 4. ./xxxx/picgo-plugin-xxx -> /absolutePath/.../xxxx/picgo-plugin-xxx
- * 5. /absolutePath/.../picgo-plugin-xxx -> /absolutePath/.../picgo-plugin-xxx
- * @param nameOrPath pluginName or pluginPath
- */
-export declare const getProcessPluginName: (nameOrPath: string, logger?: ILogger | Console) => string;
-/**
- * get the normal plugin name
- * for example:
- * 1. picgo-plugin-xxx -> picgo-plugin-xxx
- * 2. @xxx/picgo-plugin-xxx -> @xxx/picgo-plugin-xxx
- * 3. ./xxxx/picgo-plugin-xxx -> picgo-plugin-xxx
- * 4. /absolutePath/.../picgo-plugin-xxx -> picgo-plugin-xxx
- * 5. an exception: [package.json's name] !== [folder name]
- * then use [package.json's name], usually match the scope package.
- * 6. if plugin name has version: picgo-plugin-xxx@x.x.x then remove the version
- * @param nameOrPath
- */
-export declare const getNormalPluginName: (nameOrPath: string, logger?: ILogger | Console) => string;
-/**
- * handle transform the path to unix style
- * for example
- * 1. C:\\xxx\\xxx -> C:/xxx/xxx
- * 2. /xxx/xxx -> /xxx/xxx
- * @param path
- */
-export declare const handleUnixStylePath: (pathStr: string) => string;
-/**
- * remove plugin version when register plugin name
- * 1. picgo-plugin-xxx@1.0.0 -> picgo-plugin-xxx
- * 2. @xxx/picgo-plugin-xxx@1.0.0 -> @xxx/picgo-plugin-xxx
- * @param nameOrPath
- * @param scope
- */
-export declare const removePluginVersion: (nameOrPath: string, scope?: boolean) => string;
-/**
- * the config black item list which won't be setted
- * only can be got
- */
-export declare const configBlackList: never[];
-/**
- * check some config key is in blackList
- * @param key
- */
-export declare const isConfigKeyInBlackList: (key: string) => boolean;
-/**
- * check the input config is valid
- * config must be object such as { xxx: 'xxx' }
- * && can't be array
- * @param config
- * @returns
- */
-export declare const isInputConfigValid: (config: any) => boolean;
-export declare function safeParse(str: string): T | string;
-export declare const forceNumber: (num?: string | number) => number;
-export declare const isDev: () => boolean;
-export declare const isProd: () => boolean;
diff --git a/libs/zhi-picgo-core/dist/utils/createContext.d.ts b/libs/zhi-picgo-core/dist/utils/createContext.d.ts
deleted file mode 100644
index d8bab0f..0000000
--- a/libs/zhi-picgo-core/dist/utils/createContext.d.ts
+++ /dev/null
@@ -1,6 +0,0 @@
-import { IPicGo } from "../types";
-/**
- * create an unique context for each upload process
- * @param ctx
- */
-export declare const createContext: (ctx: IPicGo) => IPicGo;
diff --git a/libs/zhi-picgo-core/dist/utils/db.d.ts b/libs/zhi-picgo-core/dist/utils/db.d.ts
deleted file mode 100644
index ef19144..0000000
--- a/libs/zhi-picgo-core/dist/utils/db.d.ts
+++ /dev/null
@@ -1,15 +0,0 @@
-import { IConfig, IPicGo } from "../types";
-import { IJSON } from "@picgo/store/dist/types";
-declare class DB {
- private readonly ctx;
- private readonly db;
- constructor(ctx: IPicGo);
- read(flush?: boolean): IJSON;
- get(key?: string): any;
- set(key: string, value: any): void;
- has(key: string): boolean;
- unset(key: string, value: any): boolean;
- saveConfig(config: Partial): void;
- removeConfig(config: IConfig): void;
-}
-export default DB;
diff --git a/libs/zhi-picgo-core/dist/utils/enum.d.ts b/libs/zhi-picgo-core/dist/utils/enum.d.ts
deleted file mode 100644
index e8be407..0000000
--- a/libs/zhi-picgo-core/dist/utils/enum.d.ts
+++ /dev/null
@@ -1,27 +0,0 @@
-export declare enum ILogType {
- success = "success",
- info = "info",
- warn = "warn",
- error = "error"
-}
-/**
- * these events will be catched by users
- */
-export declare enum IBuildInEvent {
- UPLOAD_PROGRESS = "uploadProgress",
- FAILED = "failed",
- BEFORE_TRANSFORM = "beforeTransform",
- BEFORE_UPLOAD = "beforeUpload",
- AFTER_UPLOAD = "afterUpload",
- FINISHED = "finished",
- INSTALL = "install",
- UNINSTALL = "uninstall",
- UPDATE = "update",
- NOTIFICATION = "notification"
-}
-/**
- * these events will be catched only by picgo
- */
-export declare enum IBusEvent {
- CONFIG_CHANGE = "CONFIG_CHANGE"
-}
diff --git a/libs/zhi-picgo-core/dist/utils/eventBus.d.ts b/libs/zhi-picgo-core/dist/utils/eventBus.d.ts
deleted file mode 100644
index 1194d7a..0000000
--- a/libs/zhi-picgo-core/dist/utils/eventBus.d.ts
+++ /dev/null
@@ -1,4 +0,0 @@
-///
-import { EventEmitter } from "events";
-declare const eventBus: EventEmitter;
-export { eventBus };
diff --git a/libs/zhi-picgo-core/dist/utils/getClipboardImage.d.ts b/libs/zhi-picgo-core/dist/utils/getClipboardImage.d.ts
deleted file mode 100644
index 6e6bcca..0000000
--- a/libs/zhi-picgo-core/dist/utils/getClipboardImage.d.ts
+++ /dev/null
@@ -1,4 +0,0 @@
-import { IPicGo, IClipboardImage } from "../types";
-export type Platform = "darwin" | "win32" | "win10" | "linux" | "wsl";
-declare const getClipboardImage: (ctx: IPicGo) => Promise;
-export default getClipboardImage;
diff --git a/libs/zhi-picgo-core/dist/utils/initUtils.d.ts b/libs/zhi-picgo-core/dist/utils/initUtils.d.ts
deleted file mode 100644
index d0cf92d..0000000
--- a/libs/zhi-picgo-core/dist/utils/initUtils.d.ts
+++ /dev/null
@@ -1,28 +0,0 @@
-import { IPicGo, IOptions } from "../types";
-/**
- * Generate template files to destination files.
- * @param {PicGo} ctx
- * @param {IOptions} options
- */
-declare const generate: (ctx: IPicGo, options: IOptions) => Promise;
-/**
- * Return the filters' result
- * @param ctx PicGo
- * @param exp condition expression
- * @param data options data
- */
-declare const filters: (ctx: IPicGo, exp: any, data: any) => boolean;
-/**
- * Render files to a virtual tree object
- * @param {array} files
- * @param source
- * @param options
- */
-declare const render: (files: string[], source: string, options: any) => any;
-/**
- * Write rendered files' content to real file
- * @param {string} dir
- * @param {object} files
- */
-declare const writeFileTree: (dir: string, files: any) => void;
-export { filters, generate, render, writeFileTree };
diff --git a/libs/zhi-picgo-core/dist/utils/interfaces.d.ts b/libs/zhi-picgo-core/dist/utils/interfaces.d.ts
deleted file mode 100644
index 5f0a525..0000000
--- a/libs/zhi-picgo-core/dist/utils/interfaces.d.ts
+++ /dev/null
@@ -1,203 +0,0 @@
-/** This file is deprecated */
-///
-import { PicGo } from "../core/PicGo";
-import LifecyclePlugins from "../lib/LifecyclePlugins";
-/**
- * for plugin config
- */
-export interface IPluginConfig {
- name: string;
- type: string;
- required: boolean;
- default?: any;
- [propName: string]: any;
-}
-/**
- * for lifecycle plugins
- */
-export interface IHelper {
- transformer: LifecyclePlugins;
- uploader: LifecyclePlugins;
- beforeTransformPlugins: LifecyclePlugins;
- beforeUploadPlugins: LifecyclePlugins;
- afterUploadPlugins: LifecyclePlugins;
-}
-/**
- * for uploading image info
- */
-export interface IImgInfo {
- buffer?: Buffer;
- base64Image?: string;
- fileName?: string;
- width?: number;
- height?: number;
- extname?: string;
- [propName: string]: any;
-}
-export interface IPathTransformedImgInfo extends IImgInfo {
- success: boolean;
-}
-/** SM.MS 图床配置项 */
-export interface ISmmsConfig {
- token: string;
-}
-/** 七牛云图床配置项 */
-export interface IQiniuConfig {
- accessKey: string;
- secretKey: string;
- /** 存储空间名 */
- bucket: string;
- /** 自定义域名 */
- url: string;
- /** 存储区域编号 */
- area: "z0" | "z1" | "z2" | "na0" | "as0";
- /** 网址后缀,比如使用 `?imageslim` 可进行[图片瘦身](https://developer.qiniu.com/dora/api/1271/image-thin-body-imageslim) */
- options: string;
- /** 自定义存储路径,比如 `img/` */
- path: string;
-}
-/** 又拍云图床配置项 */
-export interface IUpyunConfig {
- /** 存储空间名,及你的服务名 */
- bucket: string;
- /** 操作员 */
- operator: string;
- /** 密码 */
- password: string;
- /** 针对图片的一些后缀处理参数 */
- options: string;
- /** 自定义存储路径,比如 `img/` */
- path: string;
- /** 加速域名,注意要加 `http://` 或者 `https://` */
- url: string;
-}
-/** 腾讯云图床配置项 */
-export interface ITcyunConfig {
- secretId: string;
- secretKey: string;
- /** 存储桶名,v4 和 v5 版本不一样 */
- bucket: string;
- appId: string;
- /** 存储区域,例如 ap-beijing-1 */
- area: string;
- /** 自定义存储路径,比如 img/ */
- path: string;
- /** 自定义域名,注意要加 `http://` 或者 `https://` */
- customUrl: string;
- /** COS 版本,v4 或者 v5 */
- version: "v5" | "v4";
-}
-/** GitHub 图床配置项 */
-export interface IGithubConfig {
- /** 仓库名,格式是 `username/reponame` */
- repo: string;
- /** github token */
- token: string;
- /** 自定义存储路径,比如 `img/` */
- path: string;
- /** 自定义域名,注意要加 `http://` 或者 `https://` */
- customUrl: string;
- /** 分支名,默认是 `master` */
- branch: string;
-}
-/** 阿里云图床配置项 */
-export interface IAliyunConfig {
- accessKeyId: string;
- accessKeySecret: string;
- /** 存储空间名 */
- bucket: string;
- /** 存储区域代号 */
- area: string;
- /** 自定义存储路径 */
- path: string;
- /** 自定义域名,注意要加 `http://` 或者 `https://` */
- customUrl: string;
- /** 针对图片的一些后缀处理参数 PicGo 2.2.0+ PicGo-Core 1.4.0+ */
- options: string;
-}
-/** Imgur 图床配置项 */
-export interface IImgurConfig {
- /** imgur 的 `clientId` */
- clientId: string;
- /** 代理地址,仅支持 http 代理 */
- proxy: string;
-}
-/** PicGo 配置文件类型定义 */
-export interface IConfig {
- picBed: {
- uploader: string;
- current?: string;
- smms?: ISmmsConfig;
- qiniu?: IQiniuConfig;
- upyun?: IUpyunConfig;
- tcyun?: ITcyunConfig;
- github?: IGithubConfig;
- aliyun?: IAliyunConfig;
- imgur?: IImgurConfig;
- transformer?: string;
- proxy: string;
- };
- picgoPlugins: {
- [propName: string]: boolean;
- };
- debug?: boolean;
- silent?: boolean;
- settings?: {
- logLevel: string;
- logPath: string;
- };
- /** 下载插件时 npm 命令自定义的 registry */
- registry: string;
-}
-/**
- * for plugin
- */
-export interface IPlugin {
- handle: ((ctx: PicGo) => Promise) | ((ctx: PicGo) => void);
- [propName: string]: any;
-}
-/**
- * for spawn output
- */
-export interface IResult {
- code: number;
- data: string;
-}
-/**
- * for transformer - path
- */
-export interface IImgSize {
- width: number;
- height: number;
- real?: boolean;
-}
-/**
- * for initUtils
- */
-export interface IOptions {
- template: string;
- dest: string;
- hasSlash: boolean;
- inPlace: boolean;
- clone: boolean;
- offline: boolean;
- tmp: string;
- project: string;
-}
-/**
- * for clipboard image
- */
-export interface IClipboardImage {
- imgPath: string;
- isExistFile: boolean;
-}
-/**
- * for install command environment variable
- */
-export interface IProcessEnv {
- [propName: string]: Undefinable;
-}
-export type ILogArgvType = string | number;
-export type ILogArgvTypeWithError = ILogArgvType | Error;
-export type Nullable = T | null;
-export type Undefinable = T | undefined;
diff --git a/libs/zhi-picgo-core/dist/utils/static.d.ts b/libs/zhi-picgo-core/dist/utils/static.d.ts
deleted file mode 100644
index c45ed67..0000000
--- a/libs/zhi-picgo-core/dist/utils/static.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export declare const CLIPBOARD_IMAGE_FOLDER = "picgo-clipboard-images";
diff --git a/libs/zhi-picgo-core/dist/utils/streamUtils.d.ts b/libs/zhi-picgo-core/dist/utils/streamUtils.d.ts
deleted file mode 100644
index 78ae429..0000000
--- a/libs/zhi-picgo-core/dist/utils/streamUtils.d.ts
+++ /dev/null
@@ -1,5 +0,0 @@
-///
-declare const streamUtils: {
- readBuffer: (buf: any) => Buffer;
-};
-export default streamUtils;
diff --git a/libs/zhi-picgo-core/package.json b/libs/zhi-picgo-core/package.json
deleted file mode 100644
index 5bf3b50..0000000
--- a/libs/zhi-picgo-core/package.json
+++ /dev/null
@@ -1,127 +0,0 @@
-{
- "name": "zhi-picgo-core",
- "version": "1.7.0",
- "description": "A tool for picture uploading forked from PicGO-Core",
- "main": "dist/index.cjs.js",
- "module": "dist/index.esm.js",
- "typings": "dist/index.d.ts",
- "publishConfig": {
- "access": "public"
- },
- "scripts": {
- "build": "cross-env NODE_ENV=production rimraf ./dist && rollup -c rollup.config.js",
- "dev": "cross-env NODE_ENV=development rollup -c rollup.config.js -w",
- "start": "node ./bin/picgo"
- },
- "keywords": [
- "picture",
- "upload",
- "util"
- ],
- "husky": {
- "hooks": {
- "pre-commit": "npm run lint",
- "commit-msg": "commitlint -E HUSKY_GIT_PARAMS"
- }
- },
- "config": {
- "commitizen": {
- "path": "./node_modules/cz-customizable"
- },
- "cz-customizable": {
- "config": "./node_modules/@picgo/bump-version/.cz-config.js"
- }
- },
- "commitlint": {
- "extends": [
- "./node_modules/@picgo/bump-version/commitlint-picgo"
- ]
- },
- "author": "Terwer",
- "license": "MIT",
- "devDependencies": {
- "@terwer/eslint-config-custom": "^1.3.6",
- "@picgo/bump-version": "^1.1.2",
- "@rollup/plugin-commonjs": "^21.0.0",
- "@rollup/plugin-json": "^4.1.0",
- "@rollup/plugin-node-resolve": "^13.0.5",
- "@rollup/plugin-replace": "^3.0.0",
- "@types/cross-spawn": "^6.0.0",
- "@types/ejs": "^3.0.5",
- "@types/fs-extra": "^5.0.4",
- "@types/image-size": "^0.0.29",
- "@types/inquirer": "^0.0.42",
- "@types/js-yaml": "^4.0.5",
- "@types/lodash": "^4.14.175",
- "@types/md5": "^2.1.32",
- "@types/mime-types": "^2.1.0",
- "@types/minimatch": "^3.0.3",
- "@types/node": "16.11.7",
- "@types/resolve": "^0.0.8",
- "@types/rimraf": "^3.0.0",
- "@types/tunnel": "^0.0.3",
- "@typescript-eslint/eslint-plugin": "3",
- "@typescript-eslint/parser": "^3.2.0",
- "babel-eslint": "^10.1.0",
- "builtins": "^4.0.0",
- "conventional-changelog": "^3.0.6",
- "copyfiles": "^2.1.0",
- "cross-env": "^7.0.3",
- "cz-customizable": "^5.10.0",
- "eslint": "7",
- "eslint-config-standard-with-typescript": "^18.0.2",
- "eslint-plugin-import": "2",
- "eslint-plugin-node": "11",
- "eslint-plugin-promise": "4",
- "eslint-plugin-standard": "4",
- "execa": "^5.1.1",
- "husky": "^1.3.1",
- "pre-commit": "^1.2.2",
- "rollup": "^2.58.0",
- "rollup-plugin-string": "^3.0.0",
- "rollup-plugin-terser": "^7.0.2",
- "rollup-plugin-typescript2": "^0.34.1",
- "typescript": "^4.8.2"
- },
- "dependencies": {
- "@picgo/i18n": "^1.0.0",
- "@picgo/store": "^2.0.2",
- "ali-oss": "^6.17.1",
- "arraybuffer-to-buffer": "^0.0.7",
- "axios": "^0.27.2",
- "chalk": "^2.4.1",
- "commander": "^8.1.0",
- "comment-json": "^2.3.1",
- "cross-spawn": "^6.0.5",
- "dayjs": "^1.7.4",
- "download-git-repo": "^3.0.2",
- "ejs": "^2.6.1",
- "fs-extra": "^6.0.1",
- "globby": "^11.0.4",
- "image-size": "^0.8.3",
- "inquirer": "^6.0.0",
- "is-wsl": "^2.2.0",
- "js-yaml": "^4.1.0",
- "lodash": "^4.17.21",
- "md5": "^2.2.1",
- "mime-types": "2.1.33",
- "minimatch": "^3.0.4",
- "minimist": "^1.2.5",
- "qiniu": "^7.2.1",
- "resolve": "^1.8.1",
- "rimraf": "^3.0.2",
- "tunnel": "^0.0.6",
- "upyun": "^3.4.6"
- },
- "repository": {
- "type": "git",
- "url": "git+https://github.com/terwer/zhi/zhi-picgo-core.git"
- },
- "picBed": {
- "current": "github"
- },
- "plugins": {},
- "engines": {
- "node": ">= 12.0.0"
- }
-}
diff --git a/libs/zhi-picgo-core/rollup.config.js b/libs/zhi-picgo-core/rollup.config.js
deleted file mode 100644
index ff1efeb..0000000
--- a/libs/zhi-picgo-core/rollup.config.js
+++ /dev/null
@@ -1,84 +0,0 @@
-import { terser } from "rollup-plugin-terser"
-import pkg from "./package.json"
-import typescript from "rollup-plugin-typescript2"
-import commonjs from "@rollup/plugin-commonjs"
-import { string } from "rollup-plugin-string"
-import json from "@rollup/plugin-json"
-import builtins from "builtins"
-import replace from "@rollup/plugin-replace"
-const version = process.env.VERSION || pkg.version
-const sourcemap = "inline"
-const banner = `/*
- * picgo@${version}, https://github.com/PicGo/PicGo-Core
- * (c) 2018-${new Date().getFullYear()} PicGo Group
- * Released under the MIT License.
- */`
-const input = "./src/index.ts"
-
-const commonOptions = {
- // Creating regex of the packages to make sure sub-paths of the
- // packages such as `lowdb/adapters/FileSync` are also treated as external
- // See https://github.com/rollup/rollup/issues/3684#issuecomment-926558056
- external: [...Object.keys(pkg.dependencies), ...builtins()].map((packageName) => new RegExp(`^${packageName}(/.*)?`)),
- plugins: [
- typescript({
- tsconfigOverride: {
- compilerOptions: {
- target: "ES2017",
- module: "ES2015",
- },
- },
- }),
- // terser(),
- commonjs(),
- string({
- // Required to be specified
- include: ["**/*.applescript", "**/*.ps1", "**/*.sh"],
- }),
- json(),
- replace({
- "process.env.PICGO_VERSION": JSON.stringify(pkg.version),
- preventAssignment: true,
- }),
- ],
- input,
-}
-
-const isDev = process.env.NODE_ENV === "development"
-
-if (!isDev) {
- commonOptions.plugins.push(terser())
-}
-
-/** @type import('rollup').RollupOptions */
-const nodeCjs = {
- output: [
- {
- file: "dist/index.cjs.js",
- format: "cjs",
- banner,
- sourcemap,
- },
- ],
- ...commonOptions,
-}
-
-const nodeEsm = {
- output: [
- {
- file: "dist/index.esm.js",
- format: "esm",
- banner,
- sourcemap,
- },
- ],
- ...commonOptions,
-}
-
-const bundles = []
-const env = process.env.BUNDLES || ""
-if (env.includes("cjs")) bundles.push(nodeCjs)
-if (env.includes("esm")) bundles.push(nodeEsm)
-if (bundles.length === 0) bundles.push(nodeCjs, nodeEsm)
-
-export default bundles
diff --git a/libs/zhi-picgo-core/src/core/Lifecycle.ts b/libs/zhi-picgo-core/src/core/Lifecycle.ts
deleted file mode 100644
index 044b3e0..0000000
--- a/libs/zhi-picgo-core/src/core/Lifecycle.ts
+++ /dev/null
@@ -1,137 +0,0 @@
-import { EventEmitter } from "events"
-import { ILifecyclePlugins, IPicGo, IPlugin, Undefinable } from "../types"
-import { handleUrlEncode } from "../utils/common"
-import { IBuildInEvent } from "../utils/enum"
-import { createContext } from "../utils/createContext"
-
-export class Lifecycle extends EventEmitter {
- private readonly ctx: IPicGo
-
- constructor(ctx: IPicGo) {
- super()
- this.ctx = ctx
- }
-
- async start(input: any[]): Promise {
- // ensure every upload process has an unique context
- const ctx = createContext(this.ctx)
- try {
- // images input
- if (!Array.isArray(input)) {
- throw new Error("Input must be an array.")
- }
- ctx.input = input
- ctx.output = []
-
- // lifecycle main
- await this.beforeTransform(ctx)
- await this.doTransform(ctx)
- await this.beforeUpload(ctx)
- await this.doUpload(ctx)
- await this.afterUpload(ctx)
- return ctx
- } catch (e: any) {
- ctx.log.warn(IBuildInEvent.FAILED)
- ctx.emit(IBuildInEvent.UPLOAD_PROGRESS, -1)
- ctx.emit(IBuildInEvent.FAILED, e)
- ctx.log.error(e)
- if (ctx.getConfig>("debug")) {
- throw e
- }
- return ctx
- }
- }
-
- private async beforeTransform(ctx: IPicGo): Promise {
- ctx.emit(IBuildInEvent.UPLOAD_PROGRESS, 0)
- ctx.emit(IBuildInEvent.BEFORE_TRANSFORM, ctx)
- ctx.log.info("Before transform")
- await this.handlePlugins(ctx.helper.beforeTransformPlugins, ctx)
- return ctx
- }
-
- private async doTransform(ctx: IPicGo): Promise {
- ctx.emit(IBuildInEvent.UPLOAD_PROGRESS, 30)
- const type = ctx.getConfig>("picBed.transformer") || "path"
- let currentTransformer = type
- let transformer = ctx.helper.transformer.get(type)
- if (!transformer) {
- transformer = ctx.helper.transformer.get("path")
- currentTransformer = "path"
- ctx.log.warn(`Can't find transformer - ${type}, switch to default transformer - path`)
- }
- ctx.log.info(`Transforming... Current transformer is [${currentTransformer}]`)
- await transformer?.handle(ctx)
- return ctx
- }
-
- private async beforeUpload(ctx: IPicGo): Promise {
- ctx.emit(IBuildInEvent.UPLOAD_PROGRESS, 60)
- ctx.log.info("Before upload")
- ctx.emit(IBuildInEvent.BEFORE_UPLOAD, ctx)
- await this.handlePlugins(ctx.helper.beforeUploadPlugins, ctx)
- return ctx
- }
-
- private async doUpload(ctx: IPicGo): Promise {
- let type =
- ctx.getConfig>("picBed.uploader") ||
- ctx.getConfig>("picBed.current") ||
- "github"
- let uploader = ctx.helper.uploader.get(type)
- let currentTransformer = type
- if (!uploader) {
- type = "github"
- currentTransformer = "github"
- uploader = ctx.helper.uploader.get("github")
- ctx.log.warn(`Can't find uploader - ${type}, switch to default uploader - github`)
- }
- ctx.log.info(`Uploading... Current uploader is [${currentTransformer}]`)
- await uploader?.handle(ctx)
- for (const outputImg of ctx.output) {
- outputImg.type = type
- }
- return ctx
- }
-
- private async afterUpload(ctx: IPicGo): Promise {
- ctx.emit(IBuildInEvent.AFTER_UPLOAD, ctx)
- ctx.emit(IBuildInEvent.UPLOAD_PROGRESS, 100)
- await this.handlePlugins(ctx.helper.afterUploadPlugins, ctx)
- let msg = ""
- const length = ctx.output.length
- for (let i = 0; i < length; i++) {
- if (typeof ctx.output[i].imgUrl !== "undefined") {
- msg += handleUrlEncode(ctx.output[i].imgUrl!)
- if (i !== length - 1) {
- msg += "\n"
- }
- }
- delete ctx.output[i].base64Image
- delete ctx.output[i].buffer
- }
- ctx.emit(IBuildInEvent.FINISHED, ctx)
- ctx.log.success(`\n${msg}`)
- return ctx
- }
-
- private async handlePlugins(lifeCyclePlugins: ILifecyclePlugins, ctx: IPicGo): Promise {
- const plugins = lifeCyclePlugins.getList()
- const pluginNames = lifeCyclePlugins.getIdList()
- const lifeCycleName = lifeCyclePlugins.getName()
- await Promise.all(
- plugins.map(async (plugin: IPlugin, index: number) => {
- try {
- ctx.log.info(`${lifeCycleName}: ${pluginNames[index]} running`)
- await plugin.handle(ctx)
- } catch (e) {
- ctx.log.error(`${lifeCycleName}: ${pluginNames[index]} error`)
- throw e
- }
- })
- )
- return ctx
- }
-}
-
-export default Lifecycle
diff --git a/libs/zhi-picgo-core/src/core/PicGo.ts b/libs/zhi-picgo-core/src/core/PicGo.ts
deleted file mode 100644
index 9782696..0000000
--- a/libs/zhi-picgo-core/src/core/PicGo.ts
+++ /dev/null
@@ -1,243 +0,0 @@
-import fs from "fs-extra"
-import path from "path"
-import { EventEmitter } from "events"
-import { homedir } from "os"
-import Commander from "../lib/Commander"
-import { Logger } from "../lib/Logger"
-import Lifecycle from "./Lifecycle"
-import LifecyclePlugins, { setCurrentPluginName } from "../lib/LifecyclePlugins"
-import uploaders from "../plugins/uploader"
-import transformers from "../plugins/transformer"
-import PluginLoader from "../lib/PluginLoader"
-import { get, set, unset } from "lodash"
-import {
- IHelper,
- IImgInfo,
- IConfig,
- IPicGo,
- IStringKeyMap,
- IPluginLoader,
- II18nManager,
- IPicGoPlugin,
- IPicGoPluginInterface,
- IRequest,
-} from "../types"
-import getClipboardImage from "../utils/getClipboardImage"
-import Request from "../lib/Request"
-import DB from "../utils/db"
-import PluginHandler from "../lib/PluginHandler"
-import { IBuildInEvent, IBusEvent } from "../utils/enum"
-import { eventBus } from "../utils/eventBus"
-import { isConfigKeyInBlackList, isInputConfigValid } from "../utils/common"
-import { I18nManager } from "../i18n"
-
-export class PicGo extends EventEmitter implements IPicGo {
- private _config!: IConfig
- private lifecycle!: Lifecycle
- private db!: DB
- private _pluginLoader!: PluginLoader
- configPath: string
- baseDir!: string
- helper!: IHelper
- log: Logger
- cmd: Commander
- output: IImgInfo[]
- input: any[]
- pluginHandler: PluginHandler
- /**
- * @deprecated will be removed in v1.5.0+
- *
- * use request instead
- */
- Request!: Request
- i18n!: II18nManager
- VERSION: string = process.env.PICGO_VERSION
- GUI_VERSION?: string
-
- get pluginLoader(): IPluginLoader {
- return this._pluginLoader
- }
-
- constructor(configPath = "") {
- super()
- this.configPath = configPath
- this.output = []
- this.input = []
- this.helper = {
- transformer: new LifecyclePlugins("transformer"),
- uploader: new LifecyclePlugins("uploader"),
- beforeTransformPlugins: new LifecyclePlugins("beforeTransformPlugins"),
- beforeUploadPlugins: new LifecyclePlugins("beforeUploadPlugins"),
- afterUploadPlugins: new LifecyclePlugins("afterUploadPlugins"),
- }
- this.initConfigPath()
- this.log = new Logger(this)
- this.cmd = new Commander(this)
- this.pluginHandler = new PluginHandler(this)
- this.initConfig()
- this.init()
- }
-
- private initConfigPath(): void {
- if (this.configPath === "") {
- this.configPath = homedir() + "/.picgo/config.json"
- }
- if (path.extname(this.configPath).toUpperCase() !== ".JSON") {
- this.configPath = ""
- throw Error("The configuration file only supports JSON format.")
- }
- this.baseDir = path.dirname(this.configPath)
- const exist = fs.pathExistsSync(this.configPath)
- if (!exist) {
- fs.ensureFileSync(`${this.configPath}`)
- }
- }
-
- private initConfig(): void {
- this.db = new DB(this)
- this._config = this.db.read(true) as IConfig
- }
-
- private init(): void {
- try {
- // init 18n at first
- this.i18n = new I18nManager(this)
- this.Request = new Request(this)
- this._pluginLoader = new PluginLoader(this)
- // load self plugins
- setCurrentPluginName("picgo")
- uploaders(this).register(this)
- transformers(this).register(this)
- setCurrentPluginName("")
- // load third-party plugins
- this._pluginLoader.load()
- this.lifecycle = new Lifecycle(this)
- } catch (e: any) {
- this.emit(IBuildInEvent.UPLOAD_PROGRESS, -1)
- this.log.error(e)
- throw e
- }
- }
-
- /**
- * easily mannually load a plugin
- * if provide plugin name, will register plugin by name
- * or just instantiate a plugin
- */
- use(plugin: IPicGoPlugin, name?: string): IPicGoPluginInterface {
- if (name) {
- this.pluginLoader.registerPlugin(name, plugin)
- return this.pluginLoader.getPlugin(name)!
- } else {
- const pluginInstance = plugin(this)
- return pluginInstance
- }
- }
-
- registerCommands(): void {
- if (this.configPath !== "") {
- this.cmd.init()
- this.cmd.loadCommands()
- }
- }
-
- getConfig(name?: string): T {
- if (!name) {
- return this._config as unknown as T
- } else {
- return get(this._config, name)
- }
- }
-
- saveConfig(config: IStringKeyMap): void {
- if (!isInputConfigValid(config)) {
- this.log.warn("the format of config is invalid, please provide object")
- return
- }
- this.setConfig(config)
- this.db.saveConfig(config)
- }
-
- removeConfig(key: string, propName: string): void {
- if (!key || !propName) return
- if (isConfigKeyInBlackList(key)) {
- this.log.warn(`the config.${key} can't be removed`)
- return
- }
- this.unsetConfig(key, propName)
- this.db.unset(key, propName)
- }
-
- setConfig(config: IStringKeyMap): void {
- if (!isInputConfigValid(config)) {
- this.log.warn("the format of config is invalid, please provide object")
- return
- }
- Object.keys(config).forEach((name: string) => {
- if (isConfigKeyInBlackList(name)) {
- this.log.warn(`the config.${name} can't be modified`)
- // eslint-disable-next-line @typescript-eslint/no-dynamic-delete
- delete config[name]
- }
- set(this._config, name, config[name])
- eventBus.emit(IBusEvent.CONFIG_CHANGE, {
- configName: name,
- value: config[name],
- })
- })
- }
-
- unsetConfig(key: string, propName: string): void {
- if (!key || !propName) return
- if (isConfigKeyInBlackList(key)) {
- this.log.warn(`the config.${key} can't be unset`)
- return
- }
- unset(this.getConfig(key), propName)
- }
-
- get request(): IRequest["request"] {
- return this.Request.request.bind(this.Request)
- }
-
- async upload(input?: any[]): Promise {
- if (this.configPath === "") {
- this.log.error("The configuration file only supports JSON format.")
- return []
- }
- // upload from clipboard
- if (input === undefined || input.length === 0) {
- try {
- const { imgPath, shouldKeepAfterUploading } = await getClipboardImage(this)
- if (imgPath === "no image") {
- throw new Error("image not found in clipboard")
- } else {
- this.once(IBuildInEvent.FAILED, () => {
- if (!shouldKeepAfterUploading) {
- // 删除 picgo 生成的图片文件,例如 `~/.picgo/20200621205720.png`
- fs.remove(imgPath).catch((e) => {
- this.log.error(e)
- })
- }
- })
- this.once("finished", () => {
- if (!shouldKeepAfterUploading) {
- fs.remove(imgPath).catch((e) => {
- this.log.error(e)
- })
- }
- })
- const { output } = await this.lifecycle.start([imgPath])
- return output
- }
- } catch (e) {
- this.emit(IBuildInEvent.FAILED, e)
- throw e
- }
- } else {
- // upload from path
- const { output } = await this.lifecycle.start(input)
- return output
- }
- }
-}
diff --git a/libs/zhi-picgo-core/src/custom-env.d.ts b/libs/zhi-picgo-core/src/custom-env.d.ts
deleted file mode 100644
index 1c93493..0000000
--- a/libs/zhi-picgo-core/src/custom-env.d.ts
+++ /dev/null
@@ -1,19 +0,0 @@
-/* eslint-disable @typescript-eslint/naming-convention */
-declare module "*.sh" {
- const src: string
- export default src
-}
-declare module "*.applescript" {
- const src: string
- export default src
-}
-declare module "*.ps1" {
- const src: string
- export default src
-}
-
-declare namespace NodeJS {
- interface ProcessEnv {
- readonly PICGO_VERSION: string
- }
-}
diff --git a/libs/zhi-picgo-core/src/i18n/en.ts b/libs/zhi-picgo-core/src/i18n/en.ts
deleted file mode 100644
index fc19822..0000000
--- a/libs/zhi-picgo-core/src/i18n/en.ts
+++ /dev/null
@@ -1,111 +0,0 @@
-import { ILocales } from "./zh-CN"
-
-/* eslint-disable no-template-curly-in-string */
-export const EN: ILocales = {
- UPLOAD_FAILED: "Upload failed",
- CHECK_SETTINGS: "Please check your settings",
- CHECK_SETTINGS_AND_NETWORK: "Please check your settings and network",
- UPLOAD_FAILED_REASON: "Error code: ${code}, please open the browser and paste the address to see the reason",
- SERVER_ERROR: "Server error, please try again later",
- AUTH_FAILED: "Authentication failed",
-
- // smms
- PICBED_SMMS: "SM.MS",
- PICBED_SMMS_TOKEN: "Set Token",
- PICBED_SMMS_BACKUP_DOMAIN: "Set Backup Upload Domain",
- PICBED_SMMS_MESSAGE_BACKUP_DOMAIN: "Ex. smms.app",
-
- // Ali-cloud
- PICBED_ALICLOUD: "Ali Cloud",
- PICBED_ALICLOUD_ACCESSKEYID: "Set KeyId",
- PICBED_ALICLOUD_ACCESSKEYSECRET: "Set KeySecret",
- PICBED_ALICLOUD_BUCKET: "Set Bucket",
- PICBED_ALICLOUD_AREA: "Set Area",
- PICBED_ALICLOUD_PATH: "Set Path",
- PICBED_ALICLOUD_CUSTOMURL: "Set Custom URL",
- PICBED_ALICLOUD_OPTIONS: "Set URL Suffix",
- PICBED_ALICLOUD_MESSAGE_AREA: "Ex. oss-cn-beijing",
- PICBED_ALICLOUD_MESSAGE_PATH: "Ex. test/",
- PICBED_ALICLOUD_MESSAGE_OPTIONS: "Ex. ?x-oss-process=xxx",
- PICBED_ALICLOUD_MESSAGE_CUSTOMURL: "Ex. https://test.com",
-
- // Tencent-cloud
- PICBED_TENCENTCLOUD: "Tencent Cloud",
- PICBED_TENCENTCLOUD_VERSION: "Choose COS version",
- PICBED_TENCENTCLOUD_SECRETID: "Set SecretId",
- PICBED_TENCENTCLOUD_SECRETKEY: "Set SecretKey",
- PICBED_TENCENTCLOUD_APPID: "Set AppId",
- PICBED_TENCENTCLOUD_BUCKET: "Set Bucket",
- PICBED_TENCENTCLOUD_AREA: "Set Area",
- PICBED_TENCENTCLOUD_PATH: "Set Path",
- PICBED_TENCENTCLOUD_OPTIONS: "Set URL Suffix",
- PICBED_TENCENTCLOUD_CUSTOMURL: "Set Custom URL",
- PICBED_TENCENTCLOUD_MESSAGE_APPID: "Ex. 1234567890",
- PICBED_TENCENTCLOUD_MESSAGE_AREA: "Ex. ap-beijing",
- PICBED_TENCENTCLOUD_MESSAGE_PATH: "Ex. test/",
- PICBED_TENCENTCLOUD_MESSAGE_CUSTOMURL: "Ex. http://test.com",
- PICBED_TENCENTCLOUD_MESSAGE_OPTIONS: "Ex. ?imageMogr2",
-
- // GitHub
- PICBED_GITHUB: "GitHub",
- PICBED_GITHUB_TOKEN: "Set Token",
- PICBED_GITHUB_REPO: "Set Repo Name",
- PICBED_GITHUB_PATH: "Set Path",
- PICBED_GITHUB_BRANCH: "Set Branch",
- PICBED_GITHUB_CUSTOMURL: "Set Custom URL",
- PICBED_GITHUB_MESSAGE_REPO: "Ex. username/repo",
- PICBED_GITHUB_MESSAGE_BRANCH: "Ex. main",
- PICBED_GITHUB_MESSAGE_PATH: "Ex. test/",
- PICBED_GITHUB_MESSAGE_CUSTOMURL: "Ex. https://test.com",
-
- // qiniu
- PICBED_QINIU: "Qiniu",
- PICBED_QINIU_ACCESSKEY: "Set AccessKey",
- PICBED_QINIU_SECRETKEY: "Set SecretKey",
- PICBED_QINIU_BUCKET: "Set Bucket",
- PICBED_QINIU_PATH: "Set Path",
- PICBED_QINIU_URL: "Set URL",
- PICBED_QINIU_OPTIONS: "Set URL Suffix",
- PICBED_QINIU_AREA: "Set Area",
- PICBED_QINIU_MESSAGE_PATH: "Ex. test/",
- PICBED_QINIU_MESSAGE_AREA: "Ex. z0",
- PICBED_QINIU_MESSAGE_OPTIONS: "Ex. ?imageslim",
- PICBED_QINIU_MESSAGE_URL: "Ex. https://xxx.yyy.glb.clouddn.com",
-
- // imgur
- PICBED_IMGUR: "Imgur",
- PICBED_IMGUR_CLIENTID: "Set ClientId",
- PICBED_IMGUR_PROXY: "Set Proxy",
- PICBED_IMGUR_MESSAGE_PROXY: "Ex. http://127.0.0.1:1080",
-
- // upyun
- PICBED_UPYUN: "Upyun",
- PICBED_UPYUN_BUCKET: "Set Bucket",
- PICBED_UPYUN_OPERATOR: "Set Operator",
- PICBED_UPYUN_PASSWORD: "Set Operator Password",
- PICBED_UPYUN_PATH: "Set Path",
- PICBED_UPYUN_URL: "Set URL",
- PICBED_UPYUN_OPTIONS: "Set URL Suffix",
- PICBED_UPYUN_MESSAGE_OPERATOR: "Ex. me",
- PICBED_UPYUN_MESSAGE_PASSWORD: "Please type the operator password",
- PICBED_UPYUN_MESSAGE_URL: "Ex. http://xxx.test.upcdn.net",
- PICBED_UPYUN_MESSAGE_OPTIONS: "Ex. !imgslim",
- PICBED_UPYUN_MESSAGE_PATH: "Ex. test/",
-
- // Plugin Handler
- PLUGIN_HANDLER_PLUGIN_INSTALL_SUCCESS: "Plugin installed successfully",
- PLUGIN_HANDLER_PLUGIN_INSTALL_FAILED: "Plugin installation failed",
- PLUGIN_HANDLER_PLUGIN_INSTALL_FAILED_REASON:
- "Plugin installation failed, error code is ${code}, error log is \n ${data}",
- PLUGIN_HANDLER_PLUGIN_INSTALL_FAILED_PATH:
- "Plugin installation failed, please enter a valid plugin name or valid installation path",
- PLUGIN_HANDLER_PLUGIN_UNINSTALL_SUCCESS: "Plugin uninstalled successfully",
- PLUGIN_HANDLER_PLUGIN_UNINSTALL_FAILED: "Plugin uninstall failed",
- PLUGIN_HANDLER_PLUGIN_UNINSTALL_FAILED_REASON:
- "Plugin uninstall failed, error code is ${code}, error log is \n ${data}",
- PLUGIN_HANDLER_PLUGIN_UNINSTALL_FAILED_VALID: "Plugin uninstall failed, please enter a valid plugin name",
- PLUGIN_HANDLER_PLUGIN_UPDATE_SUCCESS: "Plugin updated successfully",
- PLUGIN_HANDLER_PLUGIN_UPDATE_FAILED: "Plugin update failed",
- PLUGIN_HANDLER_PLUGIN_UPDATE_FAILED_REASON: "Plugin update failed, error code is ${code}, error log is \n ${data}",
- PLUGIN_HANDLER_PLUGIN_UPDATE_FAILED_VALID: "Plugin update failed, please enter a valid plugin name",
-}
diff --git a/libs/zhi-picgo-core/src/i18n/index.ts b/libs/zhi-picgo-core/src/i18n/index.ts
deleted file mode 100644
index 018970a..0000000
--- a/libs/zhi-picgo-core/src/i18n/index.ts
+++ /dev/null
@@ -1,101 +0,0 @@
-import { ZH_CN, ILocalesKey, ILocales } from "./zh-CN"
-import { merge } from "lodash"
-import { IPicGo } from "../types"
-import path from "path"
-import fs from "fs-extra"
-import yaml from "js-yaml"
-
-import { ObjectAdapter, I18n } from "@picgo/i18n"
-import { IStringKeyMap, II18nManager } from "../types/index"
-import { ILocale } from "@picgo/i18n/dist/types"
-import { EN } from "./en"
-import { ZH_TW } from "./zh-TW"
-
-const languageList: IStringKeyMap> = {
- "zh-CN": ZH_CN,
- "zh-TW": ZH_TW,
- en: EN,
-}
-
-class I18nManager implements II18nManager {
- private readonly i18n: I18n
- private readonly objectAdapter: ObjectAdapter
- private readonly ctx: IPicGo
- constructor(ctx: IPicGo) {
- this.ctx = ctx
- this.objectAdapter = new ObjectAdapter(languageList)
- let language = this.ctx.getConfig("settings.language") || "zh-CN"
- if (!languageList[language]) {
- language = "zh-CN" // use default
- }
- this.i18n = new I18n({
- adapter: this.objectAdapter,
- defaultLanguage: language,
- })
- this.loadOutterI18n()
- }
-
- private loadOutterI18n(): void {
- const i18nFolder = this.getOutterI18nFolder()
- const files = fs.readdirSync(i18nFolder, {
- withFileTypes: true,
- })
- files.forEach((file) => {
- if (file.isFile() && file.name.endsWith(".yml")) {
- const i18nFilePath = path.join(i18nFolder, file.name)
- const i18nFile = fs.readFileSync(i18nFilePath, "utf8")
- try {
- const i18nFileObj = yaml.load(i18nFile) as ILocales
- languageList[file.name.replace(/\.yml$/, "")] = i18nFileObj
- } catch (e) {
- console.error(e)
- }
- }
- })
- }
-
- private getOutterI18nFolder(): string {
- const i18nFolder = path.join(this.ctx.baseDir, "i18n-cli")
- if (!fs.pathExistsSync(i18nFolder)) {
- fs.ensureDirSync(i18nFolder)
- }
- return i18nFolder
- }
-
- translate(key: ILocalesKey | T, args?: IStringKeyMap): string {
- return this.i18n.translate(key, args) || key
- }
-
- setLanguage(language: string): void {
- this.i18n.setLanguage(language)
- this.ctx.saveConfig({
- "settings.language": language,
- })
- }
-
- addLocale(language: string, locales: ILocale): boolean {
- const originLocales = this.objectAdapter.getLocale(language)
- if (!originLocales) {
- return false
- }
- const newLocales = merge(originLocales, locales)
- this.objectAdapter.setLocale(language, newLocales)
- return true
- }
-
- addLanguage(language: string, locales: ILocale): boolean {
- const originLocales = this.objectAdapter.getLocale(language)
- if (originLocales) {
- return false
- }
- this.objectAdapter.setLocale(language, locales)
- languageList[language] = locales
- return true
- }
-
- getLanguageList(): string[] {
- return Object.keys(languageList)
- }
-}
-
-export { I18nManager }
diff --git a/libs/zhi-picgo-core/src/i18n/zh-CN.ts b/libs/zhi-picgo-core/src/i18n/zh-CN.ts
deleted file mode 100644
index 48b4a11..0000000
--- a/libs/zhi-picgo-core/src/i18n/zh-CN.ts
+++ /dev/null
@@ -1,109 +0,0 @@
-/* eslint-disable no-template-curly-in-string */
-export const ZH_CN = {
- UPLOAD_FAILED: "上传失败",
- CHECK_SETTINGS: "请检查你的配置项是否正确",
- CHECK_SETTINGS_AND_NETWORK: "请检查你的配置项以及网络",
- UPLOAD_FAILED_REASON: "错误码:${code},请打开浏览器粘贴地址查看相关原因",
- SERVER_ERROR: "服务端出错,请重试",
- AUTH_FAILED: "认证失败",
-
- // smms
- PICBED_SMMS: "SM.MS",
- PICBED_SMMS_TOKEN: "设定Token",
- PICBED_SMMS_BACKUP_DOMAIN: "备用上传域名",
- PICBED_SMMS_MESSAGE_BACKUP_DOMAIN: "例如 smms.app",
-
- // Ali-cloud
- PICBED_ALICLOUD: "阿里云OSS",
- PICBED_ALICLOUD_ACCESSKEYID: "设定KeyId",
- PICBED_ALICLOUD_ACCESSKEYSECRET: "设定KeySecret",
- PICBED_ALICLOUD_BUCKET: "设定Bucket",
- PICBED_ALICLOUD_AREA: "设定存储区域",
- PICBED_ALICLOUD_PATH: "设定存储路径",
- PICBED_ALICLOUD_CUSTOMURL: "设定自定义域名",
- PICBED_ALICLOUD_OPTIONS: "设定网址后缀",
- PICBED_ALICLOUD_MESSAGE_AREA: "例如:oss-cn-beijing",
- PICBED_ALICLOUD_MESSAGE_PATH: "例如:test/",
- PICBED_ALICLOUD_MESSAGE_OPTIONS: "例如:?x-oss-process=xxx",
- PICBED_ALICLOUD_MESSAGE_CUSTOMURL: "例如:https://test.com",
-
- // Tencent-cloud
- PICBED_TENCENTCLOUD: "腾讯云COS",
- PICBED_TENCENTCLOUD_VERSION: "COS版本",
- PICBED_TENCENTCLOUD_SECRETID: "设定SecretId",
- PICBED_TENCENTCLOUD_SECRETKEY: "设定SecretKey",
- PICBED_TENCENTCLOUD_APPID: "设定AppId",
- PICBED_TENCENTCLOUD_BUCKET: "设定Bucket",
- PICBED_TENCENTCLOUD_AREA: "设定存储区域",
- PICBED_TENCENTCLOUD_PATH: "设定存储路径",
- PICBED_TENCENTCLOUD_OPTIONS: "设定网址后缀",
- PICBED_TENCENTCLOUD_CUSTOMURL: "设定自定义域名",
- PICBED_TENCENTCLOUD_MESSAGE_APPID: "例如:1234567890",
- PICBED_TENCENTCLOUD_MESSAGE_AREA: "例如:ap-beijing",
- PICBED_TENCENTCLOUD_MESSAGE_PATH: "例如:test/",
- PICBED_TENCENTCLOUD_MESSAGE_CUSTOMURL: "例如:https://test.com",
- PICBED_TENCENTCLOUD_MESSAGE_OPTIONS: "例如:?imageMogr2",
-
- // GitHub
- PICBED_GITHUB: "GitHub",
- PICBED_GITHUB_TOKEN: "设定Token",
- PICBED_GITHUB_REPO: "设定仓库名",
- PICBED_GITHUB_PATH: "设定存储路径",
- PICBED_GITHUB_BRANCH: "设定分支名",
- PICBED_GITHUB_CUSTOMURL: "设定自定义域名",
- PICBED_GITHUB_MESSAGE_REPO: "格式:username/repo",
- PICBED_GITHUB_MESSAGE_BRANCH: "例如:main",
- PICBED_GITHUB_MESSAGE_PATH: "例如:test/",
- PICBED_GITHUB_MESSAGE_CUSTOMURL: "例如:https://test.com",
-
- // qiniu
- PICBED_QINIU: "七牛云",
- PICBED_QINIU_ACCESSKEY: "设定AccessKey",
- PICBED_QINIU_SECRETKEY: "设定SecretKey",
- PICBED_QINIU_BUCKET: "设定Bucket",
- PICBED_QINIU_PATH: "设定存储路径",
- PICBED_QINIU_URL: "设定访问网址",
- PICBED_QINIU_OPTIONS: "设定网址后缀",
- PICBED_QINIU_AREA: "设定存储区域",
- PICBED_QINIU_MESSAGE_PATH: "例如:test/",
- PICBED_QINIU_MESSAGE_AREA: "例如:z0",
- PICBED_QINIU_MESSAGE_OPTIONS: "例如:?imageslim",
- PICBED_QINIU_MESSAGE_URL: "例如:https://xxx.yyy.glb.clouddn.com",
-
- // imgur
- PICBED_IMGUR: "Imgur",
- PICBED_IMGUR_CLIENTID: "设定ClientId",
- PICBED_IMGUR_PROXY: "设定代理",
- PICBED_IMGUR_MESSAGE_PROXY: "例如:http://127.0.0.1:1080",
-
- // upyun
- PICBED_UPYUN: "又拍云",
- PICBED_UPYUN_BUCKET: "设定Bucket",
- PICBED_UPYUN_OPERATOR: "设定操作员",
- PICBED_UPYUN_PASSWORD: "设定操作员密码",
- PICBED_UPYUN_PATH: "设定存储路径",
- PICBED_UPYUN_URL: "设定加速域名",
- PICBED_UPYUN_OPTIONS: "设定网址后缀",
- PICBED_UPYUN_MESSAGE_OPERATOR: "例如:me",
- PICBED_UPYUN_MESSAGE_PASSWORD: "输入操作员密码",
- PICBED_UPYUN_MESSAGE_URL: "例如:http://xxx.test.upcdn.net",
- PICBED_UPYUN_MESSAGE_OPTIONS: "例如:!imgslim",
- PICBED_UPYUN_MESSAGE_PATH: "例如:test/",
-
- // Plugin Handler
- PLUGIN_HANDLER_PLUGIN_INSTALL_SUCCESS: "插件安装成功",
- PLUGIN_HANDLER_PLUGIN_INSTALL_FAILED: "插件安装失败",
- PLUGIN_HANDLER_PLUGIN_INSTALL_FAILED_REASON: "插件安装失败,失败码为${code},错误日志为 \n ${data}",
- PLUGIN_HANDLER_PLUGIN_INSTALL_FAILED_PATH: "插件安装失败,请输入合法插件名或合法安装路径",
- PLUGIN_HANDLER_PLUGIN_UNINSTALL_SUCCESS: "插件卸载成功",
- PLUGIN_HANDLER_PLUGIN_UNINSTALL_FAILED: "插件卸载失败",
- PLUGIN_HANDLER_PLUGIN_UNINSTALL_FAILED_REASON: "插件卸载失败,失败码为${code},错误日志为 \n ${data}",
- PLUGIN_HANDLER_PLUGIN_UNINSTALL_FAILED_VALID: "插件卸载失败,请输入合法插件名",
- PLUGIN_HANDLER_PLUGIN_UPDATE_SUCCESS: "插件更新成功",
- PLUGIN_HANDLER_PLUGIN_UPDATE_FAILED: "插件更新失败",
- PLUGIN_HANDLER_PLUGIN_UPDATE_FAILED_REASON: "插件更新失败,失败码为${code},错误日志为 \n ${data}",
- PLUGIN_HANDLER_PLUGIN_UPDATE_FAILED_VALID: "插件更新失败,请输入合法插件名",
-}
-
-export type ILocalesKey = keyof typeof ZH_CN
-export type ILocales = typeof ZH_CN
diff --git a/libs/zhi-picgo-core/src/i18n/zh-TW.ts b/libs/zhi-picgo-core/src/i18n/zh-TW.ts
deleted file mode 100644
index 07caed5..0000000
--- a/libs/zhi-picgo-core/src/i18n/zh-TW.ts
+++ /dev/null
@@ -1,108 +0,0 @@
-import { ILocales } from "./zh-CN"
-
-/* eslint-disable no-template-curly-in-string */
-export const ZH_TW: ILocales = {
- UPLOAD_FAILED: "上傳失敗",
- CHECK_SETTINGS: "請檢查你的設定是否正確",
- CHECK_SETTINGS_AND_NETWORK: "請檢查你的設定及網路",
- UPLOAD_FAILED_REASON: "錯誤碼:${code},請打開瀏覽器貼上地址查看相關原因",
- SERVER_ERROR: "伺服器出錯,請重試",
- AUTH_FAILED: "認證失敗",
-
- // smms
- PICBED_SMMS: "SM.MS",
- PICBED_SMMS_TOKEN: "設定Token",
- PICBED_SMMS_BACKUP_DOMAIN: "備用上傳網址",
- PICBED_SMMS_MESSAGE_BACKUP_DOMAIN: "例如 smms.app",
-
- // Ali-cloud
- PICBED_ALICLOUD: "阿里云OSS",
- PICBED_ALICLOUD_ACCESSKEYID: "設定KeyId",
- PICBED_ALICLOUD_ACCESSKEYSECRET: "設定KeySecret",
- PICBED_ALICLOUD_BUCKET: "設定Bucket",
- PICBED_ALICLOUD_AREA: "設定儲存區域",
- PICBED_ALICLOUD_PATH: "設定儲存路徑",
- PICBED_ALICLOUD_CUSTOMURL: "設定自訂網址",
- PICBED_ALICLOUD_OPTIONS: "設定網址後綴",
- PICBED_ALICLOUD_MESSAGE_AREA: "例如:oss-cn-beijing",
- PICBED_ALICLOUD_MESSAGE_PATH: "例如:test/",
- PICBED_ALICLOUD_MESSAGE_OPTIONS: "例如:?x-oss-process=xxx",
- PICBED_ALICLOUD_MESSAGE_CUSTOMURL: "例如:https://test.com",
-
- // Tencent-cloud
- PICBED_TENCENTCLOUD: "騰訊云COS",
- PICBED_TENCENTCLOUD_VERSION: "COS版本",
- PICBED_TENCENTCLOUD_SECRETID: "設定SecretId",
- PICBED_TENCENTCLOUD_SECRETKEY: "設定SecretKey",
- PICBED_TENCENTCLOUD_APPID: "設定AppId",
- PICBED_TENCENTCLOUD_BUCKET: "設定Bucket",
- PICBED_TENCENTCLOUD_AREA: "設定儲存區域",
- PICBED_TENCENTCLOUD_PATH: "設定儲存路徑",
- PICBED_TENCENTCLOUD_OPTIONS: "設定網址後綴",
- PICBED_TENCENTCLOUD_CUSTOMURL: "設定自訂網址",
- PICBED_TENCENTCLOUD_MESSAGE_APPID: "例如:1234567890",
- PICBED_TENCENTCLOUD_MESSAGE_AREA: "例如:ap-beijing",
- PICBED_TENCENTCLOUD_MESSAGE_PATH: "例如:test/",
- PICBED_TENCENTCLOUD_MESSAGE_CUSTOMURL: "例如:https://test.com",
- PICBED_TENCENTCLOUD_MESSAGE_OPTIONS: "例如:?imageMogr2",
-
- // GitHub
- PICBED_GITHUB: "GitHub",
- PICBED_GITHUB_TOKEN: "設定Token",
- PICBED_GITHUB_REPO: "設定倉庫名稱",
- PICBED_GITHUB_PATH: "設定儲存路徑",
- PICBED_GITHUB_BRANCH: "設定分支名稱",
- PICBED_GITHUB_CUSTOMURL: "設定自訂網址",
- PICBED_GITHUB_MESSAGE_REPO: "格式:username/repo",
- PICBED_GITHUB_MESSAGE_BRANCH: "例如:main",
- PICBED_GITHUB_MESSAGE_PATH: "例如:test/",
- PICBED_GITHUB_MESSAGE_CUSTOMURL: "例如:https://test.com",
-
- // qiniu
- PICBED_QINIU: "七牛云",
- PICBED_QINIU_ACCESSKEY: "設定AccessKey",
- PICBED_QINIU_SECRETKEY: "設定SecretKey",
- PICBED_QINIU_BUCKET: "設定Bucket",
- PICBED_QINIU_PATH: "設定儲存路徑",
- PICBED_QINIU_URL: "設定訪問網址",
- PICBED_QINIU_OPTIONS: "設定網址後綴",
- PICBED_QINIU_AREA: "設定儲存區域",
- PICBED_QINIU_MESSAGE_PATH: "例如:test/",
- PICBED_QINIU_MESSAGE_AREA: "例如:z0",
- PICBED_QINIU_MESSAGE_OPTIONS: "例如:?imageslim",
- PICBED_QINIU_MESSAGE_URL: "例如:https://xxx.yyy.glb.clouddn.com",
-
- // imgur
- PICBED_IMGUR: "Imgur",
- PICBED_IMGUR_CLIENTID: "設定ClientId",
- PICBED_IMGUR_PROXY: "設定PROXY",
- PICBED_IMGUR_MESSAGE_PROXY: "例如:http://127.0.0.1:1080",
-
- // upyun
- PICBED_UPYUN: "又拍云",
- PICBED_UPYUN_BUCKET: "設定Bucket",
- PICBED_UPYUN_OPERATOR: "設定操作員",
- PICBED_UPYUN_PASSWORD: "設定操作員密碼",
- PICBED_UPYUN_PATH: "設定儲存路徑",
- PICBED_UPYUN_URL: "設定加速網址",
- PICBED_UPYUN_OPTIONS: "設定網址後綴",
- PICBED_UPYUN_MESSAGE_OPERATOR: "例如:me",
- PICBED_UPYUN_MESSAGE_PASSWORD: "輸入操作員密碼",
- PICBED_UPYUN_MESSAGE_URL: "例如:http://xxx.test.upcdn.net",
- PICBED_UPYUN_MESSAGE_OPTIONS: "例如:!imgslim",
- PICBED_UPYUN_MESSAGE_PATH: "例如:test/",
-
- // Plugin Handler
- PLUGIN_HANDLER_PLUGIN_INSTALL_SUCCESS: "插件安裝成功",
- PLUGIN_HANDLER_PLUGIN_INSTALL_FAILED: "插件安裝失敗",
- PLUGIN_HANDLER_PLUGIN_INSTALL_FAILED_REASON: "插件安裝失敗,失敗碼為${code},錯誤紀錄為 \n ${data}",
- PLUGIN_HANDLER_PLUGIN_INSTALL_FAILED_PATH: "插件安裝失敗,請輸入正確的插件名稱或正確的安裝路徑",
- PLUGIN_HANDLER_PLUGIN_UNINSTALL_SUCCESS: "插件卸載成功",
- PLUGIN_HANDLER_PLUGIN_UNINSTALL_FAILED: "插件卸載失敗",
- PLUGIN_HANDLER_PLUGIN_UNINSTALL_FAILED_REASON: "插件卸載失敗,失敗碼為${code},錯誤紀錄為 \n ${data}",
- PLUGIN_HANDLER_PLUGIN_UNINSTALL_FAILED_VALID: "插件卸載失敗,請輸入正確的插件名稱",
- PLUGIN_HANDLER_PLUGIN_UPDATE_SUCCESS: "插件更新成功",
- PLUGIN_HANDLER_PLUGIN_UPDATE_FAILED: "插件更新失敗",
- PLUGIN_HANDLER_PLUGIN_UPDATE_FAILED_REASON: "插件更新失敗,失敗碼為${code},錯誤紀錄為 \n ${data}",
- PLUGIN_HANDLER_PLUGIN_UPDATE_FAILED_VALID: "插件更新失敗,請輸入正確的插件名稱",
-}
diff --git a/libs/zhi-picgo-core/src/index.ts b/libs/zhi-picgo-core/src/index.ts
deleted file mode 100644
index 788bfc6..0000000
--- a/libs/zhi-picgo-core/src/index.ts
+++ /dev/null
@@ -1,11 +0,0 @@
-export { PicGo } from "./core/PicGo"
-export { Lifecycle } from "./core/Lifecycle"
-
-export { Logger } from "./lib/Logger"
-export { PluginHandler } from "./lib/PluginHandler"
-export { LifecyclePlugins } from "./lib/LifecyclePlugins"
-export { Commander } from "./lib/Commander"
-export { PluginLoader } from "./lib/PluginLoader"
-export { Request } from "./lib/Request"
-
-export * from "./types"
diff --git a/libs/zhi-picgo-core/src/lib/Commander.ts b/libs/zhi-picgo-core/src/lib/Commander.ts
deleted file mode 100644
index cf5d80c..0000000
--- a/libs/zhi-picgo-core/src/lib/Commander.ts
+++ /dev/null
@@ -1,99 +0,0 @@
-/* eslint-disable @typescript-eslint/no-misused-promises */
-import { Command } from "commander"
-import inquirer, { Inquirer } from "inquirer"
-import { IPlugin, ICommander, IPicGo } from "../types"
-import commanders from "../plugins/commander"
-import { getCurrentPluginName } from "./LifecyclePlugins"
-
-export class Commander implements ICommander {
- private readonly name = "commander"
- static currentPlugin: string | null
- private readonly list: Map = new Map()
- private readonly pluginIdMap: Map = new Map()
- private readonly ctx: IPicGo
-
- program: Command
- inquirer: Inquirer
-
- constructor(ctx: IPicGo) {
- this.program = new Command()
- this.inquirer = inquirer
- this.ctx = ctx
- }
-
- getName(): string {
- return this.name
- }
-
- init(): void {
- this.program
- .version(process.env.PICGO_VERSION, "-v, --version")
- .option("-d, --debug", "debug mode", () => {
- this.ctx.setConfig({
- debug: true,
- })
- })
- .option("-s, --silent", "silent mode", () => {
- this.ctx.setConfig({
- silent: true,
- })
- })
- .on("command:*", () => {
- this.ctx.log.error(
- `Invalid command: ${this.program.args.join(" ")}\nSee --help for a list of available commands.`
- )
- process.exit(1)
- })
-
- // built-in commands
- commanders(this.ctx)
- }
-
- register(id: string, plugin: IPlugin): void {
- if (!id) throw new TypeError("name is required!")
- if (typeof plugin.handle !== "function") throw new TypeError("plugin.handle must be a function!")
- if (this.list.has(id)) throw new TypeError(`${this.name} plugin duplicate id: ${id}!`)
- this.list.set(id, plugin)
- const currentPluginName = getCurrentPluginName()
- if (currentPluginName !== null) {
- if (this.pluginIdMap.has(currentPluginName)) {
- this.pluginIdMap.get(currentPluginName)?.push(id)
- } else {
- this.pluginIdMap.set(currentPluginName, [id])
- }
- }
- }
-
- unregister(pluginName: string): void {
- if (this.pluginIdMap.has(pluginName)) {
- const pluginList = this.pluginIdMap.get(pluginName)
- pluginList?.forEach((plugin: string) => {
- this.list.delete(plugin)
- })
- }
- }
-
- loadCommands(): void {
- this.getList().forEach((item: IPlugin) => {
- try {
- item.handle(this.ctx)
- } catch (e: any) {
- this.ctx.log.error(e)
- }
- })
- }
-
- get(id: string): IPlugin | undefined {
- return this.list.get(id)
- }
-
- getList(): IPlugin[] {
- return [...this.list.values()]
- }
-
- getIdList(): string[] {
- return [...this.list.keys()]
- }
-}
-
-export default Commander
diff --git a/libs/zhi-picgo-core/src/lib/LifecyclePlugins.ts b/libs/zhi-picgo-core/src/lib/LifecyclePlugins.ts
deleted file mode 100644
index 8641fda..0000000
--- a/libs/zhi-picgo-core/src/lib/LifecyclePlugins.ts
+++ /dev/null
@@ -1,63 +0,0 @@
-import { IPlugin, ILifecyclePlugins } from "../types"
-
-export class LifecyclePlugins implements ILifecyclePlugins {
- static currentPlugin: string | null
- private readonly list: Map
- private readonly pluginIdMap: Map
- private readonly name: string
-
- constructor(name: string) {
- this.name = name
- this.list = new Map()
- this.pluginIdMap = new Map()
- }
-
- register(id: string, plugin: IPlugin): void {
- if (!id) throw new TypeError("id is required!")
- if (typeof plugin.handle !== "function") throw new TypeError("plugin.handle must be a function!")
- if (this.list.has(id)) throw new TypeError(`${this.name} duplicate id: ${id}!`)
- this.list.set(id, plugin)
- if (LifecyclePlugins.currentPlugin) {
- if (this.pluginIdMap.has(LifecyclePlugins.currentPlugin)) {
- this.pluginIdMap.get(LifecyclePlugins.currentPlugin)?.push(id)
- } else {
- this.pluginIdMap.set(LifecyclePlugins.currentPlugin, [id])
- }
- }
- }
-
- unregister(pluginName: string): void {
- if (this.pluginIdMap.has(pluginName)) {
- const pluginList = this.pluginIdMap.get(pluginName)
- pluginList?.forEach((plugin: string) => {
- this.list.delete(plugin)
- })
- }
- }
-
- getName(): string {
- return this.name
- }
-
- get(id: string): IPlugin | undefined {
- return this.list.get(id)
- }
-
- getList(): IPlugin[] {
- return [...this.list.values()]
- }
-
- getIdList(): string[] {
- return [...this.list.keys()]
- }
-}
-
-export const setCurrentPluginName = (name: string | null = null): void => {
- LifecyclePlugins.currentPlugin = name
-}
-
-export const getCurrentPluginName = (): string | null => {
- return LifecyclePlugins.currentPlugin
-}
-
-export default LifecyclePlugins
diff --git a/libs/zhi-picgo-core/src/lib/Logger.ts b/libs/zhi-picgo-core/src/lib/Logger.ts
deleted file mode 100644
index 48f676f..0000000
--- a/libs/zhi-picgo-core/src/lib/Logger.ts
+++ /dev/null
@@ -1,138 +0,0 @@
-import chalk from "chalk"
-import dayjs from "dayjs"
-import fs from "fs-extra"
-import path from "path"
-import util from "util"
-import { ILogType } from "../utils/enum"
-import { ILogArgvType, ILogArgvTypeWithError, Undefinable, ILogColor, ILogger, IPicGo } from "../types"
-import { forceNumber, isDev } from "../utils/common"
-
-export class Logger implements ILogger {
- private readonly level = {
- [ILogType.success]: "green",
- [ILogType.info]: "blue",
- [ILogType.warn]: "yellow",
- [ILogType.error]: "red",
- }
-
- private readonly ctx: IPicGo
- private logLevel!: string
- private logPath!: string
- constructor(ctx: IPicGo) {
- this.ctx = ctx
- }
-
- private handleLog(type: ILogType, ...msg: ILogArgvTypeWithError[]): void {
- // check config.silent
- if (!this.ctx.getConfig>("silent")) {
- const logHeader = chalk[this.level[type] as ILogColor](`[PicGo ${type.toUpperCase()}]:`)
- console.log(logHeader, ...msg)
- this.logLevel = this.ctx.getConfig("settings.logLevel")
- this.logPath =
- this.ctx.getConfig>("settings.logPath") || path.join(this.ctx.baseDir, "./picgo.log")
- setTimeout(() => {
- // fix log file is too large, now the log file's default size is 10 MB
- try {
- const result = this.checkLogFileIsLarge(this.logPath)
- if (result.isLarge) {
- const warningMsg = `Log file is too large (> ${
- result.logFileSizeLimit! / 1024 / 1024 || "10"
- } MB), recreate log file`
- console.log(chalk.yellow("[PicGo WARN]:"), warningMsg)
- this.recreateLogFile(this.logPath)
- msg.unshift(warningMsg)
- }
- this.handleWriteLog(this.logPath, type, ...msg)
- } catch (e) {
- // why???
- console.error("[PicGo Error] on checking log file size", e)
- }
- }, 0)
- }
- }
-
- private checkLogFileIsLarge(logPath: string): {
- isLarge: boolean
- logFileSize?: number
- logFileSizeLimit?: number
- } {
- if (fs.existsSync(logPath)) {
- const logFileSize = fs.statSync(logPath).size
- const logFileSizeLimit =
- forceNumber(this.ctx.getConfig>("settings.logFileSizeLimit") || 10) * 1024 * 1024 // 10 MB default
- return {
- isLarge: logFileSize > logFileSizeLimit,
- logFileSize,
- logFileSizeLimit,
- }
- }
- return {
- isLarge: false,
- }
- }
-
- private recreateLogFile(logPath: string): void {
- if (fs.existsSync(logPath)) {
- fs.unlinkSync(logPath)
- fs.createFileSync(logPath)
- }
- }
-
- private handleWriteLog(logPath: string, type: string, ...msg: ILogArgvTypeWithError[]): void {
- try {
- if (this.checkLogLevel(type, this.logLevel)) {
- let log = `${dayjs().format("YYYY-MM-DD HH:mm:ss")} [PicGo ${type.toUpperCase()}] `
- msg.forEach((item: ILogArgvTypeWithError) => {
- if (item instanceof Error && type === "error") {
- log += `\n------Error Stack Begin------\n${util.format(item?.stack)}\n-------Error Stack End------- `
- } else {
- if (typeof item === "object") {
- item = JSON.stringify(item, null, 2)
- }
- log += `${item as string} `
- }
- })
- log += "\n"
- // A synchronized approach to avoid log msg sequence errors
- fs.appendFileSync(logPath, log)
- }
- } catch (e) {
- console.error("[PicGo Error] on writing log file", e)
- }
- }
-
- private checkLogLevel(type: string, level: undefined | string | string[]): boolean {
- if (level === undefined || level === "all") {
- return true
- }
- if (Array.isArray(level)) {
- return level.some((item: string) => item === type || item === "all")
- } else {
- return type === level
- }
- }
-
- success(...msg: ILogArgvType[]): void {
- return this.handleLog(ILogType.success, ...msg)
- }
-
- info(...msg: ILogArgvType[]): void {
- return this.handleLog(ILogType.info, ...msg)
- }
-
- error(...msg: ILogArgvTypeWithError[]): void {
- return this.handleLog(ILogType.error, ...msg)
- }
-
- warn(...msg: ILogArgvType[]): void {
- return this.handleLog(ILogType.warn, ...msg)
- }
-
- debug(...msg: ILogArgvType[]): void {
- if (isDev()) {
- this.handleLog(ILogType.info, ...msg)
- }
- }
-}
-
-export default Logger
diff --git a/libs/zhi-picgo-core/src/lib/PluginHandler.ts b/libs/zhi-picgo-core/src/lib/PluginHandler.ts
deleted file mode 100644
index e3b2e15..0000000
--- a/libs/zhi-picgo-core/src/lib/PluginHandler.ts
+++ /dev/null
@@ -1,319 +0,0 @@
-import spawn from "cross-spawn"
-import {
- IResult,
- IProcessEnv,
- IPluginProcessResult,
- IPluginHandler,
- IPluginHandlerOptions,
- Undefinable,
- IPicGo,
- IPluginHandlerResult,
-} from "../types"
-import { IBuildInEvent } from "../utils/enum"
-import { getProcessPluginName, getNormalPluginName } from "../utils/common"
-import { ILocalesKey } from "../i18n/zh-CN"
-
-export class PluginHandler implements IPluginHandler {
- // Thanks to feflow -> https://github.com/feflow/feflow/blob/master/lib/internal/install/plugin.js
- private readonly ctx: IPicGo
- constructor(ctx: IPicGo) {
- this.ctx = ctx
- }
-
- async install(
- plugins: string[],
- options?: IPluginHandlerOptions,
- env?: IProcessEnv
- ): Promise> {
- if (!options) {
- options = {}
- }
- const installedPlugins: string[] = []
- const processPlugins = plugins
- .map((item: string) => handlePluginNameProcess(this.ctx, item))
- .filter((item) => {
- // detect if has already installed
- // or will cause error
- if (this.ctx.pluginLoader.hasPlugin(item.pkgName)) {
- installedPlugins.push(item.pkgName)
- this.ctx.log.success(`PicGo has already installed ${item.pkgName}`)
- return false
- }
- // if something wrong, filter it out
- if (!item.success) {
- return false
- }
- return true
- })
- const fullNameList = processPlugins.map((item) => item.fullName)
- const pkgNameList = processPlugins.map((item) => item.pkgName)
- if (fullNameList.length > 0) {
- // install plugins must use fullNameList:
- // 1. install remote pacage
- // 2. install local pacage
- const result = await this.execCommand("install", fullNameList, this.ctx.baseDir, options, env)
- console.log("execCommand install result=>", result)
- if (!result.code) {
- pkgNameList.forEach((pluginName: string) => {
- this.ctx.pluginLoader.registerPlugin(pluginName)
- })
- this.ctx.log.success(this.ctx.i18n.translate("PLUGIN_HANDLER_PLUGIN_INSTALL_SUCCESS"))
- this.ctx.emit("installSuccess", {
- title: this.ctx.i18n.translate("PLUGIN_HANDLER_PLUGIN_INSTALL_SUCCESS"),
- body: [...pkgNameList, ...installedPlugins],
- })
- const res: IPluginHandlerResult = {
- success: true,
- body: [...pkgNameList, ...installedPlugins],
- }
- return res
- } else {
- const err = this.ctx.i18n.translate("PLUGIN_HANDLER_PLUGIN_INSTALL_FAILED_REASON", {
- code: `${result.code}`,
- data: result.data,
- })
- this.ctx.log.error(err)
- this.ctx.emit("installFailed", {
- title: this.ctx.i18n.translate("PLUGIN_HANDLER_PLUGIN_INSTALL_FAILED"),
- body: err,
- })
- const res: IPluginHandlerResult = {
- success: false,
- body: err,
- }
- return res
- }
- } else if (installedPlugins.length === 0) {
- const err = this.ctx.i18n.translate("PLUGIN_HANDLER_PLUGIN_UNINSTALL_FAILED_VALID")
- this.ctx.log.error(err)
- this.ctx.emit("installFailed", {
- title: this.ctx.i18n.translate("PLUGIN_HANDLER_PLUGIN_INSTALL_FAILED"),
- body: err,
- })
- const res: IPluginHandlerResult = {
- success: false,
- body: err,
- }
- return res
- } else {
- this.ctx.log.success(this.ctx.i18n.translate("PLUGIN_HANDLER_PLUGIN_INSTALL_SUCCESS"))
- this.ctx.emit("installSuccess", {
- title: this.ctx.i18n.translate("PLUGIN_HANDLER_PLUGIN_INSTALL_SUCCESS"),
- body: [...pkgNameList, ...installedPlugins],
- })
- const res: IPluginHandlerResult = {
- success: true,
- body: [...pkgNameList, ...installedPlugins],
- }
- return res
- }
- }
-
- async uninstall(
- plugins: string[],
- options?: IPluginHandlerOptions,
- env?: IProcessEnv
- ): Promise> {
- if (!options) {
- options = {}
- }
- const processPlugins = plugins
- .map((item: string) => handlePluginNameProcess(this.ctx, item))
- .filter((item) => item.success)
- const pkgNameList = processPlugins.map((item) => item.pkgName)
- if (pkgNameList.length > 0) {
- // uninstall plugins must use pkgNameList:
- // npm uninstall will use the package.json's name
- const result = await this.execCommand("uninstall", pkgNameList, this.ctx.baseDir, options, env)
- console.log("execCommand uninstall result=>", result)
- if (!result.code) {
- pkgNameList.forEach((pluginName: string) => {
- this.ctx.pluginLoader.unregisterPlugin(pluginName)
- })
- this.ctx.log.success(this.ctx.i18n.translate("PLUGIN_HANDLER_PLUGIN_UNINSTALL_SUCCESS"))
- this.ctx.emit("uninstallSuccess", {
- title: this.ctx.i18n.translate("PLUGIN_HANDLER_PLUGIN_UNINSTALL_SUCCESS"),
- body: pkgNameList,
- })
- const res: IPluginHandlerResult = {
- success: true,
- body: pkgNameList,
- }
- return res
- } else {
- const err = this.ctx.i18n.translate("PLUGIN_HANDLER_PLUGIN_UNINSTALL_FAILED_REASON", {
- code: `${result.code}`,
- data: result.data,
- })
- this.ctx.log.error(err)
- this.ctx.emit("uninstallFailed", {
- title: this.ctx.i18n.translate("PLUGIN_HANDLER_PLUGIN_UNINSTALL_FAILED"),
- body: err,
- })
- const res: IPluginHandlerResult = {
- success: false,
- body: err,
- }
- return res
- }
- } else {
- const err = this.ctx.i18n.translate("PLUGIN_HANDLER_PLUGIN_UNINSTALL_FAILED_VALID")
- this.ctx.log.error(err)
- this.ctx.emit("uninstallFailed", {
- title: this.ctx.i18n.translate("PLUGIN_HANDLER_PLUGIN_UNINSTALL_FAILED"),
- body: err,
- })
- const res: IPluginHandlerResult = {
- success: false,
- body: err,
- }
- return res
- }
- }
-
- async update(
- plugins: string[],
- options?: IPluginHandlerOptions,
- env?: IProcessEnv
- ): Promise> {
- if (!options) {
- options = {}
- }
- const processPlugins = plugins
- .map((item: string) => handlePluginNameProcess(this.ctx, item))
- .filter((item) => item.success)
- const pkgNameList = processPlugins.map((item) => item.pkgName)
- if (pkgNameList.length > 0) {
- // update plugins must use pkgNameList:
- // npm update will use the package.json's name
- const result = await this.execCommand("update", pkgNameList, this.ctx.baseDir, options, env)
- console.log("execCommand update result=>", result)
- if (!result.code) {
- this.ctx.log.success(this.ctx.i18n.translate("PLUGIN_HANDLER_PLUGIN_UPDATE_SUCCESS"))
- this.ctx.emit("updateSuccess", {
- title: this.ctx.i18n.translate("PLUGIN_HANDLER_PLUGIN_UPDATE_SUCCESS"),
- body: pkgNameList,
- })
- const res: IPluginHandlerResult = {
- success: true,
- body: pkgNameList,
- }
- return res
- } else {
- const err = this.ctx.i18n.translate("PLUGIN_HANDLER_PLUGIN_UPDATE_FAILED_REASON", {
- code: `${result.code}`,
- data: result.data,
- })
- this.ctx.log.error(err)
- this.ctx.emit("updateFailed", {
- title: this.ctx.i18n.translate("PLUGIN_HANDLER_PLUGIN_UPDATE_FAILED"),
- body: err,
- })
- const res: IPluginHandlerResult = {
- success: false,
- body: err,
- }
- return res
- }
- } else {
- const err = this.ctx.i18n.translate("PLUGIN_HANDLER_PLUGIN_UPDATE_FAILED_VALID")
- this.ctx.log.error(err)
- this.ctx.emit("updateFailed", {
- title: this.ctx.i18n.translate("PLUGIN_HANDLER_PLUGIN_UPDATE_FAILED"),
- body: err,
- })
- const res: IPluginHandlerResult = {
- success: false,
- body: err,
- }
- return res
- }
- }
-
- private async execCommand(
- cmd: string,
- modules: string[],
- where: string,
- options: IPluginHandlerOptions = {},
- env: IProcessEnv = {}
- ): Promise {
- // options first
- const registry = options.registry || this.ctx.getConfig>("settings.registry")
- const proxy = options.proxy || this.ctx.getConfig>("settings.proxy")
- return await new Promise((resolve: any): void => {
- let args = [cmd].concat(modules).concat("--color=always").concat("--save")
- if (registry) {
- args = args.concat(`--registry=${registry}`)
- }
- if (proxy) {
- args = args.concat(`--proxy=${proxy}`)
- }
- try {
- const npmOptions = { cwd: where, env: Object.assign({}, process.env, env) }
- console.log("Start run npm, args=>", args)
- console.log("Start run npm, npmOptions=>", npmOptions)
- const npm = spawn("npm", args, npmOptions)
-
- let output = ""
- npm.stdout
- ?.on("data", (data: string) => {
- output += data
- })
- .pipe(process.stdout)
-
- npm.stderr
- ?.on("data", (data: string) => {
- output += data
- })
- .pipe(process.stderr)
-
- npm.on("close", (code: number) => {
- if (!code) {
- resolve({ code: 0, data: output })
- } else {
- resolve({ code: code, data: output })
- }
- })
- // for users who haven't installed node.js
- npm.on("error", (err: Error) => {
- this.ctx.log.error(err)
- this.ctx.log.error("NPM is not installed")
- this.ctx.emit(IBuildInEvent.FAILED, "NPM is not installed")
- })
- } catch (e) {
- this.ctx.log.error(e as Error)
- this.ctx.emit(IBuildInEvent.FAILED, e)
- }
- })
- }
-}
-
-/**
- * transform the input plugin name or path string to valid result
- * @param ctx
- * @param nameOrPath
- */
-const handlePluginNameProcess = (ctx: IPicGo, nameOrPath: string): IPluginProcessResult => {
- const res = {
- success: false,
- fullName: "",
- pkgName: "",
- }
- const result = getProcessPluginName(nameOrPath, ctx.log)
- if (!result) {
- return res
- }
- // first get result then do this process
- // or some error will log twice
- const pkgName = getNormalPluginName(result, ctx.log)
- if (!pkgName) {
- return res
- }
- return {
- success: true,
- fullName: result,
- pkgName,
- }
-}
-
-export default PluginHandler
diff --git a/libs/zhi-picgo-core/src/lib/PluginLoader.ts b/libs/zhi-picgo-core/src/lib/PluginLoader.ts
deleted file mode 100644
index 5434686..0000000
--- a/libs/zhi-picgo-core/src/lib/PluginLoader.ts
+++ /dev/null
@@ -1,154 +0,0 @@
-import fs from "fs-extra"
-import path from "path"
-import resolve from "resolve"
-import { IBuildInEvent } from "../utils/enum"
-import { IPicGo, IPicGoPlugin, IPluginLoader, IPicGoPluginInterface } from "../types/index"
-import { setCurrentPluginName } from "./LifecyclePlugins"
-
-/**
- * Local plugin loader, file system is required
- */
-export class PluginLoader implements IPluginLoader {
- private readonly ctx: IPicGo
- private list: string[] = []
- private readonly fullList: Set = new Set()
- private readonly pluginMap: Map = new Map()
- constructor(ctx: IPicGo) {
- this.ctx = ctx
- this.init()
- }
-
- private init(): void {
- const packagePath = path.join(this.ctx.baseDir, "package.json")
- if (!fs.existsSync(packagePath)) {
- const pkg = {
- name: "picgo-plugins",
- description: "picgo-plugins",
- repository: "https://github.com/PicGo/PicGo-Core",
- license: "MIT",
- }
- fs.writeFileSync(packagePath, JSON.stringify(pkg), "utf8")
- }
- }
-
- // get plugin entry
- private resolvePlugin(ctx: IPicGo, name: string): string {
- try {
- return resolve.sync(name, { basedir: ctx.baseDir })
- } catch (err) {
- return path.join(ctx.baseDir, "node_modules", name)
- }
- }
-
- // load all third party plugin
- load(): boolean {
- const packagePath = path.join(this.ctx.baseDir, "package.json")
- const pluginDir = path.join(this.ctx.baseDir, "node_modules/")
- // Thanks to hexo -> https://github.com/hexojs/hexo/blob/master/lib/hexo/load_plugins.js
- if (!fs.existsSync(pluginDir)) {
- return false
- }
- const json = fs.readJSONSync(packagePath)
- const deps = Object.keys(json.dependencies || {})
- const devDeps = Object.keys(json.devDependencies || {})
- const modules = deps.concat(devDeps).filter((name: string) => {
- if (!/^picgo-plugin-|^@[^/]+\/picgo-plugin-/.test(name)) return false
- const path = this.resolvePlugin(this.ctx, name)
- return fs.existsSync(path)
- })
- for (const module of modules) {
- this.registerPlugin(module)
- }
- return true
- }
-
- registerPlugin(name: string, plugin?: IPicGoPlugin): void {
- if (!name || typeof name !== "string") {
- this.ctx.log.warn("Please provide valid plugin")
- return
- }
- console.log("Start registering plugin " + name + " ...")
- this.fullList.add(name)
- try {
- // register local plugin
- if (!plugin) {
- if (
- this.ctx.getConfig(`picgoPlugins.${name}`) === true ||
- this.ctx.getConfig(`picgoPlugins.${name}`) === undefined
- ) {
- this.list.push(name)
- setCurrentPluginName(name)
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
- this.getPlugin(name)!.register(this.ctx)
- const plugin = `picgoPlugins[${name}]`
- this.ctx.saveConfig({
- [plugin]: true,
- })
- }
- } else {
- // register provided plugin
- // && won't write config to files
- this.list.push(name)
- setCurrentPluginName(name)
- const pluginInterface = plugin(this.ctx)
- this.pluginMap.set(name, pluginInterface)
- pluginInterface.register(this.ctx)
- }
- } catch (e) {
- this.pluginMap.delete(name)
- this.list = this.list.filter((item: string) => item !== name)
- this.fullList.delete(name)
- this.ctx.log.error(e as Error)
- this.ctx.emit(IBuildInEvent.NOTIFICATION, {
- title: `Plugin ${name} Load Error`,
- body: e,
- })
- }
- }
-
- unregisterPlugin(name: string): void {
- this.list = this.list.filter((item: string) => item !== name)
- this.fullList.delete(name)
- this.pluginMap.delete(name)
- setCurrentPluginName(name)
- this.ctx.helper.uploader.unregister(name)
- this.ctx.helper.transformer.unregister(name)
- this.ctx.helper.beforeTransformPlugins.unregister(name)
- this.ctx.helper.beforeUploadPlugins.unregister(name)
- this.ctx.helper.afterUploadPlugins.unregister(name)
- this.ctx.cmd.unregister(name)
- this.ctx.removeConfig("picgoPlugins", name)
- }
-
- // get plugin by name
- getPlugin(name: string): IPicGoPluginInterface | undefined {
- if (this.pluginMap.has(name)) {
- return this.pluginMap.get(name)
- }
- const pluginDir = path.join(this.ctx.baseDir, "node_modules/")
- console.log("Start requiring plugin lib, pluginDir", pluginDir)
- console.log("Start requiring plugin lib, name", name)
- const plugin = require(pluginDir + name)(this.ctx)
- this.pluginMap.set(name, plugin)
- return plugin
- }
-
- /**
- * Get the list of enabled plugins
- */
- getList(): string[] {
- return this.list
- }
-
- hasPlugin(name: string): boolean {
- return this.fullList.has(name)
- }
-
- /**
- * Get the full list of plugins, whether it is enabled or not
- */
- getFullList(): string[] {
- return [...this.fullList]
- }
-}
-export default PluginLoader
diff --git a/libs/zhi-picgo-core/src/lib/Request.ts b/libs/zhi-picgo-core/src/lib/Request.ts
deleted file mode 100644
index 812e3a7..0000000
--- a/libs/zhi-picgo-core/src/lib/Request.ts
+++ /dev/null
@@ -1,257 +0,0 @@
-/* eslint-disable @typescript-eslint/explicit-function-return-type */
-/* eslint-disable @typescript-eslint/promise-function-async */
-import axios, { AxiosRequestConfig, AxiosResponse } from "axios"
-import {
- IPicGo,
- Undefinable,
- IConfigChangePayload,
- IConfig,
- IRequestConfig,
- IOldReqOptions,
- IResponse,
- IFullResponse,
- IRequest,
-} from "../types"
-import { IBusEvent } from "../utils/enum"
-import { eventBus } from "../utils/eventBus"
-import { URL } from "url"
-import FormData from "form-data"
-import https from "https"
-import tunnel from "tunnel"
-const httpsAgent = new https.Agent({
- maxVersion: "TLSv1.2",
- minVersion: "TLSv1.2",
-})
-
-// thanks for https://github.dev/request/request/blob/master/index.js
-function appendFormData(form: FormData, key: string, data: any): void {
- if (typeof data === "object" && "value" in data && "options" in data) {
- form.append(key, data.value, data.options)
- } else {
- form.append(key, data)
- }
-}
-
-function requestInterceptor(options: IOldReqOptions | AxiosRequestConfig): AxiosRequestConfig & {
- __isOldOptions?: boolean
-} {
- let __isOldOptions = false
- const opt: AxiosRequestConfig & {
- __isOldOptions?: boolean
- } = {
- ...options,
- url: (options.url as string) || "",
- headers: options.headers || {},
- }
- // user request config proxy
- if (options.proxy) {
- let proxyOptions = options.proxy
- if (typeof proxyOptions === "string") {
- try {
- proxyOptions = new URL(options.proxy)
- } catch (e) {
- proxyOptions = false
- opt.proxy = false
- console.error(e)
- }
- __isOldOptions = true
- }
- if (proxyOptions) {
- if (options.url?.startsWith("https://")) {
- opt.proxy = false
- opt.httpsAgent = tunnel.httpsOverHttp({
- proxy: {
- host: proxyOptions?.hostname,
- port: parseInt(proxyOptions?.port, 10),
- },
- })
- } else {
- opt.proxy = {
- host: proxyOptions.hostname,
- port: parseInt(proxyOptions.port, 10),
- protocol: "http",
- }
- }
- }
- }
- if ("formData" in options) {
- const form = new FormData()
- for (const key in options.formData) {
- const data = options.formData[key]
- appendFormData(form, key, data)
- }
- opt.data = form
- opt.headers = Object.assign(opt.headers || {}, form.getHeaders())
- __isOldOptions = true
- // eslint-disable-next-line @typescript-eslint/ban-ts-comment
- // @ts-expect-error
- delete opt.formData
- }
- if ("body" in options) {
- opt.data = options.body
- __isOldOptions = true
- // eslint-disable-next-line @typescript-eslint/ban-ts-comment
- // @ts-expect-error
- delete opt.body
- }
- if ("qs" in options) {
- opt.params = options.qs
- __isOldOptions = true
- }
- opt.__isOldOptions = __isOldOptions
- return opt
-}
-
-function responseInterceptor(response: AxiosResponse): IFullResponse {
- return {
- ...response,
- statusCode: response.status,
- body: response.data,
- }
-}
-
-function responseErrorHandler(error: any) {
- // if (error.response) {
- // // The request was made and the server responded with a status code
- // // that falls out of the range of 2xx
- // return Promise.reject(erro)
- // } else if (error.request) {
- // // The request was made but no response was received
- // // `error.request` is an instance of XMLHttpRequest in the browser and an instance of
- // // http.ClientRequest in node.js
- // return Promise.reject(error.request)
- // } else {
- // // Something happened in setting up the request that triggered an Error
- // return Promise.reject(error.message)
- // }
- const errorObj = {
- method: error?.config?.method?.toUpperCase() || "",
- url: error?.config?.url || "",
- statusCode: error?.response?.status || 0,
- message: error?.message || "",
- stack: error?.stack || {},
- response: {
- status: error?.response?.status || 0,
- statusCode: error?.response?.status || 0,
- body: error?.response?.data || "",
- },
- }
- return Promise.reject(errorObj)
-}
-
-export class Request implements IRequest {
- private readonly ctx: IPicGo
- private proxy: Undefinable = ""
- options: AxiosRequestConfig = {}
- constructor(ctx: IPicGo) {
- this.ctx = ctx
- this.init()
- eventBus.on(IBusEvent.CONFIG_CHANGE, (data: IConfigChangePayload) => {
- switch (data.configName) {
- case "picBed":
- if ((data.value as IConfig["picBed"])?.proxy) {
- this.proxy = (data.value as IConfig["picBed"]).proxy
- }
- break
- case "picBed.proxy":
- this.proxy = data.value as string
- break
- }
- })
- }
-
- private init(): void {
- const proxy = this.ctx.getConfig>("picBed.proxy")
- if (proxy) {
- this.proxy = proxy
- }
- }
-
- private handleProxy(): AxiosRequestConfig["proxy"] | false {
- if (this.proxy) {
- try {
- const proxyOptions = new URL(this.proxy)
- return {
- host: proxyOptions.hostname,
- port: parseInt(proxyOptions.port || "0", 10),
- protocol: proxyOptions.protocol,
- }
- } catch (e) {
- console.error(e)
- }
- }
- return false
- }
-
- // #64 dynamic get proxy value
- request<
- T,
- U extends IRequestConfig extends IOldReqOptions
- ? IOldReqOptions
- : IRequestConfig extends AxiosRequestConfig
- ? AxiosRequestConfig
- : never
- >(options: U): Promise> {
- this.options.proxy = this.handleProxy()
- this.options.headers = options.headers || {}
- this.options.maxBodyLength = Infinity
- this.options.maxContentLength = Infinity
- if (this.options.proxy && options.url?.startsWith("https://")) {
- this.options.httpsAgent = tunnel.httpsOverHttp({
- proxy: {
- host: this.options.proxy.host,
- port: this.options.proxy.port,
- },
- })
- this.options.proxy = false
- } else {
- this.options.httpsAgent = httpsAgent
- }
- // !NOTICE this.options !== options
- // this.options is the default options
- const instance = axios.create(this.options)
- instance.interceptors.response.use(responseInterceptor, responseErrorHandler)
-
- // compatible with old request options to new options
- const opt = requestInterceptor(options)
-
- instance.interceptors.request.use(function (obj) {
- // handle Content-Type
- let contentType = ""
- if (obj?.headers?.contentType) {
- contentType = obj.headers.contentType as string
- delete obj.headers.contentType
- } else if (obj?.headers?.ContentType) {
- contentType = obj.headers.ContentType as string
- delete obj.headers.ContentType
- } else if (obj?.headers?.["content-type"]) {
- contentType = obj.headers["content-type"] as string
- delete obj.headers["content-type"]
- }
- if (contentType !== "" && obj.headers) {
- obj.headers["Content-Type"] = contentType
- }
- return obj
- })
- if ("resolveWithFullResponse" in options && options.resolveWithFullResponse) {
- return instance.request(opt)
- } else {
- return instance.request(opt).then((res) => {
- // use old request option format
- if (opt.__isOldOptions) {
- if ("json" in options) {
- if (options.json) {
- return res.data
- }
- } else {
- return JSON.stringify(res.data)
- }
- } else {
- return res.data
- }
- }) as Promise>
- }
- }
-}
-
-export default Request
diff --git a/libs/zhi-picgo-core/src/libs.d.ts b/libs/zhi-picgo-core/src/libs.d.ts
deleted file mode 100644
index 3964a88..0000000
--- a/libs/zhi-picgo-core/src/libs.d.ts
+++ /dev/null
@@ -1,9 +0,0 @@
-declare module "download-git-repo" {
- function download(...args: any[]): any
- export = download
-}
-declare module "lodash-id" {
- // eslint-disable-next-line no-var
- var lodashId: any
- export = lodashId
-}
diff --git a/libs/zhi-picgo-core/src/plugins/commander/config.ts b/libs/zhi-picgo-core/src/plugins/commander/config.ts
deleted file mode 100644
index 133afb4..0000000
--- a/libs/zhi-picgo-core/src/plugins/commander/config.ts
+++ /dev/null
@@ -1,11 +0,0 @@
-import { IPicGo, IPlugin } from "../../types"
-
-const config: IPlugin = {
- handle: (ctx: IPicGo) => {
- const cmd = ctx.cmd
- cmd.program.option("-c, --config ", "set config path")
- // will handle in `bin/picgo`
- },
-}
-
-export default config
diff --git a/libs/zhi-picgo-core/src/plugins/commander/i18n.ts b/libs/zhi-picgo-core/src/plugins/commander/i18n.ts
deleted file mode 100644
index 781483c..0000000
--- a/libs/zhi-picgo-core/src/plugins/commander/i18n.ts
+++ /dev/null
@@ -1,36 +0,0 @@
-import { IPlugin, IPicGo, IStringKeyMap } from "../../types"
-
-const i18n: IPlugin = {
- handle: (ctx: IPicGo) => {
- const cmd = ctx.cmd
- cmd.program
- .command("i18n")
- .arguments("[lang]")
- .description("change picgo language")
- .action(async (lang = "") => {
- const list = ctx.i18n.getLanguageList()
- if (!lang) {
- const prompts = [
- {
- type: "list",
- name: "i18n",
- choices: list,
- message: "Choose a language",
- default: ctx.getConfig("settings.language") || "zh-CN",
- },
- ]
- const answer = await ctx.cmd.inquirer.prompt>(prompts)
- ctx.i18n.setLanguage(answer.i18n)
- ctx.log.success(`Language set to ${answer.i18n}`)
- return
- }
- if (!list.includes(lang)) {
- return ctx.log.warn("No such language")
- }
- ctx.i18n.setLanguage(lang)
- ctx.log.success(`Language set to ${lang}`)
- })
- },
-}
-
-export default i18n
diff --git a/libs/zhi-picgo-core/src/plugins/commander/index.ts b/libs/zhi-picgo-core/src/plugins/commander/index.ts
deleted file mode 100644
index b0c0101..0000000
--- a/libs/zhi-picgo-core/src/plugins/commander/index.ts
+++ /dev/null
@@ -1,20 +0,0 @@
-import pluginHandler from "./pluginHandler"
-import config from "./config"
-import upload from "./upload"
-import setting from "./setting"
-import use from "./use"
-import proxy from "./proxy"
-import init from "./init"
-import i18n from "./i18n"
-import { IPicGo } from "../../types"
-
-export default (ctx: IPicGo): void => {
- ctx.cmd.register("pluginHandler", pluginHandler)
- ctx.cmd.register("config", config)
- ctx.cmd.register("setting", setting)
- ctx.cmd.register("upload", upload)
- ctx.cmd.register("use", use)
- ctx.cmd.register("proxy", proxy)
- ctx.cmd.register("init", init)
- ctx.cmd.register("i18n", i18n)
-}
diff --git a/libs/zhi-picgo-core/src/plugins/commander/init.ts b/libs/zhi-picgo-core/src/plugins/commander/init.ts
deleted file mode 100644
index df9792d..0000000
--- a/libs/zhi-picgo-core/src/plugins/commander/init.ts
+++ /dev/null
@@ -1,129 +0,0 @@
-import chalk from "chalk"
-import path from "path"
-import fs from "fs-extra"
-import { generate } from "../../utils/initUtils"
-import { homedir } from "os"
-import download from "download-git-repo"
-import { IOptions, IPlugin, IPicGo } from "../../types"
-import rm from "rimraf"
-
-const run = (ctx: IPicGo, options: IOptions): void => {
- // const name = options.inPlace ? path.relative('../', process.cwd()) : options.project
- if (options.offline) {
- // offline mode
- if (fs.existsSync(options.template)) {
- generate(ctx, options).catch((e) => {
- ctx.log.error(e)
- })
- } else {
- ctx.log.error(`Local template ${options.template} not found`)
- }
- } else {
- // online mode
- options.template = !options.hasSlash
- ? "PicGo/picgo-template-" + options.template // official template
- : options.template
- downloadAndGenerate(ctx, options)
- }
-}
-
-/**
- * download template & generate
- * @param { PicGo } ctx
- * @param { IOptions } options
- */
-const downloadAndGenerate = (ctx: IPicGo, options: IOptions): void => {
- if (fs.existsSync(options.tmp)) {
- rm.sync(options.tmp)
- }
- ctx.log.info("Template files are downloading...")
- download(options.template, options.tmp, { clone: options.clone }, (err: Error) => {
- if (err) {
- return ctx.log.error(err)
- }
- ctx.log.success("Template files are downloaded!")
- generate(ctx, options).catch((e) => {
- ctx.log.error(e)
- })
- })
-}
-
-const init: IPlugin = {
- handle: async (ctx: IPicGo) => {
- const cmd = ctx.cmd
- cmd.program
- .command("init")
- .arguments(" [project]")
- .option("--clone", "use git clone")
- .option("--offline", "use cached template")
- .description("create picgo plugin's development templates")
- .action((template: string, project: string, program: any) => {
- ;(async () => {
- // Thanks to vue-cli init: https://github.com/vuejs/vue-cli/blob/master/bin/vue-init
- try {
- const hasSlash = template.includes("/")
- const inPlace = !project || project === "."
- const dest = path.resolve(project || ".")
- const clone = program.clone || false
- const offline = program.offline || false
- const tmp = path.join(homedir(), ".picgo/templates", template.replace(/[/:]/g, "-")) // for caching template
-
- if (program.offline) {
- template = tmp
- }
-
- const options = {
- template,
- project,
- hasSlash,
- inPlace,
- dest,
- clone,
- tmp,
- offline,
- }
-
- // check if project is empty or exist
- if (inPlace || fs.existsSync(dest)) {
- await ctx.cmd.inquirer
- .prompt([
- {
- type: "confirm",
- message: inPlace ? "Generate project in current directory?" : "Target directory exists. Continue?",
- name: "ok",
- },
- ])
- .then((answer: any) => {
- if (answer.ok) {
- run(ctx, options)
- }
- })
- } else {
- // project is given
- run(ctx, options)
- }
- } catch (e: any) {
- ctx.log.error(e)
- if (process.argv.includes("--debug")) {
- throw e
- }
- }
- })().catch((e) => {
- ctx.log.error(e)
- })
- })
- .on("--help", () => {
- console.log()
- console.log("Examples:")
- console.log()
- console.log(chalk.gray(" # create a new project with an official template"))
- console.log(" $ picgo init plugin my-project")
- console.log()
- console.log(chalk.gray(" # create a new project straight from a github template"))
- console.log(" $ picgo init username/repo my-project")
- console.log()
- })
- },
-}
-
-export default init
diff --git a/libs/zhi-picgo-core/src/plugins/commander/pluginHandler.ts b/libs/zhi-picgo-core/src/plugins/commander/pluginHandler.ts
deleted file mode 100644
index adecd46..0000000
--- a/libs/zhi-picgo-core/src/plugins/commander/pluginHandler.ts
+++ /dev/null
@@ -1,50 +0,0 @@
-import { IPicGo, IPlugin } from "../../types"
-
-const pluginHandler: IPlugin = {
- handle: (ctx: IPicGo) => {
- // const pluginHandler = new PluginHandler(ctx)
- const cmd = ctx.cmd
- cmd.program
- .command("install ")
- .description("install picgo plugin")
- .alias("add")
- .option("-p, --proxy ", "Add proxy for installing")
- .option("-r, --registry ", "Choose a registry for installing")
- .action((plugins: string[], program: any) => {
- const { proxy, registry } = program
- const options = {
- proxy,
- registry,
- }
- ctx.pluginHandler.install(plugins, options).catch((e) => {
- ctx.log.error(e)
- })
- })
- cmd.program
- .command("uninstall ")
- .alias("rm")
- .description("uninstall picgo plugin")
- .action((plugins: string[]) => {
- ctx.pluginHandler.uninstall(plugins).catch((e) => {
- ctx.log.error(e)
- })
- })
- cmd.program
- .command("update ")
- .description("update picgo plugin")
- .option("-p, --proxy ", "Add proxy for installing")
- .option("-r, --registry ", "Choose a registry for installing")
- .action((plugins: string[], program: any) => {
- const { proxy, registry } = program
- const options = {
- proxy,
- registry,
- }
- ctx.pluginHandler.update(plugins, options).catch((e: Error) => {
- ctx.log.error(e)
- })
- })
- },
-}
-
-export default pluginHandler
diff --git a/libs/zhi-picgo-core/src/plugins/commander/proxy.ts b/libs/zhi-picgo-core/src/plugins/commander/proxy.ts
deleted file mode 100644
index 4ff68e5..0000000
--- a/libs/zhi-picgo-core/src/plugins/commander/proxy.ts
+++ /dev/null
@@ -1,14 +0,0 @@
-import { IPicGo, IPlugin } from "../../types"
-
-const proxy: IPlugin = {
- handle: (ctx: IPicGo) => {
- const cmd = ctx.cmd
- cmd.program.option("-p, --proxy ", "set proxy for uploading", (proxy: string) => {
- ctx.setConfig({
- "picBed.proxy": proxy,
- })
- })
- },
-}
-
-export default proxy
diff --git a/libs/zhi-picgo-core/src/plugins/commander/setting.ts b/libs/zhi-picgo-core/src/plugins/commander/setting.ts
deleted file mode 100644
index eb53c5a..0000000
--- a/libs/zhi-picgo-core/src/plugins/commander/setting.ts
+++ /dev/null
@@ -1,106 +0,0 @@
-import { IPicGo, IPluginConfig, IStringKeyMap } from "../../types"
-
-// handle modules config -> save to picgo config file
-const handleConfig = async (ctx: IPicGo, prompts: IPluginConfig[], module: string, name: string): Promise => {
- const answer = await ctx.cmd.inquirer.prompt(prompts)
- const configName = module === "uploader" ? `picBed.${name}` : module === "transformer" ? `transformer.${name}` : name
- ctx.saveConfig({
- [configName]: answer,
- })
-}
-
-const setting = {
- handle: (ctx: IPicGo) => {
- const cmd = ctx.cmd
- cmd.program
- .command("set")
- .alias("config")
- .arguments(" [name]")
- .description("configure config of picgo modules")
- .action((module: string, name: string) => {
- ;(async () => {
- try {
- // // load third-party plugins
- // await ctx.pluginLoader.load()
- // if a module is specific, then just set this option in config
- switch (module) {
- case "uploader":
- case "transformer":
- if (name) {
- const item = ctx.helper[module].get(name)
- if (!item) {
- return ctx.log.error(`No ${module} named ${name}`)
- }
- if (item.config) {
- await handleConfig(ctx, item.config(ctx), module, name)
- }
- } else {
- const prompts = [
- {
- type: "list",
- name: `${module}`,
- choices: ctx.helper[module].getIdList(),
- message: `Choose a(n) ${module}`,
- // default: ctx.getConfig('picBed.uploader') || ctx.getConfig('picBed.current')
- },
- ]
- const answer = await ctx.cmd.inquirer.prompt>(prompts)
- const item = ctx.helper[module].get(answer[module])
- if (item?.config) {
- await handleConfig(ctx, item.config(ctx), module, answer[module])
- }
- }
- break
- case "plugin":
- if (name) {
- if (!name.includes("picgo-plugin-")) {
- name = `picgo-plugin-${name}`
- }
- if (Object.keys(ctx.getConfig("picgoPlugins")).includes(name)) {
- if (ctx.pluginLoader.getPlugin(name)?.config) {
- await handleConfig(ctx, ctx.pluginLoader.getPlugin(name)!.config!(ctx), "plugin", name)
- }
- } else {
- return ctx.log.error(`No plugin named ${name}`)
- }
- } else {
- const prompts = [
- {
- type: "list",
- name: "plugin",
- choices: ctx.pluginLoader.getFullList(),
- message: "Choose a plugin",
- },
- ]
- const answer = await ctx.cmd.inquirer.prompt(prompts)
- if (ctx.pluginLoader.getPlugin(answer.plugin)?.config) {
- await handleConfig(
- ctx,
- ctx.pluginLoader.getPlugin(answer.plugin)!.config!(ctx),
- "plugin",
- answer.plugin
- )
- }
- }
- break
- default:
- ctx.log.warn(`No module named ${module}`)
- return ctx.log.warn("Available modules are uploader|transformer|plugin")
- }
- const useModuleName = module === "plugin" ? "plugins" : module
- ctx.log.success("Configure config successfully!")
- ctx.log.info(`If you want to use this config, please run 'picgo use ${useModuleName}'`)
- } catch (e: any) {
- ctx.log.error(e)
- if (process.argv.includes("--debug")) {
- throw e
- }
- }
- })().catch((e) => {
- ctx.log.error(e)
- })
- })
- },
-}
-
-export default setting
diff --git a/libs/zhi-picgo-core/src/plugins/commander/upload.ts b/libs/zhi-picgo-core/src/plugins/commander/upload.ts
deleted file mode 100644
index 170dfe0..0000000
--- a/libs/zhi-picgo-core/src/plugins/commander/upload.ts
+++ /dev/null
@@ -1,35 +0,0 @@
-import path from "path"
-import fs from "fs-extra"
-import { isUrl } from "../../utils/common"
-import { IPicGo, IPlugin } from "../../types"
-
-const upload: IPlugin = {
- handle: (ctx: IPicGo) => {
- const cmd = ctx.cmd
- cmd.program
- .command("upload")
- .description("upload, go go go")
- .arguments("[input...]")
- .alias("u")
- .action((input: string[]) => {
- ;(async () => {
- const inputList = input
- .map((item: string) => {
- return isUrl(item) ? item : path.resolve(item)
- })
- .filter((item: string) => {
- const exist = fs.existsSync(item) || isUrl(item)
- if (!exist) {
- ctx.log.warn(`${item} does not exist.`)
- }
- return exist
- })
- await ctx.upload(inputList)
- })().catch((e) => {
- ctx.log.error(e)
- })
- })
- },
-}
-
-export default upload
diff --git a/libs/zhi-picgo-core/src/plugins/commander/use.ts b/libs/zhi-picgo-core/src/plugins/commander/use.ts
deleted file mode 100644
index 19b44cd..0000000
--- a/libs/zhi-picgo-core/src/plugins/commander/use.ts
+++ /dev/null
@@ -1,89 +0,0 @@
-import { IPicGo, IPlugin, Undefinable, ICLIConfigs, IStringKeyMap } from "../../types"
-
-const use: IPlugin = {
- handle: async (ctx: IPicGo) => {
- const cmd = ctx.cmd
- cmd.program
- .command("use")
- .arguments("[module]")
- .description("use modules of picgo")
- .action((module: string) => {
- ;(async () => {
- try {
- // // load third-party plugins
- // await ctx.pluginLoader.load()
- let prompts: any[] = []
- const config: ICLIConfigs = {
- uploader: {
- type: "list",
- name: "uploader",
- message: "Use an uploader",
- choices: ctx.helper.uploader.getIdList(),
- default: ctx.getConfig("picBed.uploader") || ctx.getConfig("picBed.current") || "github",
- },
- transformer: {
- type: "list",
- name: "transformer",
- message: "Use a transformer",
- choices: ctx.helper.transformer.getIdList(),
- default: ctx.getConfig>("picBed.transformer") || "path",
- },
- plugins: {
- type: "checkbox",
- name: "plugins",
- message: "Use plugins",
- choices: ctx.pluginLoader.getFullList(),
- default: Object.keys(ctx.getConfig("picgoPlugins")).filter((item: string) =>
- ctx.getConfig(`picgoPlugins.${item}`)
- ),
- },
- }
- // if an option is specific, then just set this option in config
- if (module) {
- if (config[module]) {
- prompts.push(config[module])
- } else {
- ctx.log.warn(`No module named ${module}`)
- return ctx.log.warn("Available modules are uploader|transformer|plugins")
- }
- } else {
- prompts = Object.keys(config).map((item: string) => config[item])
- }
- const answer = await cmd.inquirer.prompt(prompts)
-
- // handle for plugins option from Array to object
- if (answer.plugins) {
- const plugins = ctx.getConfig>("picgoPlugins")
- Object.keys(plugins).map((item: string) => {
- if (answer.plugins.includes(item)) {
- plugins[item] = true
- } else {
- plugins[item] = false
- }
- })
- // save config for plugins
- ctx.saveConfig({
- picgoPlugins: plugins,
- })
- }
- // save config for uploader & transformer
- ctx.saveConfig({
- "picBed.current": answer.uploader || ctx.getConfig("picBed.current"),
- "picBed.uploader": answer.uploader || ctx.getConfig("picBed.current"),
- "picBed.transformer": answer.transformer || "path",
- })
- ctx.log.success("Configure config successfully!")
- } catch (e: any) {
- ctx.log.error(e)
- if (process.argv.includes("--debug")) {
- throw e
- }
- }
- })().catch((e) => {
- ctx.log.error(e)
- })
- })
- },
-}
-
-export default use
diff --git a/libs/zhi-picgo-core/src/plugins/transformer/base64.ts b/libs/zhi-picgo-core/src/plugins/transformer/base64.ts
deleted file mode 100644
index 86e92d0..0000000
--- a/libs/zhi-picgo-core/src/plugins/transformer/base64.ts
+++ /dev/null
@@ -1,9 +0,0 @@
-import { IPicGo } from "../../types"
-const handle = async (ctx: IPicGo): Promise => {
- ctx.output.push(...ctx.input)
- return ctx
-}
-
-export default {
- handle,
-}
diff --git a/libs/zhi-picgo-core/src/plugins/transformer/index.ts b/libs/zhi-picgo-core/src/plugins/transformer/index.ts
deleted file mode 100644
index 2fdc120..0000000
--- a/libs/zhi-picgo-core/src/plugins/transformer/index.ts
+++ /dev/null
@@ -1,14 +0,0 @@
-import { IPicGo, IPicGoPlugin } from "../../types"
-import ImgFromPath from "./path"
-import ImgFromBase64 from "./base64"
-
-const buildInTransformers: IPicGoPlugin = () => {
- return {
- register(ctx: IPicGo) {
- ctx.helper.transformer.register("path", ImgFromPath)
- ctx.helper.transformer.register("base64", ImgFromBase64)
- },
- }
-}
-
-export default buildInTransformers
diff --git a/libs/zhi-picgo-core/src/plugins/transformer/path.ts b/libs/zhi-picgo-core/src/plugins/transformer/path.ts
deleted file mode 100644
index d00920f..0000000
--- a/libs/zhi-picgo-core/src/plugins/transformer/path.ts
+++ /dev/null
@@ -1,44 +0,0 @@
-import { isUrl, getImageSize, getFSFile, getURLFile } from "../../utils/common"
-import { IPicGo, IPathTransformedImgInfo, IImgInfo, IImgSize } from "../../types"
-
-const handle = async (ctx: IPicGo): Promise => {
- const results: IImgInfo[] = ctx.output
- await Promise.all(
- ctx.input.map(async (item: string, index: number) => {
- let info: IPathTransformedImgInfo
- if (isUrl(item)) {
- info = await getURLFile(item, ctx)
- } else {
- info = await getFSFile(item)
- }
- if (info.success && info.buffer) {
- const imgSize = getImgSize(ctx, info.buffer, item)
- results[index] = {
- buffer: info.buffer,
- fileName: info.fileName,
- width: imgSize.width,
- height: imgSize.height,
- extname: info.extname,
- }
- } else {
- throw new Error(info.reason)
- }
- })
- )
- // remove empty item
- ctx.output = results.filter((item) => item)
- return ctx
-}
-
-const getImgSize = (ctx: IPicGo, file: Buffer, path: string): IImgSize => {
- const imageSize = getImageSize(file)
- if (!imageSize.real) {
- ctx.log.warn(`can't get ${path}'s image size`)
- ctx.log.warn("fallback to 200 * 200")
- }
- return imageSize
-}
-
-export default {
- handle,
-}
diff --git a/libs/zhi-picgo-core/src/plugins/uploader/aliyun.ts b/libs/zhi-picgo-core/src/plugins/uploader/aliyun.ts
deleted file mode 100644
index 1e94abd..0000000
--- a/libs/zhi-picgo-core/src/plugins/uploader/aliyun.ts
+++ /dev/null
@@ -1,251 +0,0 @@
-import { IAliyunConfig, IOldReqOptionsWithFullResponse, IPicGo, IPluginConfig } from "../../types"
-import crypto from "crypto"
-import mime from "mime-types"
-import { IBuildInEvent } from "../../utils/enum"
-import { ILocalesKey } from "../../i18n/zh-CN"
-// eslint-disable-next-line @typescript-eslint/ban-ts-comment
-// @ts-expect-error
-import OSS from "ali-oss"
-import { Readable } from "stream"
-import streamUtils from "../../utils/streamUtils"
-
-// generate OSS signature
-const generateSignature = (options: IAliyunConfig, fileName: string): string => {
- const date = new Date().toUTCString()
- const mimeType = mime.lookup(fileName)
- if (!mimeType) throw Error(`No mime type found for file ${fileName}`)
-
- const signString = `PUT\n\n${mimeType}\n${date}\n/${options.bucket}/${options.path}${fileName}`
-
- const signature = crypto.createHmac("sha1", options.accessKeySecret).update(signString).digest("base64")
- return `OSS ${options.accessKeyId}:${signature}`
-}
-
-const postOptions = (
- options: IAliyunConfig,
- fileName: string,
- signature: string,
- image: Buffer
-): IOldReqOptionsWithFullResponse => {
- return {
- method: "PUT",
- url: `https://${options.bucket}.${options.area}.aliyuncs.com/${encodeURI(options.path)}${encodeURI(fileName)}`,
- headers: {
- Host: `${options.bucket}.${options.area}.aliyuncs.com`,
- Authorization: signature,
- Date: new Date().toUTCString(),
- "Content-Type": mime.lookup(fileName),
- },
- body: image,
- resolveWithFullResponse: true,
- }
-}
-
-const handleRest = async (ctx: IPicGo): Promise => {
- const aliYunOptions = ctx.getConfig("picBed.aliyun")
- if (!aliYunOptions) {
- throw new Error("Can't find aliYun OSS config")
- }
- try {
- const imgList = ctx.output
- const customUrl = aliYunOptions.customUrl
- const path = aliYunOptions.path
- for (const img of imgList) {
- if (img.fileName && img.buffer) {
- const signature = generateSignature(aliYunOptions, img.fileName)
- let image = img.buffer
- if (!image && img.base64Image) {
- image = Buffer.from(img.base64Image, "base64")
- }
- const options = postOptions(aliYunOptions, img.fileName, signature, image)
- const body = await ctx.request(options)
- if (body.statusCode === 200) {
- delete img.base64Image
- delete img.buffer
- const optionUrl = aliYunOptions.options || ""
- if (customUrl) {
- img.imgUrl = `${customUrl}/${path}${img.fileName}${optionUrl}`
- } else {
- img.imgUrl = `https://${aliYunOptions.bucket}.${aliYunOptions.area}.aliyuncs.com/${path}${img.fileName}${optionUrl}`
- }
- } else {
- throw new Error("Upload failed")
- }
- }
- }
- return ctx
- } catch (err) {
- ctx.emit(IBuildInEvent.NOTIFICATION, {
- title: ctx.i18n.translate("UPLOAD_FAILED"),
- body: ctx.i18n.translate("CHECK_SETTINGS"),
- })
- throw err
- }
-}
-
-const handle = async (ctx: IPicGo): Promise => {
- if (!ctx) {
- await handleRest(ctx)
- }
-
- console.warn(
- "Using stream mode for aliyun upload, added by terwer, see https://github.com/terwer/Electron-PicGo-Core/blob/dev/src/plugins/uploader/aliyun.ts#L76"
- )
- const aliYunOptions = ctx.getConfig("picBed.aliyun")
- if (!aliYunOptions) {
- throw new Error("Can't find aliYun OSS config")
- }
- try {
- const store = new OSS({
- region: aliYunOptions.area,
- accessKeyId: aliYunOptions.accessKeyId,
- accessKeySecret: aliYunOptions.accessKeySecret,
- bucket: aliYunOptions.bucket,
- })
-
- const imgList = ctx.output
- const customUrl = aliYunOptions.customUrl
- const path = aliYunOptions.path
-
- for (const img of imgList) {
- if (img.fileName && img.buffer) {
- let image = streamUtils.readBuffer(img.buffer)
- if (!image && img.base64Image) {
- image = Buffer.from(img.base64Image, "base64")
- }
-
- const optionUrl = aliYunOptions.options || ""
- const remotePath = `${path}${img.fileName}${optionUrl}`
- const stream = Readable.from(image)
- // console.log('Before upload,remotePath=>', remotePath)
- // console.log('Before upload,stream=>', stream)
-
- const result = await store.putStream(remotePath, stream)
- console.log("Using aliyun SDK for upload add by terwer, result=>", result)
-
- if (result?.res?.status && result.res.status === 200) {
- delete img.base64Image
- delete img.buffer
- if (customUrl) {
- img.imgUrl = `${customUrl}/${path}${img.fileName}${optionUrl}`
- } else {
- img.imgUrl = `https://${aliYunOptions.bucket}.${aliYunOptions.area}.aliyuncs.com/${path}${img.fileName}${optionUrl}`
- }
- } else {
- throw new Error("Upload failed")
- }
- }
- }
- return ctx
- } catch (err) {
- ctx.emit(IBuildInEvent.NOTIFICATION, {
- title: ctx.i18n.translate("UPLOAD_FAILED"),
- body: ctx.i18n.translate("CHECK_SETTINGS"),
- })
- throw err
- }
-}
-
-const config = (ctx: IPicGo): IPluginConfig[] => {
- const userConfig = ctx.getConfig("picBed.aliyun") || {}
- const config: IPluginConfig[] = [
- {
- name: "accessKeyId",
- type: "input",
- get alias() {
- return ctx.i18n.translate("PICBED_ALICLOUD_ACCESSKEYID")
- },
- default: userConfig.accessKeyId || "",
- required: true,
- },
- {
- name: "accessKeySecret",
- type: "password",
- get alias() {
- return ctx.i18n.translate("PICBED_ALICLOUD_ACCESSKEYSECRET")
- },
- default: userConfig.accessKeySecret || "",
- required: true,
- },
- {
- name: "bucket",
- type: "input",
- get alias() {
- return ctx.i18n.translate("PICBED_ALICLOUD_BUCKET")
- },
- default: userConfig.bucket || "",
- required: true,
- },
- {
- name: "area",
- type: "input",
- get prefix() {
- return ctx.i18n.translate("PICBED_ALICLOUD_AREA")
- },
- get alias() {
- return ctx.i18n.translate("PICBED_ALICLOUD_AREA")
- },
- default: userConfig.area || "",
- get message() {
- return ctx.i18n.translate("PICBED_ALICLOUD_MESSAGE_AREA")
- },
- required: true,
- },
- {
- name: "path",
- type: "input",
- get prefix() {
- return ctx.i18n.translate("PICBED_ALICLOUD_PATH")
- },
- get alias() {
- return ctx.i18n.translate("PICBED_ALICLOUD_PATH")
- },
- get message() {
- return ctx.i18n.translate("PICBED_ALICLOUD_MESSAGE_PATH")
- },
- default: userConfig.path || "",
- required: false,
- },
- {
- name: "customUrl",
- type: "input",
- get prefix() {
- return ctx.i18n.translate("PICBED_ALICLOUD_CUSTOMURL")
- },
- get alias() {
- return ctx.i18n.translate("PICBED_ALICLOUD_CUSTOMURL")
- },
- get message() {
- return ctx.i18n.translate("PICBED_ALICLOUD_MESSAGE_CUSTOMURL")
- },
- default: userConfig.customUrl || "",
- required: false,
- },
- {
- name: "options",
- type: "input",
- get prefix() {
- return ctx.i18n.translate("PICBED_ALICLOUD_OPTIONS")
- },
- get alias() {
- return ctx.i18n.translate("PICBED_ALICLOUD_OPTIONS")
- },
- get message() {
- return ctx.i18n.translate("PICBED_ALICLOUD_MESSAGE_OPTIONS")
- },
- default: userConfig.options || "",
- required: false,
- },
- ]
- return config
-}
-
-export default function register(ctx: IPicGo): void {
- ctx.helper.uploader.register("aliyun", {
- get name() {
- return ctx.i18n.translate("PICBED_ALICLOUD")
- },
- handle,
- config,
- })
-}
diff --git a/libs/zhi-picgo-core/src/plugins/uploader/github.ts b/libs/zhi-picgo-core/src/plugins/uploader/github.ts
deleted file mode 100644
index 40929e5..0000000
--- a/libs/zhi-picgo-core/src/plugins/uploader/github.ts
+++ /dev/null
@@ -1,151 +0,0 @@
-import { IPicGo, IPluginConfig, IGithubConfig, IOldReqOptionsWithJSON } from "../../types"
-import { IBuildInEvent } from "../../utils/enum"
-import { ILocalesKey } from "../../i18n/zh-CN"
-import mime from "mime-types"
-
-const postOptions = (fileName: string, options: IGithubConfig, data: any): IOldReqOptionsWithJSON => {
- const path = options.path || ""
- const { token, repo } = options
- return {
- method: "PUT",
- url: `https://api.github.com/repos/${repo}/contents/${encodeURI(path)}${encodeURI(fileName)}`,
- headers: {
- Authorization: `token ${token}`,
- "User-Agent": "PicGo",
- "Content-Type": mime.lookup(fileName),
- },
- body: data,
- json: true,
- } as const
-}
-
-const handle = async (ctx: IPicGo): Promise => {
- const githubOptions = ctx.getConfig("picBed.github")
- if (!githubOptions) {
- throw new Error("Can't find github config")
- }
- try {
- const imgList = ctx.output
- for (const img of imgList) {
- if (img.fileName && img.buffer) {
- const base64Image = img.base64Image || Buffer.from(img.buffer).toString("base64")
- const data = {
- message: "Upload by PicGo",
- branch: githubOptions.branch,
- content: base64Image,
- path: githubOptions.path + encodeURI(img.fileName),
- }
- const postConfig = postOptions(img.fileName, githubOptions, data)
- const body: {
- content: {
- download_url: string
- }
- } = await ctx.request(postConfig)
- if (body) {
- delete img.base64Image
- delete img.buffer
- if (githubOptions.customUrl) {
- img.imgUrl = `${githubOptions.customUrl}/${githubOptions.path}${img.fileName}`
- } else {
- img.imgUrl = body.content.download_url
- }
- } else {
- throw new Error("Server error, please try again")
- }
- }
- }
- return ctx
- } catch (err) {
- ctx.emit(IBuildInEvent.NOTIFICATION, {
- title: ctx.i18n.translate("UPLOAD_FAILED"),
- body: ctx.i18n.translate("CHECK_SETTINGS_AND_NETWORK"),
- })
- throw err
- }
-}
-
-const config = (ctx: IPicGo): IPluginConfig[] => {
- const userConfig = ctx.getConfig("picBed.github") || {}
- const config: IPluginConfig[] = [
- {
- name: "repo",
- type: "input",
- get prefix() {
- return ctx.i18n.translate("PICBED_GITHUB_REPO")
- },
- get alias() {
- return ctx.i18n.translate("PICBED_GITHUB_REPO")
- },
- get message() {
- return ctx.i18n.translate("PICBED_GITHUB_MESSAGE_REPO")
- },
- default: userConfig.repo || "",
- required: true,
- },
- {
- name: "branch",
- type: "input",
- get prefix() {
- return ctx.i18n.translate("PICBED_GITHUB_BRANCH")
- },
- get alias() {
- return ctx.i18n.translate("PICBED_GITHUB_BRANCH")
- },
- get message() {
- return ctx.i18n.translate("PICBED_GITHUB_MESSAGE_BRANCH")
- },
- default: userConfig.branch || "master",
- required: true,
- },
- {
- name: "token",
- type: "password",
- get alias() {
- return ctx.i18n.translate("PICBED_GITHUB_TOKEN")
- },
- default: userConfig.token || "",
- required: true,
- },
- {
- name: "path",
- type: "input",
- get prefix() {
- return ctx.i18n.translate("PICBED_GITHUB_PATH")
- },
- get alias() {
- return ctx.i18n.translate("PICBED_GITHUB_PATH")
- },
- get message() {
- return ctx.i18n.translate("PICBED_GITHUB_MESSAGE_PATH")
- },
- default: userConfig.path || "",
- required: false,
- },
- {
- name: "customUrl",
- type: "input",
- get prefix() {
- return ctx.i18n.translate("PICBED_GITHUB_CUSTOMURL")
- },
- get alias() {
- return ctx.i18n.translate("PICBED_GITHUB_CUSTOMURL")
- },
- get message() {
- return ctx.i18n.translate("PICBED_GITHUB_MESSAGE_CUSTOMURL")
- },
- default: userConfig.customUrl || "",
- required: false,
- },
- ]
- return config
-}
-
-export default function register(ctx: IPicGo): void {
- ctx.helper.uploader.register("github", {
- get name() {
- return ctx.i18n.translate("PICBED_GITHUB")
- },
- handle,
- config,
- })
-}
diff --git a/libs/zhi-picgo-core/src/plugins/uploader/imgur.ts b/libs/zhi-picgo-core/src/plugins/uploader/imgur.ts
deleted file mode 100644
index 4ed1293..0000000
--- a/libs/zhi-picgo-core/src/plugins/uploader/imgur.ts
+++ /dev/null
@@ -1,101 +0,0 @@
-import { IPicGo, IPluginConfig, IImgurConfig, IOldReqOptions } from "../../types"
-import { IBuildInEvent } from "../../utils/enum"
-import { ILocalesKey } from "../../i18n/zh-CN"
-
-const postOptions = (options: IImgurConfig, fileName: string, imgBase64: string): IOldReqOptions => {
- const clientId = options.clientId
- const obj: IOldReqOptions = {
- method: "POST",
- url: "https://api.imgur.com/3/image",
- headers: {
- Authorization: `Client-ID ${clientId}`,
- "content-type": "multipart/form-data",
- Host: "api.imgur.com",
- "User-Agent": "PicGo",
- },
- formData: {
- image: imgBase64,
- type: "base64",
- name: fileName,
- },
- }
- if (options.proxy) {
- obj.proxy = options.proxy
- }
- return obj
-}
-
-const handle = async (ctx: IPicGo): Promise => {
- const imgurOptions = ctx.getConfig("picBed.imgur")
- if (!imgurOptions) {
- throw new Error("Can't find imgur config")
- }
- try {
- const imgList = ctx.output
- for (const img of imgList) {
- if (img.fileName && img.buffer) {
- const base64Image = img.base64Image || Buffer.from(img.buffer).toString("base64")
- const options = postOptions(imgurOptions, img.fileName, base64Image)
- const res: string = await ctx.request(options)
- const body = typeof res === "string" ? JSON.parse(res) : res
- if (body.success) {
- delete img.base64Image
- delete img.buffer
- img.imgUrl = body.data.link
- } else {
- throw new Error("Server error, please try again")
- }
- }
- }
- return ctx
- } catch (err) {
- ctx.emit(IBuildInEvent.NOTIFICATION, {
- title: ctx.i18n.translate("UPLOAD_FAILED"),
- body: ctx.i18n.translate("CHECK_SETTINGS_AND_NETWORK"),
- text: "http://docs.imgur.com/api/errno/",
- })
- // @ts-expect-error
- throw err?.response?.data || err
- }
-}
-
-const config = (ctx: IPicGo): IPluginConfig[] => {
- const userConfig = ctx.getConfig("picBed.imgur") || {}
- const config: IPluginConfig[] = [
- {
- name: "clientId",
- type: "input",
- get alias() {
- return ctx.i18n.translate("PICBED_IMGUR_CLIENTID")
- },
- default: userConfig.clientId || "",
- required: true,
- },
- {
- name: "proxy",
- type: "input",
- get prefix() {
- return ctx.i18n.translate("PICBED_IMGUR_PROXY")
- },
- get alias() {
- return ctx.i18n.translate("PICBED_IMGUR_PROXY")
- },
- get message() {
- return ctx.i18n.translate("PICBED_IMGUR_MESSAGE_PROXY")
- },
- default: userConfig.proxy || "",
- required: false,
- },
- ]
- return config
-}
-
-export default function register(ctx: IPicGo): void {
- ctx.helper.uploader.register("imgur", {
- get name() {
- return ctx.i18n.translate("PICBED_IMGUR")
- },
- handle,
- config,
- })
-}
diff --git a/libs/zhi-picgo-core/src/plugins/uploader/index.ts b/libs/zhi-picgo-core/src/plugins/uploader/index.ts
deleted file mode 100644
index 2728268..0000000
--- a/libs/zhi-picgo-core/src/plugins/uploader/index.ts
+++ /dev/null
@@ -1,22 +0,0 @@
-import { IPicGo, IPicGoPlugin } from "../../types"
-import tcYunUploader from "./tcyun"
-import githubUploader from "./github"
-import qiniuUploader from "./qiniu"
-import aliYunUploader from "./aliyun"
-import upYunUploader from "./upyun"
-
-const buildInUploaders: IPicGoPlugin = () => {
- return {
- register(ctx: IPicGo) {
- aliYunUploader(ctx)
- tcYunUploader(ctx)
- // SMMSUploader(ctx)
- githubUploader(ctx)
- qiniuUploader(ctx)
- // imgurUploader(ctx)
- upYunUploader(ctx)
- },
- }
-}
-
-export default buildInUploaders
diff --git a/libs/zhi-picgo-core/src/plugins/uploader/qiniu.ts b/libs/zhi-picgo-core/src/plugins/uploader/qiniu.ts
deleted file mode 100644
index 6503750..0000000
--- a/libs/zhi-picgo-core/src/plugins/uploader/qiniu.ts
+++ /dev/null
@@ -1,187 +0,0 @@
-import qiniu from "qiniu"
-import { IPluginConfig, IQiniuConfig, IPicGo, IOldReqOptions } from "../../types"
-import { IBuildInEvent } from "../../utils/enum"
-import { ILocalesKey } from "../../i18n/zh-CN"
-import mime from "mime-types"
-
-function postOptions(options: IQiniuConfig, fileName: string, token: string, imgBase64: string): IOldReqOptions {
- const area = selectArea(options.area || "z0")
- const path = options.path || ""
- const base64FileName = Buffer.from(path + fileName, "utf-8")
- .toString("base64")
- .replace(/\+/g, "-")
- .replace(/\//g, "_")
- return {
- method: "POST",
- url: `http://upload${area}.qiniup.com/putb64/-1/key/${base64FileName}`,
- headers: {
- Authorization: `UpToken ${token}`,
- "Content-Type": mime.lookup(fileName) || "application/octet-stream",
- },
- body: imgBase64,
- }
-}
-
-function selectArea(area: string): string {
- return area === "z0" ? "" : "-" + area
-}
-
-function getToken(qiniuOptions: any): string {
- const accessKey = qiniuOptions.accessKey
- const secretKey = qiniuOptions.secretKey
- const mac = new qiniu.auth.digest.Mac(accessKey, secretKey)
- const options = {
- scope: qiniuOptions.bucket,
- }
- const putPolicy = new qiniu.rs.PutPolicy(options)
- return putPolicy.uploadToken(mac)
-}
-
-const handle = async (ctx: IPicGo): Promise => {
- const qiniuOptions = ctx.getConfig("picBed.qiniu")
- if (!qiniuOptions) {
- throw new Error("Can't find qiniu config")
- }
- try {
- const imgList = ctx.output
- for (const img of imgList) {
- if (img.fileName && img.buffer) {
- const base64Image = img.base64Image || Buffer.from(img.buffer).toString("base64")
- const options = postOptions(qiniuOptions, img.fileName, getToken(qiniuOptions), base64Image)
- const res = await ctx.request(options)
- const body = JSON.parse(res)
- if (body?.key) {
- delete img.base64Image
- delete img.buffer
- const baseUrl = qiniuOptions.url
- const options = qiniuOptions.options
- img.imgUrl = `${baseUrl}/${body.key as string}${options}`
- } else {
- ctx.emit(IBuildInEvent.NOTIFICATION, {
- title: ctx.i18n.translate("UPLOAD_FAILED"),
- body: body.msg,
- })
- ctx.log.error("qiniu error", body)
- throw new Error("Upload failed")
- }
- }
- }
- return ctx
- } catch (err: any) {
- if (err.message !== "Upload failed") {
- // err.response maybe undefined
- if (err.response) {
- const error = err.response.body
- ctx.emit(IBuildInEvent.NOTIFICATION, {
- title: ctx.i18n.translate("UPLOAD_FAILED"),
- body: error.error,
- })
- }
- }
- throw err
- }
-}
-
-const config = (ctx: IPicGo): IPluginConfig[] => {
- const userConfig = ctx.getConfig("picBed.qiniu") || {}
- const config: IPluginConfig[] = [
- {
- name: "accessKey",
- type: "input",
- get alias() {
- return ctx.i18n.translate("PICBED_QINIU_ACCESSKEY")
- },
- default: userConfig.accessKey || "",
- required: true,
- },
- {
- name: "secretKey",
- type: "password",
- get alias() {
- return ctx.i18n.translate("PICBED_QINIU_SECRETKEY")
- },
- default: userConfig.secretKey || "",
- required: true,
- },
- {
- name: "bucket",
- type: "input",
- get alias() {
- return ctx.i18n.translate("PICBED_QINIU_BUCKET")
- },
- default: userConfig.bucket || "",
- required: true,
- },
- {
- name: "url",
- type: "input",
- get prefix() {
- return ctx.i18n.translate("PICBED_QINIU_URL")
- },
- get alias() {
- return ctx.i18n.translate("PICBED_QINIU_URL")
- },
- get message() {
- return ctx.i18n.translate("PICBED_QINIU_MESSAGE_URL")
- },
- default: userConfig.url || "",
- required: true,
- },
- {
- name: "area",
- type: "input",
- get prefix() {
- return ctx.i18n.translate("PICBED_QINIU_AREA")
- },
- get alias() {
- return ctx.i18n.translate("PICBED_QINIU_AREA")
- },
- get message() {
- return ctx.i18n.translate("PICBED_QINIU_MESSAGE_AREA")
- },
- default: userConfig.area || "",
- required: true,
- },
- {
- name: "options",
- type: "input",
- get prefix() {
- return ctx.i18n.translate("PICBED_QINIU_OPTIONS")
- },
- get alias() {
- return ctx.i18n.translate("PICBED_QINIU_OPTIONS")
- },
- get message() {
- return ctx.i18n.translate