sonamu 0.8.20 → 0.8.22

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (39) hide show
  1. package/dist/api/config.d.ts +1 -1
  2. package/dist/api/config.d.ts.map +1 -1
  3. package/dist/api/config.js +1 -1
  4. package/dist/api/sonamu.d.ts +1 -1
  5. package/dist/api/sonamu.d.ts.map +1 -1
  6. package/dist/api/sonamu.js +14 -19
  7. package/dist/cone/cone-generator.js +29 -16
  8. package/dist/database/base-model.js +2 -2
  9. package/dist/database/db.d.ts +1 -1
  10. package/dist/database/db.d.ts.map +1 -1
  11. package/dist/database/db.js +1 -1
  12. package/dist/stream/sse.d.ts +2 -0
  13. package/dist/stream/sse.d.ts.map +1 -1
  14. package/dist/stream/sse.js +22 -1
  15. package/dist/syncer/syncer.js +2 -2
  16. package/dist/testing/global-setup.d.ts.map +1 -1
  17. package/dist/testing/global-setup.js +1 -4
  18. package/dist/ui/api.d.ts.map +1 -1
  19. package/dist/ui/api.js +11 -11
  20. package/package.json +4 -4
  21. package/src/api/config.ts +1 -1
  22. package/src/api/sonamu.ts +15 -20
  23. package/src/cone/cone-generator.ts +39 -19
  24. package/src/database/base-model.ts +1 -1
  25. package/src/database/db.ts +1 -1
  26. package/src/shared/app.shared.ts.txt +1 -1
  27. package/src/shared/web.shared.ts.txt +1 -1
  28. package/src/skills/AGENTS.md +11 -1
  29. package/src/skills/sonamu/SKILL.md +42 -149
  30. package/src/skills/sonamu/cdd.md +172 -517
  31. package/src/skills/sonamu/cone.md +3 -4
  32. package/src/skills/sonamu/fixture-cli.md +1 -1
  33. package/src/skills/sonamu/workflow.md +72 -80
  34. package/src/stream/sse.ts +27 -0
  35. package/src/syncer/syncer.ts +1 -1
  36. package/src/testing/global-setup.ts +0 -4
  37. package/src/ui/api.ts +6 -15
  38. package/src/skills/project/business-logic.md +0 -270
  39. package/src/skills/project/requirements.md +0 -160
@@ -101,6 +101,9 @@ class SonamuClass {
101
101
  }
102
102
  _workflows = null;
103
103
  get workflows() {
104
+ if (this._workflows === null) {
105
+ throw new Error("Sonamu has not been initialized");
106
+ }
104
107
  return this._workflows;
105
108
  }
106
109
  _auth = null;
@@ -141,10 +144,8 @@ class SonamuClass {
141
144
  const { loadConfig } = await import("./config.js");
142
145
  this.config = await loadConfig(this.apiRootPath);
143
146
  // sonamu.config.ts 기본값 설정
144
- if (this.config.database) {
145
- this.config.database.database = this.config.database.database ?? "pg";
146
- this.config.database.defaultOptions.client = this.config.database.database ?? "pg";
147
- }
147
+ this.config.database.database = this.config.database.database ?? "pg";
148
+ this.config.database.defaultOptions.client = this.config.database.database ?? "pg";
148
149
  // 로깅 설정
149
150
  const { configureLogTape } = await import("../logger/configure.js");
150
151
  if (this.config.logging !== false) {
@@ -153,13 +154,11 @@ class SonamuClass {
153
154
  });
154
155
  }
155
156
  // DB 로드
156
- if (this.config.database) {
157
- const { DB } = await import("../database/db.js");
158
- this.dbConfig = DB.generateDBConfig(this.config.database);
159
- if (!doSilent) {
160
- const chalk = (await import("chalk")).default;
161
- console.log(chalk.green("DB Config Loaded!"));
162
- }
157
+ const { DB } = await import("../database/db.js");
158
+ this.dbConfig = DB.generateDBConfig(this.config.database);
159
+ if (!doSilent) {
160
+ const chalk = (await import("chalk")).default;
161
+ console.log(chalk.green("DB Config Loaded!"));
163
162
  }
164
163
  // Entity 로드
165
164
  // 테스트에서도 Entity 정보는 필요합니다.
@@ -1026,10 +1025,6 @@ class SonamuClass {
1026
1025
  setCacheManagerRef(this._cache);
1027
1026
  }
1028
1027
  async initializeWorkflows(options) {
1029
- // database 설정이 없으면 WorkflowManager를 초기화하지 않음
1030
- if (!this.config.database) {
1031
- return;
1032
- }
1033
1028
  const { WorkflowManager } = await import("../tasks/workflow-manager.js");
1034
1029
  // NOTE: @sonamu-kit/tasks 안에선 knex config를 수정하기 때문에 connection이 아닌 config 째로 보냅니다.
1035
1030
  this._workflows = new WorkflowManager(DB.getDBConfig("w"));
@@ -1043,7 +1038,7 @@ class SonamuClass {
1043
1038
  listenDelay: 500
1044
1039
  };
1045
1040
  if (enableWorker) {
1046
- this._workflows?.setupWorker({
1041
+ this.workflows.setupWorker({
1047
1042
  ...defaultWorkerOptions,
1048
1043
  ...options.workerOptions
1049
1044
  });
@@ -1054,7 +1049,7 @@ class SonamuClass {
1054
1049
  const host = options.listen?.host ?? "localhost";
1055
1050
  server.addHook("onClose", async ()=>{
1056
1051
  await options.lifecycle?.onShutdown?.(server);
1057
- await this.workflows?.destroy();
1052
+ await this.workflows.destroy();
1058
1053
  await this.destroy();
1059
1054
  });
1060
1055
  const shutdown = async ()=>{
@@ -1075,7 +1070,7 @@ class SonamuClass {
1075
1070
  port,
1076
1071
  host
1077
1072
  }).then(async ()=>{
1078
- await this.workflows?.startWorker();
1073
+ await this.workflows.startWorker();
1079
1074
  await options.lifecycle?.onStart?.(server);
1080
1075
  }).catch(async (err)=>{
1081
1076
  const chalk = (await import("chalk")).default;
@@ -1134,4 +1129,4 @@ export const Sonamu = new SonamuClass();
1134
1129
  return `uploads/${timestamp}-${random}.${ext}`;
1135
1130
  }
1136
1131
 
1137
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hcGkvc29uYW11LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGRpc3Bvc2UgYXMgbG9ndGFwZURpc3Bvc2UgfSBmcm9tIFwiQGxvZ3RhcGUvbG9ndGFwZVwiO1xuaW1wb3J0IGFzc2VydCBmcm9tIFwiYXNzZXJ0XCI7XG5pbXBvcnQgeyBBc3luY0xvY2FsU3RvcmFnZSB9IGZyb20gXCJhc3luY19ob29rc1wiO1xuaW1wb3J0IHR5cGUgeyBBdXRoIH0gZnJvbSBcImJldHRlci1hdXRoXCI7XG5pbXBvcnQgdHlwZSB7IEZTV2F0Y2hlciB9IGZyb20gXCJjaG9raWRhclwiO1xuaW1wb3J0IHR5cGUgeyBGYXN0aWZ5SW5zdGFuY2UsIEZhc3RpZnlSZXBseSwgRmFzdGlmeVJlcXVlc3QgfSBmcm9tIFwiZmFzdGlmeVwiO1xuaW1wb3J0IGZzIGZyb20gXCJmcy9wcm9taXNlc1wiO1xuaW1wb3J0IHR5cGUgeyBJbmNvbWluZ01lc3NhZ2UsIFNlcnZlciwgU2VydmVyUmVzcG9uc2UgfSBmcm9tIFwiaHR0cFwiO1xuaW1wb3J0IG1pbWUsIHsgbG9va3VwIGFzIG1pbWVMb29rdXAgfSBmcm9tIFwibWltZS10eXBlc1wiO1xuaW1wb3J0IG9zIGZyb20gXCJvc1wiO1xuaW1wb3J0IHBhdGggZnJvbSBcInBhdGhcIjtcbmltcG9ydCB0eXBlIHsgUG9vbENvbmZpZyB9IGZyb20gXCJwZ1wiO1xuaW1wb3J0IHR5cGUgeyBab2RPYmplY3QgfSBmcm9tIFwiem9kXCI7XG5pbXBvcnQge1xuICBCQVNFX0ZJRUxEX01BUFBJTkdTLFxuICBjb252ZXJ0RmFzdGlmeUhlYWRlcnNUb1N0YW5kYXJkLFxuICBjcmVhdGVNb2NrU1NFRmFjdG9yeSxcbiAgREIsXG4gIGlzRGFlbW9uU2VydmVyLFxuICBtZXJnZSxcbiAgTm90Rm91bmRFeGNlcHRpb24sXG59IGZyb20gXCIuLlwiO1xuaW1wb3J0IHR5cGUgeyBDYWNoZUNvbmZpZywgQ2FjaGVNYW5hZ2VyIH0gZnJvbSBcIi4uL2NhY2hlL3R5cGVzXCI7XG5pbXBvcnQgeyBhcHBseUNhY2hlSGVhZGVycywgQ2FjaGVQcmVzZXRzIH0gZnJvbSBcIi4uL2NhY2hlLWNvbnRyb2wvY2FjaGUtY29udHJvbFwiO1xuaW1wb3J0IHR5cGUgeyBDYWNoZUNvbnRyb2xDb25maWcsIENhY2hlQ29udHJvbFJlcXVlc3QgfSBmcm9tIFwiLi4vY2FjaGUtY29udHJvbC90eXBlc1wiO1xuaW1wb3J0IHsgdG9GYXN0aWZ5Q29tcHJlc3NPcHRpb24gfSBmcm9tIFwiLi4vY29tcHJlc3MvY29tcHJlc3NcIjtcbmltcG9ydCB0eXBlIHsgQ29tcHJlc3NPcHRpb25zIH0gZnJvbSBcIi4uL2NvbXByZXNzL3R5cGVzXCI7XG5pbXBvcnQgdHlwZSB7IFNvbmFtdURCQ29uZmlnIH0gZnJvbSBcIi4uL2RhdGFiYXNlL2RiXCI7XG5pbXBvcnQgeyBTRCB9IGZyb20gXCIuLi9kaWN0L3NkXCI7XG5pbXBvcnQgdHlwZSB7IExvY2FsaXplZFN0cmluZyB9IGZyb20gXCIuLi9kaWN0L3R5cGVzXCI7XG5pbXBvcnQgeyBOYWl0ZSB9IGZyb20gXCIuLi9uYWl0ZS9uYWl0ZVwiO1xuaW1wb3J0IHsgQnVmZmVyZWRGaWxlIH0gZnJvbSBcIi4uL3N0b3JhZ2UvYnVmZmVyZWQtZmlsZVwiO1xuaW1wb3J0IHR5cGUgeyBTdG9yYWdlTWFuYWdlciB9IGZyb20gXCIuLi9zdG9yYWdlL3N0b3JhZ2UtbWFuYWdlclwiO1xuaW1wb3J0IHR5cGUgeyBLZXlHZW5lcmF0b3IgfSBmcm9tIFwiLi4vc3RvcmFnZS90eXBlc1wiO1xuaW1wb3J0IHsgVXBsb2FkZWRGaWxlIH0gZnJvbSBcIi4uL3N0b3JhZ2UvdXBsb2FkZWQtZmlsZVwiO1xuaW1wb3J0IHR5cGUgeyBTeW5jZXIgfSBmcm9tIFwiLi4vc3luY2VyL3N5bmNlclwiO1xuaW1wb3J0IHR5cGUgeyBXb3JrZmxvd01hbmFnZXIgfSBmcm9tIFwiLi4vdGFza3Mvd29ya2Zsb3ctbWFuYWdlclwiO1xuaW1wb3J0IHR5cGUgeyBEZXZWaXRlc3RNYW5hZ2VyIH0gZnJvbSBcIi4uL3Rlc3RpbmcvZGV2LXZpdGVzdC1tYW5hZ2VyXCI7XG5pbXBvcnQgdHlwZSB7IFNvbmFtdUZhc3RpZnlDb25maWcgfSBmcm9tIFwiLi4vdHlwZXMvdHlwZXNcIjtcbmltcG9ydCB7IGV4aXN0cywgZmlsZUV4aXN0cyB9IGZyb20gXCIuLi91dGlscy9mcy11dGlsc1wiO1xuaW1wb3J0IHR5cGUgeyBBYnNvbHV0ZVBhdGggfSBmcm9tIFwiLi4vdXRpbHMvcGF0aC11dGlsc1wiO1xuaW1wb3J0IHR5cGUgeyBTb25hbXVDb25maWcsIFNvbmFtdVNlcnZlck9wdGlvbnMsIFNvbmFtdVRhc2tPcHRpb25zIH0gZnJvbSBcIi4vY29uZmlnXCI7XG5pbXBvcnQgdHlwZSB7IENvbnRleHQgfSBmcm9tIFwiLi9jb250ZXh0XCI7XG5pbXBvcnQgdHlwZSB7IEV4dGVuZGVkQXBpIH0gZnJvbSBcIi4vZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgZ2V0U2VjcmV0cywgdHlwZSBTb25hbXVTZWNyZXRzIH0gZnJvbSBcIi4vc2VjcmV0XCI7XG5cbmNsYXNzIFNvbmFtdUNsYXNzIHtcbiAgcHVibGljIGlzSW5pdGlhbGl6ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHVibGljIGZvclRlc3Rpbmc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHVibGljIGFzeW5jTG9jYWxTdG9yYWdlOiBBc3luY0xvY2FsU3RvcmFnZTx7XG4gICAgY29udGV4dDogQ29udGV4dDtcbiAgfT4gPSBuZXcgQXN5bmNMb2NhbFN0b3JhZ2UoKTtcblxuICBwdWJsaWMgZ2V0Q29udGV4dCgpOiBDb250ZXh0IHtcbiAgICBjb25zdCBzdG9yZSA9IHRoaXMuYXN5bmNMb2NhbFN0b3JhZ2UuZ2V0U3RvcmUoKTtcbiAgICBpZiAoc3RvcmU/LmNvbnRleHQpIHtcbiAgICAgIHJldHVybiBzdG9yZS5jb250ZXh0IGFzIENvbnRleHQ7XG4gICAgfVxuXG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInRlc3RcIikge1xuICAgICAgLy8g7YWM7Iqk7YyFIO2ZmOqyveyXkOyEnCDsu6jthY3siqTtirjqsIAg7KO87J6F65CY7KeAIOyViuydgCDqsr3smrAg67mIIOy7qO2FjeyKpO2KuCDrpqzthLRcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHJlcXVlc3Q6IG51bGwsXG4gICAgICAgIHJlcGx5OiBudWxsLFxuICAgICAgICBoZWFkZXJzOiB7fSxcbiAgICAgICAgY3JlYXRlU1NFOiAoc2NoZW1hOiBab2RPYmplY3QpID0+IGNyZWF0ZU1vY2tTU0VGYWN0b3J5KHNjaGVtYSksXG4gICAgICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9FeHBsaWNpdEFueTog7YWM7Iqk7YyFIO2ZmOqyveyXkOyEnCDsu6jthY3siqTtirjqsIAg7KO87J6F65CY7KeAIOyViuydgCDqsr3smrAg67mIIOy7qO2FjeyKpO2KuCDrpqzthLRcbiAgICAgICAgbmFpdGVTdG9yZTogbmV3IE1hcDxzdHJpbmcsIGFueT4oKSxcbiAgICAgIH0gYXMgdW5rbm93biBhcyBDb250ZXh0O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTb25hbXUgY2Fubm90IGZpbmQgY29udGV4dFwiKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9hcGlSb290UGF0aDogQWJzb2x1dGVQYXRoIHwgbnVsbCA9IG51bGw7XG4gIHNldCBhcGlSb290UGF0aChhcGlSb290UGF0aDogQWJzb2x1dGVQYXRoKSB7XG4gICAgdGhpcy5fYXBpUm9vdFBhdGggPSBhcGlSb290UGF0aDtcbiAgfVxuICBnZXQgYXBpUm9vdFBhdGgoKTogQWJzb2x1dGVQYXRoIHtcbiAgICBpZiAodGhpcy5fYXBpUm9vdFBhdGggPT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlNvbmFtdSBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWRcIik7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9hcGlSb290UGF0aDtcbiAgfVxuICBnZXQgYXBwUm9vdFBhdGgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5hcGlSb290UGF0aC5zcGxpdChwYXRoLnNlcCkuc2xpY2UoMCwgLTEpLmpvaW4ocGF0aC5zZXApO1xuICB9XG5cbiAgcHJpdmF0ZSBfZGJDb25maWc6IFNvbmFtdURCQ29uZmlnIHwgbnVsbCA9IG51bGw7XG4gIHNldCBkYkNvbmZpZyhkYkNvbmZpZzogU29uYW11REJDb25maWcpIHtcbiAgICB0aGlzLl9kYkNvbmZpZyA9IGRiQ29uZmlnO1xuICB9XG4gIGdldCBkYkNvbmZpZygpOiBTb25hbXVEQkNvbmZpZyB7XG4gICAgaWYgKHRoaXMuX2RiQ29uZmlnID09PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTb25hbXUgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkXCIpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fZGJDb25maWc7XG4gIH1cblxuICBwcml2YXRlIF9zeW5jZXI6IFN5bmNlciB8IG51bGwgPSBudWxsO1xuICBzZXQgc3luY2VyKHN5bmNlcjogU3luY2VyKSB7XG4gICAgdGhpcy5fc3luY2VyID0gc3luY2VyO1xuICB9XG4gIGdldCBzeW5jZXIoKTogU3luY2VyIHtcbiAgICBpZiAodGhpcy5fc3luY2VyID09PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTb25hbXUgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkXCIpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fc3luY2VyO1xuICB9XG5cbiAgcHJpdmF0ZSBfY29uZmlnOiBTb25hbXVDb25maWcgfCBudWxsID0gbnVsbDtcbiAgc2V0IGNvbmZpZyhjb25maWc6IFNvbmFtdUNvbmZpZykge1xuICAgIHRoaXMuX2NvbmZpZyA9IGNvbmZpZztcbiAgfVxuICBnZXQgY29uZmlnKCk6IFNvbmFtdUNvbmZpZyB7XG4gICAgaWYgKHRoaXMuX2NvbmZpZyA9PT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiU29uYW11IGhhcyBub3QgYmVlbiBpbml0aWFsaXplZFwiKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2NvbmZpZztcbiAgfVxuXG4gIHB1YmxpYyByZWFkb25seSBzZWNyZXRzOiBTb25hbXVTZWNyZXRzID0gZ2V0U2VjcmV0cygpO1xuXG4gIHByaXZhdGUgX3N0b3JhZ2U6IFN0b3JhZ2VNYW5hZ2VyIHwgbnVsbCA9IG51bGw7XG4gIC8qKlxuICAgKiBTdG9yYWdlTWFuYWdlciDsnbjsiqTthLTsiqRcbiAgICovXG4gIGdldCBzdG9yYWdlKCk6IFN0b3JhZ2VNYW5hZ2VyIHtcbiAgICBpZiAoIXRoaXMuX3N0b3JhZ2UpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlN0b3JhZ2UgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkLiBDaGVjayBzdG9yYWdlIGNvbmZpZy5cIik7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9zdG9yYWdlO1xuICB9XG5cbiAgcHJpdmF0ZSBfY2FjaGU6IENhY2hlTWFuYWdlciB8IG51bGwgPSBudWxsO1xuICAvKipcbiAgICogQ2FjaGVNYW5hZ2VyIOyduOyKpO2EtOyKpCAoQmVudG9DYWNoZSlcbiAgICovXG4gIGdldCBjYWNoZSgpOiBDYWNoZU1hbmFnZXIge1xuICAgIGlmICghdGhpcy5fY2FjaGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhY2hlIGhhcyBub3QgYmVlbiBpbml0aWFsaXplZC4gQ2hlY2sgY2FjaGUgY29uZmlnIGluIHNvbmFtdS5jb25maWcudHMuXCIpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fY2FjaGU7XG4gIH1cblxuICBwcml2YXRlIF93b3JrZmxvd3M6IFdvcmtmbG93TWFuYWdlciB8IG51bGwgPSBudWxsO1xuICBnZXQgd29ya2Zsb3dzKCk6IFdvcmtmbG93TWFuYWdlciB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl93b3JrZmxvd3M7XG4gIH1cblxuICBwcml2YXRlIF9hdXRoOiBBdXRoIHwgbnVsbCA9IG51bGw7XG4gIGdldCBhdXRoKCk6IEF1dGgge1xuICAgIGlmICghdGhpcy5fYXV0aCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQXV0aCBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWQuIENoZWNrIGF1dGggY29uZmlnIGluIHNvbmFtdS5jb25maWcudHMuXCIpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fYXV0aDtcbiAgfVxuXG4gIHByaXZhdGUgX2RldlZpdGVzdE1hbmFnZXI6IERldlZpdGVzdE1hbmFnZXIgfCBudWxsID0gbnVsbDtcbiAgZ2V0IGRldlZpdGVzdE1hbmFnZXIoKTogRGV2Vml0ZXN0TWFuYWdlciB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl9kZXZWaXRlc3RNYW5hZ2VyO1xuICB9XG4gIHNldCBkZXZWaXRlc3RNYW5hZ2VyKG1hbmFnZXI6IERldlZpdGVzdE1hbmFnZXIgfCBudWxsKSB7XG4gICAgdGhpcy5fZGV2Vml0ZXN0TWFuYWdlciA9IG1hbmFnZXI7XG4gIH1cblxuICAvLyBITVIg7LKY66asXG4gIHB1YmxpYyB3YXRjaGVyOiBGU1dhdGNoZXIgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBwZW5kaW5nRmlsZXM6IHN0cmluZ1tdID0gW107XG4gIHByaXZhdGUgaG1yU3RhcnRUaW1lOiBudW1iZXIgPSAwO1xuXG4gIHB1YmxpYyBzZXJ2ZXI6IEZhc3RpZnlJbnN0YW5jZSB8IG51bGwgPSBudWxsO1xuXG4gIGFzeW5jIGluaXRGb3JUZXN0aW5nKCkge1xuICAgIGF3YWl0IHRoaXMuaW5pdCh0cnVlLCBmYWxzZSwgdW5kZWZpbmVkLCB0cnVlKTtcbiAgfVxuXG4gIGFzeW5jIGluaXQoXG4gICAgZG9TaWxlbnQ6IGJvb2xlYW4gPSBmYWxzZSxcbiAgICBlbmFibGVTeW5jOiBib29sZWFuID0gdHJ1ZSxcbiAgICBhcGlSb290UGF0aD86IEFic29sdXRlUGF0aCxcbiAgICBmb3JUZXN0aW5nOiBib29sZWFuID0gZmFsc2UsXG4gICkge1xuICAgIHRoaXMuZm9yVGVzdGluZyA9IGZvclRlc3Rpbmc7XG5cbiAgICBpZiAodGhpcy5pc0luaXRpYWxpemVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCFkb1NpbGVudCkge1xuICAgICAgY29uc3QgY2hhbGsgPSAoYXdhaXQgaW1wb3J0KFwiY2hhbGtcIikpLmRlZmF1bHQ7XG4gICAgICBjb25zb2xlLnRpbWUoY2hhbGsuY3lhbihgU29uYW11LmluaXQke2ZvclRlc3RpbmcgPyBcIiBmb3IgdGVzdGluZ1wiIDogXCJcIn1gKSk7XG4gICAgfVxuXG4gICAgLy8gQVBJIOujqO2KuCDtjKjsiqRcbiAgICBjb25zdCB7IGZpbmRBcGlSb290UGF0aCB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vdXRpbHMvdXRpbHNcIik7XG4gICAgdGhpcy5hcGlSb290UGF0aCA9IGFwaVJvb3RQYXRoID8/IGZpbmRBcGlSb290UGF0aCgpO1xuXG4gICAgLy8g7ISk7KCV7J2EIOuhnOuUqe2VmOuKlCDqsoPrtoDthLAg7Iuc7J6RXG4gICAgY29uc3QgeyBsb2FkQ29uZmlnIH0gPSBhd2FpdCBpbXBvcnQoXCIuL2NvbmZpZ1wiKTtcbiAgICB0aGlzLmNvbmZpZyA9IGF3YWl0IGxvYWRDb25maWcodGhpcy5hcGlSb290UGF0aCk7XG4gICAgLy8gc29uYW11LmNvbmZpZy50cyDquLDrs7jqsJIg7ISk7KCVXG4gICAgaWYgKHRoaXMuY29uZmlnLmRhdGFiYXNlKSB7XG4gICAgICB0aGlzLmNvbmZpZy5kYXRhYmFzZS5kYXRhYmFzZSA9IHRoaXMuY29uZmlnLmRhdGFiYXNlLmRhdGFiYXNlID8/IFwicGdcIjtcbiAgICAgIHRoaXMuY29uZmlnLmRhdGFiYXNlLmRlZmF1bHRPcHRpb25zLmNsaWVudCA9IHRoaXMuY29uZmlnLmRhdGFiYXNlLmRhdGFiYXNlID8/IFwicGdcIjtcbiAgICB9XG5cbiAgICAvLyDroZzquYUg7ISk7KCVXG4gICAgY29uc3QgeyBjb25maWd1cmVMb2dUYXBlIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi9sb2dnZXIvY29uZmlndXJlXCIpO1xuICAgIGlmICh0aGlzLmNvbmZpZy5sb2dnaW5nICE9PSBmYWxzZSkge1xuICAgICAgYXdhaXQgY29uZmlndXJlTG9nVGFwZSh7XG4gICAgICAgIC4uLnRoaXMuY29uZmlnLmxvZ2dpbmcsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBEQiDroZzrk5xcbiAgICBpZiAodGhpcy5jb25maWcuZGF0YWJhc2UpIHtcbiAgICAgIGNvbnN0IHsgREIgfSA9IGF3YWl0IGltcG9ydChcIi4uL2RhdGFiYXNlL2RiXCIpO1xuICAgICAgdGhpcy5kYkNvbmZpZyA9IERCLmdlbmVyYXRlREJDb25maWcodGhpcy5jb25maWcuZGF0YWJhc2UpO1xuICAgICAgaWYgKCFkb1NpbGVudCkge1xuICAgICAgICBjb25zdCBjaGFsayA9IChhd2FpdCBpbXBvcnQoXCJjaGFsa1wiKSkuZGVmYXVsdDtcbiAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JlZW4oXCJEQiBDb25maWcgTG9hZGVkIVwiKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gRW50aXR5IOuhnOuTnFxuICAgIC8vIO2FjOyKpO2KuOyXkOyEnOuPhCBFbnRpdHkg7KCV67O064qUIO2VhOyalO2VqeuLiOuLpC5cbiAgICAvLyB1cHNlcnTqsIAg7KCc64yA66GcIOyekeuPme2VmOugpOuptCBlbnRpdHnsnZggdW5pcXVlIGluZGV4IOygleuztOqwgCDtlYTsmpTtlZjquLAg65WM66y47J6F64uI64ukLlxuICAgIGNvbnN0IHsgRW50aXR5TWFuYWdlciB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vZW50aXR5L2VudGl0eS1tYW5hZ2VyXCIpO1xuICAgIGF3YWl0IEVudGl0eU1hbmFnZXIuYXV0b2xvYWQoZG9TaWxlbnQpO1xuXG4gICAgLy8gQ2FjaGUg7LSI6riw7ZmUXG4gICAgYXdhaXQgdGhpcy5pbml0aWFsaXplQ2FjaGUodGhpcy5jb25maWcuc2VydmVyLmNhY2hlLCBmb3JUZXN0aW5nKTtcblxuICAgIC8vIO2FjOyKpO2MheyduCDqsr3smrAg7Iux7YGsIOyXhuydtCDspJHri6hcbiAgICBpZiAoZm9yVGVzdGluZykge1xuICAgICAgdGhpcy5pc0luaXRpYWxpemVkID0gdHJ1ZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBUYXNrIOuTseuhnVxuICAgIGF3YWl0IHRoaXMuaW5pdGlhbGl6ZVdvcmtmbG93cyh0aGlzLmNvbmZpZy50YXNrcyk7XG5cbiAgICAvLyBTeW5jZXJcbiAgICBjb25zdCB7IFN5bmNlciB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vc3luY2VyL3N5bmNlclwiKTtcbiAgICB0aGlzLnN5bmNlciA9IG5ldyBTeW5jZXIoKTtcblxuICAgIC8vIEF1dG9sb2FkOiBNb2RlbHMgLyBUeXBlcyAvIEFQSXMgLyBXb3JrZmxvd3MgLyBUZW1wbGF0ZXMgLyBTU1IgUm91dGVzXG4gICAgYXdhaXQgdGhpcy5zeW5jZXIuYXV0b2xvYWRUeXBlcygpO1xuICAgIGF3YWl0IHRoaXMuc3luY2VyLmF1dG9sb2FkTW9kZWxzKCk7XG4gICAgYXdhaXQgdGhpcy5zeW5jZXIuYXV0b2xvYWRBcGlzKCk7XG4gICAgYXdhaXQgdGhpcy5zeW5jZXIuYXV0b2xvYWRXb3JrZmxvd3MoKTtcbiAgICBjb25zdCB7IFRlbXBsYXRlTWFuYWdlciB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vdGVtcGxhdGVcIik7XG4gICAgYXdhaXQgVGVtcGxhdGVNYW5hZ2VyLmF1dG9sb2FkKCk7XG4gICAgYXdhaXQgdGhpcy5zeW5jZXIuYXV0b2xvYWRTU1JSb3V0ZXMoKTtcblxuICAgIGNvbnN0IHsgaXNMb2NhbCwgaXNUZXN0IH0gPSBhd2FpdCBpbXBvcnQoXCIuLi91dGlscy9jb250cm9sbGVyXCIpO1xuICAgIGlmIChpc0xvY2FsKCkpIHtcbiAgICAgIC8vIOuhnOy7rOyXkOyEnOuKlCDsvZTrk5wg7IOd7ISx7J2EIOychO2VtCBCaW9tZSDshYvsl4XsnbQg7ZWE7JqU7ZWoICjtmITsnqwgYXBpUm9vdFBhdGgg7KCE64us7ZWY7JesIOyLpO2WiSlcbiAgICAgIChhd2FpdCBpbXBvcnQoXCIuLi91dGlscy9mb3JtYXR0ZXJcIikpLnNldHVwQmlvbWUodGhpcy5hcGlSb290UGF0aCk7XG4gICAgfVxuXG4gICAgY29uc3QgeyBpc0hvdFJlbG9hZFNlcnZlciB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vdXRpbHMvY29udHJvbGxlclwiKTtcbiAgICBpZiAoaXNMb2NhbCgpICYmICFpc1Rlc3QoKSAmJiBpc0hvdFJlbG9hZFNlcnZlcigpICYmIGVuYWJsZVN5bmMpIHtcbiAgICAgIGF3YWl0IHRoaXMuc3luY2VyLnN5bmMoKTtcbiAgICAgIGF3YWl0IHRoaXMuc3RhcnRXYXRjaGVyKCk7XG4gICAgfVxuXG4gICAgdGhpcy5pc0luaXRpYWxpemVkID0gdHJ1ZTtcbiAgICBpZiAoIWRvU2lsZW50KSB7XG4gICAgICBjb25zdCBjaGFsayA9IChhd2FpdCBpbXBvcnQoXCJjaGFsa1wiKSkuZGVmYXVsdDtcbiAgICAgIGNvbnNvbGUudGltZUVuZChjaGFsay5jeWFuKFwiU29uYW11LmluaXRcIikpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGNyZWF0ZVNlcnZlcihpbml0T3B0aW9ucz86IHsgZW5hYmxlU3luYz86IGJvb2xlYW47IGRvU2lsZW50PzogYm9vbGVhbiB9KSB7XG4gICAgaWYgKHRoaXMuaXNJbml0aWFsaXplZCA9PT0gZmFsc2UpIHtcbiAgICAgIGF3YWl0IHRoaXMuaW5pdChpbml0T3B0aW9ucz8uZG9TaWxlbnQsIGluaXRPcHRpb25zPy5lbmFibGVTeW5jKTtcbiAgICB9XG5cbiAgICBjb25zdCBvcHRpb25zID0gdGhpcy5jb25maWcuc2VydmVyO1xuICAgIGNvbnN0IHsgZGVmYXVsdDogZmFzdGlmeSB9ID0gYXdhaXQgaW1wb3J0KFwiZmFzdGlmeVwiKTtcbiAgICBjb25zdCB7IGdldExvZ1RhcGVGYXN0aWZ5TG9nZ2VyIH0gPSBhd2FpdCBpbXBvcnQoXCJAbG9ndGFwZS9mYXN0aWZ5XCIpO1xuICAgIGNvbnN0IHNlcnZlciA9IGZhc3RpZnkoe1xuICAgICAgLi4ub3B0aW9ucy5mYXN0aWZ5LFxuICAgICAgbG9nZ2VyOlxuICAgICAgICB0aGlzLmNvbmZpZy5sb2dnaW5nICE9PSBmYWxzZVxuICAgICAgICAgID8gZ2V0TG9nVGFwZUZhc3RpZnlMb2dnZXIoe1xuICAgICAgICAgICAgICBjYXRlZ29yeTogdGhpcy5jb25maWcubG9nZ2luZz8uZmFzdGlmeUNhdGVnb3J5ID8/IFtcImZhc3RpZnlcIl0sXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgIH0pO1xuICAgIHRoaXMuc2VydmVyID0gc2VydmVyO1xuXG4gICAgLy8gU3RvcmFnZSDshKTsoJUg4oaSIFN0b3JhZ2VNYW5hZ2VyIOyDneyEsVxuICAgIGlmIChvcHRpb25zLnN0b3JhZ2UpIHtcbiAgICAgIGNvbnN0IHsgU3RvcmFnZU1hbmFnZXIgfSA9IGF3YWl0IGltcG9ydChcIi4uL3N0b3JhZ2Uvc3RvcmFnZS1tYW5hZ2VyXCIpO1xuICAgICAgdGhpcy5fc3RvcmFnZSA9IG5ldyBTdG9yYWdlTWFuYWdlcihvcHRpb25zLnN0b3JhZ2UpO1xuICAgIH1cblxuICAgIC8vIO2UjOufrOq3uOyduCDrk7HroZ1cbiAgICBpZiAob3B0aW9ucy5wbHVnaW5zKSB7XG4gICAgICBhd2FpdCB0aGlzLnJlZ2lzdGVyUGx1Z2lucyhzZXJ2ZXIsIG9wdGlvbnMucGx1Z2lucyk7XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMuYXV0aCkge1xuICAgICAgYXdhaXQgdGhpcy5yZWdpc3RlckJldHRlckF1dGgoc2VydmVyLCBvcHRpb25zLmF1dGgpO1xuICAgIH1cblxuICAgIC8vIEFQSSDrnbzsmrDtjIUg7ISk7KCVXG4gICAgYXdhaXQgdGhpcy53aXRoRmFzdGlmeShzZXJ2ZXIsIG9wdGlvbnMuYXBpQ29uZmlnLCB7XG4gICAgICBlbmFibGVTeW5jOiBpbml0T3B0aW9ucz8uZW5hYmxlU3luYyxcbiAgICAgIGRvU2lsZW50OiBpbml0T3B0aW9ucz8uZG9TaWxlbnQsXG4gICAgfSk7XG5cbiAgICAvLyDshJzrsoQg7Iuc7J6RXG4gICAgYXdhaXQgdGhpcy5ib290KHNlcnZlciwgb3B0aW9ucyk7XG5cbiAgICByZXR1cm4gc2VydmVyO1xuICB9XG5cbiAgYXN5bmMgd2l0aEZhc3RpZnkoXG4gICAgc2VydmVyOiBGYXN0aWZ5SW5zdGFuY2U8U2VydmVyLCBJbmNvbWluZ01lc3NhZ2UsIFNlcnZlclJlc3BvbnNlPixcbiAgICBjb25maWc6IFNvbmFtdUZhc3RpZnlDb25maWcsXG4gICAgb3B0aW9ucz86IHtcbiAgICAgIGVuYWJsZVN5bmM/OiBib29sZWFuO1xuICAgICAgZG9TaWxlbnQ/OiBib29sZWFuO1xuICAgIH0sXG4gICkge1xuICAgIGlmICh0aGlzLmlzSW5pdGlhbGl6ZWQgPT09IGZhbHNlKSB7XG4gICAgICBhd2FpdCB0aGlzLmluaXQob3B0aW9ucz8uZG9TaWxlbnQsIG9wdGlvbnM/LmVuYWJsZVN5bmMpO1xuICAgIH1cblxuICAgIHRoaXMuc2VydmVyID0gc2VydmVyO1xuXG4gICAgLy8gdGltZXpvbmUg7ISk7KCVXG4gICAgY29uc3QgdGltZXpvbmUgPSB0aGlzLmNvbmZpZy5hcGkudGltZXpvbmU7XG4gICAgaWYgKHRpbWV6b25lKSB7XG4gICAgICAvLyDtg4DsnoTsobTsl5Ag66ee6rKMIOydkeuLtSDrgqDsp5wg7Iqk7Yq466eB7J2EIOuzgO2ZmO2VtOyjvOyWtOyVvCDtlanri4jri6QuXG4gICAgICAvLyDqsIDroLkgdGltZXpvbmXsnbQgXCJBc2lhL1Nlb3VsXCIg7J2066m0XG4gICAgICAvLyBcIjIwMjUtMTEtMjFUMDA6MDA6MDAuMDAwWlwiIOulvCBcIjIwMjUtMTEtMjFUMDk6MDA6MDArMDk6MDBcIiDsnLzroZwg67OA7ZmY7ZW07KO87Ja07JW8IO2VqeuLiOuLpC5cbiAgICAgIGNvbnN0IHsgZm9ybWF0SW5UaW1lWm9uZSB9ID0gYXdhaXQgaW1wb3J0KFwiZGF0ZS1mbnMtdHpcIik7XG5cbiAgICAgIC8vIElTTyA4NjAxIOuCoOynnCDtmJXsi50g7KCV6rec7IudICjsmIg6IDIwMjQtMDEtMTVUMDk6MzA6MDAuMDAwWilcbiAgICAgIGNvbnN0IElTT19EQVRFX1JFR0VYID0gL15cXGR7NH0tXFxkezJ9LVxcZHsyfVRcXGR7Mn06XFxkezJ9OlxcZHsyfShcXC5cXGR7M30pP1okLztcblxuICAgICAgLy8gVOulvCDrkZjrn6zsi7wg7J6R7J2A65Sw7Ji07ZGc6rCAIOyXhuuLpOuptCBcIjIwMjUtMTEtMTkxNzYzNTQ2MTg5MDAwMTg6NTY6MjkrMDk6MDBcIuyZgCDqsJnsnYAg6rKw6rO86rCAIOuCmOyYteuLiOuLpC5cbiAgICAgIC8vIOydtOuKlCBkYXRlLWZucyDtirnsnoXri4jri6QuXG4gICAgICAvLyDsnbTroIfqsowg7ZW064+EIOq0nOywruyKteuLiOuLpC4gXCIyMDI1LTExLTE5VDE4OjU2OjI5KzA5OjAwXCIg66qo7JaR7Jy866GcIOyemCDrgpjsmLXri4jri6QuXG4gICAgICBjb25zdCBEQVRFX0ZPUk1BVCA9IFwieXl5eS1NTS1kZCdUJ0hIOm1tOnNzWFhYXCI7XG5cbiAgICAgIHNlcnZlci5zZXRSZXBseVNlcmlhbGl6ZXIoKHBheWxvYWQpID0+IHtcbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHBheWxvYWQsIChfa2V5LCB2YWx1ZSkgPT4ge1xuICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgJiYgSVNPX0RBVEVfUkVHRVgudGVzdCh2YWx1ZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmb3JtYXRJblRpbWVab25lKFxuICAgICAgICAgICAgICBuZXcgRGF0ZSh2YWx1ZSksXG4gICAgICAgICAgICAgIHRpbWV6b25lIGFzIGAke3N0cmluZ30vJHtzdHJpbmd9YCxcbiAgICAgICAgICAgICAgREFURV9GT1JNQVQsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgICBpZiAoIW9wdGlvbnM/LmRvU2lsZW50KSB7XG4gICAgICAgIGNvbnN0IGNoYWxrID0gKGF3YWl0IGltcG9ydChcImNoYWxrXCIpKS5kZWZhdWx0O1xuICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmVlbihgVGltZXpvbmUgc2V0IHRvICR7dGltZXpvbmV9YCkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIOyghOyytCDrnbzsmrDtjIUg66as7Iqk7Yq4XG4gICAgc2VydmVyLmdldChcbiAgICAgIGAke3RoaXMuY29uZmlnLmFwaS5yb3V0ZS5wcmVmaXh9L3JvdXRlc2AsXG4gICAgICBhc3luYyAoX3JlcXVlc3QsIF9yZXBseSk6IFByb21pc2U8dHlwZW9mIHRoaXMuc3luY2VyLmFwaXM+ID0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3luY2VyLmFwaXM7XG4gICAgICB9LFxuICAgICk7XG5cbiAgICAvLyBIZWFsdGhjaGVjayBBUElcbiAgICBzZXJ2ZXIuZ2V0KFxuICAgICAgYCR7dGhpcy5jb25maWcuYXBpLnJvdXRlLnByZWZpeH0vaGVhbHRoY2hlY2tgLFxuICAgICAgYXN5bmMgKF9yZXF1ZXN0LCBfcmVwbHkpOiBQcm9taXNlPHN0cmluZz4gPT4ge1xuICAgICAgICByZXR1cm4gXCJva1wiO1xuICAgICAgfSxcbiAgICApO1xuXG4gICAgLy8gU29uYW11IFVJIEFQSSAo66Gc7LusIO2ZmOqyveyXkOyEnOunjClcbiAgICBjb25zdCB7IGlzTG9jYWwgfSA9IGF3YWl0IGltcG9ydChcIi4uL3V0aWxzL2NvbnRyb2xsZXJcIik7XG4gICAgaWYgKGlzTG9jYWwoKSkge1xuICAgICAgY29uc3QgeyBzb25hbXVVSUFwaVBsdWdpbiB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vdWkvYXBpXCIpO1xuICAgICAgc2VydmVyLnJlZ2lzdGVyKHNvbmFtdVVJQXBpUGx1Z2luKTtcbiAgICB9XG5cbiAgICAvLyBEZXZSdW5uZXIg7YWM7Iqk7Yq4IOyXlOuTnO2PrOyduO2KuCAo66Gc7LusIO2ZmOqyvSArIGRldlJ1bm5lciDtmZzshLHtmZQg7IucKVxuICAgIGlmIChpc0xvY2FsKCkgJiYgdGhpcy5jb25maWcudGVzdD8uZGV2UnVubmVyPy5lbmFibGVkKSB7XG4gICAgICBjb25zdCB7IHJlZ2lzdGVyRGV2VGVzdFJvdXRlcyB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vdGVzdGluZy9kZXYtdGVzdC1yb3V0ZXNcIik7XG4gICAgICBhd2FpdCByZWdpc3RlckRldlRlc3RSb3V0ZXMoc2VydmVyLCB0aGlzLmNvbmZpZy50ZXN0LmRldlJ1bm5lcik7XG4gICAgfVxuXG4gICAgY29uc3Qgd2ViUGF0aCA9IHBhdGguam9pbih0aGlzLmFwcFJvb3RQYXRoLCBcIndlYlwiKTtcbiAgICBjb25zdCBoYXNXZWIgPSBhd2FpdCBleGlzdHMod2ViUGF0aCk7XG5cbiAgICAvLyDsoITsl60gY29tcHJlc3Mg7Ji17IWYIOqzhOyCsCAocm91dGUuY29tcHJlc3M6IHRydWXsnbwg65WMIOyCrOyaqSlcbiAgICBjb25zdCBwbHVnaW5Db21wcmVzcyA9IHRoaXMuY29uZmlnLnNlcnZlci5wbHVnaW5zPy5jb21wcmVzcztcbiAgICBjb25zdCBnbG9iYWxDb21wcmVzc09wdGlvbnM6IENvbXByZXNzT3B0aW9ucyB8IHVuZGVmaW5lZCA9IHBsdWdpbkNvbXByZXNzXG4gICAgICA/IHBsdWdpbkNvbXByZXNzID09PSB0cnVlXG4gICAgICAgID8geyB0aHJlc2hvbGQ6IDEwMjQsIGVuY29kaW5nczogW1wiYnJcIiwgXCJnemlwXCIsIFwiZGVmbGF0ZVwiXSB9XG4gICAgICAgIDoge1xuICAgICAgICAgICAgdGhyZXNob2xkOiBwbHVnaW5Db21wcmVzcy50aHJlc2hvbGQsXG4gICAgICAgICAgICBlbmNvZGluZ3M6IHBsdWdpbkNvbXByZXNzLmVuY29kaW5ncyxcbiAgICAgICAgICAgIGN1c3RvbVR5cGVzOiBwbHVnaW5Db21wcmVzcy5jdXN0b21UeXBlcyxcbiAgICAgICAgICB9XG4gICAgICA6IHVuZGVmaW5lZDtcblxuICAgIGlmIChpc0xvY2FsKCkpIHtcbiAgICAgIC8vIOuhnOy7rCDqsJzrsJwg7ZmY6rK9OiBjYXRjaC1hbGzroZwgQVBJ66W8IOuPmeyggSDrp6Tsua3tlZjsl6wgSE1S7J2EIOyngOybkO2VqeuLiOuLpC5cbiAgICAgIC8vIFNPTkFNVV9ESVNBQkxFX0lOVEVHUkFURURfV0VCPXllc+uhnCDshKTsoJXtlZjrqbQgZGV2X2FwaSDrqqjrk5zsl5DshJwgVml0ZSDthrXtlansnYQg67mE7Zmc7ISx7ZmU7ZWgIOyImCDsnojsirXri4jri6QuXG4gICAgICBjb25zdCBkaXNhYmxlSW50ZWdyYXRlZFdlYiA9IHByb2Nlc3MuZW52LlNPTkFNVV9ESVNBQkxFX0lOVEVHUkFURURfV0VCID09PSBcInllc1wiO1xuICAgICAgaWYgKGhhc1dlYiAmJiAhZGlzYWJsZUludGVncmF0ZWRXZWIpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5zZXR1cERldlNlcnZlcldpdGhWaXRlKHNlcnZlciwgd2ViUGF0aCwgY29uZmlnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc2V0dXBEZXZTZXJ2ZXIoc2VydmVyLCBjb25maWcpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyDtlITroZzrjZXshZgg7ZmY6rK9OiDqsJzrs4QgQVBJIOudvOyasO2KuCArIOygleyggSDtjIzsnbwg7ISc67mZXG4gICAgICBmb3IgKGNvbnN0IGFwaSBvZiB0aGlzLnN5bmNlci5hcGlzKSB7XG4gICAgICAgIGlmICh0aGlzLnN5bmNlci5tb2RlbHNbYXBpLm1vZGVsTmFtZV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihg7KCV7J2Y65CY7KeAIOyViuydgCDrqqjrjbjsl5Ag7KCR6re8ICR7YXBpLm1vZGVsTmFtZX1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHNlcnZlci5yb3V0ZSh7XG4gICAgICAgICAgbWV0aG9kOiBhcGkub3B0aW9ucy5odHRwTWV0aG9kID8/IFwiR0VUXCIsXG4gICAgICAgICAgdXJsOiB0aGlzLmNvbmZpZy5hcGkucm91dGUucHJlZml4ICsgYXBpLnBhdGgsXG4gICAgICAgICAgaGFuZGxlcjogdGhpcy5jcmVhdGVBcGlIYW5kbGVyKGFwaSwgY29uZmlnKSxcbiAgICAgICAgICBjb21wcmVzczogdG9GYXN0aWZ5Q29tcHJlc3NPcHRpb24oYXBpLm9wdGlvbnMuY29tcHJlc3MsIGdsb2JhbENvbXByZXNzT3B0aW9ucyksXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICAvLyDtlITroZzrjZXshZjsl5DshJzripQgd2ViIOyGjOyKpChhcHBSb290L3dlYikg7Jyg66y07JmAIOustOq0gO2VmOqyjCxcbiAgICAgIC8vIGFwaS93ZWItZGlzdCDsobTsnqwg7Jes67aA66W8IHNldHVwU3RhdGljV2ViU2VydmVyIOuCtOu2gOyXkOyEnCDtjJDri6jtlanri4jri6QuXG4gICAgICBhd2FpdCB0aGlzLnNldHVwU3RhdGljV2ViU2VydmVyKHNlcnZlciwgY29uZmlnLCBnbG9iYWxDb21wcmVzc09wdGlvbnMpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBkZXYg66qo65OcIOqzte2GtTogY2F0Y2gtYWxs7JeQ7IScIHN5bmNlci5hcGlz66W8IOuPmeyggeycvOuhnCDtg5Dsg4ntlZjsl6wgQVBJIOyalOyyreydhCDsspjrpqztlanri4jri6QuXG4gICAqIHNlcnZlci5yb3V0ZSgp66GcIOqwnOuzhCDrk7HroZ3tlZjrqbQgaGFuZGxlcuqwgCDqs6DsoJXrkJjslrQgSE1S7J20IOuPmeyeke2VmOyngCDslYrsnLzrr4DroZwsXG4gICAqIOunpCDsmpTssq3rp4jri6Qgc3luY2VyLmFwaXPrpbwg7KGw7ZqM7ZWY64qUIOydtCDrsKnsi53snYQg7IKs7Jqp7ZWp64uI64ukLlxuICAgKlxuICAgKiDsmpTssq3snbQgL2FwaSjsoJXtmZXtnojripQgdGhpcy5jb25maWcuYXBpLnJvdXRlLnByZWZpeCnroZwg7Iuc7J6R7ZWY7KeAIOyViuuKlCDqsr3smrDrnbzrqbQgbnVsbOydhCDrsJjtmZjtlZjrqbAg64Gd64OF64uI64ukLlxuICAgKi9cbiAgcHJpdmF0ZSBoYW5kbGVEZXZBcGlSZXF1ZXN0KFxuICAgIHJlcXVlc3Q6IEZhc3RpZnlSZXF1ZXN0LFxuICAgIGNvbmZpZzogU29uYW11RmFzdGlmeUNvbmZpZyxcbiAgKTogKChyZXF1ZXN0OiBGYXN0aWZ5UmVxdWVzdCwgcmVwbHk6IEZhc3RpZnlSZXBseSkgPT4gUHJvbWlzZTx1bmtub3duPikgfCBudWxsIHtcbiAgICBjb25zdCB1cmwgPSB0aGlzLmdldFBhdGhuYW1lRnJvbVVybChyZXF1ZXN0LnVybCk7XG4gICAgY29uc3QgbWV0aG9kID0gcmVxdWVzdC5tZXRob2Q7XG5cbiAgICBpZiAoIXVybC5zdGFydHNXaXRoKHRoaXMuY29uZmlnLmFwaS5yb3V0ZS5wcmVmaXgpKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBzeW5jZXIuYXBpc+ydmCBwYXRo64qUIDpwYXJhbSDtmJXtg5zrpbwg7Y+s7ZWo7ZWgIOyImCDsnojsnLzrr4DroZwg7IS46re466i87Yq4IOuLqOychOuhnCDrp6Tsua3tlanri4jri6QuXG4gICAgLy8g7KCV6rec7IudIOyDneyEsSDrsKnsi53snYAgcGF0aCDrrLjsnpDsl7Qg64K0IO2KueyImOusuOyekCguLCArLCAoLCBbIOuTsSnroZwg7Jik7J6R64+Z7ZWgIOyImCDsnojslrQg7IKs7Jqp7ZWY7KeAIOyViuyKteuLiOuLpC5cbiAgICBjb25zdCBtYXRjaGVkQXBpID0gdGhpcy5zeW5jZXIuYXBpcy5maW5kKChhcGkpID0+IHtcbiAgICAgIGlmICh0aGlzLnN5bmNlci5tb2RlbHNbYXBpLm1vZGVsTmFtZV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBjb25zdCBhcGlNZXRob2QgPSBhcGkub3B0aW9ucy5odHRwTWV0aG9kID8/IFwiR0VUXCI7XG4gICAgICBpZiAoYXBpTWV0aG9kICE9PSBtZXRob2QpIHJldHVybiBmYWxzZTtcblxuICAgICAgY29uc3QgZnVsbFBhdGggPSB0aGlzLmNvbmZpZy5hcGkucm91dGUucHJlZml4ICsgYXBpLnBhdGg7XG4gICAgICByZXR1cm4gdGhpcy5pc1BhdGhQYXR0ZXJuTWF0Y2goZnVsbFBhdGgsIHVybCk7XG4gICAgfSk7XG5cbiAgICBpZiAoIW1hdGNoZWRBcGkpIHtcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEV4Y2VwdGlvbihTRChcImVycm9yLmFwaS5ub3RGb3VuZFwiKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlQXBpSGFuZGxlcihtYXRjaGVkQXBpLCBjb25maWcpO1xuICB9XG5cbiAgLyoqXG4gICAqIGRldiBhcGkg66qo65OcOiBWaXRlIOyXhuydtCBBUEkg64+Z7KCBIOudvOyasO2MheunjCDsoJzqs7Xtlanri4jri6QuXG4gICAqIEhNUuydhCDsnITtlbQgY2F0Y2gtYWxs7JeQ7IScIOunpCDsmpTssq3rp4jri6Qgc3luY2VyLmFwaXPrpbwg7KGw7ZqM7ZWp64uI64ukLlxuICAgKi9cbiAgcHJpdmF0ZSBzZXR1cERldlNlcnZlcihcbiAgICBzZXJ2ZXI6IEZhc3RpZnlJbnN0YW5jZTxTZXJ2ZXIsIEluY29taW5nTWVzc2FnZSwgU2VydmVyUmVzcG9uc2U+LFxuICAgIGNvbmZpZzogU29uYW11RmFzdGlmeUNvbmZpZyxcbiAgKTogdm9pZCB7XG4gICAgc2VydmVyLnJvdXRlKHtcbiAgICAgIG1ldGhvZDogW1wiR0VUXCIsIFwiSEVBRFwiLCBcIlBPU1RcIiwgXCJQVVRcIiwgXCJERUxFVEVcIiwgXCJQQVRDSFwiXSxcbiAgICAgIHVybDogYCR7dGhpcy5jb25maWcuYXBpLnJvdXRlLnByZWZpeH0vKmAsXG4gICAgICBoYW5kbGVyOiBhc3luYyAocmVxdWVzdCwgcmVwbHkpID0+IHtcbiAgICAgICAgY29uc3QgaGFuZGxlciA9IHRoaXMuaGFuZGxlRGV2QXBpUmVxdWVzdChyZXF1ZXN0LCBjb25maWcpO1xuICAgICAgICBpZiAoaGFuZGxlcikge1xuICAgICAgICAgIHJldHVybiBoYW5kbGVyKHJlcXVlc3QsIHJlcGx5KTtcbiAgICAgICAgfVxuICAgICAgICAvLyDrk7HroZ3rkJwgQVBJ7JmAIOydvOy5mO2VmOyngCDslYrripQg7JqU7LKt7JeQIOuMgO2VnCBmYWxsYmFja+yeheuLiOuLpC5cbiAgICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kRXhjZXB0aW9uKFNEKFwiZXJyb3IuYXBpLm5vdEZvdW5kXCIpKTtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vRXhwbGljaXRBbnk6IFZpdGVEZXZTZXJ2ZXIg7YOA7J6F7J2EIOuPmeyggeycvOuhnCDroZzrk5ztlbTslbwg7ZWoXG4gIHByaXZhdGUgdml0ZVNlcnZlcjogYW55ID0gbnVsbDtcblxuICAvKipcbiAgICogZGV2IGFsbCDrqqjrk5w6IFZpdGUgRGV2IFNlcnZlcuulvCDthrXtlantlZjsl6wgQVBJICsgU1NSICsgQ1NS7J2EIOuqqOuRkCDsoJzqs7Xtlanri4jri6QuXG4gICAqIEFQSSDrj5nsoIEg66ek7Lmt7J2AIGhhbmRsZURldkFwaVJlcXVlc3Trpbwg6rO17Jyg7ZWp64uI64ukLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBzZXR1cERldlNlcnZlcldpdGhWaXRlKFxuICAgIHNlcnZlcjogRmFzdGlmeUluc3RhbmNlPFNlcnZlciwgSW5jb21pbmdNZXNzYWdlLCBTZXJ2ZXJSZXNwb25zZT4sXG4gICAgd2ViUGF0aDogc3RyaW5nLFxuICAgIGNvbmZpZzogU29uYW11RmFzdGlmeUNvbmZpZyxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gQGZhc3RpZnkvbWlkZGllIOuTseuhnSAoQ29ubmVjdC1zdHlsZSBtaWRkbGV3YXJlIOyngOybkClcbiAgICBhd2FpdCBzZXJ2ZXIucmVnaXN0ZXIoKGF3YWl0IGltcG9ydChcIkBmYXN0aWZ5L21pZGRpZVwiKSkuZGVmYXVsdCk7XG5cbiAgICBjb25zdCB2aXRlID0gYXdhaXQgaW1wb3J0KFwidml0ZVwiKTtcblxuICAgIHRoaXMudml0ZVNlcnZlciA9IGF3YWl0IHZpdGUuY3JlYXRlU2VydmVyKHtcbiAgICAgIHJvb3Q6IHdlYlBhdGgsXG4gICAgICBzZXJ2ZXI6IHtcbiAgICAgICAgbWlkZGxld2FyZU1vZGU6IHRydWUsXG4gICAgICAgIGhtcjoge1xuICAgICAgICAgIHNlcnZlcjogc2VydmVyLnNlcnZlcixcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBhcHBUeXBlOiBcImN1c3RvbVwiLFxuICAgIH0pO1xuXG4gICAgLy8gVml0ZSBtaWRkbGV3YXJlIOuTseuhnSAoVml0ZSDsl5DshYsg7LKY66asKVxuICAgIHNlcnZlci51c2UoKHJlcSwgcmVzLCBuZXh0KSA9PiB7XG4gICAgICAvLyBBUEnsmYAgU29uYW11IFVJ64qUIEZhc3RpZnkg65287Jqw7Yq46rCAIOyymOumrO2VmOuPhOuhnSBza2lwXG4gICAgICBpZiAocmVxLnVybD8uc3RhcnRzV2l0aCh0aGlzLmNvbmZpZy5hcGkucm91dGUucHJlZml4KSB8fCByZXEudXJsPy5zdGFydHNXaXRoKFwiL3NvbmFtdS11aVwiKSkge1xuICAgICAgICByZXR1cm4gbmV4dCgpO1xuICAgICAgfVxuICAgICAgLy8g64KY66i47KeA64qUIFZpdGUgbWlkZGxld2FyZeuhnCDsoITri6xcbiAgICAgIHJldHVybiB0aGlzLnZpdGVTZXJ2ZXIubWlkZGxld2FyZXMocmVxLCByZXMsIG5leHQpO1xuICAgIH0pO1xuXG4gICAgLy8gY2F0Y2gtYWxsIOudvOyasO2KuOyXkOyEnCDrj5nsoIHsnLzroZwgQVBJL1NTUiDsspjrpqxcbiAgICAvLyDqsJzrsJwg7ZmY6rK97JeQ7ISc64qUIOudvOyasO2KuOuzhCBjb21wcmVzcyDsmLXshZjsnYQg7Y+s6riw7ZWY6rOgIEhNUiDsnbTsoJDsnYQg7Leo7ZWp64uI64ukLlxuICAgIHNlcnZlci5yb3V0ZSh7XG4gICAgICBtZXRob2Q6IFtcIkdFVFwiLCBcIkhFQURcIiwgXCJQT1NUXCIsIFwiUFVUXCIsIFwiREVMRVRFXCIsIFwiUEFUQ0hcIl0sXG4gICAgICB1cmw6IFwiLypcIixcbiAgICAgIGhhbmRsZXI6IGFzeW5jIChyZXF1ZXN0LCByZXBseSkgPT4ge1xuICAgICAgICAvLyAxLiBBUEkg7JqU7LKtIOyymOumrFxuICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLmhhbmRsZURldkFwaVJlcXVlc3QocmVxdWVzdCwgY29uZmlnKTtcbiAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgIHJldHVybiByZXN1bHQocmVxdWVzdCwgcmVwbHkpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdXJsID0gcmVxdWVzdC51cmw7XG5cbiAgICAgICAgLy8gMi4gU1NSIOudvOyasO2KuCDsspjrpqxcbiAgICAgICAgY29uc3QgeyBtYXRjaFNTUlJvdXRlLCByZW5kZXJTU1IgfSA9IGF3YWl0IGltcG9ydChcIi4uL3NzclwiKTtcbiAgICAgICAgY29uc3Qgc3NyTWF0Y2ggPSBtYXRjaFNTUlJvdXRlKHVybCk7XG4gICAgICAgIGlmIChzc3JNYXRjaCkge1xuICAgICAgICAgIGNvbnNvbGUubG9nKGBbU1NSXSBNYXRjaGVkIHJvdXRlOiAke3Nzck1hdGNoLnJvdXRlLnBhdGh9YCk7XG4gICAgICAgICAgY29uc3QgaHRtbCA9IGF3YWl0IHJlbmRlclNTUihcbiAgICAgICAgICAgIHVybCxcbiAgICAgICAgICAgIHNzck1hdGNoLnJvdXRlLFxuICAgICAgICAgICAgc3NyTWF0Y2gucGFyYW1zLFxuICAgICAgICAgICAgcmVxdWVzdCxcbiAgICAgICAgICAgIHJlcGx5LFxuICAgICAgICAgICAgY29uZmlnLFxuICAgICAgICAgICAgdGhpcy52aXRlU2VydmVyLFxuICAgICAgICAgICk7XG4gICAgICAgICAgcmVwbHkudHlwZShcInRleHQvaHRtbFwiKTtcbiAgICAgICAgICByZXR1cm4gaHRtbDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIDMuIENTUiBmYWxsYmFja1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IGZzID0gYXdhaXQgaW1wb3J0KFwibm9kZTpmcy9wcm9taXNlc1wiKTtcbiAgICAgICAgICBsZXQgdGVtcGxhdGUgPSBhd2FpdCBmcy5yZWFkRmlsZShcbiAgICAgICAgICAgIHBhdGguam9pbih0aGlzLnZpdGVTZXJ2ZXIuY29uZmlnLnJvb3QsIFwiaW5kZXguaHRtbFwiKSxcbiAgICAgICAgICAgIFwidXRmLThcIixcbiAgICAgICAgICApO1xuICAgICAgICAgIHRlbXBsYXRlID0gYXdhaXQgdGhpcy52aXRlU2VydmVyLnRyYW5zZm9ybUluZGV4SHRtbCh1cmwsIHRlbXBsYXRlKTtcblxuICAgICAgICAgIHJlcGx5LnR5cGUoXCJ0ZXh0L2h0bWxcIik7XG4gICAgICAgICAgcmV0dXJuIHRlbXBsYXRlO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgdGhpcy52aXRlU2VydmVyLnNzckZpeFN0YWNrdHJhY2UoZSBhcyBFcnJvcik7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICAgICAgICByZXBseS5zdGF0dXMoNTAwKTtcbiAgICAgICAgICByZXR1cm4gKGUgYXMgRXJyb3IpLm1lc3NhZ2U7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICAvLyDshJzrsoQg7KKF66OMIOyLnCBWaXRl64+EIOyiheujjFxuICAgIHNlcnZlci5hZGRIb29rKFwib25DbG9zZVwiLCBhc3luYyAoKSA9PiB7XG4gICAgICBhd2FpdCB0aGlzLnZpdGVTZXJ2ZXIuY2xvc2UoKTtcbiAgICB9KTtcblxuICAgIGNvbnNvbGUubG9nKFwi4pyTIFZpdGUgZGV2IHNlcnZlciBpbnRlZ3JhdGVkXCIpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBzZXR1cFN0YXRpY1dlYlNlcnZlcihcbiAgICBzZXJ2ZXI6IEZhc3RpZnlJbnN0YW5jZTxTZXJ2ZXIsIEluY29taW5nTWVzc2FnZSwgU2VydmVyUmVzcG9uc2U+LFxuICAgIGNvbmZpZzogU29uYW11RmFzdGlmeUNvbmZpZyxcbiAgICBnbG9iYWxDb21wcmVzc09wdGlvbnM6IENvbXByZXNzT3B0aW9ucyB8IHVuZGVmaW5lZCxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8g6rK966GcIOuqhe2Zle2ZlDogYXBpL3dlYi1kaXN0L2NsaWVudCAo7KCV7KCBIO2MjOydvCksIGFwaS93ZWItZGlzdC9zZXJ2ZXIgKFNTUiBlbnRyeSksIGFwaS9kaXN0L3NzciAoU1NSIHJvdXRlcyAtIEFQSSDshozsnKApXG4gICAgY29uc3Qgd2ViRGlzdFBhdGggPSBwYXRoLmpvaW4odGhpcy5hcGlSb290UGF0aCwgXCJ3ZWItZGlzdFwiLCBcImNsaWVudFwiKTtcbiAgICBjb25zdCBzc3JQYXRoID0gcGF0aC5qb2luKHRoaXMuYXBpUm9vdFBhdGgsIFwid2ViLWRpc3RcIiwgXCJzZXJ2ZXJcIik7XG4gICAgY29uc3Qgc3NyRW50cnlQYXRoID0gcGF0aC5qb2luKHNzclBhdGgsIFwiZW50cnktc2VydmVyLmdlbmVyYXRlZC5qc1wiKTtcbiAgICBjb25zdCBzc3JSb3V0ZXNQYXRoID0gcGF0aC5qb2luKHRoaXMuYXBpUm9vdFBhdGgsIFwiZGlzdFwiLCBcInNzclwiLCBcInJvdXRlcy5qc1wiKTtcblxuICAgIGlmICghKGF3YWl0IGV4aXN0cyh3ZWJEaXN0UGF0aCkpKSB7XG4gICAgICBjb25zb2xlLndhcm4oYOKaoCBXZWIgZGlzdCBub3QgZm91bmQ6ICR7d2ViRGlzdFBhdGh9YCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gU1NSIGVudHJ5IOyhtOyerCDsl6zrtoAg7ZmV7J24XG4gICAgY29uc3Qgc3NyQXZhaWxhYmxlID0gYXdhaXQgZXhpc3RzKHNzckVudHJ5UGF0aCk7XG5cbiAgICBpZiAoIXNzckF2YWlsYWJsZSkge1xuICAgICAgY29uc29sZS53YXJuKGDimqAgU1NSIGVudHJ5IG5vdCBmb3VuZDogJHtzc3JFbnRyeVBhdGh9YCk7XG4gICAgICBjb25zb2xlLndhcm4oXCIgIFNTUiB3aWxsIGJlIGRpc2FibGVkLiBPbmx5IENTUiB3aWxsIHdvcmsuXCIpO1xuICAgIH1cblxuICAgIC8vIFNTUiDrnbzsmrDtirgg66Gc65OcIChwcm9kdWN0aW9u7JeQ7ISc66eMLCDsgqzsmqnsnpAg7ZSE66Gc7KCd7Yq47J2YIHNzci9yb3V0ZXMudHMpXG4gICAgaWYgKHNzckF2YWlsYWJsZSkge1xuICAgICAgaWYgKGF3YWl0IGV4aXN0cyhzc3JSb3V0ZXNQYXRoKSkge1xuICAgICAgICAvLyB0cy1sb2FkZXLrnbzrqbQgXCJmaWxlOi8vXCLroZwg7Iuc7J6R7ZWY64qUIGZ1bGx5LXJlc29sdmVkIHBhdGjrp4wg67Cb6riw7JeQIOydtOulvCDsspjrpqztlbTso7zripQgaW1wb3J0TWVtYmVyc+ulvCDsgqzsmqntlbTslbwg7ZaI6rKg7KeA66eMLFxuICAgICAgICAvLyDsl6zquLDripQg7ZSE66Gc642V7IWYIO2ZmOqyveyXkOyEnCBsb2FkZXIg7JeG7J20IOuPjOyVhOqwgOq4sCDrlYzrrLjsl5AgXCLsp4Tsp5wganMg7YyM7J28XCLsnZggXCLqt7jrg6VcIiDsoIjrjIDqsr3roZzrpbwg67CU66GcIGltcG9ydO2VtOuPhCDrkKnri4jri6QuXG4gICAgICAgIC8vIOydtCDrgrTsmqnsnYAg7J20IO2VqOyImCDrgrTsl5DshJwg7JWE656Y7JeQIOuCmOyYrCDri6TrpbggaW1wb3J0IO2YuOy2nOyXkOuPhCDrj5nsnbztlZjqsowg7KCB7Jqp65Cp64uI64ukLlxuICAgICAgICBhd2FpdCBpbXBvcnQoc3NyUm91dGVzUGF0aCk7XG4gICAgICAgIGNvbnNvbGUubG9nKFwi4pyTIFNTUiByb3V0ZXMgbG9hZGVkXCIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS53YXJuKGDimqAgU1NSIHJvdXRlcyBub3QgZm91bmQ6ICR7c3NyUm91dGVzUGF0aH1gKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyDroaTrp4Eg7JeF642w7J207Yq4IOuMgOydkTogYXNzZXQgaGFzaCDrtojsnbzsuZgg7IucIO2YhOyerCDrsoTsoIQg7KeB7KCRIOyEnOu5mVxuICAgIHNlcnZlci5nZXQoXCIvYXNzZXRzLzpmaWxlbmFtZVwiLCBhc3luYyAocmVxdWVzdCwgcmVwbHkpID0+IHtcbiAgICAgIGNvbnN0IHJlcXVlc3RlZEZpbGUgPSAocmVxdWVzdC5wYXJhbXMgYXMgeyBmaWxlbmFtZTogc3RyaW5nIH0pLmZpbGVuYW1lO1xuICAgICAgY29uc3QgYXNzZXRzRGlyID0gcGF0aC5qb2luKHdlYkRpc3RQYXRoLCBcImFzc2V0c1wiKTtcbiAgICAgIGNvbnN0IHNhZmVGaWxlUGF0aCA9IHRoaXMucmVzb2x2ZVBhdGhXaXRoaW5CYXNlRGlyKGFzc2V0c0RpciwgcmVxdWVzdGVkRmlsZSk7XG4gICAgICBpZiAoc2FmZUZpbGVQYXRoID09PSBudWxsKSB7XG4gICAgICAgIHJlcGx5LnN0YXR1cyg0MDMpLnNlbmQoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3Qgbm9ybWFsaXplZFJlcXVlc3RlZEZpbGUgPSBwYXRoLnJlbGF0aXZlKGFzc2V0c0Rpciwgc2FmZUZpbGVQYXRoKS5yZXBsYWNlKC9cXFxcL2csIFwiL1wiKTtcblxuICAgICAgY29uc3QgYXNzZXRQYXRoID0gYC9hc3NldHMvJHtub3JtYWxpemVkUmVxdWVzdGVkRmlsZX1gO1xuXG4gICAgICAvLyBDYWNoZS1Db250cm9sIO2XpOuNlCDqsrDsoJVcbiAgICAgIGNvbnN0IGdldENhY2hlQ29udHJvbEZvckFzc2V0ID0gKCk6IENhY2hlQ29udHJvbENvbmZpZyA9PiB7XG4gICAgICAgIGNvbnN0IGNhY2hlUmVxOiBDYWNoZUNvbnRyb2xSZXF1ZXN0ID0ge1xuICAgICAgICAgIHR5cGU6IFwiYXNzZXRzXCIsXG4gICAgICAgICAgdXJsOiByZXF1ZXN0LnVybCxcbiAgICAgICAgICBwYXRoOiBhc3NldFBhdGgsXG4gICAgICAgICAgbWV0aG9kOiByZXF1ZXN0Lm1ldGhvZCxcbiAgICAgICAgfTtcblxuICAgICAgICAvLyDsgqzsmqnsnpAg7KCV7J2YIO2VuOuTpOufrCDsmrDshKBcbiAgICAgICAgaWYgKGNvbmZpZy5jYWNoZUNvbnRyb2xIYW5kbGVyKSB7XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gY29uZmlnLmNhY2hlQ29udHJvbEhhbmRsZXIoY2FjaGVSZXEpO1xuICAgICAgICAgIGlmIChyZXN1bHQpIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cblxuICAgICAgICAvLyDquLDrs7jqsJI6IGltbXV0YWJsZVxuICAgICAgICByZXR1cm4gQ2FjaGVQcmVzZXRzLmltbXV0YWJsZTtcbiAgICAgIH07XG5cbiAgICAgIC8vIGluZGV4LSouanMg65iQ64qUIGluZGV4LSouY3NzIOyalOyyreyduCDqsr3smrBcbiAgICAgIGlmICgvXmluZGV4LVthLWYwLTldK1xcLihqc3xjc3MpJC8udGVzdChub3JtYWxpemVkUmVxdWVzdGVkRmlsZSkpIHtcbiAgICAgICAgY29uc3QgZXh0ID0gbm9ybWFsaXplZFJlcXVlc3RlZEZpbGUuc3BsaXQoXCIuXCIpLnBvcCgpO1xuICAgICAgICBjb25zdCBmaWxlcyA9IGF3YWl0IGZzLnJlYWRkaXIoYXNzZXRzRGlyKTtcbiAgICAgICAgY29uc3QgY3VycmVudEZpbGUgPSBmaWxlcy5maW5kKChmKSA9PiBmLnN0YXJ0c1dpdGgoXCJpbmRleC1cIikgJiYgZi5lbmRzV2l0aChgLiR7ZXh0fWApKTtcblxuICAgICAgICBpZiAoY3VycmVudEZpbGUpIHtcbiAgICAgICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbihhc3NldHNEaXIsIGN1cnJlbnRGaWxlKTtcbiAgICAgICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgZnMucmVhZEZpbGUoZmlsZVBhdGgpO1xuICAgICAgICAgIHJlcGx5LnR5cGUoZXh0ID09PSBcImpzXCIgPyBcImFwcGxpY2F0aW9uL2phdmFzY3JpcHRcIiA6IFwidGV4dC9jc3NcIik7XG4gICAgICAgICAgYXBwbHlDYWNoZUhlYWRlcnMocmVwbHksIGdldENhY2hlQ29udHJvbEZvckFzc2V0KCkpO1xuICAgICAgICAgIHJldHVybiByZXBseS5zZW5kKGNvbnRlbnQpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIOydvOuwmCDtjIzsnbwg7ISc67mZXG4gICAgICBjb25zdCBmaWxlUGF0aCA9IHNhZmVGaWxlUGF0aDtcbiAgICAgIGlmIChhd2FpdCBleGlzdHMoZmlsZVBhdGgpKSB7XG4gICAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmcy5yZWFkRmlsZShmaWxlUGF0aCk7XG4gICAgICAgIGNvbnN0IGV4dCA9IG5vcm1hbGl6ZWRSZXF1ZXN0ZWRGaWxlLnNwbGl0KFwiLlwiKS5wb3AoKTtcbiAgICAgICAgcmVwbHkudHlwZShleHQgPT09IFwianNcIiA/IFwiYXBwbGljYXRpb24vamF2YXNjcmlwdFwiIDogZXh0ID09PSBcImNzc1wiID8gXCJ0ZXh0L2Nzc1wiIDogXCJcIik7XG4gICAgICAgIGlmIChub3JtYWxpemVkUmVxdWVzdGVkRmlsZS5pbmNsdWRlcyhcIi1cIikpIHtcbiAgICAgICAgICBhcHBseUNhY2hlSGVhZGVycyhyZXBseSwgZ2V0Q2FjaGVDb250cm9sRm9yQXNzZXQoKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlcGx5LnNlbmQoY29udGVudCk7XG4gICAgICB9XG5cbiAgICAgIHJlcGx5LnN0YXR1cyg0MDQpLnNlbmQoKTtcbiAgICB9KTtcblxuICAgIC8vIFNTUiDrnbzsmrDtirgg6rCc67OEIOuTseuhnSAoY29tcHJlc3Mg7Ji17IWY7J20IOudvOyasO2KuOuzhOuhnCDsoIHsmqnrkJjrj4TroZ0pXG4gICAgaWYgKHNzckF2YWlsYWJsZSkge1xuICAgICAgY29uc3QgeyBnZXRTU1JSb3V0ZXMgfSA9IGF3YWl0IGltcG9ydChcIi4uL3NzclwiKTtcbiAgICAgIGNvbnN0IHsgcmVuZGVyU1NSIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi9zc3IvcmVuZGVyZXJcIik7XG4gICAgICBjb25zdCBzc3JSb3V0ZXMgPSBnZXRTU1JSb3V0ZXMoKTtcblxuICAgICAgZm9yIChjb25zdCByb3V0ZSBvZiBzc3JSb3V0ZXMpIHtcbiAgICAgICAgc2VydmVyLnJvdXRlKHtcbiAgICAgICAgICBtZXRob2Q6IFtcIkdFVFwiLCBcIkhFQURcIl0sXG4gICAgICAgICAgdXJsOiByb3V0ZS5wYXRoLFxuICAgICAgICAgIGNvbXByZXNzOiB0b0Zhc3RpZnlDb21wcmVzc09wdGlvbihyb3V0ZS5jb21wcmVzcyA/PyB0cnVlLCBnbG9iYWxDb21wcmVzc09wdGlvbnMpLFxuICAgICAgICAgIGhhbmRsZXI6IGFzeW5jIChyZXF1ZXN0LCByZXBseSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdXJsID0gcmVxdWVzdC51cmw7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgW1NTUl0gTWF0Y2hlZCByb3V0ZTogJHtyb3V0ZS5wYXRofWApO1xuXG4gICAgICAgICAgICBjb25zdCBwYXJhbXMgPSB0aGlzLmV4dHJhY3RQYXRoUGFyYW1zKHJvdXRlLnBhdGgsIHVybCk7XG4gICAgICAgICAgICBjb25zdCBodG1sID0gYXdhaXQgcmVuZGVyU1NSKHVybCwgcm91dGUsIHBhcmFtcywgcmVxdWVzdCwgcmVwbHksIGNvbmZpZyk7XG5cbiAgICAgICAgICAgIHJlcGx5LnR5cGUoXCJ0ZXh0L2h0bWxcIik7XG4gICAgICAgICAgICByZXR1cm4gaHRtbDtcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDU1Igb3IgU3RhdGljIEZpbGUgRmFsbGJhY2sgKFNTUiDrnbzsmrDtirjsl5Ag66ek7Lmt65CY7KeAIOyViuuKlCDrqqjrk6Ag7JqU7LKtKVxuICAgIHNlcnZlci5yb3V0ZSh7XG4gICAgICBtZXRob2Q6IFtcIkdFVFwiLCBcIkhFQURcIl0sXG4gICAgICB1cmw6IFwiKlwiLFxuICAgICAgaGFuZGxlcjogYXN5bmMgKHJlcXVlc3QsIHJlcGx5KSA9PiB7XG4gICAgICAgIC8vIC9hcGksIC9zb25hbXUtdWnripQgNDA0IOq3uOuMgOuhnFxuICAgICAgICBpZiAocmVxdWVzdC51cmwuc3RhcnRzV2l0aChcIi9hcGlcIikgfHwgcmVxdWVzdC51cmwuc3RhcnRzV2l0aChcIi9zb25hbXUtdWlcIikpIHtcbiAgICAgICAgICByZXBseS5zdGF0dXMoNDA0KS5zZW5kKCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ1NS7JqpIENhY2hlLUNvbnRyb2wg7Zek642UIOyEpOyglVxuICAgICAgICBpZiAoY29uZmlnLmNhY2hlQ29udHJvbEhhbmRsZXIpIHtcbiAgICAgICAgICBjb25zdCBjc3JDYWNoZVJlcTogQ2FjaGVDb250cm9sUmVxdWVzdCA9IHtcbiAgICAgICAgICAgIHR5cGU6IFwiY3NyXCIsXG4gICAgICAgICAgICB1cmw6IHJlcXVlc3QudXJsLFxuICAgICAgICAgICAgcGF0aDogcmVxdWVzdC51cmwuc3BsaXQoXCI/XCIpWzBdLFxuICAgICAgICAgICAgbWV0aG9kOiByZXF1ZXN0Lm1ldGhvZCxcbiAgICAgICAgICB9O1xuICAgICAgICAgIGNvbnN0IGNzckNhY2hlQ29uZmlnID0gY29uZmlnLmNhY2hlQ29udHJvbEhhbmRsZXIoY3NyQ2FjaGVSZXEpO1xuXG4gICAgICAgICAgaWYgKGNzckNhY2hlQ29uZmlnKSB7XG4gICAgICAgICAgICBhcHBseUNhY2hlSGVhZGVycyhyZXBseSwgY3NyQ2FjaGVDb25maWcpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIOygleyggSDtjIzsnbzsnbQg7KG07J6s7ZWgIOqyveyasCwg7KCV7KCBIO2MjOydvOydhCDrqLzsoIAg7ISc67mZ7ZW07JW87ZWoXG4gICAgICAgIGNvbnN0IHJlcXVlc3RQYXRoID0gdGhpcy5nZXRQYXRobmFtZUZyb21VcmwocmVxdWVzdC51cmwpO1xuICAgICAgICBjb25zdCBzYWZlRmlsZVBhdGggPSB0aGlzLnJlc29sdmVQYXRoV2l0aGluQmFzZURpcih3ZWJEaXN0UGF0aCwgcmVxdWVzdFBhdGgpO1xuICAgICAgICBpZiAoc2FmZUZpbGVQYXRoID09PSBudWxsKSB7XG4gICAgICAgICAgcmVwbHkuc3RhdHVzKDQwMykuc2VuZCgpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYXdhaXQgZmlsZUV4aXN0cyhzYWZlRmlsZVBhdGgpKSB7XG4gICAgICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzLnJlYWRGaWxlKHNhZmVGaWxlUGF0aCk7XG4gICAgICAgICAgcmV0dXJuIHJlcGx5LnR5cGUobWltZUxvb2t1cChzYWZlRmlsZVBhdGgpIHx8IFwiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtXCIpLnNlbmQoY29udGVudCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDU1IgZmFsbGJhY2s6IGluZGV4Lmh0bWwg7ISc67mZXG4gICAgICAgIGNvbnN0IGluZGV4UGF0aCA9IHBhdGguam9pbih3ZWJEaXN0UGF0aCwgXCJpbmRleC5odG1sXCIpO1xuICAgICAgICByZXR1cm4gcmVwbHkudHlwZShcInRleHQvaHRtbFwiKS5zZW5kKGF3YWl0IGZzLnJlYWRGaWxlKGluZGV4UGF0aCwgXCJ1dGYtOFwiKSk7XG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgY29uc29sZS5sb2coYOKckyBTdGF0aWMgd2ViIHNlcnZlciBjb25maWd1cmVkIHdpdGggJHtzc3JBdmFpbGFibGUgPyBcIlNTUlwiIDogXCJDU1Igb25seVwifSBzdXBwb3J0YCk7XG4gIH1cblxuICBjcmVhdGVBcGlIYW5kbGVyKFxuICAgIGFwaTogRXh0ZW5kZWRBcGksXG4gICAgY29uZmlnOiBTb25hbXVGYXN0aWZ5Q29uZmlnLFxuICApOiAocmVxdWVzdDogRmFzdGlmeVJlcXVlc3QsIHJlcGx5OiBGYXN0aWZ5UmVwbHkpID0+IFByb21pc2U8dW5rbm93bj4ge1xuICAgIHJldHVybiBhc3luYyAocmVxdWVzdDogRmFzdGlmeVJlcXVlc3QsIHJlcGx5OiBGYXN0aWZ5UmVwbHkpOiBQcm9taXNlPHVua25vd24+ID0+IHtcbiAgICAgIC8vIENvbnRleHQg7IOd7ISxXG4gICAgICBjb25zdCBjb250ZXh0OiBDb250ZXh0ID0gYXdhaXQgdGhpcy5jcmVhdGVDb250ZXh0KGNvbmZpZywgcmVxdWVzdCwgcmVwbHkpO1xuXG4gICAgICByZXR1cm4gdGhpcy5hc3luY0xvY2FsU3RvcmFnZS5ydW4oeyBjb250ZXh0IH0sIGFzeW5jICgpID0+IHtcbiAgICAgICAgLy8gZ3VhcmRzIOyymOumrFxuICAgICAgICAoYXBpLm9wdGlvbnMuZ3VhcmRzID8/IFtdKS5ldmVyeSgoZ3VhcmQpID0+IGNvbmZpZy5ndWFyZEhhbmRsZXIoZ3VhcmQsIHJlcXVlc3QsIGFwaSkpO1xuXG4gICAgICAgIC8vIO2MjOudvOuvuO2EsCDsoJXrs7TroZwgem9kIOyKpO2CpOuniCDruYzrk5xcbiAgICAgICAgY29uc3QgeyBnZXRab2RPYmplY3RGcm9tQXBpIH0gPSBhd2FpdCBpbXBvcnQoXCIuL2NvZGUtY29udmVydGVyc1wiKTtcbiAgICAgICAgY29uc3QgUmVxVHlwZSA9IGdldFpvZE9iamVjdEZyb21BcGkoYXBpLCB0aGlzLnN5bmNlci50eXBlcyk7XG5cbiAgICAgICAgLy8gcmVxdWVzdCDtjIzsi7FcbiAgICAgICAgY29uc3Qgd2hpY2ggPSBhcGkub3B0aW9ucy5odHRwTWV0aG9kID09PSBcIkdFVFwiID8gXCJxdWVyeVwiIDogXCJib2R5XCI7XG4gICAgICAgIGxldCByZXFCb2R5OiB7XG4gICAgICAgICAgW2tleTogc3RyaW5nXTogdW5rbm93bjtcbiAgICAgICAgfTtcbiAgICAgICAgLy8g7YyM7J28IOyXheuhnOuTnCDsnojripQg6rK97JqwIOyehOyLnCDrjbDsnbTthLBcbiAgICAgICAgY29uc3QgZmlsZXM6IHtcbiAgICAgICAgICBidWZmZXJlZEZpbGVzOiBCdWZmZXJlZEZpbGVbXTtcbiAgICAgICAgICB1cGxvYWRlZEZpbGVzOiBVcGxvYWRlZEZpbGVbXTtcbiAgICAgICAgfSA9IHtcbiAgICAgICAgICBidWZmZXJlZEZpbGVzOiBbXSxcbiAgICAgICAgICB1cGxvYWRlZEZpbGVzOiBbXSxcbiAgICAgICAgfTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IGJvZHkgPSAocmVxdWVzdFt3aGljaF0gPz8ge30pIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgICAgICAgIGlmIChhcGkudXBsb2FkT3B0aW9ucykge1xuICAgICAgICAgICAgY29uc3QgcGFydHMgPSByZXF1ZXN0LnBhcnRzKHtcbiAgICAgICAgICAgICAgbGltaXRzOiBhcGkudXBsb2FkT3B0aW9ucy5saW1pdHMsXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgLy8gRm9ybURhdGHsnZggZmllbGTrk6TsnYQg7J6E7Iuc66GcIOyggOyepVxuICAgICAgICAgICAgY29uc3QgZmllbGRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG5cbiAgICAgICAgICAgIGlmIChhcGkudXBsb2FkT3B0aW9ucy5jb25zdW1lID09PSBcImJ1ZmZlclwiIHx8ICFhcGkudXBsb2FkT3B0aW9ucy5jb25zdW1lKSB7XG4gICAgICAgICAgICAgIC8vIEJ1ZmZlciDrqqjrk5w6IOuplOuqqOumrOyXkCDroZzrk5xcbiAgICAgICAgICAgICAgZm9yIGF3YWl0IChjb25zdCBwYXJ0IG9mIHBhcnRzKSB7XG4gICAgICAgICAgICAgICAgaWYgKHBhcnQudHlwZSA9PT0gXCJmaWxlXCIpIHtcbiAgICAgICAgICAgICAgICAgIC8vIENSSVRJQ0FMOiDtjIzsnbwg7Iqk7Yq466a87J2EIOymieyLnCBjb25zdW1l7ZW07JW8IOuLpOydjCBwYXJ066GcIOuEmOyWtOqwiCDsiJgg7J6I7J2MXG4gICAgICAgICAgICAgICAgICAvLyDsnbQg7Zi47Lac7J20IOyXhuycvOuptCDsooXsooUgbXVsdGlwYXJ0IO2MjOyLseydtCBwZW5kaW5nIOyDge2DnOuhnCDtg4DsnoTslYTsm4Mg67Cc7IOdXG4gICAgICAgICAgICAgICAgICBjb25zdCBidWZmZXIgPSBhd2FpdCBwYXJ0LnRvQnVmZmVyKCk7XG4gICAgICAgICAgICAgICAgICBmaWxlcy5idWZmZXJlZEZpbGVzLnB1c2gobmV3IEJ1ZmZlcmVkRmlsZShwYXJ0LCBidWZmZXIpKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBhcnQudHlwZSA9PT0gXCJmaWVsZFwiKSB7XG4gICAgICAgICAgICAgICAgICBmaWVsZHNbcGFydC5maWVsZG5hbWVdID0gU3RyaW5nKHBhcnQudmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChhcGkudXBsb2FkT3B0aW9ucy5jb25zdW1lID09PSBcInN0cmVhbVwiKSB7XG4gICAgICAgICAgICAgIC8vIFN0cmVhbSDrqqjrk5w6IOymieyLnCDsoIDsnqXshozroZwg7Iqk7Yq466as67CNXG4gICAgICAgICAgICAgIGNvbnN0IGRpc2tOYW1lID0gYXBpLnVwbG9hZE9wdGlvbnMuZGVzdGluYXRpb247XG4gICAgICAgICAgICAgIGNvbnN0IGRpc2sgPSB0aGlzLnN0b3JhZ2UudXNlKGRpc2tOYW1lKTtcblxuICAgICAgICAgICAgICAvLyDsmrDshKDsiJzsnIQ6IOuNsOy9lOugiOydtO2EsCA+IOyghOyXrSDshKTsoJUgPiDquLDrs7jqsJJcbiAgICAgICAgICAgICAgY29uc3Qga2V5R2VuZXJhdG9yOiBLZXlHZW5lcmF0b3IgPVxuICAgICAgICAgICAgICAgIGFwaS51cGxvYWRPcHRpb25zLmtleUdlbmVyYXRvciA/P1xuICAgICAgICAgICAgICAgIHRoaXMuY29uZmlnLnNlcnZlci5zdG9yYWdlPy5rZXlHZW5lcmF0b3IgPz9cbiAgICAgICAgICAgICAgICBkZWZhdWx0S2V5R2VuZXJhdG9yO1xuXG4gICAgICAgICAgICAgIGZvciBhd2FpdCAoY29uc3QgcGFydCBvZiBwYXJ0cykge1xuICAgICAgICAgICAgICAgIGlmIChwYXJ0LnR5cGUgPT09IFwiZmlsZVwiKSB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBrZXkgPSBhd2FpdCBrZXlHZW5lcmF0b3Ioe1xuICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZTogcGFydC5maWxlbmFtZSxcbiAgICAgICAgICAgICAgICAgICAgbWltZXR5cGU6IHBhcnQubWltZXR5cGUsXG4gICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgYXdhaXQgZGlzay5wdXRTdHJlYW0oa2V5LCBwYXJ0LmZpbGUsIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGVudFR5cGU6IHBhcnQubWltZXR5cGUsXG4gICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgY29uc3QgdXJsID0gYXdhaXQgZGlzay5nZXRVcmwoa2V5KTtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHNpZ25lZFVybCA9IGF3YWl0IGRpc2suZ2V0U2lnbmVkVXJsKGtleSk7XG5cbiAgICAgICAgICAgICAgICAgIGZpbGVzLnVwbG9hZGVkRmlsZXMucHVzaChcbiAgICAgICAgICAgICAgICAgICAgbmV3IFVwbG9hZGVkRmlsZSh7XG4gICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWU6IHBhcnQuZmlsZW5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgbWltZXR5cGU6IHBhcnQubWltZXR5cGUsXG4gICAgICAgICAgICAgICAgICAgICAgc2l6ZTogcGFydC5maWxlLmJ5dGVzUmVhZCxcbiAgICAgICAgICAgICAgICAgICAgICB1cmwsXG4gICAgICAgICAgICAgICAgICAgICAgc2lnbmVkVXJsLFxuICAgICAgICAgICAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgICAgICAgICAgICBkaXNrTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocGFydC50eXBlID09PSBcImZpZWxkXCIpIHtcbiAgICAgICAgICAgICAgICAgIGZpZWxkc1twYXJ0LmZpZWxkbmFtZV0gPSBTdHJpbmcocGFydC52YWx1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIHFz66GcIOykkeyyqSDqtazsobAg7YyM7IuxOiBwYXJhbXNbY2F0ZWdvcnldIOKGkiB7IHBhcmFtczogeyBjYXRlZ29yeTogXCJ0ZXN0XCIgfSB9XG4gICAgICAgICAgICBjb25zdCBxcyA9IGF3YWl0IGltcG9ydChcInFzXCIpO1xuICAgICAgICAgICAgY29uc3QgcGFyc2VkID0gcXMuZGVmYXVsdC5wYXJzZShmaWVsZHMpO1xuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihib2R5LCBwYXJzZWQpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IHsgZmFzdGlmeUNhc3RlciB9ID0gYXdhaXQgaW1wb3J0KFwiLi9jYXN0ZXJcIik7XG4gICAgICAgICAgcmVxQm9keSA9IGZhc3RpZnlDYXN0ZXIoUmVxVHlwZSkucGFyc2UoYm9keSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBjb25zdCB7IFpvZEVycm9yIH0gPSBhd2FpdCBpbXBvcnQoXCJ6b2RcIik7XG4gICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBab2RFcnJvcikge1xuICAgICAgICAgICAgY29uc3QgeyBodW1hbml6ZVpvZEVycm9yIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi91dGlscy96b2QtZXJyb3JcIik7XG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlcyA9IGh1bWFuaXplWm9kRXJyb3IoZSlcbiAgICAgICAgICAgICAgLm1hcCgoaXNzdWUpID0+IGlzc3VlLm1lc3NhZ2UpXG4gICAgICAgICAgICAgIC5qb2luKFwiIFwiKTtcbiAgICAgICAgICAgIGNvbnN0IHsgQmFkUmVxdWVzdEV4Y2VwdGlvbiB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vZXhjZXB0aW9ucy9zby1leGNlcHRpb25zXCIpO1xuICAgICAgICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24obWVzc2FnZXMgYXMgTG9jYWxpemVkU3RyaW5nLCB7XG4gICAgICAgICAgICAgIHpvZEVycm9yOiBlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ29udGVudC1UeXBlXG4gICAgICAgIHJlcGx5LnR5cGUoYXBpLm9wdGlvbnMuY29udGVudFR5cGUgPz8gXCJhcHBsaWNhdGlvbi9qc29uXCIpO1xuXG4gICAgICAgIC8vIENhY2hlLUNvbnRyb2wg7Zek642UIOyEpOyglVxuICAgICAgICBjb25zdCBhcGlDYWNoZUNvbmZpZyA9IHRoaXMuZ2V0QXBpQ2FjaGVDb250cm9sKGFwaSwgcmVxdWVzdCwgY29uZmlnKTtcbiAgICAgICAgaWYgKGFwaUNhY2hlQ29uZmlnKSB7XG4gICAgICAgICAgYXBwbHlDYWNoZUhlYWRlcnMocmVwbHksIGFwaUNhY2hlQ29uZmlnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIOyXheuhnOuTnCDsmLXshZjsnbQg7J6I64qUIOqyveyasCDtjIzsnbwg642w7J207YSw66W8IENvbnRleHTsl5Ag7LaU6rCAXG4gICAgICAgIGlmIChhcGkudXBsb2FkT3B0aW9ucykge1xuICAgICAgICAgIGNvbnN0IGNvbnN1bWUgPSBhcGkudXBsb2FkT3B0aW9ucy5jb25zdW1lID8/IFwiYnVmZmVyXCI7XG4gICAgICAgICAgaWYgKGNvbnN1bWUgPT09IFwiYnVmZmVyXCIpIHtcbiAgICAgICAgICAgIGNvbnRleHQuYnVmZmVyZWRGaWxlcyA9IGZpbGVzLmJ1ZmZlcmVkRmlsZXM7XG4gICAgICAgICAgfSBlbHNlIGlmIChjb25zdW1lID09PSBcInN0cmVhbVwiKSB7XG4gICAgICAgICAgICBjb250ZXh0LnVwbG9hZGVkRmlsZXMgPSBmaWxlcy51cGxvYWRlZEZpbGVzO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIOuqqOuNuCDrqZTshozrk5wgYXJncyDsg53shLHtlZjsl6wg7Zi47LacXG4gICAgICAgIGNvbnN0IHsgQXBpUGFyYW1UeXBlIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi90eXBlcy90eXBlc1wiKTtcbiAgICAgICAgY29uc3QgYXJncyA9IGFwaS5wYXJhbWV0ZXJzLm1hcCgocGFyYW0pID0+IHtcbiAgICAgICAgICAvLyBDb250ZXh0IOyduOygneyFmFxuICAgICAgICAgIGlmIChBcGlQYXJhbVR5cGUuaXNDb250ZXh0KHBhcmFtLnR5cGUpKSB7XG4gICAgICAgICAgICByZXR1cm4gY29udGV4dDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHJlcUJvZHlbcGFyYW0ubmFtZV07XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gdGhpcy5pbnZva2VNb2RlbE1ldGhvZChhcGksIGFyZ3MsIHJlcGx5KTtcbiAgICAgIH0pO1xuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogVVJM7JeQ7IScIHBhdGggcGFyYW1z66W8IOy2lOy2nO2VqeuLiOuLpC5cbiAgICog7JiIOiBwYXR0ZXJuPVwiL2FkbWluL2NvbXBhbmllcy86Y29tcGFueUlkXCIsIHVybD1cIi9hZG1pbi9jb21wYW5pZXMvMTIzXCIg4oaSIHsgY29tcGFueUlkOiBcIjEyM1wiIH1cbiAgICovXG4gIHByaXZhdGUgZXh0cmFjdFBhdGhQYXJhbXMocGF0dGVybjogc3RyaW5nLCB1cmw6IHN0cmluZyk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICAgIGNvbnN0IHBhdHRlcm5QYXJ0cyA9IHBhdHRlcm4uc3BsaXQoXCIvXCIpLmZpbHRlcihCb29sZWFuKTtcbiAgICBjb25zdCB1cmxQYXJ0cyA9IHRoaXMuZ2V0UGF0aG5hbWVGcm9tVXJsKHVybCkuc3BsaXQoXCIvXCIpLmZpbHRlcihCb29sZWFuKTtcbiAgICBjb25zdCBwYXJhbXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGF0dGVyblBhcnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAocGF0dGVyblBhcnRzW2ldLnN0YXJ0c1dpdGgoXCI6XCIpKSB7XG4gICAgICAgIHBhcmFtc1twYXR0ZXJuUGFydHNbaV0uc2xpY2UoMSldID0gdXJsUGFydHNbaV07XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBwYXJhbXM7XG4gIH1cblxuICBwcml2YXRlIGlzUGF0aFBhdHRlcm5NYXRjaChwYXR0ZXJuOiBzdHJpbmcsIHVybDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgY29uc3QgcGF0dGVyblBhcnRzID0gcGF0dGVybi5zcGxpdChcIi9cIikuZmlsdGVyKEJvb2xlYW4pO1xuICAgIGNvbnN0IHVybFBhcnRzID0gdGhpcy5nZXRQYXRobmFtZUZyb21VcmwodXJsKS5zcGxpdChcIi9cIikuZmlsdGVyKEJvb2xlYW4pO1xuXG4gICAgaWYgKHBhdHRlcm5QYXJ0cy5sZW5ndGggIT09IHVybFBhcnRzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGF0dGVyblBhcnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBwYXR0ZXJuUGFydCA9IHBhdHRlcm5QYXJ0c1tpXTtcbiAgICAgIGNvbnN0IHVybFBhcnQgPSB1cmxQYXJ0c1tpXTtcbiAgICAgIGlmIChwYXR0ZXJuUGFydC5zdGFydHNXaXRoKFwiOlwiKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmIChwYXR0ZXJuUGFydCAhPT0gdXJsUGFydCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBwcml2YXRlIGdldFBhdGhuYW1lRnJvbVVybCh1cmw6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHVybC5zcGxpdChcIj9cIilbMF07XG4gIH1cblxuICBwcml2YXRlIHJlc29sdmVQYXRoV2l0aGluQmFzZURpcihiYXNlRGlyOiBzdHJpbmcsIGlucHV0UGF0aDogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGRlY29kZWQgPSBkZWNvZGVVUklDb21wb25lbnQoaW5wdXRQYXRoKS5yZXBsYWNlKC9cXFxcL2csIFwiL1wiKTtcbiAgICAgIGlmIChkZWNvZGVkLmluY2x1ZGVzKFwiXFwwXCIpKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgY29uc3QgcmVsYXRpdmVQYXRoID0gZGVjb2RlZC5yZXBsYWNlKC9eXFwvKy8sIFwiXCIpO1xuICAgICAgY29uc3QgcmVzb2x2ZWRQYXRoID0gcGF0aC5yZXNvbHZlKGJhc2VEaXIsIHJlbGF0aXZlUGF0aCk7XG4gICAgICBjb25zdCByZWxhdGl2ZUZyb21CYXNlID0gcGF0aC5yZWxhdGl2ZShiYXNlRGlyLCByZXNvbHZlZFBhdGgpO1xuICAgICAgaWYgKHJlbGF0aXZlRnJvbUJhc2Uuc3RhcnRzV2l0aChcIi4uXCIpIHx8IHBhdGguaXNBYnNvbHV0ZShyZWxhdGl2ZUZyb21CYXNlKSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXNvbHZlZFBhdGg7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQVBJIOydkeuLteyXkCDsoIHsmqntlaAgQ2FjaGUtQ29udHJvbCDshKTsoJXsnYQg6rKw7KCV7ZWp64uI64ukLlxuICAgKiDsmrDshKDsiJzsnIQ6IOqwnOuzhCDsp4DsoJUgPiBjYWNoZUNvbnRyb2xIYW5kbGVyXG4gICAqL1xuICBwcml2YXRlIGdldEFwaUNhY2hlQ29udHJvbChcbiAgICBhcGk6IEV4dGVuZGVkQXBpLFxuICAgIHJlcXVlc3Q6IEZhc3RpZnlSZXF1ZXN0LFxuICAgIGNvbmZpZzogU29uYW11RmFzdGlmeUNvbmZpZyxcbiAgKSB7XG4gICAgLy8g642w7L2U66CI7J207YSwIOyEpOyglSDsmrDshKBcbiAgICBpZiAoYXBpLm9wdGlvbnMuY2FjaGVDb250cm9sKSB7XG4gICAgICByZXR1cm4gYXBpLm9wdGlvbnMuY2FjaGVDb250cm9sO1xuICAgIH1cblxuICAgIC8vIOyghOyXrSDtlbjrk6Trn6xcbiAgICBpZiAoY29uZmlnLmNhY2hlQ29udHJvbEhhbmRsZXIpIHtcbiAgICAgIGNvbnN0IGNhY2hlUmVxOiBDYWNoZUNvbnRyb2xSZXF1ZXN0ID0ge1xuICAgICAgICB0eXBlOiBcImFwaVwiLFxuICAgICAgICB1cmw6IHJlcXVlc3QudXJsLFxuICAgICAgICBwYXRoOiByZXF1ZXN0LnJvdXRlT3B0aW9ucz8udXJsID8/IHJlcXVlc3QudXJsLnNwbGl0KFwiP1wiKVswXSxcbiAgICAgICAgbWV0aG9kOiByZXF1ZXN0Lm1ldGhvZCxcbiAgICAgICAgYXBpLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGNvbmZpZy5jYWNoZUNvbnRyb2xIYW5kbGVyKGNhY2hlUmVxKTtcbiAgICAgIGlmIChyZXN1bHQpIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKipcbiAgICogU1NS7JqpIEFQSSDtmLjstpwgKEhUVFAg7Jik67KE7Zek65OcIOyXhuydtCDsp4HsoJEg7Zi47LacKVxuICAgKiBjcmVhdGVBcGlIYW5kbGVy7J2YIOuhnOyngeydhCDsnqzsgqzsmqntlZjrkJgsIHJlcXVlc3Qg7YyM7IuxIOuMgOyLoCBwYXJhbXMg7KeB7KCRIOyCrOyaqVxuICAgKi9cbiAgYXN5bmMgaW52b2tlQXBpRm9yU1NSKFxuICAgIGFwaTogRXh0ZW5kZWRBcGksXG4gICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0V4cGxpY2l0QW55OiBTU1Lsl5DshJwg64uk7JaR7ZWcIO2DgOyeheydmCBwYXJhbXPrpbwg67Cb7JWE7JW8IO2VqFxuICAgIHBhcmFtczogYW55W10sXG4gICAgY29uZmlnOiBTb25hbXVGYXN0aWZ5Q29uZmlnLFxuICAgIHJlcXVlc3Q6IEZhc3RpZnlSZXF1ZXN0LFxuICAgIHJlcGx5OiBGYXN0aWZ5UmVwbHksXG4gICk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgIC8vIENvbnRleHQg7IOd7ISxICjquLDsobQg66mU7IaM65OcIOyerOyCrOyaqSlcbiAgICBjb25zdCBjb250ZXh0ID0gYXdhaXQgdGhpcy5jcmVhdGVDb250ZXh0KGNvbmZpZywgcmVxdWVzdCwgcmVwbHkpO1xuXG4gICAgcmV0dXJuIHRoaXMuYXN5bmNMb2NhbFN0b3JhZ2UucnVuKHsgY29udGV4dCB9LCBhc3luYyAoKSA9PiB7XG4gICAgICAvLyBhcmdzIOyDneyEsTogQ29udGV4dCDtjIzrnbzrr7jthLDripQg7KO87J6FLCDrgpjrqLjsp4DripQgcGFyYW1z7JeQ7IScIOqwgOyguOyYpOq4sFxuICAgICAgY29uc3QgeyBBcGlQYXJhbVR5cGUgfSA9IGF3YWl0IGltcG9ydChcIi4uL3R5cGVzL3R5cGVzXCIpO1xuICAgICAgbGV0IHBhcmFtc0luZGV4ID0gMDtcbiAgICAgIGNvbnN0IGFyZ3MgPSBhcGkucGFyYW1ldGVycy5tYXAoKHBhcmFtKSA9PiB7XG4gICAgICAgIGlmIChBcGlQYXJhbVR5cGUuaXNDb250ZXh0KHBhcmFtLnR5cGUpKSB7XG4gICAgICAgICAgcmV0dXJuIGNvbnRleHQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBhcmFtc1twYXJhbXNJbmRleCsrXTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyDrqqjrjbgg66mU7ISc65OcIO2YuOy2nCAo6riw7KG0IOuplOyEnOuTnCDsnqzsgqzsmqkpXG4gICAgICByZXR1cm4gdGhpcy5pbnZva2VNb2RlbE1ldGhvZChhcGksIGFyZ3MsIHJlcGx5KTtcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIGludm9rZU1vZGVsTWV0aG9kKFxuICAgIGFwaTogRXh0ZW5kZWRBcGksXG4gICAgYXJnczogdW5rbm93bltdLFxuICAgIHJlcGx5OiBGYXN0aWZ5UmVwbHksXG4gICk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgIGNvbnN0IG1vZGVsID0gdGhpcy5zeW5jZXIubW9kZWxzW2FwaS5tb2RlbE5hbWVdO1xuICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9FeHBsaWNpdEFueTogbW9kZWzsnYAg66qo6424IOyduOyKpO2EtOyKpOydtOuvgOuhnCDrqZTshJzrk5wg7Zi47LacIOqwgOuKpVxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IChtb2RlbCBhcyBhbnkpW2FwaS5tZXRob2ROYW1lXS5hcHBseShtb2RlbCwgYXJncyk7XG4gICAgcmVwbHkudHlwZShhcGkub3B0aW9ucy5jb250ZW50VHlwZSA/PyBcImFwcGxpY2F0aW9uL2pzb25cIik7XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgYXN5bmMgY3JlYXRlQ29udGV4dChcbiAgICBjb25maWc6IFNvbmFtdUZhc3RpZnlDb25maWcsXG4gICAgcmVxdWVzdDogRmFzdGlmeVJlcXVlc3QsXG4gICAgcmVwbHk6IEZhc3RpZnlSZXBseSxcbiAgKTogUHJvbWlzZTxDb250ZXh0PiB7XG4gICAgLy8gY3JlYXRlU1NFRmFjdG9yeSDtlajsiJjsl5Ag66+466asIHJlcXVlc3TsnZggc29ja2V06rO8IHJlcGx566W8IOuwlOyduOuUqS5cbiAgICBjb25zdCB7IGNyZWF0ZVNTRUZhY3RvcnkgfSA9IGF3YWl0IGltcG9ydChcIi4uL3N0cmVhbS9zc2VcIik7XG4gICAgY29uc3QgY3JlYXRlU1NFID0gKDxUIGV4dGVuZHMgWm9kT2JqZWN0PihcbiAgICAgIF9yZXF1ZXN0OiBGYXN0aWZ5UmVxdWVzdCxcbiAgICAgIF9yZXBseTogRmFzdGlmeVJlcGx5LFxuICAgICAgX2V2ZW50czogVCxcbiAgICApID0+IGNyZWF0ZVNTRUZhY3RvcnkoX3JlcXVlc3Quc29ja2V0LCBfcmVwbHksIF9ldmVudHMpKS5iaW5kKG51bGwsIHJlcXVlc3QsIHJlcGx5KTtcblxuICAgIC8vIGxvY2FsZSDqsJDsp4BcbiAgICBjb25zdCBsb2NhbGUgPVxuICAgICAgdGhpcy5kZXRlY3RMb2NhbGUocmVxdWVzdC5oZWFkZXJzW1wiYWNjZXB0LWxhbmd1YWdlXCJdLCB0aGlzLmNvbmZpZy5pMThuLnN1cHBvcnRlZExvY2FsZXMpID8/XG4gICAgICB0aGlzLmNvbmZpZy5pMThuLmRlZmF1bHRMb2NhbGU7XG5cbiAgICAvLyBhdXRoIGNvbnRleHQg7LaU6rCAXG4gICAgY29uc3QgaGVhZGVycyA9IGNvbnZlcnRGYXN0aWZ5SGVhZGVyc1RvU3RhbmRhcmQocmVxdWVzdC5oZWFkZXJzKTtcbiAgICBjb25zdCBzZXNzaW9uID0gKGF3YWl0IHRoaXMuX2F1dGg/LmFwaS5nZXRTZXNzaW9uKHsgaGVhZGVycyB9KSkgPz8gbnVsbDtcblxuICAgIGNvbnN0IGNvbnRleHQ6IENvbnRleHQgPSB7XG4gICAgICAuLi4oYXdhaXQgUHJvbWlzZS5yZXNvbHZlKFxuICAgICAgICBjb25maWcuY29udGV4dFByb3ZpZGVyKFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHJlcXVlc3QsXG4gICAgICAgICAgICByZXBseSxcbiAgICAgICAgICAgIGhlYWRlcnM6IHJlcXVlc3QuaGVhZGVycyxcbiAgICAgICAgICAgIGNyZWF0ZVNTRSxcbiAgICAgICAgICAgIG5haXRlU3RvcmU6IE5haXRlLmNyZWF0ZVN0b3JlKCksXG4gICAgICAgICAgICBsb2NhbGUsXG4gICAgICAgICAgICAvLyBhdXRoXG4gICAgICAgICAgICB1c2VyOiBzZXNzaW9uPy51c2VyID8/IG51bGwsXG4gICAgICAgICAgICBzZXNzaW9uOiBzZXNzaW9uPy5zZXNzaW9uID8/IG51bGwsXG4gICAgICAgICAgfSxcbiAgICAgICAgICByZXF1ZXN0LFxuICAgICAgICAgIHJlcGx5LFxuICAgICAgICApLFxuICAgICAgKSksXG4gICAgfTtcbiAgICByZXR1cm4gY29udGV4dDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBY2NlcHQtTGFuZ3VhZ2Ug7Zek642U7JeQ7IScIOyngOybkO2VmOuKlCBsb2NhbGXsnYQg7LC+7Iq164uI64ukLlxuICAgKiBAZXhhbXBsZSBcImtvLUtSLGtvO3E9MC45LGVuO3E9MC44XCIg4oaSIFwia29cIlxuICAgKi9cbiAgcHJpdmF0ZSBkZXRlY3RMb2NhbGUoXG4gICAgYWNjZXB0TGFuZ3VhZ2U6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBzdXBwb3J0ZWQ6IHN0cmluZ1tdLFxuICApOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGlmICghYWNjZXB0TGFuZ3VhZ2UpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgICAvLyBBY2NlcHQtTGFuZ3VhZ2U6IGtvLUtSLGtvO3E9MC45LGVuO3E9MC44XG4gICAgY29uc3QgbGFuZ3MgPSBhY2NlcHRMYW5ndWFnZS5zcGxpdChcIixcIikubWFwKChsYW5nKSA9PiB7XG4gICAgICBjb25zdCBbY29kZV0gPSBsYW5nLnNwbGl0KFwiO1wiKTtcbiAgICAgIHJldHVybiBjb2RlLnRyaW0oKS5zcGxpdChcIi1cIilbMF07IC8vIGtvLUtSIOKGkiBrb1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIGxhbmdzLmZpbmQoKGxhbmcpID0+IHN1cHBvcnRlZC5pbmNsdWRlcyhsYW5nKSk7XG4gIH1cblxuICBhc3luYyBzdGFydFdhdGNoZXIoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgd2F0Y2hQYXRoID0gW3BhdGguam9pbih0aGlzLmFwaVJvb3RQYXRoLCBcInNyY1wiKV07XG5cbiAgICBjb25zdCBjaG9raWRhciA9IChhd2FpdCBpbXBvcnQoXCJjaG9raWRhclwiKSkuZGVmYXVsdDtcbiAgICB0aGlzLndhdGNoZXIgPSBjaG9raWRhci53YXRjaCh3YXRjaFBhdGgsIHtcbiAgICAgIGlnbm9yZWQ6IChwYXRoLCBzdGF0cykgPT5cbiAgICAgICAgISFzdGF0cz8uaXNGaWxlKCkgJiYgIXBhdGguZW5kc1dpdGgoXCIudHNcIikgJiYgIXBhdGguZW5kc1dpdGgoXCIuanNvblwiKSxcbiAgICAgIHBlcnNpc3RlbnQ6IHRydWUsXG4gICAgICBpZ25vcmVJbml0aWFsOiB0cnVlLFxuICAgIH0pO1xuXG4gICAgdGhpcy53YXRjaGVyLm9uKFwiYWxsXCIsIGFzeW5jIChldmVudDogc3RyaW5nLCBmaWxlUGF0aDogc3RyaW5nKSA9PiB7XG4gICAgICBjb25zdCBhYnNvbHV0ZVBhdGggPSBmaWxlUGF0aCBhcyBBYnNvbHV0ZVBhdGg7XG4gICAgICBhc3NlcnQoXG4gICAgICAgIGFic29sdXRlUGF0aC5zdGFydHNXaXRoKHRoaXMuYXBpUm9vdFBhdGgpLFxuICAgICAgICBcIkZpbGUgcGF0aCBpcyBub3Qgd2l0aGluIHRoZSBBUEkgcm9vdCBwYXRoXCIsXG4gICAgICApO1xuXG4gICAgICBpZiAoZXZlbnQgIT09IFwiY2hhbmdlXCIgJiYgZXZlbnQgIT09IFwiYWRkXCIpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0cnkge1xuICAgICAgICAvLyBzb25hbXUuY29uZmlnLnRzIOuzgOqyvSDsi5wg7J6s7Iuc7J6RXG4gICAgICAgIGNvbnN0IGlzQ29uZmlnVHMgPSBmaWxlUGF0aCA9PT0gcGF0aC5qb2luKHRoaXMuYXBpUm9vdFBhdGgsIFwic3JjXCIsIFwic29uYW11LmNvbmZpZy50c1wiKTtcblxuICAgICAgICBpZiAoaXNDb25maWdUcykge1xuICAgICAgICAgIGNvbnN0IHJlbGF0aXZlUGF0aCA9IGZpbGVQYXRoLnJlcGxhY2UodGhpcy5hcGlSb290UGF0aCwgXCJhcGlcIik7XG4gICAgICAgICAgY29uc3QgY2hhbGsgPSAoYXdhaXQgaW1wb3J0KFwiY2hhbGtcIikpLmRlZmF1bHQ7XG4gICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICBjaGFsay5ib2xkKGBEZXRlY3RlZCgke2V2ZW50fSk6ICR7Y2hhbGsuYmx1ZShyZWxhdGl2ZVBhdGgpfSAtIFJlc3RhcnRpbmcuLi5gKSxcbiAgICAgICAgICApO1xuICAgICAgICAgIHByb2Nlc3Mua2lsbChwcm9jZXNzLnBpZCwgXCJTSUdVU1IyXCIpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlRmlsZUNoYW5nZShldmVudCwgYWJzb2x1dGVQYXRoKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qXG4gICAgIEEgZnVuY3Rpb24gdGhhdCBhdXRvbWF0aWNhbGx5IGhhbmRsZXMgaW5pdCBhbmQgZGVzdHJveSB3aGVuIHVzaW5nIFNvbmFtdSB2aWEgc2NyaXB0cy5cbiAgKi9cbiAgYXN5bmMgcnVuU2NyaXB0KGZuOiAoKSA9PiBQcm9taXNlPHZvaWQ+KSB7XG4gICAgYXdhaXQgdGhpcy5pbml0KHRydWUsIGZhbHNlLCB1bmRlZmluZWQsIGZhbHNlKTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgZm4oKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgYXdhaXQgdGhpcy5kZXN0cm95KCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyByZWdpc3RlclBsdWdpbnMoc2VydmVyOiBGYXN0aWZ5SW5zdGFuY2UsIHBsdWdpbnM6IFNvbmFtdVNlcnZlck9wdGlvbnNbXCJwbHVnaW5zXCJdKSB7XG4gICAgaWYgKCFwbHVnaW5zKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gY29tcHJlc3Mg7ZSM65+s6re47J247J2AIOuLpOuluCDtlIzrn6zqt7jsnbjrs7Tri6Qg66i87KCAIOuTseuhneuQmOyWtOyVvCDtlanri4jri6QuXG4gICAgaWYgKHBsdWdpbnMuY29tcHJlc3MpIHtcbiAgICAgIGNvbnN0IGNvbXByZXNzUGx1Z2luID0gKGF3YWl0IGltcG9ydChcIkBmYXN0aWZ5L2NvbXByZXNzXCIpKS5kZWZhdWx0O1xuICAgICAgY29uc3QgZGVmYXVsdE9wdGlvbnMgPSB7XG4gICAgICAgIHRocmVzaG9sZDogMTAyNCxcbiAgICAgICAgZW5jb2RpbmdzOiBbXCJiclwiLCBcImd6aXBcIiwgXCJkZWZsYXRlXCJdIGFzIChcImJyXCIgfCBcImd6aXBcIiB8IFwiZGVmbGF0ZVwiKVtdLFxuICAgICAgfTtcblxuICAgICAgaWYgKHBsdWdpbnMuY29tcHJlc3MgPT09IHRydWUpIHtcbiAgICAgICAgc2VydmVyLnJlZ2lzdGVyKGNvbXByZXNzUGx1Z2luLCBkZWZhdWx0T3B0aW9ucyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzZXJ2ZXIucmVnaXN0ZXIoY29tcHJlc3NQbHVnaW4sIHtcbiAgICAgICAgICAuLi5kZWZhdWx0T3B0aW9ucyxcbiAgICAgICAgICAuLi5wbHVnaW5zLmNvbXByZXNzLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBwbHVnaW5zTW9kdWxlcyA9IHtcbiAgICAgIGNvcnM6IFwiQGZhc3RpZnkvY29yc1wiLFxuICAgICAgZm9ybWJvZHk6IFwiQGZhc3RpZnkvZm9ybWJvZHlcIixcbiAgICAgIG11bHRpcGFydDogXCJAZmFzdGlmeS9tdWx0aXBhcnRcIixcbiAgICAgIHFzOiBcImZhc3RpZnktcXNcIixcbiAgICAgIHNzZTogXCJmYXN0aWZ5LXNzZS12MlwiLFxuICAgICAgc3RhdGljOiBcIkBmYXN0aWZ5L3N0YXRpY1wiLFxuICAgIH0gYXMgY29uc3Q7XG5cbiAgICBjb25zdCByZWdpc3RlclBsdWdpbiA9IGFzeW5jIDxLIGV4dGVuZHMga2V5b2YgTm9uTnVsbGFibGU8dHlwZW9mIHBsdWdpbnM+PihcbiAgICAgIGtleTogSyxcbiAgICAgIHBsdWdpbk5hbWU6IHN0cmluZyxcbiAgICApID0+IHtcbiAgICAgIGNvbnN0IG9wdGlvbiA9IHBsdWdpbnNba2V5XTtcbiAgICAgIGlmICghb3B0aW9uKSByZXR1cm47XG5cbiAgICAgIGlmIChvcHRpb24gPT09IHRydWUpIHtcbiAgICAgICAgc2VydmVyLnJlZ2lzdGVyKChhd2FpdCBpbXBvcnQocGx1Z2luTmFtZSkpLmRlZmF1bHQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2VydmVyLnJlZ2lzdGVyKChhd2FpdCBpbXBvcnQocGx1Z2luTmFtZSkpLmRlZmF1bHQsIG9wdGlvbik7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGZvciAoY29uc3QgW2tleSwgcGx1Z2luTmFtZV0gb2YgT2JqZWN0LmVudHJpZXMocGx1Z2luc01vZHVsZXMpKSB7XG4gICAgICBhd2FpdCByZWdpc3RlclBsdWdpbihrZXkgYXMga2V5b2YgdHlwZW9mIHBsdWdpbnMsIHBsdWdpbk5hbWUpO1xuICAgIH1cblxuICAgIGlmIChwbHVnaW5zLmN1c3RvbSkge1xuICAgICAgcGx1Z2lucy5jdXN0b20oc2VydmVyKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogYmV0dGVyLWF1dGgg65287Jqw7Yq466W8IOuTseuhne2VqeuLiOuLpC5cbiAgICogL2FwaS9hdXRoLyog6rK966Gc66GcIOyduOymnSBBUEnqsIAg7J6Q64+ZIOuTseuhneuQqeuLiOuLpC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcmVnaXN0ZXJCZXR0ZXJBdXRoKFxuICAgIHNlcnZlcjogRmFzdGlmeUluc3RhbmNlLFxuICAgIG9wdGlvbnM6IE5vbk51bGxhYmxlPFNvbmFtdVNlcnZlck9wdGlvbnNbXCJhdXRoXCJdPixcbiAgKSB7XG4gICAgaWYgKCFvcHRpb25zKSByZXR1cm47XG5cbiAgICBjb25zdCBiYXNlUGF0aCA9IG9wdGlvbnMuYmFzZVBhdGggPz8gXCIvYXBpL2F1dGhcIjtcblxuICAgIC8vIOyCrOyaqeyekCDshKTsoJXqs7wg6riw67O46rCS7J2EIG1lcmdlXG4gICAgY29uc3QgbWVyZ2VkRmllbGRNYXBwaW5ncyA9IG1lcmdlKEJBU0VfRklFTERfTUFQUElOR1MsIG9wdGlvbnMpO1xuXG4gICAgLy8gYmV0dGVyLWF1dGgg7J247Iqk7YS07IqkIOyDneyEsVxuICAgIGNvbnN0IHsgYmV0dGVyQXV0aCB9ID0gYXdhaXQgaW1wb3J0KFwiYmV0dGVyLWF1dGhcIik7XG4gICAgY29uc3QgeyBQb29sIH0gPSBhd2FpdCBpbXBvcnQoXCJwZ1wiKTtcblxuICAgIHRoaXMuX2F1dGggPSBiZXR0ZXJBdXRoKHtcbiAgICAgIGRhdGFiYXNlOiBuZXcgUG9vbChEQi5nZXREQkNvbmZpZyhcIndcIikuY29ubmVjdGlvbiBhcyBQb29sQ29uZmlnKSxcbiAgICAgIC4uLm1lcmdlZEZpZWxkTWFwcGluZ3MsXG4gICAgfSk7XG5cbiAgICAvLyBiZXR0ZXItYXV0aCDrnbzsmrDtirgg65Ox66GdXG4gICAgc2VydmVyLnJvdXRlKHtcbiAgICAgIG1ldGhvZDogW1wiR0VUXCIsIFwiUE9TVFwiXSxcbiAgICAgIHVybDogYCR7YmFzZVBhdGh9LypgLFxuICAgICAgaGFuZGxlcjogYXN5bmMgKHJlcXVlc3QsIHJlcGx5KSA9PiB7XG4gICAgICAgIGNvbnN0IHVybCA9IG5ldyBVUkwocmVxdWVzdC51cmwsIGBodHRwOi8vJHtyZXF1ZXN0LmhlYWRlcnMuaG9zdH1gKTtcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IGNvbnZlcnRGYXN0aWZ5SGVhZGVyc1RvU3RhbmRhcmQocmVxdWVzdC5oZWFkZXJzKTtcbiAgICAgICAgY29uc3QgcmVxID0gbmV3IFJlcXVlc3QodXJsLnRvU3RyaW5nKCksIHtcbiAgICAgICAgICBtZXRob2Q6IHJlcXVlc3QubWV0aG9kLFxuICAgICAgICAgIGhlYWRlcnMsXG4gICAgICAgICAgLi4uKHJlcXVlc3QuYm9keSA/IHsgYm9keTogSlNPTi5zdHJpbmdpZnkocmVxdWVzdC5ib2R5KSB9IDoge30pLFxuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuYXV0aC5oYW5kbGVyKHJlcSk7XG5cbiAgICAgICAgcmVwbHkuc3RhdHVzKHJlc3BvbnNlLnN0YXR1cyk7XG4gICAgICAgIHJlc3BvbnNlLmhlYWRlcnMuZm9yRWFjaCgodmFsdWU6IHN0cmluZywga2V5OiBzdHJpbmcpID0+IHtcbiAgICAgICAgICByZXBseS5oZWFkZXIoa2V5LCB2YWx1ZSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gcmVwbHkuc2VuZChyZXNwb25zZS5ib2R5ID8gYXdhaXQgcmVzcG9uc2UudGV4dCgpIDogbnVsbCk7XG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgY29uc3QgY2hhbGsgPSAoYXdhaXQgaW1wb3J0KFwiY2hhbGtcIikpLmRlZmF1bHQ7XG4gICAgY29uc29sZS5sb2coY2hhbGsuZ3JlZW4oYOKckyBiZXR0ZXItYXV0aCByZWdpc3RlcmVkIGF0ICR7YmFzZVBhdGh9LypgKSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGluaXRpYWxpemVDYWNoZShjb25maWc6IENhY2hlQ29uZmlnIHwgdW5kZWZpbmVkLCBmb3JUZXN0aW5nOiBib29sZWFuKSB7XG4gICAgY29uc3QgeyBzZXRDYWNoZU1hbmFnZXJSZWYgfSA9IGF3YWl0IGltcG9ydChcIi4uL2NhY2hlL2RlY29yYXRvclwiKTtcblxuICAgIC8vIO2FjOyKpO2KuCDtmZjqsr3sl5DshJwg66mU66qo66asIOuTnOudvOydtOuyhCDsnpDrj5kg7IKs7JqpXG4gICAgaWYgKGZvclRlc3RpbmcpIHtcbiAgICAgIGNvbnN0IHsgY3JlYXRlVGVzdENhY2hlTWFuYWdlciB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vY2FjaGUvY2FjaGUtbWFuYWdlclwiKTtcbiAgICAgIHRoaXMuX2NhY2hlID0gY3JlYXRlVGVzdENhY2hlTWFuYWdlcigpO1xuICAgICAgc2V0Q2FjaGVNYW5hZ2VyUmVmKHRoaXMuX2NhY2hlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyDshKTsoJXsnbQg7JeG7Jy866m0IOy6kOyLnCDruYTtmZzshLHtmZRcbiAgICBpZiAoIWNvbmZpZykge1xuICAgICAgc2V0Q2FjaGVNYW5hZ2VyUmVmKG51bGwpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIOyEpOygleyXkCDrlLDrnbwgQ2FjaGVNYW5hZ2VyIOyDneyEsVxuICAgIGNvbnN0IHsgY3JlYXRlQ2FjaGVNYW5hZ2VyIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi9jYWNoZS9jYWNoZS1tYW5hZ2VyXCIpO1xuICAgIHRoaXMuX2NhY2hlID0gY3JlYXRlQ2FjaGVNYW5hZ2VyKGNvbmZpZyk7XG4gICAgc2V0Q2FjaGVNYW5hZ2VyUmVmKHRoaXMuX2NhY2hlKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgaW5pdGlhbGl6ZVdvcmtmbG93cyhvcHRpb25zOiBTb25hbXVUYXNrT3B0aW9ucyB8IHVuZGVmaW5lZCkge1xuICAgIC8vIGRhdGFiYXNlIOyEpOygleydtCDsl4bsnLzrqbQgV29ya2Zsb3dNYW5hZ2Vy66W8IOy0iOq4sO2ZlO2VmOyngCDslYrsnYxcbiAgICBpZiAoIXRoaXMuY29uZmlnLmRhdGFiYXNlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgeyBXb3JrZmxvd01hbmFnZXIgfSA9IGF3YWl0IGltcG9ydChcIi4uL3Rhc2tzL3dvcmtmbG93LW1hbmFnZXJcIik7XG4gICAgLy8gTk9URTogQHNvbmFtdS1raXQvdGFza3Mg7JWI7JeQ7ISgIGtuZXggY29uZmln66W8IOyImOygle2VmOq4sCDrlYzrrLjsl5AgY29ubmVjdGlvbuydtCDslYTri4wgY29uZmlnIOynuOuhnCDrs7Trg4Xri4jri6QuXG4gICAgdGhpcy5fd29ya2Zsb3dzID0gbmV3IFdvcmtmbG93TWFuYWdlcihEQi5nZXREQkNvbmZpZyhcIndcIikpO1xuICAgIGlmICghb3B0aW9ucykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGVuYWJsZVdvcmtlciA9IG9wdGlvbnMuZW5hYmxlV29ya2VyID8/IGlzRGFlbW9uU2VydmVyKCk7XG4gICAgY29uc3QgZGVmYXVsdFdvcmtlck9wdGlvbnMgPSB7XG4gICAgICBjb25jdXJyZW5jeTogb3MuY3B1cygpLmxlbmd0aCAtIDEsXG4gICAgICB1c2VQdWJTdWI6IHRydWUsXG4gICAgICBsaXN0ZW5EZWxheTogNTAwLFxuICAgIH07XG5cbiAgICBpZiAoZW5hYmxlV29ya2VyKSB7XG4gICAgICB0aGlzLl93b3JrZmxvd3M/LnNldHVwV29ya2VyKHtcbiAgICAgICAgLi4uZGVmYXVsdFdvcmtlck9wdGlvbnMsXG4gICAgICAgIC4uLm9wdGlvbnMud29ya2VyT3B0aW9ucyxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgYm9vdChzZXJ2ZXI6IEZhc3RpZnlJbnN0YW5jZSwgb3B0aW9uczogU29uYW11U2VydmVyT3B0aW9ucykge1xuICAgIGNvbnN0IHBvcnQgPSBvcHRpb25zLmxpc3Rlbj8ucG9ydCA/PyAzMDAwO1xuICAgIGNvbnN0IGhvc3QgPSBvcHRpb25zLmxpc3Rlbj8uaG9zdCA/PyBcImxvY2FsaG9zdFwiO1xuXG4gICAgc2VydmVyLmFkZEhvb2soXCJvbkNsb3NlXCIsIGFzeW5jICgpID0+IHtcbiAgICAgIGF3YWl0IG9wdGlvbnMubGlmZWN5Y2xlPy5vblNodXRkb3duPy4oc2VydmVyKTtcbiAgICAgIGF3YWl0IHRoaXMud29ya2Zsb3dzPy5kZXN0cm95KCk7XG4gICAgICBhd2FpdCB0aGlzLmRlc3Ryb3koKTtcbiAgICB9KTtcblxuICAgIGNvbnN0IHNodXRkb3duID0gYXN5bmMgKCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgc2VydmVyLmNsb3NlKCk7XG4gICAgICAgIHByb2Nlc3MuZXhpdCgwKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBjb25zb2xlLmVycm9yKFwiRXJyb3IgZHVyaW5nIHNodXRkb3duOlwiLCBlcnIpO1xuICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHByb2Nlc3Mub24oXCJTSUdJTlRcIiwgc2h1dGRvd24pO1xuICAgIHByb2Nlc3Mub24oXCJTSUdURVJNXCIsIHNodXRkb3duKTtcblxuICAgIGlmIChvcHRpb25zLmxpZmVjeWNsZT8ub25FcnJvcikge1xuICAgICAgc2VydmVyLnNldEVycm9ySGFuZGxlcihvcHRpb25zLmxpZmVjeWNsZT8ub25FcnJvcik7XG4gICAgfVxuXG4gICAgc2VydmVyXG4gICAgICAubGlzdGVuKHsgcG9ydCwgaG9zdCB9KVxuICAgICAgLnRoZW4oYXN5bmMgKCkgPT4ge1xuICAgICAgICBhd2FpdCB0aGlzLndvcmtmbG93cz8uc3RhcnRXb3JrZXIoKTtcbiAgICAgICAgYXdhaXQgb3B0aW9ucy5saWZlY3ljbGU/Lm9uU3RhcnQ/LihzZXJ2ZXIpO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaChhc3luYyAoZXJyKSA9PiB7XG4gICAgICAgIGNvbnN0IGNoYWxrID0gKGF3YWl0IGltcG9ydChcImNoYWxrXCIpKS5kZWZhdWx0O1xuICAgICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZChcIkZhaWxlZCB0byBzdGFydCBzZXJ2ZXI6XCIsIGVycikpO1xuICAgICAgICBhd2FpdCBzaHV0ZG93bigpO1xuICAgICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGhhbmRsZUZpbGVDaGFuZ2UoZXZlbnQ6IHN0cmluZywgZmlsZVBhdGg6IEFic29sdXRlUGF0aCk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIOyyqyDrsojsp7gg7YyM7J287J2066m0IEhNUiDsi5zsnpEg7Iuc6rCEIOq4sOuhnVxuICAgIGlmICh0aGlzLnBlbmRpbmdGaWxlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMuaG1yU3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICB9XG4gICAgdGhpcy5wZW5kaW5nRmlsZXMucHVzaChmaWxlUGF0aCk7XG5cbiAgICBjb25zdCByZWxhdGl2ZVBhdGggPSBwYXRoLnJlbGF0aXZlKHRoaXMuYXBpUm9vdFBhdGgsIGZpbGVQYXRoKTtcbiAgICBjb25zdCBjaGFsayA9IChhd2FpdCBpbXBvcnQoXCJjaGFsa1wiKSkuZGVmYXVsdDtcbiAgICBjb25zb2xlLmxvZyhjaGFsay5ib2xkKGBEZXRlY3RlZCgke2V2ZW50fSk6ICR7Y2hhbGsuYmx1ZShyZWxhdGl2ZVBhdGgpfWApKTtcblxuICAgIGF3YWl0IHRoaXMuc3luY2VyLnN5bmNGcm9tV2F0Y2hlcihldmVudCwgZmlsZVBhdGgpO1xuXG4gICAgLy8g7LKY66asIOyZhOujjOuQnCDtjIzsnbzsnYQg64yA6riwIOuqqeuhneyXkOyEnCDsoJzqsbBcbiAgICB0aGlzLnBlbmRpbmdGaWxlcyA9IHRoaXMucGVuZGluZ0ZpbGVzLnNsaWNlKDEpO1xuXG4gICAgLy8g66qo65OgIO2MjOydvCDsspjrpqzqsIAg7JmE66OM65CY66m0IOy1nOyihSDrqZTsi5zsp4Ag7Lac66ClXG4gICAgaWYgKHRoaXMucGVuZGluZ0ZpbGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgYXdhaXQgdGhpcy5maW5pc2hITVIoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGZpbmlzaEhNUigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLnN5bmNlci5yZW5ld0NoZWNrc3VtcygpO1xuXG4gICAgY29uc3QgZW5kVGltZSA9IERhdGUubm93KCk7XG4gICAgY29uc3QgdG90YWxUaW1lID0gZW5kVGltZSAtIHRoaXMuaG1yU3RhcnRUaW1lO1xuICAgIGNvbnN0IFtjaGFsaywgeyBjZW50ZXJUZXh0IH1dID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgKGF3YWl0IGltcG9ydChcImNoYWxrXCIpKS5kZWZhdWx0LFxuICAgICAgaW1wb3J0KFwiLi4vdXRpbHMvY29uc29sZS11dGlsXCIpLFxuICAgIF0pO1xuICAgIGNvbnN0IG1zZyA9IGBITVIgRG9uZSEgJHtjaGFsay5ib2xkLndoaXRlKGAke3RvdGFsVGltZX1tc2ApfWA7XG5cbiAgICBjb25zb2xlLmxvZyhjaGFsay5ibGFjay5iZ0dyZWVuKGNlbnRlclRleHQobXNnKSkpO1xuICB9XG5cbiAgYXN5bmMgZGVzdHJveSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB7IEJhc2VNb2RlbCB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vZGF0YWJhc2UvYmFzZS1tb2RlbFwiKTtcbiAgICAvLyDrqLzsoIAg7LKY66as7ZW07JW87ZWoLlxuICAgIGF3YWl0IEJhc2VNb2RlbC5kZXN0cm95KCk7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKFtcbiAgICAgIHRoaXMuX3dvcmtmbG93cz8uZGVzdHJveSgpID8/IFByb21pc2UucmVzb2x2ZSgpLFxuICAgICAgdGhpcy5fY2FjaGU/LmRpc2Nvbm5lY3QoKSA/PyBQcm9taXNlLnJlc29sdmUoKSxcbiAgICAgIHRoaXMuX2RldlZpdGVzdE1hbmFnZXI/LnNodXRkb3duKCkgPz8gUHJvbWlzZS5yZXNvbHZlKCksXG4gICAgICB0aGlzLndhdGNoZXI/LmNsb3NlKCkgPz8gUHJvbWlzZS5yZXNvbHZlKCksXG4gICAgICBsb2d0YXBlRGlzcG9zZSgpLFxuICAgIF0pO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBTb25hbXUgPSBuZXcgU29uYW11Q2xhc3MoKTtcblxuLyoqXG4gKiBzdHJlYW0g66qo65Oc7JeQ7IScIO2CpCDsg53shLEg7ZWo7IiY6rCAIOyngOygleuQmOyngCDslYrslZjsnYQg65WMIOyCrOyaqe2VmOuKlCDquLDrs7gg7ZWo7IiY7J6F64uI64ukLlxuICovXG5mdW5jdGlvbiBkZWZhdWx0S2V5R2VuZXJhdG9yKGZpbGU6IHsgZmlsZW5hbWU6IHN0cmluZzsgbWltZXR5cGU6IHN0cmluZyB9KTogc3RyaW5nIHtcbiAgY29uc3QgZXh0ID0gbWltZS5leHRlbnNpb24oZmlsZS5taW1ldHlwZSkgfHwgXCJiaW5cIjtcbiAgY29uc3QgdGltZXN0YW1wID0gRGF0ZS5ub3coKTtcbiAgY29uc3QgcmFuZG9tID0gTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc2xpY2UoMiwgOCk7XG4gIHJldHVybiBgdXBsb2Fkcy8ke3RpbWVzdGFtcH0tJHtyYW5kb219LiR7ZXh0fWA7XG59XG4iXSwibmFtZXMiOlsiZGlzcG9zZSIsImxvZ3RhcGVEaXNwb3NlIiwiYXNzZXJ0IiwiQXN5bmNMb2NhbFN0b3JhZ2UiLCJmcyIsIm1pbWUiLCJsb29rdXAiLCJtaW1lTG9va3VwIiwib3MiLCJwYXRoIiwiQkFTRV9GSUVMRF9NQVBQSU5HUyIsImNvbnZlcnRGYXN0aWZ5SGVhZGVyc1RvU3RhbmRhcmQiLCJjcmVhdGVNb2NrU1NFRmFjdG9yeSIsIkRCIiwiaXNEYWVtb25TZXJ2ZXIiLCJtZXJnZSIsIk5vdEZvdW5kRXhjZXB0aW9uIiwiYXBwbHlDYWNoZUhlYWRlcnMiLCJDYWNoZVByZXNldHMiLCJ0b0Zhc3RpZnlDb21wcmVzc09wdGlvbiIsIlNEIiwiTmFpdGUiLCJCdWZmZXJlZEZpbGUiLCJVcGxvYWRlZEZpbGUiLCJleGlzdHMiLCJmaWxlRXhpc3RzIiwiZ2V0U2VjcmV0cyIsIlNvbmFtdUNsYXNzIiwiaXNJbml0aWFsaXplZCIsImZvclRlc3RpbmciLCJhc3luY0xvY2FsU3RvcmFnZSIsImdldENvbnRleHQiLCJzdG9yZSIsImdldFN0b3JlIiwiY29udGV4dCIsInByb2Nlc3MiLCJlbnYiLCJOT0RFX0VOViIsInJlcXVlc3QiLCJyZXBseSIsImhlYWRlcnMiLCJjcmVhdGVTU0UiLCJzY2hlbWEiLCJuYWl0ZVN0b3JlIiwiTWFwIiwiRXJyb3IiLCJfYXBpUm9vdFBhdGgiLCJhcGlSb290UGF0aCIsImFwcFJvb3RQYXRoIiwic3BsaXQiLCJzZXAiLCJzbGljZSIsImpvaW4iLCJfZGJDb25maWciLCJkYkNvbmZpZyIsIl9zeW5jZXIiLCJzeW5jZXIiLCJfY29uZmlnIiwiY29uZmlnIiwic2VjcmV0cyIsIl9zdG9yYWdlIiwic3RvcmFnZSIsIl9jYWNoZSIsImNhY2hlIiwiX3dvcmtmbG93cyIsIndvcmtmbG93cyIsIl9hdXRoIiwiYXV0aCIsIl9kZXZWaXRlc3RNYW5hZ2VyIiwiZGV2Vml0ZXN0TWFuYWdlciIsIm1hbmFnZXIiLCJ3YXRjaGVyIiwicGVuZGluZ0ZpbGVzIiwiaG1yU3RhcnRUaW1lIiwic2VydmVyIiwiaW5pdEZvclRlc3RpbmciLCJpbml0IiwidW5kZWZpbmVkIiwiZG9TaWxlbnQiLCJlbmFibGVTeW5jIiwiY2hhbGsiLCJkZWZhdWx0IiwiY29uc29sZSIsInRpbWUiLCJjeWFuIiwiZmluZEFwaVJvb3RQYXRoIiwibG9hZENvbmZpZyIsImRhdGFiYXNlIiwiZGVmYXVsdE9wdGlvbnMiLCJjbGllbnQiLCJjb25maWd1cmVMb2dUYXBlIiwibG9nZ2luZyIsImdlbmVyYXRlREJDb25maWciLCJsb2ciLCJncmVlbiIsIkVudGl0eU1hbmFnZXIiLCJhdXRvbG9hZCIsImluaXRpYWxpemVDYWNoZSIsImluaXRpYWxpemVXb3JrZmxvd3MiLCJ0YXNrcyIsIlN5bmNlciIsImF1dG9sb2FkVHlwZXMiLCJhdXRvbG9hZE1vZGVscyIsImF1dG9sb2FkQXBpcyIsImF1dG9sb2FkV29ya2Zsb3dzIiwiVGVtcGxhdGVNYW5hZ2VyIiwiYXV0b2xvYWRTU1JSb3V0ZXMiLCJpc0xvY2FsIiwiaXNUZXN0Iiwic2V0dXBCaW9tZSIsImlzSG90UmVsb2FkU2VydmVyIiwic3luYyIsInN0YXJ0V2F0Y2hlciIsInRpbWVFbmQiLCJjcmVhdGVTZXJ2ZXIiLCJpbml0T3B0aW9ucyIsIm9wdGlvbnMiLCJmYXN0aWZ5IiwiZ2V0TG9nVGFwZUZhc3RpZnlMb2dnZXIiLCJsb2dnZXIiLCJjYXRlZ29yeSIsImZhc3RpZnlDYXRlZ29yeSIsIlN0b3JhZ2VNYW5hZ2VyIiwicGx1Z2lucyIsInJlZ2lzdGVyUGx1Z2lucyIsInJlZ2lzdGVyQmV0dGVyQXV0aCIsIndpdGhGYXN0aWZ5IiwiYXBpQ29uZmlnIiwiYm9vdCIsInRpbWV6b25lIiwiYXBpIiwiZm9ybWF0SW5UaW1lWm9uZSIsIklTT19EQVRFX1JFR0VYIiwiREFURV9GT1JNQVQiLCJzZXRSZXBseVNlcmlhbGl6ZXIiLCJwYXlsb2FkIiwiSlNPTiIsInN0cmluZ2lmeSIsIl9rZXkiLCJ2YWx1ZSIsInRlc3QiLCJEYXRlIiwiZ2V0Iiwicm91dGUiLCJwcmVmaXgiLCJfcmVxdWVzdCIsIl9yZXBseSIsImFwaXMiLCJzb25hbXVVSUFwaVBsdWdpbiIsInJlZ2lzdGVyIiwiZGV2UnVubmVyIiwiZW5hYmxlZCIsInJlZ2lzdGVyRGV2VGVzdFJvdXRlcyIsIndlYlBhdGgiLCJoYXNXZWIiLCJwbHVnaW5Db21wcmVzcyIsImNvbXByZXNzIiwiZ2xvYmFsQ29tcHJlc3NPcHRpb25zIiwidGhyZXNob2xkIiwiZW5jb2RpbmdzIiwiY3VzdG9tVHlwZXMiLCJkaXNhYmxlSW50ZWdyYXRlZFdlYiIsIlNPTkFNVV9ESVNBQkxFX0lOVEVHUkFURURfV0VCIiwic2V0dXBEZXZTZXJ2ZXJXaXRoVml0ZSIsInNldHVwRGV2U2VydmVyIiwibW9kZWxzIiwibW9kZWxOYW1lIiwibWV0aG9kIiwiaHR0cE1ldGhvZCIsInVybCIsImhhbmRsZXIiLCJjcmVhdGVBcGlIYW5kbGVyIiwic2V0dXBTdGF0aWNXZWJTZXJ2ZXIiLCJoYW5kbGVEZXZBcGlSZXF1ZXN0IiwiZ2V0UGF0aG5hbWVGcm9tVXJsIiwic3RhcnRzV2l0aCIsIm1hdGNoZWRBcGkiLCJmaW5kIiwiYXBpTWV0aG9kIiwiZnVsbFBhdGgiLCJpc1BhdGhQYXR0ZXJuTWF0Y2giLCJ2aXRlU2VydmVyIiwidml0ZSIsInJvb3QiLCJtaWRkbGV3YXJlTW9kZSIsImhtciIsImFwcFR5cGUiLCJ1c2UiLCJyZXEiLCJyZXMiLCJuZXh0IiwibWlkZGxld2FyZXMiLCJyZXN1bHQiLCJtYXRjaFNTUlJvdXRlIiwicmVuZGVyU1NSIiwic3NyTWF0Y2giLCJodG1sIiwicGFyYW1zIiwidHlwZSIsInRlbXBsYXRlIiwicmVhZEZpbGUiLCJ0cmFuc2Zvcm1JbmRleEh0bWwiLCJlIiwic3NyRml4U3RhY2t0cmFjZSIsImVycm9yIiwic3RhdHVzIiwibWVzc2FnZSIsImFkZEhvb2siLCJjbG9zZSIsIndlYkRpc3RQYXRoIiwic3NyUGF0aCIsInNzckVudHJ5UGF0aCIsInNzclJvdXRlc1BhdGgiLCJ3YXJuIiwic3NyQXZhaWxhYmxlIiwicmVxdWVzdGVkRmlsZSIsImZpbGVuYW1lIiwiYXNzZXRzRGlyIiwic2FmZUZpbGVQYXRoIiwicmVzb2x2ZVBhdGhXaXRoaW5CYXNlRGlyIiwic2VuZCIsIm5vcm1hbGl6ZWRSZXF1ZXN0ZWRGaWxlIiwicmVsYXRpdmUiLCJyZXBsYWNlIiwiYXNzZXRQYXRoIiwiZ2V0Q2FjaGVDb250cm9sRm9yQXNzZXQiLCJjYWNoZVJlcSIsImNhY2hlQ29udHJvbEhhbmRsZXIiLCJpbW11dGFibGUiLCJleHQiLCJwb3AiLCJmaWxlcyIsInJlYWRkaXIiLCJjdXJyZW50RmlsZSIsImYiLCJlbmRzV2l0aCIsImZpbGVQYXRoIiwiY29udGVudCIsImluY2x1ZGVzIiwiZ2V0U1NSUm91dGVzIiwic3NyUm91dGVzIiwiZXh0cmFjdFBhdGhQYXJhbXMiLCJjc3JDYWNoZVJlcSIsImNzckNhY2hlQ29uZmlnIiwicmVxdWVzdFBhdGgiLCJpbmRleFBhdGgiLCJjcmVhdGVDb250ZXh0IiwicnVuIiwiZ3VhcmRzIiwiZXZlcnkiLCJndWFyZCIsImd1YXJkSGFuZGxlciIsImdldFpvZE9iamVjdEZyb21BcGkiLCJSZXFUeXBlIiwidHlwZXMiLCJ3aGljaCIsInJlcUJvZHkiLCJidWZmZXJlZEZpbGVzIiwidXBsb2FkZWRGaWxlcyIsImJvZHkiLCJ1cGxvYWRPcHRpb25zIiwicGFydHMiLCJsaW1pdHMiLCJmaWVsZHMiLCJjb25zdW1lIiwicGFydCIsImJ1ZmZlciIsInRvQnVmZmVyIiwicHVzaCIsImZpZWxkbmFtZSIsIlN0cmluZyIsImRpc2tOYW1lIiwiZGVzdGluYXRpb24iLCJkaXNrIiwia2V5R2VuZXJhdG9yIiwiZGVmYXVsdEtleUdlbmVyYXRvciIsImtleSIsIm1pbWV0eXBlIiwicHV0U3RyZWFtIiwiZmlsZSIsImNvbnRlbnRUeXBlIiwiZ2V0VXJsIiwic2lnbmVkVXJsIiwiZ2V0U2lnbmVkVXJsIiwic2l6ZSIsImJ5dGVzUmVhZCIsInFzIiwicGFyc2VkIiwicGFyc2UiLCJPYmplY3QiLCJhc3NpZ24iLCJmYXN0aWZ5Q2FzdGVyIiwiWm9kRXJyb3IiLCJodW1hbml6ZVpvZEVycm9yIiwibWVzc2FnZXMiLCJtYXAiLCJpc3N1ZSIsIkJhZFJlcXVlc3RFeGNlcHRpb24iLCJ6b2RFcnJvciIsImFwaUNhY2hlQ29uZmlnIiwiZ2V0QXBpQ2FjaGVDb250cm9sIiwiQXBpUGFyYW1UeXBlIiwiYXJncyIsInBhcmFtZXRlcnMiLCJwYXJhbSIsImlzQ29udGV4dCIsIm5hbWUiLCJpbnZva2VNb2RlbE1ldGhvZCIsInBhdHRlcm4iLCJwYXR0ZXJuUGFydHMiLCJmaWx0ZXIiLCJCb29sZWFuIiwidXJsUGFydHMiLCJpIiwibGVuZ3RoIiwicGF0dGVyblBhcnQiLCJ1cmxQYXJ0IiwiYmFzZURpciIsImlucHV0UGF0aCIsImRlY29kZWQiLCJkZWNvZGVVUklDb21wb25lbnQiLCJyZWxhdGl2ZVBhdGgiLCJyZXNvbHZlZFBhdGgiLCJyZXNvbHZlIiwicmVsYXRpdmVGcm9tQmFzZSIsImlzQWJzb2x1dGUiLCJjYWNoZUNvbnRyb2wiLCJyb3V0ZU9wdGlvbnMiLCJpbnZva2VBcGlGb3JTU1IiLCJwYXJhbXNJbmRleCIsIm1vZGVsIiwibWV0aG9kTmFtZSIsImFwcGx5IiwiY3JlYXRlU1NFRmFjdG9yeSIsIl9ldmVudHMiLCJzb2NrZXQiLCJiaW5kIiwibG9jYWxlIiwiZGV0ZWN0TG9jYWxlIiwiaTE4biIsInN1cHBvcnRlZExvY2FsZXMiLCJkZWZhdWx0TG9jYWxlIiwic2Vzc2lvbiIsImdldFNlc3Npb24iLCJQcm9taXNlIiwiY29udGV4dFByb3ZpZGVyIiwiY3JlYXRlU3RvcmUiLCJ1c2VyIiwiYWNjZXB0TGFuZ3VhZ2UiLCJzdXBwb3J0ZWQiLCJsYW5ncyIsImxhbmciLCJjb2RlIiwidHJpbSIsIndhdGNoUGF0aCIsImNob2tpZGFyIiwid2F0Y2giLCJpZ25vcmVkIiwic3RhdHMiLCJpc0ZpbGUiLCJwZXJzaXN0ZW50IiwiaWdub3JlSW5pdGlhbCIsIm9uIiwiZXZlbnQiLCJhYnNvbHV0ZVBhdGgiLCJpc0NvbmZpZ1RzIiwiYm9sZCIsImJsdWUiLCJraWxsIiwicGlkIiwiaGFuZGxlRmlsZUNoYW5nZSIsInJ1blNjcmlwdCIsImZuIiwiZGVzdHJveSIsImNvbXByZXNzUGx1Z2luIiwicGx1Z2luc01vZHVsZXMiLCJjb3JzIiwiZm9ybWJvZHkiLCJtdWx0aXBhcnQiLCJzc2UiLCJzdGF0aWMiLCJyZWdpc3RlclBsdWdpbiIsInBsdWdpbk5hbWUiLCJvcHRpb24iLCJlbnRyaWVzIiwiY3VzdG9tIiwiYmFzZVBhdGgiLCJtZXJnZWRGaWVsZE1hcHBpbmdzIiwiYmV0dGVyQXV0aCIsIlBvb2wiLCJnZXREQkNvbmZpZyIsImNvbm5lY3Rpb24iLCJVUkwiLCJob3N0IiwiUmVxdWVzdCIsInRvU3RyaW5nIiwicmVzcG9uc2UiLCJmb3JFYWNoIiwiaGVhZGVyIiwidGV4dCIsInNldENhY2hlTWFuYWdlclJlZiIsImNyZWF0ZVRlc3RDYWNoZU1hbmFnZXIiLCJjcmVhdGVDYWNoZU1hbmFnZXIiLCJXb3JrZmxvd01hbmFnZXIiLCJlbmFibGVXb3JrZXIiLCJkZWZhdWx0V29ya2VyT3B0aW9ucyIsImNvbmN1cnJlbmN5IiwiY3B1cyIsInVzZVB1YlN1YiIsImxpc3RlbkRlbGF5Iiwic2V0dXBXb3JrZXIiLCJ3b3JrZXJPcHRpb25zIiwicG9ydCIsImxpc3RlbiIsImxpZmVjeWNsZSIsIm9uU2h1dGRvd24iLCJzaHV0ZG93biIsImV4aXQiLCJlcnIiLCJvbkVycm9yIiwic2V0RXJyb3JIYW5kbGVyIiwidGhlbiIsInN0YXJ0V29ya2VyIiwib25TdGFydCIsImNhdGNoIiwicmVkIiwibm93Iiwic3luY0Zyb21XYXRjaGVyIiwiZmluaXNoSE1SIiwicmVuZXdDaGVja3N1bXMiLCJlbmRUaW1lIiwidG90YWxUaW1lIiwiY2VudGVyVGV4dCIsImFsbCIsIm1zZyIsIndoaXRlIiwiYmxhY2siLCJiZ0dyZWVuIiwiQmFzZU1vZGVsIiwiYWxsU2V0dGxlZCIsImRpc2Nvbm5lY3QiLCJTb25hbXUiLCJleHRlbnNpb24iLCJ0aW1lc3RhbXAiLCJyYW5kb20iLCJNYXRoIl0sIm1hcHBpbmdzIjoiQUFBQSxTQUFTQSxXQUFXQyxjQUFjLFFBQVEsbUJBQW1CO0FBQzdELE9BQU9DLFlBQVksU0FBUztBQUM1QixTQUFTQyxpQkFBaUIsUUFBUSxjQUFjO0FBSWhELE9BQU9DLFFBQVEsbUJBQWM7QUFFN0IsT0FBT0MsUUFBUUMsVUFBVUMsVUFBVSxRQUFRLGFBQWE7QUFD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
1132
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hcGkvc29uYW11LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGRpc3Bvc2UgYXMgbG9ndGFwZURpc3Bvc2UgfSBmcm9tIFwiQGxvZ3RhcGUvbG9ndGFwZVwiO1xuaW1wb3J0IGFzc2VydCBmcm9tIFwiYXNzZXJ0XCI7XG5pbXBvcnQgeyBBc3luY0xvY2FsU3RvcmFnZSB9IGZyb20gXCJhc3luY19ob29rc1wiO1xuaW1wb3J0IHR5cGUgeyBBdXRoIH0gZnJvbSBcImJldHRlci1hdXRoXCI7XG5pbXBvcnQgdHlwZSB7IEZTV2F0Y2hlciB9IGZyb20gXCJjaG9raWRhclwiO1xuaW1wb3J0IHR5cGUgeyBGYXN0aWZ5SW5zdGFuY2UsIEZhc3RpZnlSZXBseSwgRmFzdGlmeVJlcXVlc3QgfSBmcm9tIFwiZmFzdGlmeVwiO1xuaW1wb3J0IGZzIGZyb20gXCJmcy9wcm9taXNlc1wiO1xuaW1wb3J0IHR5cGUgeyBJbmNvbWluZ01lc3NhZ2UsIFNlcnZlciwgU2VydmVyUmVzcG9uc2UgfSBmcm9tIFwiaHR0cFwiO1xuaW1wb3J0IG1pbWUsIHsgbG9va3VwIGFzIG1pbWVMb29rdXAgfSBmcm9tIFwibWltZS10eXBlc1wiO1xuaW1wb3J0IG9zIGZyb20gXCJvc1wiO1xuaW1wb3J0IHBhdGggZnJvbSBcInBhdGhcIjtcbmltcG9ydCB0eXBlIHsgUG9vbENvbmZpZyB9IGZyb20gXCJwZ1wiO1xuaW1wb3J0IHR5cGUgeyBab2RPYmplY3QgfSBmcm9tIFwiem9kXCI7XG5pbXBvcnQge1xuICBCQVNFX0ZJRUxEX01BUFBJTkdTLFxuICBjb252ZXJ0RmFzdGlmeUhlYWRlcnNUb1N0YW5kYXJkLFxuICBjcmVhdGVNb2NrU1NFRmFjdG9yeSxcbiAgREIsXG4gIGlzRGFlbW9uU2VydmVyLFxuICBtZXJnZSxcbiAgTm90Rm91bmRFeGNlcHRpb24sXG59IGZyb20gXCIuLlwiO1xuaW1wb3J0IHR5cGUgeyBDYWNoZUNvbmZpZywgQ2FjaGVNYW5hZ2VyIH0gZnJvbSBcIi4uL2NhY2hlL3R5cGVzXCI7XG5pbXBvcnQgeyBhcHBseUNhY2hlSGVhZGVycywgQ2FjaGVQcmVzZXRzIH0gZnJvbSBcIi4uL2NhY2hlLWNvbnRyb2wvY2FjaGUtY29udHJvbFwiO1xuaW1wb3J0IHR5cGUgeyBDYWNoZUNvbnRyb2xDb25maWcsIENhY2hlQ29udHJvbFJlcXVlc3QgfSBmcm9tIFwiLi4vY2FjaGUtY29udHJvbC90eXBlc1wiO1xuaW1wb3J0IHsgdG9GYXN0aWZ5Q29tcHJlc3NPcHRpb24gfSBmcm9tIFwiLi4vY29tcHJlc3MvY29tcHJlc3NcIjtcbmltcG9ydCB0eXBlIHsgQ29tcHJlc3NPcHRpb25zIH0gZnJvbSBcIi4uL2NvbXByZXNzL3R5cGVzXCI7XG5pbXBvcnQgdHlwZSB7IFNvbmFtdURCQ29uZmlnIH0gZnJvbSBcIi4uL2RhdGFiYXNlL2RiXCI7XG5pbXBvcnQgeyBTRCB9IGZyb20gXCIuLi9kaWN0L3NkXCI7XG5pbXBvcnQgdHlwZSB7IExvY2FsaXplZFN0cmluZyB9IGZyb20gXCIuLi9kaWN0L3R5cGVzXCI7XG5pbXBvcnQgeyBOYWl0ZSB9IGZyb20gXCIuLi9uYWl0ZS9uYWl0ZVwiO1xuaW1wb3J0IHsgQnVmZmVyZWRGaWxlIH0gZnJvbSBcIi4uL3N0b3JhZ2UvYnVmZmVyZWQtZmlsZVwiO1xuaW1wb3J0IHR5cGUgeyBTdG9yYWdlTWFuYWdlciB9IGZyb20gXCIuLi9zdG9yYWdlL3N0b3JhZ2UtbWFuYWdlclwiO1xuaW1wb3J0IHR5cGUgeyBLZXlHZW5lcmF0b3IgfSBmcm9tIFwiLi4vc3RvcmFnZS90eXBlc1wiO1xuaW1wb3J0IHsgVXBsb2FkZWRGaWxlIH0gZnJvbSBcIi4uL3N0b3JhZ2UvdXBsb2FkZWQtZmlsZVwiO1xuaW1wb3J0IHR5cGUgeyBTeW5jZXIgfSBmcm9tIFwiLi4vc3luY2VyL3N5bmNlclwiO1xuaW1wb3J0IHR5cGUgeyBXb3JrZmxvd01hbmFnZXIgfSBmcm9tIFwiLi4vdGFza3Mvd29ya2Zsb3ctbWFuYWdlclwiO1xuaW1wb3J0IHR5cGUgeyBEZXZWaXRlc3RNYW5hZ2VyIH0gZnJvbSBcIi4uL3Rlc3RpbmcvZGV2LXZpdGVzdC1tYW5hZ2VyXCI7XG5pbXBvcnQgdHlwZSB7IFNvbmFtdUZhc3RpZnlDb25maWcgfSBmcm9tIFwiLi4vdHlwZXMvdHlwZXNcIjtcbmltcG9ydCB7IGV4aXN0cywgZmlsZUV4aXN0cyB9IGZyb20gXCIuLi91dGlscy9mcy11dGlsc1wiO1xuaW1wb3J0IHR5cGUgeyBBYnNvbHV0ZVBhdGggfSBmcm9tIFwiLi4vdXRpbHMvcGF0aC11dGlsc1wiO1xuaW1wb3J0IHR5cGUgeyBTb25hbXVDb25maWcsIFNvbmFtdVNlcnZlck9wdGlvbnMsIFNvbmFtdVRhc2tPcHRpb25zIH0gZnJvbSBcIi4vY29uZmlnXCI7XG5pbXBvcnQgdHlwZSB7IENvbnRleHQgfSBmcm9tIFwiLi9jb250ZXh0XCI7XG5pbXBvcnQgdHlwZSB7IEV4dGVuZGVkQXBpIH0gZnJvbSBcIi4vZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgZ2V0U2VjcmV0cywgdHlwZSBTb25hbXVTZWNyZXRzIH0gZnJvbSBcIi4vc2VjcmV0XCI7XG5cbmNsYXNzIFNvbmFtdUNsYXNzIHtcbiAgcHVibGljIGlzSW5pdGlhbGl6ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHVibGljIGZvclRlc3Rpbmc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHVibGljIGFzeW5jTG9jYWxTdG9yYWdlOiBBc3luY0xvY2FsU3RvcmFnZTx7XG4gICAgY29udGV4dDogQ29udGV4dDtcbiAgfT4gPSBuZXcgQXN5bmNMb2NhbFN0b3JhZ2UoKTtcblxuICBwdWJsaWMgZ2V0Q29udGV4dCgpOiBDb250ZXh0IHtcbiAgICBjb25zdCBzdG9yZSA9IHRoaXMuYXN5bmNMb2NhbFN0b3JhZ2UuZ2V0U3RvcmUoKTtcbiAgICBpZiAoc3RvcmU/LmNvbnRleHQpIHtcbiAgICAgIHJldHVybiBzdG9yZS5jb250ZXh0IGFzIENvbnRleHQ7XG4gICAgfVxuXG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInRlc3RcIikge1xuICAgICAgLy8g7YWM7Iqk7YyFIO2ZmOqyveyXkOyEnCDsu6jthY3siqTtirjqsIAg7KO87J6F65CY7KeAIOyViuydgCDqsr3smrAg67mIIOy7qO2FjeyKpO2KuCDrpqzthLRcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHJlcXVlc3Q6IG51bGwsXG4gICAgICAgIHJlcGx5OiBudWxsLFxuICAgICAgICBoZWFkZXJzOiB7fSxcbiAgICAgICAgY3JlYXRlU1NFOiAoc2NoZW1hOiBab2RPYmplY3QpID0+IGNyZWF0ZU1vY2tTU0VGYWN0b3J5KHNjaGVtYSksXG4gICAgICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9FeHBsaWNpdEFueTog7YWM7Iqk7YyFIO2ZmOqyveyXkOyEnCDsu6jthY3siqTtirjqsIAg7KO87J6F65CY7KeAIOyViuydgCDqsr3smrAg67mIIOy7qO2FjeyKpO2KuCDrpqzthLRcbiAgICAgICAgbmFpdGVTdG9yZTogbmV3IE1hcDxzdHJpbmcsIGFueT4oKSxcbiAgICAgIH0gYXMgdW5rbm93biBhcyBDb250ZXh0O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTb25hbXUgY2Fubm90IGZpbmQgY29udGV4dFwiKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9hcGlSb290UGF0aDogQWJzb2x1dGVQYXRoIHwgbnVsbCA9IG51bGw7XG4gIHNldCBhcGlSb290UGF0aChhcGlSb290UGF0aDogQWJzb2x1dGVQYXRoKSB7XG4gICAgdGhpcy5fYXBpUm9vdFBhdGggPSBhcGlSb290UGF0aDtcbiAgfVxuICBnZXQgYXBpUm9vdFBhdGgoKTogQWJzb2x1dGVQYXRoIHtcbiAgICBpZiAodGhpcy5fYXBpUm9vdFBhdGggPT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlNvbmFtdSBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWRcIik7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9hcGlSb290UGF0aDtcbiAgfVxuICBnZXQgYXBwUm9vdFBhdGgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5hcGlSb290UGF0aC5zcGxpdChwYXRoLnNlcCkuc2xpY2UoMCwgLTEpLmpvaW4ocGF0aC5zZXApO1xuICB9XG5cbiAgcHJpdmF0ZSBfZGJDb25maWc6IFNvbmFtdURCQ29uZmlnIHwgbnVsbCA9IG51bGw7XG4gIHNldCBkYkNvbmZpZyhkYkNvbmZpZzogU29uYW11REJDb25maWcpIHtcbiAgICB0aGlzLl9kYkNvbmZpZyA9IGRiQ29uZmlnO1xuICB9XG4gIGdldCBkYkNvbmZpZygpOiBTb25hbXVEQkNvbmZpZyB7XG4gICAgaWYgKHRoaXMuX2RiQ29uZmlnID09PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTb25hbXUgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkXCIpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fZGJDb25maWc7XG4gIH1cblxuICBwcml2YXRlIF9zeW5jZXI6IFN5bmNlciB8IG51bGwgPSBudWxsO1xuICBzZXQgc3luY2VyKHN5bmNlcjogU3luY2VyKSB7XG4gICAgdGhpcy5fc3luY2VyID0gc3luY2VyO1xuICB9XG4gIGdldCBzeW5jZXIoKTogU3luY2VyIHtcbiAgICBpZiAodGhpcy5fc3luY2VyID09PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTb25hbXUgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkXCIpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fc3luY2VyO1xuICB9XG5cbiAgcHJpdmF0ZSBfY29uZmlnOiBTb25hbXVDb25maWcgfCBudWxsID0gbnVsbDtcbiAgc2V0IGNvbmZpZyhjb25maWc6IFNvbmFtdUNvbmZpZykge1xuICAgIHRoaXMuX2NvbmZpZyA9IGNvbmZpZztcbiAgfVxuICBnZXQgY29uZmlnKCk6IFNvbmFtdUNvbmZpZyB7XG4gICAgaWYgKHRoaXMuX2NvbmZpZyA9PT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiU29uYW11IGhhcyBub3QgYmVlbiBpbml0aWFsaXplZFwiKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2NvbmZpZztcbiAgfVxuXG4gIHB1YmxpYyByZWFkb25seSBzZWNyZXRzOiBTb25hbXVTZWNyZXRzID0gZ2V0U2VjcmV0cygpO1xuXG4gIHByaXZhdGUgX3N0b3JhZ2U6IFN0b3JhZ2VNYW5hZ2VyIHwgbnVsbCA9IG51bGw7XG4gIC8qKlxuICAgKiBTdG9yYWdlTWFuYWdlciDsnbjsiqTthLTsiqRcbiAgICovXG4gIGdldCBzdG9yYWdlKCk6IFN0b3JhZ2VNYW5hZ2VyIHtcbiAgICBpZiAoIXRoaXMuX3N0b3JhZ2UpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlN0b3JhZ2UgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkLiBDaGVjayBzdG9yYWdlIGNvbmZpZy5cIik7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9zdG9yYWdlO1xuICB9XG5cbiAgcHJpdmF0ZSBfY2FjaGU6IENhY2hlTWFuYWdlciB8IG51bGwgPSBudWxsO1xuICAvKipcbiAgICogQ2FjaGVNYW5hZ2VyIOyduOyKpO2EtOyKpCAoQmVudG9DYWNoZSlcbiAgICovXG4gIGdldCBjYWNoZSgpOiBDYWNoZU1hbmFnZXIge1xuICAgIGlmICghdGhpcy5fY2FjaGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhY2hlIGhhcyBub3QgYmVlbiBpbml0aWFsaXplZC4gQ2hlY2sgY2FjaGUgY29uZmlnIGluIHNvbmFtdS5jb25maWcudHMuXCIpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fY2FjaGU7XG4gIH1cblxuICBwcml2YXRlIF93b3JrZmxvd3M6IFdvcmtmbG93TWFuYWdlciB8IG51bGwgPSBudWxsO1xuICBnZXQgd29ya2Zsb3dzKCk6IFdvcmtmbG93TWFuYWdlciB7XG4gICAgaWYgKHRoaXMuX3dvcmtmbG93cyA9PT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiU29uYW11IGhhcyBub3QgYmVlbiBpbml0aWFsaXplZFwiKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fd29ya2Zsb3dzO1xuICB9XG5cbiAgcHJpdmF0ZSBfYXV0aDogQXV0aCB8IG51bGwgPSBudWxsO1xuICBnZXQgYXV0aCgpOiBBdXRoIHtcbiAgICBpZiAoIXRoaXMuX2F1dGgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkF1dGggaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkLiBDaGVjayBhdXRoIGNvbmZpZyBpbiBzb25hbXUuY29uZmlnLnRzLlwiKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2F1dGg7XG4gIH1cblxuICBwcml2YXRlIF9kZXZWaXRlc3RNYW5hZ2VyOiBEZXZWaXRlc3RNYW5hZ2VyIHwgbnVsbCA9IG51bGw7XG4gIGdldCBkZXZWaXRlc3RNYW5hZ2VyKCk6IERldlZpdGVzdE1hbmFnZXIgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fZGV2Vml0ZXN0TWFuYWdlcjtcbiAgfVxuICBzZXQgZGV2Vml0ZXN0TWFuYWdlcihtYW5hZ2VyOiBEZXZWaXRlc3RNYW5hZ2VyIHwgbnVsbCkge1xuICAgIHRoaXMuX2RldlZpdGVzdE1hbmFnZXIgPSBtYW5hZ2VyO1xuICB9XG5cbiAgLy8gSE1SIOyymOumrFxuICBwdWJsaWMgd2F0Y2hlcjogRlNXYXRjaGVyIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgcGVuZGluZ0ZpbGVzOiBzdHJpbmdbXSA9IFtdO1xuICBwcml2YXRlIGhtclN0YXJ0VGltZTogbnVtYmVyID0gMDtcblxuICBwdWJsaWMgc2VydmVyOiBGYXN0aWZ5SW5zdGFuY2UgfCBudWxsID0gbnVsbDtcblxuICBhc3luYyBpbml0Rm9yVGVzdGluZygpIHtcbiAgICBhd2FpdCB0aGlzLmluaXQodHJ1ZSwgZmFsc2UsIHVuZGVmaW5lZCwgdHJ1ZSk7XG4gIH1cblxuICBhc3luYyBpbml0KFxuICAgIGRvU2lsZW50OiBib29sZWFuID0gZmFsc2UsXG4gICAgZW5hYmxlU3luYzogYm9vbGVhbiA9IHRydWUsXG4gICAgYXBpUm9vdFBhdGg/OiBBYnNvbHV0ZVBhdGgsXG4gICAgZm9yVGVzdGluZzogYm9vbGVhbiA9IGZhbHNlLFxuICApIHtcbiAgICB0aGlzLmZvclRlc3RpbmcgPSBmb3JUZXN0aW5nO1xuXG4gICAgaWYgKHRoaXMuaXNJbml0aWFsaXplZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghZG9TaWxlbnQpIHtcbiAgICAgIGNvbnN0IGNoYWxrID0gKGF3YWl0IGltcG9ydChcImNoYWxrXCIpKS5kZWZhdWx0O1xuICAgICAgY29uc29sZS50aW1lKGNoYWxrLmN5YW4oYFNvbmFtdS5pbml0JHtmb3JUZXN0aW5nID8gXCIgZm9yIHRlc3RpbmdcIiA6IFwiXCJ9YCkpO1xuICAgIH1cblxuICAgIC8vIEFQSSDro6jtirgg7Yyo7IqkXG4gICAgY29uc3QgeyBmaW5kQXBpUm9vdFBhdGggfSA9IGF3YWl0IGltcG9ydChcIi4uL3V0aWxzL3V0aWxzXCIpO1xuICAgIHRoaXMuYXBpUm9vdFBhdGggPSBhcGlSb290UGF0aCA/PyBmaW5kQXBpUm9vdFBhdGgoKTtcblxuICAgIC8vIOyEpOygleydhCDroZzrlKntlZjripQg6rKD67aA7YSwIOyLnOyekVxuICAgIGNvbnN0IHsgbG9hZENvbmZpZyB9ID0gYXdhaXQgaW1wb3J0KFwiLi9jb25maWdcIik7XG4gICAgdGhpcy5jb25maWcgPSBhd2FpdCBsb2FkQ29uZmlnKHRoaXMuYXBpUm9vdFBhdGgpO1xuICAgIC8vIHNvbmFtdS5jb25maWcudHMg6riw67O46rCSIOyEpOyglVxuICAgIHRoaXMuY29uZmlnLmRhdGFiYXNlLmRhdGFiYXNlID0gdGhpcy5jb25maWcuZGF0YWJhc2UuZGF0YWJhc2UgPz8gXCJwZ1wiO1xuICAgIHRoaXMuY29uZmlnLmRhdGFiYXNlLmRlZmF1bHRPcHRpb25zLmNsaWVudCA9IHRoaXMuY29uZmlnLmRhdGFiYXNlLmRhdGFiYXNlID8/IFwicGdcIjtcblxuICAgIC8vIOuhnOq5hSDshKTsoJVcbiAgICBjb25zdCB7IGNvbmZpZ3VyZUxvZ1RhcGUgfSA9IGF3YWl0IGltcG9ydChcIi4uL2xvZ2dlci9jb25maWd1cmVcIik7XG4gICAgaWYgKHRoaXMuY29uZmlnLmxvZ2dpbmcgIT09IGZhbHNlKSB7XG4gICAgICBhd2FpdCBjb25maWd1cmVMb2dUYXBlKHtcbiAgICAgICAgLi4udGhpcy5jb25maWcubG9nZ2luZyxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIERCIOuhnOuTnFxuICAgIGNvbnN0IHsgREIgfSA9IGF3YWl0IGltcG9ydChcIi4uL2RhdGFiYXNlL2RiXCIpO1xuICAgIHRoaXMuZGJDb25maWcgPSBEQi5nZW5lcmF0ZURCQ29uZmlnKHRoaXMuY29uZmlnLmRhdGFiYXNlKTtcbiAgICBpZiAoIWRvU2lsZW50KSB7XG4gICAgICBjb25zdCBjaGFsayA9IChhd2FpdCBpbXBvcnQoXCJjaGFsa1wiKSkuZGVmYXVsdDtcbiAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyZWVuKFwiREIgQ29uZmlnIExvYWRlZCFcIikpO1xuICAgIH1cblxuICAgIC8vIEVudGl0eSDroZzrk5xcbiAgICAvLyDthYzsiqTtirjsl5DshJzrj4QgRW50aXR5IOygleuztOuKlCDtlYTsmpTtlanri4jri6QuXG4gICAgLy8gdXBzZXJ06rCAIOygnOuMgOuhnCDsnpHrj5ntlZjroKTrqbQgZW50aXR57J2YIHVuaXF1ZSBpbmRleCDsoJXrs7TqsIAg7ZWE7JqU7ZWY6riwIOuVjOusuOyeheuLiOuLpC5cbiAgICBjb25zdCB7IEVudGl0eU1hbmFnZXIgfSA9IGF3YWl0IGltcG9ydChcIi4uL2VudGl0eS9lbnRpdHktbWFuYWdlclwiKTtcbiAgICBhd2FpdCBFbnRpdHlNYW5hZ2VyLmF1dG9sb2FkKGRvU2lsZW50KTtcblxuICAgIC8vIENhY2hlIOy0iOq4sO2ZlFxuICAgIGF3YWl0IHRoaXMuaW5pdGlhbGl6ZUNhY2hlKHRoaXMuY29uZmlnLnNlcnZlci5jYWNoZSwgZm9yVGVzdGluZyk7XG5cbiAgICAvLyDthYzsiqTtjIXsnbgg6rK97JqwIOyLse2BrCDsl4bsnbQg7KSR64uoXG4gICAgaWYgKGZvclRlc3RpbmcpIHtcbiAgICAgIHRoaXMuaXNJbml0aWFsaXplZCA9IHRydWU7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gVGFzayDrk7HroZ1cbiAgICBhd2FpdCB0aGlzLmluaXRpYWxpemVXb3JrZmxvd3ModGhpcy5jb25maWcudGFza3MpO1xuXG4gICAgLy8gU3luY2VyXG4gICAgY29uc3QgeyBTeW5jZXIgfSA9IGF3YWl0IGltcG9ydChcIi4uL3N5bmNlci9zeW5jZXJcIik7XG4gICAgdGhpcy5zeW5jZXIgPSBuZXcgU3luY2VyKCk7XG5cbiAgICAvLyBBdXRvbG9hZDogTW9kZWxzIC8gVHlwZXMgLyBBUElzIC8gV29ya2Zsb3dzIC8gVGVtcGxhdGVzIC8gU1NSIFJvdXRlc1xuICAgIGF3YWl0IHRoaXMuc3luY2VyLmF1dG9sb2FkVHlwZXMoKTtcbiAgICBhd2FpdCB0aGlzLnN5bmNlci5hdXRvbG9hZE1vZGVscygpO1xuICAgIGF3YWl0IHRoaXMuc3luY2VyLmF1dG9sb2FkQXBpcygpO1xuICAgIGF3YWl0IHRoaXMuc3luY2VyLmF1dG9sb2FkV29ya2Zsb3dzKCk7XG4gICAgY29uc3QgeyBUZW1wbGF0ZU1hbmFnZXIgfSA9IGF3YWl0IGltcG9ydChcIi4uL3RlbXBsYXRlXCIpO1xuICAgIGF3YWl0IFRlbXBsYXRlTWFuYWdlci5hdXRvbG9hZCgpO1xuICAgIGF3YWl0IHRoaXMuc3luY2VyLmF1dG9sb2FkU1NSUm91dGVzKCk7XG5cbiAgICBjb25zdCB7IGlzTG9jYWwsIGlzVGVzdCB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vdXRpbHMvY29udHJvbGxlclwiKTtcbiAgICBpZiAoaXNMb2NhbCgpKSB7XG4gICAgICAvLyDroZzsu6zsl5DshJzripQg7L2U65OcIOyDneyEseydhCDsnITtlbQgQmlvbWUg7IWL7JeF7J20IO2VhOyalO2VqCAo7ZiE7J6sIGFwaVJvb3RQYXRoIOyghOuLrO2VmOyXrCDsi6TtlokpXG4gICAgICAoYXdhaXQgaW1wb3J0KFwiLi4vdXRpbHMvZm9ybWF0dGVyXCIpKS5zZXR1cEJpb21lKHRoaXMuYXBpUm9vdFBhdGgpO1xuICAgIH1cblxuICAgIGNvbnN0IHsgaXNIb3RSZWxvYWRTZXJ2ZXIgfSA9IGF3YWl0IGltcG9ydChcIi4uL3V0aWxzL2NvbnRyb2xsZXJcIik7XG4gICAgaWYgKGlzTG9jYWwoKSAmJiAhaXNUZXN0KCkgJiYgaXNIb3RSZWxvYWRTZXJ2ZXIoKSAmJiBlbmFibGVTeW5jKSB7XG4gICAgICBhd2FpdCB0aGlzLnN5bmNlci5zeW5jKCk7XG4gICAgICBhd2FpdCB0aGlzLnN0YXJ0V2F0Y2hlcigpO1xuICAgIH1cblxuICAgIHRoaXMuaXNJbml0aWFsaXplZCA9IHRydWU7XG4gICAgaWYgKCFkb1NpbGVudCkge1xuICAgICAgY29uc3QgY2hhbGsgPSAoYXdhaXQgaW1wb3J0KFwiY2hhbGtcIikpLmRlZmF1bHQ7XG4gICAgICBjb25zb2xlLnRpbWVFbmQoY2hhbGsuY3lhbihcIlNvbmFtdS5pbml0XCIpKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBjcmVhdGVTZXJ2ZXIoaW5pdE9wdGlvbnM/OiB7IGVuYWJsZVN5bmM/OiBib29sZWFuOyBkb1NpbGVudD86IGJvb2xlYW4gfSkge1xuICAgIGlmICh0aGlzLmlzSW5pdGlhbGl6ZWQgPT09IGZhbHNlKSB7XG4gICAgICBhd2FpdCB0aGlzLmluaXQoaW5pdE9wdGlvbnM/LmRvU2lsZW50LCBpbml0T3B0aW9ucz8uZW5hYmxlU3luYyk7XG4gICAgfVxuXG4gICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMuY29uZmlnLnNlcnZlcjtcbiAgICBjb25zdCB7IGRlZmF1bHQ6IGZhc3RpZnkgfSA9IGF3YWl0IGltcG9ydChcImZhc3RpZnlcIik7XG4gICAgY29uc3QgeyBnZXRMb2dUYXBlRmFzdGlmeUxvZ2dlciB9ID0gYXdhaXQgaW1wb3J0KFwiQGxvZ3RhcGUvZmFzdGlmeVwiKTtcbiAgICBjb25zdCBzZXJ2ZXIgPSBmYXN0aWZ5KHtcbiAgICAgIC4uLm9wdGlvbnMuZmFzdGlmeSxcbiAgICAgIGxvZ2dlcjpcbiAgICAgICAgdGhpcy5jb25maWcubG9nZ2luZyAhPT0gZmFsc2VcbiAgICAgICAgICA/IGdldExvZ1RhcGVGYXN0aWZ5TG9nZ2VyKHtcbiAgICAgICAgICAgICAgY2F0ZWdvcnk6IHRoaXMuY29uZmlnLmxvZ2dpbmc/LmZhc3RpZnlDYXRlZ29yeSA/PyBbXCJmYXN0aWZ5XCJdLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICB9KTtcbiAgICB0aGlzLnNlcnZlciA9IHNlcnZlcjtcblxuICAgIC8vIFN0b3JhZ2Ug7ISk7KCVIOKGkiBTdG9yYWdlTWFuYWdlciDsg53shLFcbiAgICBpZiAob3B0aW9ucy5zdG9yYWdlKSB7XG4gICAgICBjb25zdCB7IFN0b3JhZ2VNYW5hZ2VyIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi9zdG9yYWdlL3N0b3JhZ2UtbWFuYWdlclwiKTtcbiAgICAgIHRoaXMuX3N0b3JhZ2UgPSBuZXcgU3RvcmFnZU1hbmFnZXIob3B0aW9ucy5zdG9yYWdlKTtcbiAgICB9XG5cbiAgICAvLyDtlIzrn6zqt7jsnbgg65Ox66GdXG4gICAgaWYgKG9wdGlvbnMucGx1Z2lucykge1xuICAgICAgYXdhaXQgdGhpcy5yZWdpc3RlclBsdWdpbnMoc2VydmVyLCBvcHRpb25zLnBsdWdpbnMpO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLmF1dGgpIHtcbiAgICAgIGF3YWl0IHRoaXMucmVnaXN0ZXJCZXR0ZXJBdXRoKHNlcnZlciwgb3B0aW9ucy5hdXRoKTtcbiAgICB9XG5cbiAgICAvLyBBUEkg65287Jqw7YyFIOyEpOyglVxuICAgIGF3YWl0IHRoaXMud2l0aEZhc3RpZnkoc2VydmVyLCBvcHRpb25zLmFwaUNvbmZpZywge1xuICAgICAgZW5hYmxlU3luYzogaW5pdE9wdGlvbnM/LmVuYWJsZVN5bmMsXG4gICAgICBkb1NpbGVudDogaW5pdE9wdGlvbnM/LmRvU2lsZW50LFxuICAgIH0pO1xuXG4gICAgLy8g7ISc67KEIOyLnOyekVxuICAgIGF3YWl0IHRoaXMuYm9vdChzZXJ2ZXIsIG9wdGlvbnMpO1xuXG4gICAgcmV0dXJuIHNlcnZlcjtcbiAgfVxuXG4gIGFzeW5jIHdpdGhGYXN0aWZ5KFxuICAgIHNlcnZlcjogRmFzdGlmeUluc3RhbmNlPFNlcnZlciwgSW5jb21pbmdNZXNzYWdlLCBTZXJ2ZXJSZXNwb25zZT4sXG4gICAgY29uZmlnOiBTb25hbXVGYXN0aWZ5Q29uZmlnLFxuICAgIG9wdGlvbnM/OiB7XG4gICAgICBlbmFibGVTeW5jPzogYm9vbGVhbjtcbiAgICAgIGRvU2lsZW50PzogYm9vbGVhbjtcbiAgICB9LFxuICApIHtcbiAgICBpZiAodGhpcy5pc0luaXRpYWxpemVkID09PSBmYWxzZSkge1xuICAgICAgYXdhaXQgdGhpcy5pbml0KG9wdGlvbnM/LmRvU2lsZW50LCBvcHRpb25zPy5lbmFibGVTeW5jKTtcbiAgICB9XG5cbiAgICB0aGlzLnNlcnZlciA9IHNlcnZlcjtcblxuICAgIC8vIHRpbWV6b25lIOyEpOyglVxuICAgIGNvbnN0IHRpbWV6b25lID0gdGhpcy5jb25maWcuYXBpLnRpbWV6b25lO1xuICAgIGlmICh0aW1lem9uZSkge1xuICAgICAgLy8g7YOA7J6E7KG07JeQIOunnuqyjCDsnZHri7Ug64Kg7KecIOyKpO2KuOungeydhCDrs4DtmZjtlbTso7zslrTslbwg7ZWp64uI64ukLlxuICAgICAgLy8g6rCA66C5IHRpbWV6b25l7J20IFwiQXNpYS9TZW91bFwiIOydtOuptFxuICAgICAgLy8gXCIyMDI1LTExLTIxVDAwOjAwOjAwLjAwMFpcIiDrpbwgXCIyMDI1LTExLTIxVDA5OjAwOjAwKzA5OjAwXCIg7Jy866GcIOuzgO2ZmO2VtOyjvOyWtOyVvCDtlanri4jri6QuXG4gICAgICBjb25zdCB7IGZvcm1hdEluVGltZVpvbmUgfSA9IGF3YWl0IGltcG9ydChcImRhdGUtZm5zLXR6XCIpO1xuXG4gICAgICAvLyBJU08gODYwMSDrgqDsp5wg7ZiV7IudIOygleq3nOyLnSAo7JiIOiAyMDI0LTAxLTE1VDA5OjMwOjAwLjAwMFopXG4gICAgICBjb25zdCBJU09fREFURV9SRUdFWCA9IC9eXFxkezR9LVxcZHsyfS1cXGR7Mn1UXFxkezJ9OlxcZHsyfTpcXGR7Mn0oXFwuXFxkezN9KT9aJC87XG5cbiAgICAgIC8vIFTrpbwg65GY65+s7Iu8IOyekeydgOuUsOyYtO2RnOqwgCDsl4bri6TrqbQgXCIyMDI1LTExLTE5MTc2MzU0NjE4OTAwMDE4OjU2OjI5KzA5OjAwXCLsmYAg6rCZ7J2AIOqysOqzvOqwgCDrgpjsmLXri4jri6QuXG4gICAgICAvLyDsnbTripQgZGF0ZS1mbnMg7Yq57J6F64uI64ukLlxuICAgICAgLy8g7J2066CH6rKMIO2VtOuPhCDqtJzssK7sirXri4jri6QuIFwiMjAyNS0xMS0xOVQxODo1NjoyOSswOTowMFwiIOuqqOyWkeycvOuhnCDsnpgg64KY7Ji164uI64ukLlxuICAgICAgY29uc3QgREFURV9GT1JNQVQgPSBcInl5eXktTU0tZGQnVCdISDptbTpzc1hYWFwiO1xuXG4gICAgICBzZXJ2ZXIuc2V0UmVwbHlTZXJpYWxpemVyKChwYXlsb2FkKSA9PiB7XG4gICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShwYXlsb2FkLCAoX2tleSwgdmFsdWUpID0+IHtcbiAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiICYmIElTT19EQVRFX1JFR0VYLnRlc3QodmFsdWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gZm9ybWF0SW5UaW1lWm9uZShcbiAgICAgICAgICAgICAgbmV3IERhdGUodmFsdWUpLFxuICAgICAgICAgICAgICB0aW1lem9uZSBhcyBgJHtzdHJpbmd9LyR7c3RyaW5nfWAsXG4gICAgICAgICAgICAgIERBVEVfRk9STUFULFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgICAgaWYgKCFvcHRpb25zPy5kb1NpbGVudCkge1xuICAgICAgICBjb25zdCBjaGFsayA9IChhd2FpdCBpbXBvcnQoXCJjaGFsa1wiKSkuZGVmYXVsdDtcbiAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JlZW4oYFRpbWV6b25lIHNldCB0byAke3RpbWV6b25lfWApKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyDsoITssrQg65287Jqw7YyFIOumrOyKpO2KuFxuICAgIHNlcnZlci5nZXQoXG4gICAgICBgJHt0aGlzLmNvbmZpZy5hcGkucm91dGUucHJlZml4fS9yb3V0ZXNgLFxuICAgICAgYXN5bmMgKF9yZXF1ZXN0LCBfcmVwbHkpOiBQcm9taXNlPHR5cGVvZiB0aGlzLnN5bmNlci5hcGlzPiA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLnN5bmNlci5hcGlzO1xuICAgICAgfSxcbiAgICApO1xuXG4gICAgLy8gSGVhbHRoY2hlY2sgQVBJXG4gICAgc2VydmVyLmdldChcbiAgICAgIGAke3RoaXMuY29uZmlnLmFwaS5yb3V0ZS5wcmVmaXh9L2hlYWx0aGNoZWNrYCxcbiAgICAgIGFzeW5jIChfcmVxdWVzdCwgX3JlcGx5KTogUHJvbWlzZTxzdHJpbmc+ID0+IHtcbiAgICAgICAgcmV0dXJuIFwib2tcIjtcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIC8vIFNvbmFtdSBVSSBBUEkgKOuhnOy7rCDtmZjqsr3sl5DshJzrp4wpXG4gICAgY29uc3QgeyBpc0xvY2FsIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi91dGlscy9jb250cm9sbGVyXCIpO1xuICAgIGlmIChpc0xvY2FsKCkpIHtcbiAgICAgIGNvbnN0IHsgc29uYW11VUlBcGlQbHVnaW4gfSA9IGF3YWl0IGltcG9ydChcIi4uL3VpL2FwaVwiKTtcbiAgICAgIHNlcnZlci5yZWdpc3Rlcihzb25hbXVVSUFwaVBsdWdpbik7XG4gICAgfVxuXG4gICAgLy8gRGV2UnVubmVyIO2FjOyKpO2KuCDsl5Trk5ztj6zsnbjtirggKOuhnOy7rCDtmZjqsr0gKyBkZXZSdW5uZXIg7Zmc7ISx7ZmUIOyLnClcbiAgICBpZiAoaXNMb2NhbCgpICYmIHRoaXMuY29uZmlnLnRlc3Q/LmRldlJ1bm5lcj8uZW5hYmxlZCkge1xuICAgICAgY29uc3QgeyByZWdpc3RlckRldlRlc3RSb3V0ZXMgfSA9IGF3YWl0IGltcG9ydChcIi4uL3Rlc3RpbmcvZGV2LXRlc3Qtcm91dGVzXCIpO1xuICAgICAgYXdhaXQgcmVnaXN0ZXJEZXZUZXN0Um91dGVzKHNlcnZlciwgdGhpcy5jb25maWcudGVzdC5kZXZSdW5uZXIpO1xuICAgIH1cblxuICAgIGNvbnN0IHdlYlBhdGggPSBwYXRoLmpvaW4odGhpcy5hcHBSb290UGF0aCwgXCJ3ZWJcIik7XG4gICAgY29uc3QgaGFzV2ViID0gYXdhaXQgZXhpc3RzKHdlYlBhdGgpO1xuXG4gICAgLy8g7KCE7JetIGNvbXByZXNzIOyYteyFmCDqs4TsgrAgKHJvdXRlLmNvbXByZXNzOiB0cnVl7J28IOuVjCDsgqzsmqkpXG4gICAgY29uc3QgcGx1Z2luQ29tcHJlc3MgPSB0aGlzLmNvbmZpZy5zZXJ2ZXIucGx1Z2lucz8uY29tcHJlc3M7XG4gICAgY29uc3QgZ2xvYmFsQ29tcHJlc3NPcHRpb25zOiBDb21wcmVzc09wdGlvbnMgfCB1bmRlZmluZWQgPSBwbHVnaW5Db21wcmVzc1xuICAgICAgPyBwbHVnaW5Db21wcmVzcyA9PT0gdHJ1ZVxuICAgICAgICA/IHsgdGhyZXNob2xkOiAxMDI0LCBlbmNvZGluZ3M6IFtcImJyXCIsIFwiZ3ppcFwiLCBcImRlZmxhdGVcIl0gfVxuICAgICAgICA6IHtcbiAgICAgICAgICAgIHRocmVzaG9sZDogcGx1Z2luQ29tcHJlc3MudGhyZXNob2xkLFxuICAgICAgICAgICAgZW5jb2RpbmdzOiBwbHVnaW5Db21wcmVzcy5lbmNvZGluZ3MsXG4gICAgICAgICAgICBjdXN0b21UeXBlczogcGx1Z2luQ29tcHJlc3MuY3VzdG9tVHlwZXMsXG4gICAgICAgICAgfVxuICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICBpZiAoaXNMb2NhbCgpKSB7XG4gICAgICAvLyDroZzsu6wg6rCc67CcIO2ZmOqyvTogY2F0Y2gtYWxs66GcIEFQSeulvCDrj5nsoIEg66ek7Lmt7ZWY7JesIEhNUuydhCDsp4Dsm5Dtlanri4jri6QuXG4gICAgICAvLyBTT05BTVVfRElTQUJMRV9JTlRFR1JBVEVEX1dFQj15ZXProZwg7ISk7KCV7ZWY66m0IGRldl9hcGkg66qo65Oc7JeQ7IScIFZpdGUg7Ya17ZWp7J2EIOu5hO2ZnOyEse2ZlO2VoCDsiJgg7J6I7Iq164uI64ukLlxuICAgICAgY29uc3QgZGlzYWJsZUludGVncmF0ZWRXZWIgPSBwcm9jZXNzLmVudi5TT05BTVVfRElTQUJMRV9JTlRFR1JBVEVEX1dFQiA9PT0gXCJ5ZXNcIjtcbiAgICAgIGlmIChoYXNXZWIgJiYgIWRpc2FibGVJbnRlZ3JhdGVkV2ViKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuc2V0dXBEZXZTZXJ2ZXJXaXRoVml0ZShzZXJ2ZXIsIHdlYlBhdGgsIGNvbmZpZyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnNldHVwRGV2U2VydmVyKHNlcnZlciwgY29uZmlnKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8g7ZSE66Gc642V7IWYIO2ZmOqyvTog6rCc67OEIEFQSSDrnbzsmrDtirggKyDsoJXsoIEg7YyM7J28IOyEnOu5mVxuICAgICAgZm9yIChjb25zdCBhcGkgb2YgdGhpcy5zeW5jZXIuYXBpcykge1xuICAgICAgICBpZiAodGhpcy5zeW5jZXIubW9kZWxzW2FwaS5tb2RlbE5hbWVdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYOygleydmOuQmOyngCDslYrsnYAg66qo64247JeQIOygkeq3vCAke2FwaS5tb2RlbE5hbWV9YCk7XG4gICAgICAgIH1cblxuICAgICAgICBzZXJ2ZXIucm91dGUoe1xuICAgICAgICAgIG1ldGhvZDogYXBpLm9wdGlvbnMuaHR0cE1ldGhvZCA/PyBcIkdFVFwiLFxuICAgICAgICAgIHVybDogdGhpcy5jb25maWcuYXBpLnJvdXRlLnByZWZpeCArIGFwaS5wYXRoLFxuICAgICAgICAgIGhhbmRsZXI6IHRoaXMuY3JlYXRlQXBpSGFuZGxlcihhcGksIGNvbmZpZyksXG4gICAgICAgICAgY29tcHJlc3M6IHRvRmFzdGlmeUNvbXByZXNzT3B0aW9uKGFwaS5vcHRpb25zLmNvbXByZXNzLCBnbG9iYWxDb21wcmVzc09wdGlvbnMpLFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgLy8g7ZSE66Gc642V7IWY7JeQ7ISc64qUIHdlYiDshozsiqQoYXBwUm9vdC93ZWIpIOycoOustOyZgCDrrLTqtIDtlZjqsowsXG4gICAgICAvLyBhcGkvd2ViLWRpc3Qg7KG07J6sIOyXrOu2gOulvCBzZXR1cFN0YXRpY1dlYlNlcnZlciDrgrTrtoDsl5DshJwg7YyQ64uo7ZWp64uI64ukLlxuICAgICAgYXdhaXQgdGhpcy5zZXR1cFN0YXRpY1dlYlNlcnZlcihzZXJ2ZXIsIGNvbmZpZywgZ2xvYmFsQ29tcHJlc3NPcHRpb25zKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogZGV2IOuqqOuTnCDqs7XthrU6IGNhdGNoLWFsbOyXkOyEnCBzeW5jZXIuYXBpc+ulvCDrj5nsoIHsnLzroZwg7YOQ7IOJ7ZWY7JesIEFQSSDsmpTssq3snYQg7LKY66as7ZWp64uI64ukLlxuICAgKiBzZXJ2ZXIucm91dGUoKeuhnCDqsJzrs4Qg65Ox66Gd7ZWY66m0IGhhbmRsZXLqsIAg6rOg7KCV65CY7Ja0IEhNUuydtCDrj5nsnpHtlZjsp4Ag7JWK7Jy866+A66GcLFxuICAgKiDrp6Qg7JqU7LKt66eI64ukIHN5bmNlci5hcGlz66W8IOyhsO2ajO2VmOuKlCDsnbQg67Cp7Iud7J2EIOyCrOyaqe2VqeuLiOuLpC5cbiAgICpcbiAgICog7JqU7LKt7J20IC9hcGko7KCV7ZmV7Z6I64qUIHRoaXMuY29uZmlnLmFwaS5yb3V0ZS5wcmVmaXgp66GcIOyLnOyeke2VmOyngCDslYrripQg6rK97Jqw652866m0IG51bGzsnYQg67CY7ZmY7ZWY66mwIOuBneuDheuLiOuLpC5cbiAgICovXG4gIHByaXZhdGUgaGFuZGxlRGV2QXBpUmVxdWVzdChcbiAgICByZXF1ZXN0OiBGYXN0aWZ5UmVxdWVzdCxcbiAgICBjb25maWc6IFNvbmFtdUZhc3RpZnlDb25maWcsXG4gICk6ICgocmVxdWVzdDogRmFzdGlmeVJlcXVlc3QsIHJlcGx5OiBGYXN0aWZ5UmVwbHkpID0+IFByb21pc2U8dW5rbm93bj4pIHwgbnVsbCB7XG4gICAgY29uc3QgdXJsID0gdGhpcy5nZXRQYXRobmFtZUZyb21VcmwocmVxdWVzdC51cmwpO1xuICAgIGNvbnN0IG1ldGhvZCA9IHJlcXVlc3QubWV0aG9kO1xuXG4gICAgaWYgKCF1cmwuc3RhcnRzV2l0aCh0aGlzLmNvbmZpZy5hcGkucm91dGUucHJlZml4KSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLy8gc3luY2VyLmFwaXPsnZggcGF0aOuKlCA6cGFyYW0g7ZiV7YOc66W8IO2PrO2VqO2VoCDsiJgg7J6I7Jy866+A66GcIOyEuOq3uOuovO2KuCDri6jsnITroZwg66ek7Lmt7ZWp64uI64ukLlxuICAgIC8vIOygleq3nOyLnSDsg53shLEg67Cp7Iud7J2AIHBhdGgg66y47J6Q7Je0IOuCtCDtirnsiJjrrLjsnpAoLiwgKywgKCwgWyDrk7Ep66GcIOyYpOyekeuPme2VoCDsiJgg7J6I7Ja0IOyCrOyaqe2VmOyngCDslYrsirXri4jri6QuXG4gICAgY29uc3QgbWF0Y2hlZEFwaSA9IHRoaXMuc3luY2VyLmFwaXMuZmluZCgoYXBpKSA9PiB7XG4gICAgICBpZiAodGhpcy5zeW5jZXIubW9kZWxzW2FwaS5tb2RlbE5hbWVdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgY29uc3QgYXBpTWV0aG9kID0gYXBpLm9wdGlvbnMuaHR0cE1ldGhvZCA/PyBcIkdFVFwiO1xuICAgICAgaWYgKGFwaU1ldGhvZCAhPT0gbWV0aG9kKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgIGNvbnN0IGZ1bGxQYXRoID0gdGhpcy5jb25maWcuYXBpLnJvdXRlLnByZWZpeCArIGFwaS5wYXRoO1xuICAgICAgcmV0dXJuIHRoaXMuaXNQYXRoUGF0dGVybk1hdGNoKGZ1bGxQYXRoLCB1cmwpO1xuICAgIH0pO1xuXG4gICAgaWYgKCFtYXRjaGVkQXBpKSB7XG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRFeGNlcHRpb24oU0QoXCJlcnJvci5hcGkubm90Rm91bmRcIikpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmNyZWF0ZUFwaUhhbmRsZXIobWF0Y2hlZEFwaSwgY29uZmlnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBkZXYgYXBpIOuqqOuTnDogVml0ZSDsl4bsnbQgQVBJIOuPmeyggSDrnbzsmrDtjIXrp4wg7KCc6rO17ZWp64uI64ukLlxuICAgKiBITVLsnYQg7JyE7ZW0IGNhdGNoLWFsbOyXkOyEnCDrp6Qg7JqU7LKt66eI64ukIHN5bmNlci5hcGlz66W8IOyhsO2ajO2VqeuLiOuLpC5cbiAgICovXG4gIHByaXZhdGUgc2V0dXBEZXZTZXJ2ZXIoXG4gICAgc2VydmVyOiBGYXN0aWZ5SW5zdGFuY2U8U2VydmVyLCBJbmNvbWluZ01lc3NhZ2UsIFNlcnZlclJlc3BvbnNlPixcbiAgICBjb25maWc6IFNvbmFtdUZhc3RpZnlDb25maWcsXG4gICk6IHZvaWQge1xuICAgIHNlcnZlci5yb3V0ZSh7XG4gICAgICBtZXRob2Q6IFtcIkdFVFwiLCBcIkhFQURcIiwgXCJQT1NUXCIsIFwiUFVUXCIsIFwiREVMRVRFXCIsIFwiUEFUQ0hcIl0sXG4gICAgICB1cmw6IGAke3RoaXMuY29uZmlnLmFwaS5yb3V0ZS5wcmVmaXh9LypgLFxuICAgICAgaGFuZGxlcjogYXN5bmMgKHJlcXVlc3QsIHJlcGx5KSA9PiB7XG4gICAgICAgIGNvbnN0IGhhbmRsZXIgPSB0aGlzLmhhbmRsZURldkFwaVJlcXVlc3QocmVxdWVzdCwgY29uZmlnKTtcbiAgICAgICAgaWYgKGhhbmRsZXIpIHtcbiAgICAgICAgICByZXR1cm4gaGFuZGxlcihyZXF1ZXN0LCByZXBseSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8g65Ox66Gd65CcIEFQSeyZgCDsnbzsuZjtlZjsp4Ag7JWK64qUIOyalOyyreyXkCDrjIDtlZwgZmFsbGJhY2vsnoXri4jri6QuXG4gICAgICAgIHRocm93IG5ldyBOb3RGb3VuZEV4Y2VwdGlvbihTRChcImVycm9yLmFwaS5ub3RGb3VuZFwiKSk7XG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0V4cGxpY2l0QW55OiBWaXRlRGV2U2VydmVyIO2DgOyeheydhCDrj5nsoIHsnLzroZwg66Gc65Oc7ZW07JW8IO2VqFxuICBwcml2YXRlIHZpdGVTZXJ2ZXI6IGFueSA9IG51bGw7XG5cbiAgLyoqXG4gICAqIGRldiBhbGwg66qo65OcOiBWaXRlIERldiBTZXJ2ZXLrpbwg7Ya17ZWp7ZWY7JesIEFQSSArIFNTUiArIENTUuydhCDrqqjrkZAg7KCc6rO17ZWp64uI64ukLlxuICAgKiBBUEkg64+Z7KCBIOunpOy5reydgCBoYW5kbGVEZXZBcGlSZXF1ZXN066W8IOqzteycoO2VqeuLiOuLpC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgc2V0dXBEZXZTZXJ2ZXJXaXRoVml0ZShcbiAgICBzZXJ2ZXI6IEZhc3RpZnlJbnN0YW5jZTxTZXJ2ZXIsIEluY29taW5nTWVzc2FnZSwgU2VydmVyUmVzcG9uc2U+LFxuICAgIHdlYlBhdGg6IHN0cmluZyxcbiAgICBjb25maWc6IFNvbmFtdUZhc3RpZnlDb25maWcsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIEBmYXN0aWZ5L21pZGRpZSDrk7HroZ0gKENvbm5lY3Qtc3R5bGUgbWlkZGxld2FyZSDsp4Dsm5ApXG4gICAgYXdhaXQgc2VydmVyLnJlZ2lzdGVyKChhd2FpdCBpbXBvcnQoXCJAZmFzdGlmeS9taWRkaWVcIikpLmRlZmF1bHQpO1xuXG4gICAgY29uc3Qgdml0ZSA9IGF3YWl0IGltcG9ydChcInZpdGVcIik7XG5cbiAgICB0aGlzLnZpdGVTZXJ2ZXIgPSBhd2FpdCB2aXRlLmNyZWF0ZVNlcnZlcih7XG4gICAgICByb290OiB3ZWJQYXRoLFxuICAgICAgc2VydmVyOiB7XG4gICAgICAgIG1pZGRsZXdhcmVNb2RlOiB0cnVlLFxuICAgICAgICBobXI6IHtcbiAgICAgICAgICBzZXJ2ZXI6IHNlcnZlci5zZXJ2ZXIsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgYXBwVHlwZTogXCJjdXN0b21cIixcbiAgICB9KTtcblxuICAgIC8vIFZpdGUgbWlkZGxld2FyZSDrk7HroZ0gKFZpdGUg7JeQ7IWLIOyymOumrClcbiAgICBzZXJ2ZXIudXNlKChyZXEsIHJlcywgbmV4dCkgPT4ge1xuICAgICAgLy8gQVBJ7JmAIFNvbmFtdSBVSeuKlCBGYXN0aWZ5IOudvOyasO2KuOqwgCDsspjrpqztlZjrj4TroZ0gc2tpcFxuICAgICAgaWYgKHJlcS51cmw/LnN0YXJ0c1dpdGgodGhpcy5jb25maWcuYXBpLnJvdXRlLnByZWZpeCkgfHwgcmVxLnVybD8uc3RhcnRzV2l0aChcIi9zb25hbXUtdWlcIikpIHtcbiAgICAgICAgcmV0dXJuIG5leHQoKTtcbiAgICAgIH1cbiAgICAgIC8vIOuCmOuouOyngOuKlCBWaXRlIG1pZGRsZXdhcmXroZwg7KCE64usXG4gICAgICByZXR1cm4gdGhpcy52aXRlU2VydmVyLm1pZGRsZXdhcmVzKHJlcSwgcmVzLCBuZXh0KTtcbiAgICB9KTtcblxuICAgIC8vIGNhdGNoLWFsbCDrnbzsmrDtirjsl5DshJwg64+Z7KCB7Jy866GcIEFQSS9TU1Ig7LKY66asXG4gICAgLy8g6rCc67CcIO2ZmOqyveyXkOyEnOuKlCDrnbzsmrDtirjrs4QgY29tcHJlc3Mg7Ji17IWY7J2EIO2PrOq4sO2VmOqzoCBITVIg7J207KCQ7J2EIOy3qO2VqeuLiOuLpC5cbiAgICBzZXJ2ZXIucm91dGUoe1xuICAgICAgbWV0aG9kOiBbXCJHRVRcIiwgXCJIRUFEXCIsIFwiUE9TVFwiLCBcIlBVVFwiLCBcIkRFTEVURVwiLCBcIlBBVENIXCJdLFxuICAgICAgdXJsOiBcIi8qXCIsXG4gICAgICBoYW5kbGVyOiBhc3luYyAocmVxdWVzdCwgcmVwbHkpID0+IHtcbiAgICAgICAgLy8gMS4gQVBJIOyalOyyrSDsspjrpqxcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5oYW5kbGVEZXZBcGlSZXF1ZXN0KHJlcXVlc3QsIGNvbmZpZyk7XG4gICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0KHJlcXVlc3QsIHJlcGx5KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHVybCA9IHJlcXVlc3QudXJsO1xuXG4gICAgICAgIC8vIDIuIFNTUiDrnbzsmrDtirgg7LKY66asXG4gICAgICAgIGNvbnN0IHsgbWF0Y2hTU1JSb3V0ZSwgcmVuZGVyU1NSIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi9zc3JcIik7XG4gICAgICAgIGNvbnN0IHNzck1hdGNoID0gbWF0Y2hTU1JSb3V0ZSh1cmwpO1xuICAgICAgICBpZiAoc3NyTWF0Y2gpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhgW1NTUl0gTWF0Y2hlZCByb3V0ZTogJHtzc3JNYXRjaC5yb3V0ZS5wYXRofWApO1xuICAgICAgICAgIGNvbnN0IGh0bWwgPSBhd2FpdCByZW5kZXJTU1IoXG4gICAgICAgICAgICB1cmwsXG4gICAgICAgICAgICBzc3JNYXRjaC5yb3V0ZSxcbiAgICAgICAgICAgIHNzck1hdGNoLnBhcmFtcyxcbiAgICAgICAgICAgIHJlcXVlc3QsXG4gICAgICAgICAgICByZXBseSxcbiAgICAgICAgICAgIGNvbmZpZyxcbiAgICAgICAgICAgIHRoaXMudml0ZVNlcnZlcixcbiAgICAgICAgICApO1xuICAgICAgICAgIHJlcGx5LnR5cGUoXCJ0ZXh0L2h0bWxcIik7XG4gICAgICAgICAgcmV0dXJuIGh0bWw7XG4gICAgICAgIH1cblxuICAgICAgICAvLyAzLiBDU1IgZmFsbGJhY2tcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBmcyA9IGF3YWl0IGltcG9ydChcIm5vZGU6ZnMvcHJvbWlzZXNcIik7XG4gICAgICAgICAgbGV0IHRlbXBsYXRlID0gYXdhaXQgZnMucmVhZEZpbGUoXG4gICAgICAgICAgICBwYXRoLmpvaW4odGhpcy52aXRlU2VydmVyLmNvbmZpZy5yb290LCBcImluZGV4Lmh0bWxcIiksXG4gICAgICAgICAgICBcInV0Zi04XCIsXG4gICAgICAgICAgKTtcbiAgICAgICAgICB0ZW1wbGF0ZSA9IGF3YWl0IHRoaXMudml0ZVNlcnZlci50cmFuc2Zvcm1JbmRleEh0bWwodXJsLCB0ZW1wbGF0ZSk7XG5cbiAgICAgICAgICByZXBseS50eXBlKFwidGV4dC9odG1sXCIpO1xuICAgICAgICAgIHJldHVybiB0ZW1wbGF0ZTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIHRoaXMudml0ZVNlcnZlci5zc3JGaXhTdGFja3RyYWNlKGUgYXMgRXJyb3IpO1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgICAgICAgcmVwbHkuc3RhdHVzKDUwMCk7XG4gICAgICAgICAgcmV0dXJuIChlIGFzIEVycm9yKS5tZXNzYWdlO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgLy8g7ISc67KEIOyiheujjCDsi5wgVml0ZeuPhCDsooXro4xcbiAgICBzZXJ2ZXIuYWRkSG9vayhcIm9uQ2xvc2VcIiwgYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgdGhpcy52aXRlU2VydmVyLmNsb3NlKCk7XG4gICAgfSk7XG5cbiAgICBjb25zb2xlLmxvZyhcIuKckyBWaXRlIGRldiBzZXJ2ZXIgaW50ZWdyYXRlZFwiKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgc2V0dXBTdGF0aWNXZWJTZXJ2ZXIoXG4gICAgc2VydmVyOiBGYXN0aWZ5SW5zdGFuY2U8U2VydmVyLCBJbmNvbWluZ01lc3NhZ2UsIFNlcnZlclJlc3BvbnNlPixcbiAgICBjb25maWc6IFNvbmFtdUZhc3RpZnlDb25maWcsXG4gICAgZ2xvYmFsQ29tcHJlc3NPcHRpb25zOiBDb21wcmVzc09wdGlvbnMgfCB1bmRlZmluZWQsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIOqyveuhnCDrqoXtmZXtmZQ6IGFwaS93ZWItZGlzdC9jbGllbnQgKOygleyggSDtjIzsnbwpLCBhcGkvd2ViLWRpc3Qvc2VydmVyIChTU1IgZW50cnkpLCBhcGkvZGlzdC9zc3IgKFNTUiByb3V0ZXMgLSBBUEkg7IaM7JygKVxuICAgIGNvbnN0IHdlYkRpc3RQYXRoID0gcGF0aC5qb2luKHRoaXMuYXBpUm9vdFBhdGgsIFwid2ViLWRpc3RcIiwgXCJjbGllbnRcIik7XG4gICAgY29uc3Qgc3NyUGF0aCA9IHBhdGguam9pbih0aGlzLmFwaVJvb3RQYXRoLCBcIndlYi1kaXN0XCIsIFwic2VydmVyXCIpO1xuICAgIGNvbnN0IHNzckVudHJ5UGF0aCA9IHBhdGguam9pbihzc3JQYXRoLCBcImVudHJ5LXNlcnZlci5nZW5lcmF0ZWQuanNcIik7XG4gICAgY29uc3Qgc3NyUm91dGVzUGF0aCA9IHBhdGguam9pbih0aGlzLmFwaVJvb3RQYXRoLCBcImRpc3RcIiwgXCJzc3JcIiwgXCJyb3V0ZXMuanNcIik7XG5cbiAgICBpZiAoIShhd2FpdCBleGlzdHMod2ViRGlzdFBhdGgpKSkge1xuICAgICAgY29uc29sZS53YXJuKGDimqAgV2ViIGRpc3Qgbm90IGZvdW5kOiAke3dlYkRpc3RQYXRofWApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFNTUiBlbnRyeSDsobTsnqwg7Jes67aAIO2ZleyduFxuICAgIGNvbnN0IHNzckF2YWlsYWJsZSA9IGF3YWl0IGV4aXN0cyhzc3JFbnRyeVBhdGgpO1xuXG4gICAgaWYgKCFzc3JBdmFpbGFibGUpIHtcbiAgICAgIGNvbnNvbGUud2Fybihg4pqgIFNTUiBlbnRyeSBub3QgZm91bmQ6ICR7c3NyRW50cnlQYXRofWApO1xuICAgICAgY29uc29sZS53YXJuKFwiICBTU1Igd2lsbCBiZSBkaXNhYmxlZC4gT25seSBDU1Igd2lsbCB3b3JrLlwiKTtcbiAgICB9XG5cbiAgICAvLyBTU1Ig65287Jqw7Yq4IOuhnOuTnCAocHJvZHVjdGlvbuyXkOyEnOunjCwg7IKs7Jqp7J6QIO2UhOuhnOygne2KuOydmCBzc3Ivcm91dGVzLnRzKVxuICAgIGlmIChzc3JBdmFpbGFibGUpIHtcbiAgICAgIGlmIChhd2FpdCBleGlzdHMoc3NyUm91dGVzUGF0aCkpIHtcbiAgICAgICAgLy8gdHMtbG9hZGVy652866m0IFwiZmlsZTovL1wi66GcIOyLnOyeke2VmOuKlCBmdWxseS1yZXNvbHZlZCBwYXRo66eMIOuwm+q4sOyXkCDsnbTrpbwg7LKY66as7ZW07KO864qUIGltcG9ydE1lbWJlcnPrpbwg7IKs7Jqp7ZW07JW8IO2WiOqyoOyngOunjCxcbiAgICAgICAgLy8g7Jes6riw64qUIO2UhOuhnOuNleyFmCDtmZjqsr3sl5DshJwgbG9hZGVyIOyXhuydtCDrj4zslYTqsIDquLAg65WM66y47JeQIFwi7KeE7KecIGpzIO2MjOydvFwi7J2YIFwi6re464OlXCIg7KCI64yA6rK966Gc66W8IOuwlOuhnCBpbXBvcnTtlbTrj4Qg65Cp64uI64ukLlxuICAgICAgICAvLyDsnbQg64K07Jqp7J2AIOydtCDtlajsiJgg64K07JeQ7IScIOyVhOuemOyXkCDrgpjsmKwg64uk66W4IGltcG9ydCDtmLjstpzsl5Drj4Qg64+Z7J287ZWY6rKMIOyggeyaqeuQqeuLiOuLpC5cbiAgICAgICAgYXdhaXQgaW1wb3J0KHNzclJvdXRlc1BhdGgpO1xuICAgICAgICBjb25zb2xlLmxvZyhcIuKckyBTU1Igcm91dGVzIGxvYWRlZFwiKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUud2Fybihg4pqgIFNTUiByb3V0ZXMgbm90IGZvdW5kOiAke3NzclJvdXRlc1BhdGh9YCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8g66Gk66eBIOyXheuNsOydtO2KuCDrjIDsnZE6IGFzc2V0IGhhc2gg67aI7J287LmYIOyLnCDtmITsnqwg67KE7KCEIOyngeygkSDshJzruZlcbiAgICBzZXJ2ZXIuZ2V0KFwiL2Fzc2V0cy86ZmlsZW5hbWVcIiwgYXN5bmMgKHJlcXVlc3QsIHJlcGx5KSA9PiB7XG4gICAgICBjb25zdCByZXF1ZXN0ZWRGaWxlID0gKHJlcXVlc3QucGFyYW1zIGFzIHsgZmlsZW5hbWU6IHN0cmluZyB9KS5maWxlbmFtZTtcbiAgICAgIGNvbnN0IGFzc2V0c0RpciA9IHBhdGguam9pbih3ZWJEaXN0UGF0aCwgXCJhc3NldHNcIik7XG4gICAgICBjb25zdCBzYWZlRmlsZVBhdGggPSB0aGlzLnJlc29sdmVQYXRoV2l0aGluQmFzZURpcihhc3NldHNEaXIsIHJlcXVlc3RlZEZpbGUpO1xuICAgICAgaWYgKHNhZmVGaWxlUGF0aCA9PT0gbnVsbCkge1xuICAgICAgICByZXBseS5zdGF0dXMoNDAzKS5zZW5kKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWRSZXF1ZXN0ZWRGaWxlID0gcGF0aC5yZWxhdGl2ZShhc3NldHNEaXIsIHNhZmVGaWxlUGF0aCkucmVwbGFjZSgvXFxcXC9nLCBcIi9cIik7XG5cbiAgICAgIGNvbnN0IGFzc2V0UGF0aCA9IGAvYXNzZXRzLyR7bm9ybWFsaXplZFJlcXVlc3RlZEZpbGV9YDtcblxuICAgICAgLy8gQ2FjaGUtQ29udHJvbCDtl6TrjZQg6rKw7KCVXG4gICAgICBjb25zdCBnZXRDYWNoZUNvbnRyb2xGb3JBc3NldCA9ICgpOiBDYWNoZUNvbnRyb2xDb25maWcgPT4ge1xuICAgICAgICBjb25zdCBjYWNoZVJlcTogQ2FjaGVDb250cm9sUmVxdWVzdCA9IHtcbiAgICAgICAgICB0eXBlOiBcImFzc2V0c1wiLFxuICAgICAgICAgIHVybDogcmVxdWVzdC51cmwsXG4gICAgICAgICAgcGF0aDogYXNzZXRQYXRoLFxuICAgICAgICAgIG1ldGhvZDogcmVxdWVzdC5tZXRob2QsXG4gICAgICAgIH07XG5cbiAgICAgICAgLy8g7IKs7Jqp7J6QIOygleydmCDtlbjrk6Trn6wg7Jqw7ISgXG4gICAgICAgIGlmIChjb25maWcuY2FjaGVDb250cm9sSGFuZGxlcikge1xuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGNvbmZpZy5jYWNoZUNvbnRyb2xIYW5kbGVyKGNhY2hlUmVxKTtcbiAgICAgICAgICBpZiAocmVzdWx0KSByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8g6riw67O46rCSOiBpbW11dGFibGVcbiAgICAgICAgcmV0dXJuIENhY2hlUHJlc2V0cy5pbW11dGFibGU7XG4gICAgICB9O1xuXG4gICAgICAvLyBpbmRleC0qLmpzIOuYkOuKlCBpbmRleC0qLmNzcyDsmpTssq3snbgg6rK97JqwXG4gICAgICBpZiAoL15pbmRleC1bYS1mMC05XStcXC4oanN8Y3NzKSQvLnRlc3Qobm9ybWFsaXplZFJlcXVlc3RlZEZpbGUpKSB7XG4gICAgICAgIGNvbnN0IGV4dCA9IG5vcm1hbGl6ZWRSZXF1ZXN0ZWRGaWxlLnNwbGl0KFwiLlwiKS5wb3AoKTtcbiAgICAgICAgY29uc3QgZmlsZXMgPSBhd2FpdCBmcy5yZWFkZGlyKGFzc2V0c0Rpcik7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRGaWxlID0gZmlsZXMuZmluZCgoZikgPT4gZi5zdGFydHNXaXRoKFwiaW5kZXgtXCIpICYmIGYuZW5kc1dpdGgoYC4ke2V4dH1gKSk7XG5cbiAgICAgICAgaWYgKGN1cnJlbnRGaWxlKSB7XG4gICAgICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4oYXNzZXRzRGlyLCBjdXJyZW50RmlsZSk7XG4gICAgICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzLnJlYWRGaWxlKGZpbGVQYXRoKTtcbiAgICAgICAgICByZXBseS50eXBlKGV4dCA9PT0gXCJqc1wiID8gXCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0XCIgOiBcInRleHQvY3NzXCIpO1xuICAgICAgICAgIGFwcGx5Q2FjaGVIZWFkZXJzKHJlcGx5LCBnZXRDYWNoZUNvbnRyb2xGb3JBc3NldCgpKTtcbiAgICAgICAgICByZXR1cm4gcmVwbHkuc2VuZChjb250ZW50KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyDsnbzrsJgg7YyM7J28IOyEnOu5mVxuICAgICAgY29uc3QgZmlsZVBhdGggPSBzYWZlRmlsZVBhdGg7XG4gICAgICBpZiAoYXdhaXQgZXhpc3RzKGZpbGVQYXRoKSkge1xuICAgICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgZnMucmVhZEZpbGUoZmlsZVBhdGgpO1xuICAgICAgICBjb25zdCBleHQgPSBub3JtYWxpemVkUmVxdWVzdGVkRmlsZS5zcGxpdChcIi5cIikucG9wKCk7XG4gICAgICAgIHJlcGx5LnR5cGUoZXh0ID09PSBcImpzXCIgPyBcImFwcGxpY2F0aW9uL2phdmFzY3JpcHRcIiA6IGV4dCA9PT0gXCJjc3NcIiA/IFwidGV4dC9jc3NcIiA6IFwiXCIpO1xuICAgICAgICBpZiAobm9ybWFsaXplZFJlcXVlc3RlZEZpbGUuaW5jbHVkZXMoXCItXCIpKSB7XG4gICAgICAgICAgYXBwbHlDYWNoZUhlYWRlcnMocmVwbHksIGdldENhY2hlQ29udHJvbEZvckFzc2V0KCkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXBseS5zZW5kKGNvbnRlbnQpO1xuICAgICAgfVxuXG4gICAgICByZXBseS5zdGF0dXMoNDA0KS5zZW5kKCk7XG4gICAgfSk7XG5cbiAgICAvLyBTU1Ig65287Jqw7Yq4IOqwnOuzhCDrk7HroZ0gKGNvbXByZXNzIOyYteyFmOydtCDrnbzsmrDtirjrs4TroZwg7KCB7Jqp65CY64+E66GdKVxuICAgIGlmIChzc3JBdmFpbGFibGUpIHtcbiAgICAgIGNvbnN0IHsgZ2V0U1NSUm91dGVzIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi9zc3JcIik7XG4gICAgICBjb25zdCB7IHJlbmRlclNTUiB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vc3NyL3JlbmRlcmVyXCIpO1xuICAgICAgY29uc3Qgc3NyUm91dGVzID0gZ2V0U1NSUm91dGVzKCk7XG5cbiAgICAgIGZvciAoY29uc3Qgcm91dGUgb2Ygc3NyUm91dGVzKSB7XG4gICAgICAgIHNlcnZlci5yb3V0ZSh7XG4gICAgICAgICAgbWV0aG9kOiBbXCJHRVRcIiwgXCJIRUFEXCJdLFxuICAgICAgICAgIHVybDogcm91dGUucGF0aCxcbiAgICAgICAgICBjb21wcmVzczogdG9GYXN0aWZ5Q29tcHJlc3NPcHRpb24ocm91dGUuY29tcHJlc3MgPz8gdHJ1ZSwgZ2xvYmFsQ29tcHJlc3NPcHRpb25zKSxcbiAgICAgICAgICBoYW5kbGVyOiBhc3luYyAocmVxdWVzdCwgcmVwbHkpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHVybCA9IHJlcXVlc3QudXJsO1xuICAgICAgICAgICAgY29uc29sZS5sb2coYFtTU1JdIE1hdGNoZWQgcm91dGU6ICR7cm91dGUucGF0aH1gKTtcblxuICAgICAgICAgICAgY29uc3QgcGFyYW1zID0gdGhpcy5leHRyYWN0UGF0aFBhcmFtcyhyb3V0ZS5wYXRoLCB1cmwpO1xuICAgICAgICAgICAgY29uc3QgaHRtbCA9IGF3YWl0IHJlbmRlclNTUih1cmwsIHJvdXRlLCBwYXJhbXMsIHJlcXVlc3QsIHJlcGx5LCBjb25maWcpO1xuXG4gICAgICAgICAgICByZXBseS50eXBlKFwidGV4dC9odG1sXCIpO1xuICAgICAgICAgICAgcmV0dXJuIGh0bWw7XG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ1NSIG9yIFN0YXRpYyBGaWxlIEZhbGxiYWNrIChTU1Ig65287Jqw7Yq47JeQIOunpOy5reuQmOyngCDslYrripQg66qo65OgIOyalOyyrSlcbiAgICBzZXJ2ZXIucm91dGUoe1xuICAgICAgbWV0aG9kOiBbXCJHRVRcIiwgXCJIRUFEXCJdLFxuICAgICAgdXJsOiBcIipcIixcbiAgICAgIGhhbmRsZXI6IGFzeW5jIChyZXF1ZXN0LCByZXBseSkgPT4ge1xuICAgICAgICAvLyAvYXBpLCAvc29uYW11LXVp64qUIDQwNCDqt7jrjIDroZxcbiAgICAgICAgaWYgKHJlcXVlc3QudXJsLnN0YXJ0c1dpdGgoXCIvYXBpXCIpIHx8IHJlcXVlc3QudXJsLnN0YXJ0c1dpdGgoXCIvc29uYW11LXVpXCIpKSB7XG4gICAgICAgICAgcmVwbHkuc3RhdHVzKDQwNCkuc2VuZCgpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENTUuyaqSBDYWNoZS1Db250cm9sIO2XpOuNlCDshKTsoJVcbiAgICAgICAgaWYgKGNvbmZpZy5jYWNoZUNvbnRyb2xIYW5kbGVyKSB7XG4gICAgICAgICAgY29uc3QgY3NyQ2FjaGVSZXE6IENhY2hlQ29udHJvbFJlcXVlc3QgPSB7XG4gICAgICAgICAgICB0eXBlOiBcImNzclwiLFxuICAgICAgICAgICAgdXJsOiByZXF1ZXN0LnVybCxcbiAgICAgICAgICAgIHBhdGg6IHJlcXVlc3QudXJsLnNwbGl0KFwiP1wiKVswXSxcbiAgICAgICAgICAgIG1ldGhvZDogcmVxdWVzdC5tZXRob2QsXG4gICAgICAgICAgfTtcbiAgICAgICAgICBjb25zdCBjc3JDYWNoZUNvbmZpZyA9IGNvbmZpZy5jYWNoZUNvbnRyb2xIYW5kbGVyKGNzckNhY2hlUmVxKTtcblxuICAgICAgICAgIGlmIChjc3JDYWNoZUNvbmZpZykge1xuICAgICAgICAgICAgYXBwbHlDYWNoZUhlYWRlcnMocmVwbHksIGNzckNhY2hlQ29uZmlnKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyDsoJXsoIEg7YyM7J287J20IOyhtOyerO2VoCDqsr3smrAsIOygleyggSDtjIzsnbzsnYQg66i87KCAIOyEnOu5me2VtOyVvO2VqFxuICAgICAgICBjb25zdCByZXF1ZXN0UGF0aCA9IHRoaXMuZ2V0UGF0aG5hbWVGcm9tVXJsKHJlcXVlc3QudXJsKTtcbiAgICAgICAgY29uc3Qgc2FmZUZpbGVQYXRoID0gdGhpcy5yZXNvbHZlUGF0aFdpdGhpbkJhc2VEaXIod2ViRGlzdFBhdGgsIHJlcXVlc3RQYXRoKTtcbiAgICAgICAgaWYgKHNhZmVGaWxlUGF0aCA9PT0gbnVsbCkge1xuICAgICAgICAgIHJlcGx5LnN0YXR1cyg0MDMpLnNlbmQoKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGF3YWl0IGZpbGVFeGlzdHMoc2FmZUZpbGVQYXRoKSkge1xuICAgICAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmcy5yZWFkRmlsZShzYWZlRmlsZVBhdGgpO1xuICAgICAgICAgIHJldHVybiByZXBseS50eXBlKG1pbWVMb29rdXAoc2FmZUZpbGVQYXRoKSB8fCBcImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbVwiKS5zZW5kKGNvbnRlbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ1NSIGZhbGxiYWNrOiBpbmRleC5odG1sIOyEnOu5mVxuICAgICAgICBjb25zdCBpbmRleFBhdGggPSBwYXRoLmpvaW4od2ViRGlzdFBhdGgsIFwiaW5kZXguaHRtbFwiKTtcbiAgICAgICAgcmV0dXJuIHJlcGx5LnR5cGUoXCJ0ZXh0L2h0bWxcIikuc2VuZChhd2FpdCBmcy5yZWFkRmlsZShpbmRleFBhdGgsIFwidXRmLThcIikpO1xuICAgICAgfSxcbiAgICB9KTtcblxuICAgIGNvbnNvbGUubG9nKGDinJMgU3RhdGljIHdlYiBzZXJ2ZXIgY29uZmlndXJlZCB3aXRoICR7c3NyQXZhaWxhYmxlID8gXCJTU1JcIiA6IFwiQ1NSIG9ubHlcIn0gc3VwcG9ydGApO1xuICB9XG5cbiAgY3JlYXRlQXBpSGFuZGxlcihcbiAgICBhcGk6IEV4dGVuZGVkQXBpLFxuICAgIGNvbmZpZzogU29uYW11RmFzdGlmeUNvbmZpZyxcbiAgKTogKHJlcXVlc3Q6IEZhc3RpZnlSZXF1ZXN0LCByZXBseTogRmFzdGlmeVJlcGx5KSA9PiBQcm9taXNlPHVua25vd24+IHtcbiAgICByZXR1cm4gYXN5bmMgKHJlcXVlc3Q6IEZhc3RpZnlSZXF1ZXN0LCByZXBseTogRmFzdGlmeVJlcGx5KTogUHJvbWlzZTx1bmtub3duPiA9PiB7XG4gICAgICAvLyBDb250ZXh0IOyDneyEsVxuICAgICAgY29uc3QgY29udGV4dDogQ29udGV4dCA9IGF3YWl0IHRoaXMuY3JlYXRlQ29udGV4dChjb25maWcsIHJlcXVlc3QsIHJlcGx5KTtcblxuICAgICAgcmV0dXJuIHRoaXMuYXN5bmNMb2NhbFN0b3JhZ2UucnVuKHsgY29udGV4dCB9LCBhc3luYyAoKSA9PiB7XG4gICAgICAgIC8vIGd1YXJkcyDsspjrpqxcbiAgICAgICAgKGFwaS5vcHRpb25zLmd1YXJkcyA/PyBbXSkuZXZlcnkoKGd1YXJkKSA9PiBjb25maWcuZ3VhcmRIYW5kbGVyKGd1YXJkLCByZXF1ZXN0LCBhcGkpKTtcblxuICAgICAgICAvLyDtjIzrnbzrr7jthLAg7KCV67O066GcIHpvZCDsiqTtgqTrp4gg67mM65OcXG4gICAgICAgIGNvbnN0IHsgZ2V0Wm9kT2JqZWN0RnJvbUFwaSB9ID0gYXdhaXQgaW1wb3J0KFwiLi9jb2RlLWNvbnZlcnRlcnNcIik7XG4gICAgICAgIGNvbnN0IFJlcVR5cGUgPSBnZXRab2RPYmplY3RGcm9tQXBpKGFwaSwgdGhpcy5zeW5jZXIudHlwZXMpO1xuXG4gICAgICAgIC8vIHJlcXVlc3Qg7YyM7IuxXG4gICAgICAgIGNvbnN0IHdoaWNoID0gYXBpLm9wdGlvbnMuaHR0cE1ldGhvZCA9PT0gXCJHRVRcIiA/IFwicXVlcnlcIiA6IFwiYm9keVwiO1xuICAgICAgICBsZXQgcmVxQm9keToge1xuICAgICAgICAgIFtrZXk6IHN0cmluZ106IHVua25vd247XG4gICAgICAgIH07XG4gICAgICAgIC8vIO2MjOydvCDsl4XroZzrk5wg7J6I64qUIOqyveyasCDsnoTsi5wg642w7J207YSwXG4gICAgICAgIGNvbnN0IGZpbGVzOiB7XG4gICAgICAgICAgYnVmZmVyZWRGaWxlczogQnVmZmVyZWRGaWxlW107XG4gICAgICAgICAgdXBsb2FkZWRGaWxlczogVXBsb2FkZWRGaWxlW107XG4gICAgICAgIH0gPSB7XG4gICAgICAgICAgYnVmZmVyZWRGaWxlczogW10sXG4gICAgICAgICAgdXBsb2FkZWRGaWxlczogW10sXG4gICAgICAgIH07XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBib2R5ID0gKHJlcXVlc3Rbd2hpY2hdID8/IHt9KSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICAgICAgICBpZiAoYXBpLnVwbG9hZE9wdGlvbnMpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhcnRzID0gcmVxdWVzdC5wYXJ0cyh7XG4gICAgICAgICAgICAgIGxpbWl0czogYXBpLnVwbG9hZE9wdGlvbnMubGltaXRzLFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIC8vIEZvcm1EYXRh7J2YIGZpZWxk65Ok7J2EIOyehOyLnOuhnCDsoIDsnqVcbiAgICAgICAgICAgIGNvbnN0IGZpZWxkczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuXG4gICAgICAgICAgICBpZiAoYXBpLnVwbG9hZE9wdGlvbnMuY29uc3VtZSA9PT0gXCJidWZmZXJcIiB8fCAhYXBpLnVwbG9hZE9wdGlvbnMuY29uc3VtZSkge1xuICAgICAgICAgICAgICAvLyBCdWZmZXIg66qo65OcOiDrqZTrqqjrpqzsl5Ag66Gc65OcXG4gICAgICAgICAgICAgIGZvciBhd2FpdCAoY29uc3QgcGFydCBvZiBwYXJ0cykge1xuICAgICAgICAgICAgICAgIGlmIChwYXJ0LnR5cGUgPT09IFwiZmlsZVwiKSB7XG4gICAgICAgICAgICAgICAgICAvLyBDUklUSUNBTDog7YyM7J28IOyKpO2KuOumvOydhCDsponsi5wgY29uc3VtZe2VtOyVvCDri6TsnYwgcGFydOuhnCDrhJjslrTqsIgg7IiYIOyeiOydjFxuICAgICAgICAgICAgICAgICAgLy8g7J20IO2YuOy2nOydtCDsl4bsnLzrqbQg7KKF7KKFIG11bHRpcGFydCDtjIzsi7HsnbQgcGVuZGluZyDsg4Htg5zroZwg7YOA7J6E7JWE7JuDIOuwnOyDnVxuICAgICAgICAgICAgICAgICAgY29uc3QgYnVmZmVyID0gYXdhaXQgcGFydC50b0J1ZmZlcigpO1xuICAgICAgICAgICAgICAgICAgZmlsZXMuYnVmZmVyZWRGaWxlcy5wdXNoKG5ldyBCdWZmZXJlZEZpbGUocGFydCwgYnVmZmVyKSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwYXJ0LnR5cGUgPT09IFwiZmllbGRcIikge1xuICAgICAgICAgICAgICAgICAgZmllbGRzW3BhcnQuZmllbGRuYW1lXSA9IFN0cmluZyhwYXJ0LnZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoYXBpLnVwbG9hZE9wdGlvbnMuY29uc3VtZSA9PT0gXCJzdHJlYW1cIikge1xuICAgICAgICAgICAgICAvLyBTdHJlYW0g66qo65OcOiDsponsi5wg7KCA7J6l7IaM66GcIOyKpO2KuOumrOuwjVxuICAgICAgICAgICAgICBjb25zdCBkaXNrTmFtZSA9IGFwaS51cGxvYWRPcHRpb25zLmRlc3RpbmF0aW9uO1xuICAgICAgICAgICAgICBjb25zdCBkaXNrID0gdGhpcy5zdG9yYWdlLnVzZShkaXNrTmFtZSk7XG5cbiAgICAgICAgICAgICAgLy8g7Jqw7ISg7Iic7JyEOiDrjbDsvZTroIjsnbTthLAgPiDsoITsl60g7ISk7KCVID4g6riw67O46rCSXG4gICAgICAgICAgICAgIGNvbnN0IGtleUdlbmVyYXRvcjogS2V5R2VuZXJhdG9yID1cbiAgICAgICAgICAgICAgICBhcGkudXBsb2FkT3B0aW9ucy5rZXlHZW5lcmF0b3IgPz9cbiAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZy5zZXJ2ZXIuc3RvcmFnZT8ua2V5R2VuZXJhdG9yID8/XG4gICAgICAgICAgICAgICAgZGVmYXVsdEtleUdlbmVyYXRvcjtcblxuICAgICAgICAgICAgICBmb3IgYXdhaXQgKGNvbnN0IHBhcnQgb2YgcGFydHMpIHtcbiAgICAgICAgICAgICAgICBpZiAocGFydC50eXBlID09PSBcImZpbGVcIikge1xuICAgICAgICAgICAgICAgICAgY29uc3Qga2V5ID0gYXdhaXQga2V5R2VuZXJhdG9yKHtcbiAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWU6IHBhcnQuZmlsZW5hbWUsXG4gICAgICAgICAgICAgICAgICAgIG1pbWV0eXBlOiBwYXJ0Lm1pbWV0eXBlLFxuICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgIGF3YWl0IGRpc2sucHV0U3RyZWFtKGtleSwgcGFydC5maWxlLCB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnRUeXBlOiBwYXJ0Lm1pbWV0eXBlLFxuICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgIGNvbnN0IHVybCA9IGF3YWl0IGRpc2suZ2V0VXJsKGtleSk7XG4gICAgICAgICAgICAgICAgICBjb25zdCBzaWduZWRVcmwgPSBhd2FpdCBkaXNrLmdldFNpZ25lZFVybChrZXkpO1xuXG4gICAgICAgICAgICAgICAgICBmaWxlcy51cGxvYWRlZEZpbGVzLnB1c2goXG4gICAgICAgICAgICAgICAgICAgIG5ldyBVcGxvYWRlZEZpbGUoe1xuICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lOiBwYXJ0LmZpbGVuYW1lLFxuICAgICAgICAgICAgICAgICAgICAgIG1pbWV0eXBlOiBwYXJ0Lm1pbWV0eXBlLFxuICAgICAgICAgICAgICAgICAgICAgIHNpemU6IHBhcnQuZmlsZS5ieXRlc1JlYWQsXG4gICAgICAgICAgICAgICAgICAgICAgdXJsLFxuICAgICAgICAgICAgICAgICAgICAgIHNpZ25lZFVybCxcbiAgICAgICAgICAgICAgICAgICAgICBrZXksXG4gICAgICAgICAgICAgICAgICAgICAgZGlza05hbWUsXG4gICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBhcnQudHlwZSA9PT0gXCJmaWVsZFwiKSB7XG4gICAgICAgICAgICAgICAgICBmaWVsZHNbcGFydC5maWVsZG5hbWVdID0gU3RyaW5nKHBhcnQudmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBxc+uhnCDspJHssqkg6rWs7KGwIO2MjOyLsTogcGFyYW1zW2NhdGVnb3J5XSDihpIgeyBwYXJhbXM6IHsgY2F0ZWdvcnk6IFwidGVzdFwiIH0gfVxuICAgICAgICAgICAgY29uc3QgcXMgPSBhd2FpdCBpbXBvcnQoXCJxc1wiKTtcbiAgICAgICAgICAgIGNvbnN0IHBhcnNlZCA9IHFzLmRlZmF1bHQucGFyc2UoZmllbGRzKTtcbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oYm9keSwgcGFyc2VkKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCB7IGZhc3RpZnlDYXN0ZXIgfSA9IGF3YWl0IGltcG9ydChcIi4vY2FzdGVyXCIpO1xuICAgICAgICAgIHJlcUJvZHkgPSBmYXN0aWZ5Q2FzdGVyKFJlcVR5cGUpLnBhcnNlKGJvZHkpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgY29uc3QgeyBab2RFcnJvciB9ID0gYXdhaXQgaW1wb3J0KFwiem9kXCIpO1xuICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgWm9kRXJyb3IpIHtcbiAgICAgICAgICAgIGNvbnN0IHsgaHVtYW5pemVab2RFcnJvciB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vdXRpbHMvem9kLWVycm9yXCIpO1xuICAgICAgICAgICAgY29uc3QgbWVzc2FnZXMgPSBodW1hbml6ZVpvZEVycm9yKGUpXG4gICAgICAgICAgICAgIC5tYXAoKGlzc3VlKSA9PiBpc3N1ZS5tZXNzYWdlKVxuICAgICAgICAgICAgICAuam9pbihcIiBcIik7XG4gICAgICAgICAgICBjb25zdCB7IEJhZFJlcXVlc3RFeGNlcHRpb24gfSA9IGF3YWl0IGltcG9ydChcIi4uL2V4Y2VwdGlvbnMvc28tZXhjZXB0aW9uc1wiKTtcbiAgICAgICAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKG1lc3NhZ2VzIGFzIExvY2FsaXplZFN0cmluZywge1xuICAgICAgICAgICAgICB6b2RFcnJvcjogZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENvbnRlbnQtVHlwZVxuICAgICAgICByZXBseS50eXBlKGFwaS5vcHRpb25zLmNvbnRlbnRUeXBlID8/IFwiYXBwbGljYXRpb24vanNvblwiKTtcblxuICAgICAgICAvLyBDYWNoZS1Db250cm9sIO2XpOuNlCDshKTsoJVcbiAgICAgICAgY29uc3QgYXBpQ2FjaGVDb25maWcgPSB0aGlzLmdldEFwaUNhY2hlQ29udHJvbChhcGksIHJlcXVlc3QsIGNvbmZpZyk7XG4gICAgICAgIGlmIChhcGlDYWNoZUNvbmZpZykge1xuICAgICAgICAgIGFwcGx5Q2FjaGVIZWFkZXJzKHJlcGx5LCBhcGlDYWNoZUNvbmZpZyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyDsl4XroZzrk5wg7Ji17IWY7J20IOyeiOuKlCDqsr3smrAg7YyM7J28IOuNsOydtO2EsOulvCBDb250ZXh07JeQIOy2lOqwgFxuICAgICAgICBpZiAoYXBpLnVwbG9hZE9wdGlvbnMpIHtcbiAgICAgICAgICBjb25zdCBjb25zdW1lID0gYXBpLnVwbG9hZE9wdGlvbnMuY29uc3VtZSA/PyBcImJ1ZmZlclwiO1xuICAgICAgICAgIGlmIChjb25zdW1lID09PSBcImJ1ZmZlclwiKSB7XG4gICAgICAgICAgICBjb250ZXh0LmJ1ZmZlcmVkRmlsZXMgPSBmaWxlcy5idWZmZXJlZEZpbGVzO1xuICAgICAgICAgIH0gZWxzZSBpZiAoY29uc3VtZSA9PT0gXCJzdHJlYW1cIikge1xuICAgICAgICAgICAgY29udGV4dC51cGxvYWRlZEZpbGVzID0gZmlsZXMudXBsb2FkZWRGaWxlcztcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyDrqqjrjbgg66mU7IaM65OcIGFyZ3Mg7IOd7ISx7ZWY7JesIO2YuOy2nFxuICAgICAgICBjb25zdCB7IEFwaVBhcmFtVHlwZSB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vdHlwZXMvdHlwZXNcIik7XG4gICAgICAgIGNvbnN0IGFyZ3MgPSBhcGkucGFyYW1ldGVycy5tYXAoKHBhcmFtKSA9PiB7XG4gICAgICAgICAgLy8gQ29udGV4dCDsnbjsoJ3shZhcbiAgICAgICAgICBpZiAoQXBpUGFyYW1UeXBlLmlzQ29udGV4dChwYXJhbS50eXBlKSkge1xuICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQ7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiByZXFCb2R5W3BhcmFtLm5hbWVdO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuaW52b2tlTW9kZWxNZXRob2QoYXBpLCBhcmdzLCByZXBseSk7XG4gICAgICB9KTtcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFVSTOyXkOyEnCBwYXRoIHBhcmFtc+ulvCDstpTstpztlanri4jri6QuXG4gICAqIOyYiDogcGF0dGVybj1cIi9hZG1pbi9jb21wYW5pZXMvOmNvbXBhbnlJZFwiLCB1cmw9XCIvYWRtaW4vY29tcGFuaWVzLzEyM1wiIOKGkiB7IGNvbXBhbnlJZDogXCIxMjNcIiB9XG4gICAqL1xuICBwcml2YXRlIGV4dHJhY3RQYXRoUGFyYW1zKHBhdHRlcm46IHN0cmluZywgdXJsOiBzdHJpbmcpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgICBjb25zdCBwYXR0ZXJuUGFydHMgPSBwYXR0ZXJuLnNwbGl0KFwiL1wiKS5maWx0ZXIoQm9vbGVhbik7XG4gICAgY29uc3QgdXJsUGFydHMgPSB0aGlzLmdldFBhdGhuYW1lRnJvbVVybCh1cmwpLnNwbGl0KFwiL1wiKS5maWx0ZXIoQm9vbGVhbik7XG4gICAgY29uc3QgcGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhdHRlcm5QYXJ0cy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHBhdHRlcm5QYXJ0c1tpXS5zdGFydHNXaXRoKFwiOlwiKSkge1xuICAgICAgICBwYXJhbXNbcGF0dGVyblBhcnRzW2ldLnNsaWNlKDEpXSA9IHVybFBhcnRzW2ldO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcGFyYW1zO1xuICB9XG5cbiAgcHJpdmF0ZSBpc1BhdGhQYXR0ZXJuTWF0Y2gocGF0dGVybjogc3RyaW5nLCB1cmw6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHBhdHRlcm5QYXJ0cyA9IHBhdHRlcm4uc3BsaXQoXCIvXCIpLmZpbHRlcihCb29sZWFuKTtcbiAgICBjb25zdCB1cmxQYXJ0cyA9IHRoaXMuZ2V0UGF0aG5hbWVGcm9tVXJsKHVybCkuc3BsaXQoXCIvXCIpLmZpbHRlcihCb29sZWFuKTtcblxuICAgIGlmIChwYXR0ZXJuUGFydHMubGVuZ3RoICE9PSB1cmxQYXJ0cy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhdHRlcm5QYXJ0cy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgcGF0dGVyblBhcnQgPSBwYXR0ZXJuUGFydHNbaV07XG4gICAgICBjb25zdCB1cmxQYXJ0ID0gdXJsUGFydHNbaV07XG4gICAgICBpZiAocGF0dGVyblBhcnQuc3RhcnRzV2l0aChcIjpcIikpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAocGF0dGVyblBhcnQgIT09IHVybFBhcnQpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRQYXRobmFtZUZyb21VcmwodXJsOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiB1cmwuc3BsaXQoXCI/XCIpWzBdO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNvbHZlUGF0aFdpdGhpbkJhc2VEaXIoYmFzZURpcjogc3RyaW5nLCBpbnB1dFBhdGg6IHN0cmluZyk6IHN0cmluZyB8IG51bGwge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBkZWNvZGVkID0gZGVjb2RlVVJJQ29tcG9uZW50KGlucHV0UGF0aCkucmVwbGFjZSgvXFxcXC9nLCBcIi9cIik7XG4gICAgICBpZiAoZGVjb2RlZC5pbmNsdWRlcyhcIlxcMFwiKSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlbGF0aXZlUGF0aCA9IGRlY29kZWQucmVwbGFjZSgvXlxcLysvLCBcIlwiKTtcbiAgICAgIGNvbnN0IHJlc29sdmVkUGF0aCA9IHBhdGgucmVzb2x2ZShiYXNlRGlyLCByZWxhdGl2ZVBhdGgpO1xuICAgICAgY29uc3QgcmVsYXRpdmVGcm9tQmFzZSA9IHBhdGgucmVsYXRpdmUoYmFzZURpciwgcmVzb2x2ZWRQYXRoKTtcbiAgICAgIGlmIChyZWxhdGl2ZUZyb21CYXNlLnN0YXJ0c1dpdGgoXCIuLlwiKSB8fCBwYXRoLmlzQWJzb2x1dGUocmVsYXRpdmVGcm9tQmFzZSkpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzb2x2ZWRQYXRoO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFQSSDsnZHri7Xsl5Ag7KCB7Jqp7ZWgIENhY2hlLUNvbnRyb2wg7ISk7KCV7J2EIOqysOygle2VqeuLiOuLpC5cbiAgICog7Jqw7ISg7Iic7JyEOiDqsJzrs4Qg7KeA7KCVID4gY2FjaGVDb250cm9sSGFuZGxlclxuICAgKi9cbiAgcHJpdmF0ZSBnZXRBcGlDYWNoZUNvbnRyb2woXG4gICAgYXBpOiBFeHRlbmRlZEFwaSxcbiAgICByZXF1ZXN0OiBGYXN0aWZ5UmVxdWVzdCxcbiAgICBjb25maWc6IFNvbmFtdUZhc3RpZnlDb25maWcsXG4gICkge1xuICAgIC8vIOuNsOy9lOugiOydtO2EsCDshKTsoJUg7Jqw7ISgXG4gICAgaWYgKGFwaS5vcHRpb25zLmNhY2hlQ29udHJvbCkge1xuICAgICAgcmV0dXJuIGFwaS5vcHRpb25zLmNhY2hlQ29udHJvbDtcbiAgICB9XG5cbiAgICAvLyDsoITsl60g7ZW465Ok65+sXG4gICAgaWYgKGNvbmZpZy5jYWNoZUNvbnRyb2xIYW5kbGVyKSB7XG4gICAgICBjb25zdCBjYWNoZVJlcTogQ2FjaGVDb250cm9sUmVxdWVzdCA9IHtcbiAgICAgICAgdHlwZTogXCJhcGlcIixcbiAgICAgICAgdXJsOiByZXF1ZXN0LnVybCxcbiAgICAgICAgcGF0aDogcmVxdWVzdC5yb3V0ZU9wdGlvbnM/LnVybCA/PyByZXF1ZXN0LnVybC5zcGxpdChcIj9cIilbMF0sXG4gICAgICAgIG1ldGhvZDogcmVxdWVzdC5tZXRob2QsXG4gICAgICAgIGFwaSxcbiAgICAgIH07XG4gICAgICBjb25zdCByZXN1bHQgPSBjb25maWcuY2FjaGVDb250cm9sSGFuZGxlcihjYWNoZVJlcSk7XG4gICAgICBpZiAocmVzdWx0KSByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFNTUuyaqSBBUEkg7Zi47LacIChIVFRQIOyYpOuyhO2XpOuTnCDsl4bsnbQg7KeB7KCRIO2YuOy2nClcbiAgICogY3JlYXRlQXBpSGFuZGxlcuydmCDroZzsp4HsnYQg7J6s7IKs7Jqp7ZWY65CYLCByZXF1ZXN0IO2MjOyLsSDrjIDsi6AgcGFyYW1zIOyngeygkSDsgqzsmqlcbiAgICovXG4gIGFzeW5jIGludm9rZUFwaUZvclNTUihcbiAgICBhcGk6IEV4dGVuZGVkQXBpLFxuICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9FeHBsaWNpdEFueTogU1NS7JeQ7IScIOuLpOyWke2VnCDtg4DsnoXsnZggcGFyYW1z66W8IOuwm+yVhOyVvCDtlahcbiAgICBwYXJhbXM6IGFueVtdLFxuICAgIGNvbmZpZzogU29uYW11RmFzdGlmeUNvbmZpZyxcbiAgICByZXF1ZXN0OiBGYXN0aWZ5UmVxdWVzdCxcbiAgICByZXBseTogRmFzdGlmeVJlcGx5LFxuICApOiBQcm9taXNlPHVua25vd24+IHtcbiAgICAvLyBDb250ZXh0IOyDneyEsSAo6riw7KG0IOuplOyGjOuTnCDsnqzsgqzsmqkpXG4gICAgY29uc3QgY29udGV4dCA9IGF3YWl0IHRoaXMuY3JlYXRlQ29udGV4dChjb25maWcsIHJlcXVlc3QsIHJlcGx5KTtcblxuICAgIHJldHVybiB0aGlzLmFzeW5jTG9jYWxTdG9yYWdlLnJ1bih7IGNvbnRleHQgfSwgYXN5bmMgKCkgPT4ge1xuICAgICAgLy8gYXJncyDsg53shLE6IENvbnRleHQg7YyM652866+47YSw64qUIOyjvOyehSwg64KY66i47KeA64qUIHBhcmFtc+yXkOyEnCDqsIDsoLjsmKTquLBcbiAgICAgIGNvbnN0IHsgQXBpUGFyYW1UeXBlIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi90eXBlcy90eXBlc1wiKTtcbiAgICAgIGxldCBwYXJhbXNJbmRleCA9IDA7XG4gICAgICBjb25zdCBhcmdzID0gYXBpLnBhcmFtZXRlcnMubWFwKChwYXJhbSkgPT4ge1xuICAgICAgICBpZiAoQXBpUGFyYW1UeXBlLmlzQ29udGV4dChwYXJhbS50eXBlKSkge1xuICAgICAgICAgIHJldHVybiBjb250ZXh0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwYXJhbXNbcGFyYW1zSW5kZXgrK107XG4gICAgICB9KTtcblxuICAgICAgLy8g66qo6424IOuplOyEnOuTnCDtmLjstpwgKOq4sOyhtCDrqZTshJzrk5wg7J6s7IKs7JqpKVxuICAgICAgcmV0dXJuIHRoaXMuaW52b2tlTW9kZWxNZXRob2QoYXBpLCBhcmdzLCByZXBseSk7XG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBpbnZva2VNb2RlbE1ldGhvZChcbiAgICBhcGk6IEV4dGVuZGVkQXBpLFxuICAgIGFyZ3M6IHVua25vd25bXSxcbiAgICByZXBseTogRmFzdGlmeVJlcGx5LFxuICApOiBQcm9taXNlPHVua25vd24+IHtcbiAgICBjb25zdCBtb2RlbCA9IHRoaXMuc3luY2VyLm1vZGVsc1thcGkubW9kZWxOYW1lXTtcbiAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vRXhwbGljaXRBbnk6IG1vZGVs7J2AIOuqqOuNuCDsnbjsiqTthLTsiqTsnbTrr4DroZwg66mU7ISc65OcIO2YuOy2nCDqsIDriqVcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCAobW9kZWwgYXMgYW55KVthcGkubWV0aG9kTmFtZV0uYXBwbHkobW9kZWwsIGFyZ3MpO1xuICAgIHJlcGx5LnR5cGUoYXBpLm9wdGlvbnMuY29udGVudFR5cGUgPz8gXCJhcHBsaWNhdGlvbi9qc29uXCIpO1xuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIGFzeW5jIGNyZWF0ZUNvbnRleHQoXG4gICAgY29uZmlnOiBTb25hbXVGYXN0aWZ5Q29uZmlnLFxuICAgIHJlcXVlc3Q6IEZhc3RpZnlSZXF1ZXN0LFxuICAgIHJlcGx5OiBGYXN0aWZ5UmVwbHksXG4gICk6IFByb21pc2U8Q29udGV4dD4ge1xuICAgIC8vIGNyZWF0ZVNTRUZhY3Rvcnkg7ZWo7IiY7JeQIOuvuOumrCByZXF1ZXN07J2YIHNvY2tldOqzvCByZXBseeulvCDrsJTsnbjrlKkuXG4gICAgY29uc3QgeyBjcmVhdGVTU0VGYWN0b3J5IH0gPSBhd2FpdCBpbXBvcnQoXCIuLi9zdHJlYW0vc3NlXCIpO1xuICAgIGNvbnN0IGNyZWF0ZVNTRSA9ICg8VCBleHRlbmRzIFpvZE9iamVjdD4oXG4gICAgICBfcmVxdWVzdDogRmFzdGlmeVJlcXVlc3QsXG4gICAgICBfcmVwbHk6IEZhc3RpZnlSZXBseSxcbiAgICAgIF9ldmVudHM6IFQsXG4gICAgKSA9PiBjcmVhdGVTU0VGYWN0b3J5KF9yZXF1ZXN0LnNvY2tldCwgX3JlcGx5LCBfZXZlbnRzKSkuYmluZChudWxsLCByZXF1ZXN0LCByZXBseSk7XG5cbiAgICAvLyBsb2NhbGUg6rCQ7KeAXG4gICAgY29uc3QgbG9jYWxlID1cbiAgICAgIHRoaXMuZGV0ZWN0TG9jYWxlKHJlcXVlc3QuaGVhZGVyc1tcImFjY2VwdC1sYW5ndWFnZVwiXSwgdGhpcy5jb25maWcuaTE4bi5zdXBwb3J0ZWRMb2NhbGVzKSA/P1xuICAgICAgdGhpcy5jb25maWcuaTE4bi5kZWZhdWx0TG9jYWxlO1xuXG4gICAgLy8gYXV0aCBjb250ZXh0IOy2lOqwgFxuICAgIGNvbnN0IGhlYWRlcnMgPSBjb252ZXJ0RmFzdGlmeUhlYWRlcnNUb1N0YW5kYXJkKHJlcXVlc3QuaGVhZGVycyk7XG4gICAgY29uc3Qgc2Vzc2lvbiA9IChhd2FpdCB0aGlzLl9hdXRoPy5hcGkuZ2V0U2Vzc2lvbih7IGhlYWRlcnMgfSkpID8/IG51bGw7XG5cbiAgICBjb25zdCBjb250ZXh0OiBDb250ZXh0ID0ge1xuICAgICAgLi4uKGF3YWl0IFByb21pc2UucmVzb2x2ZShcbiAgICAgICAgY29uZmlnLmNvbnRleHRQcm92aWRlcihcbiAgICAgICAgICB7XG4gICAgICAgICAgICByZXF1ZXN0LFxuICAgICAgICAgICAgcmVwbHksXG4gICAgICAgICAgICBoZWFkZXJzOiByZXF1ZXN0LmhlYWRlcnMsXG4gICAgICAgICAgICBjcmVhdGVTU0UsXG4gICAgICAgICAgICBuYWl0ZVN0b3JlOiBOYWl0ZS5jcmVhdGVTdG9yZSgpLFxuICAgICAgICAgICAgbG9jYWxlLFxuICAgICAgICAgICAgLy8gYXV0aFxuICAgICAgICAgICAgdXNlcjogc2Vzc2lvbj8udXNlciA/PyBudWxsLFxuICAgICAgICAgICAgc2Vzc2lvbjogc2Vzc2lvbj8uc2Vzc2lvbiA/PyBudWxsLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgcmVxdWVzdCxcbiAgICAgICAgICByZXBseSxcbiAgICAgICAgKSxcbiAgICAgICkpLFxuICAgIH07XG4gICAgcmV0dXJuIGNvbnRleHQ7XG4gIH1cblxuICAvKipcbiAgICogQWNjZXB0LUxhbmd1YWdlIO2XpOuNlOyXkOyEnCDsp4Dsm5DtlZjripQgbG9jYWxl7J2EIOywvuyKteuLiOuLpC5cbiAgICogQGV4YW1wbGUgXCJrby1LUixrbztxPTAuOSxlbjtxPTAuOFwiIOKGkiBcImtvXCJcbiAgICovXG4gIHByaXZhdGUgZGV0ZWN0TG9jYWxlKFxuICAgIGFjY2VwdExhbmd1YWdlOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgc3VwcG9ydGVkOiBzdHJpbmdbXSxcbiAgKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIWFjY2VwdExhbmd1YWdlKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gICAgLy8gQWNjZXB0LUxhbmd1YWdlOiBrby1LUixrbztxPTAuOSxlbjtxPTAuOFxuICAgIGNvbnN0IGxhbmdzID0gYWNjZXB0TGFuZ3VhZ2Uuc3BsaXQoXCIsXCIpLm1hcCgobGFuZykgPT4ge1xuICAgICAgY29uc3QgW2NvZGVdID0gbGFuZy5zcGxpdChcIjtcIik7XG4gICAgICByZXR1cm4gY29kZS50cmltKCkuc3BsaXQoXCItXCIpWzBdOyAvLyBrby1LUiDihpIga29cbiAgICB9KTtcblxuICAgIHJldHVybiBsYW5ncy5maW5kKChsYW5nKSA9PiBzdXBwb3J0ZWQuaW5jbHVkZXMobGFuZykpO1xuICB9XG5cbiAgYXN5bmMgc3RhcnRXYXRjaGVyKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHdhdGNoUGF0aCA9IFtwYXRoLmpvaW4odGhpcy5hcGlSb290UGF0aCwgXCJzcmNcIildO1xuXG4gICAgY29uc3QgY2hva2lkYXIgPSAoYXdhaXQgaW1wb3J0KFwiY2hva2lkYXJcIikpLmRlZmF1bHQ7XG4gICAgdGhpcy53YXRjaGVyID0gY2hva2lkYXIud2F0Y2god2F0Y2hQYXRoLCB7XG4gICAgICBpZ25vcmVkOiAocGF0aCwgc3RhdHMpID0+XG4gICAgICAgICEhc3RhdHM/LmlzRmlsZSgpICYmICFwYXRoLmVuZHNXaXRoKFwiLnRzXCIpICYmICFwYXRoLmVuZHNXaXRoKFwiLmpzb25cIiksXG4gICAgICBwZXJzaXN0ZW50OiB0cnVlLFxuICAgICAgaWdub3JlSW5pdGlhbDogdHJ1ZSxcbiAgICB9KTtcblxuICAgIHRoaXMud2F0Y2hlci5vbihcImFsbFwiLCBhc3luYyAoZXZlbnQ6IHN0cmluZywgZmlsZVBhdGg6IHN0cmluZykgPT4ge1xuICAgICAgY29uc3QgYWJzb2x1dGVQYXRoID0gZmlsZVBhdGggYXMgQWJzb2x1dGVQYXRoO1xuICAgICAgYXNzZXJ0KFxuICAgICAgICBhYnNvbHV0ZVBhdGguc3RhcnRzV2l0aCh0aGlzLmFwaVJvb3RQYXRoKSxcbiAgICAgICAgXCJGaWxlIHBhdGggaXMgbm90IHdpdGhpbiB0aGUgQVBJIHJvb3QgcGF0aFwiLFxuICAgICAgKTtcblxuICAgICAgaWYgKGV2ZW50ICE9PSBcImNoYW5nZVwiICYmIGV2ZW50ICE9PSBcImFkZFwiKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gc29uYW11LmNvbmZpZy50cyDrs4Dqsr0g7IucIOyerOyLnOyekVxuICAgICAgICBjb25zdCBpc0NvbmZpZ1RzID0gZmlsZVBhdGggPT09IHBhdGguam9pbih0aGlzLmFwaVJvb3RQYXRoLCBcInNyY1wiLCBcInNvbmFtdS5jb25maWcudHNcIik7XG5cbiAgICAgICAgaWYgKGlzQ29uZmlnVHMpIHtcbiAgICAgICAgICBjb25zdCByZWxhdGl2ZVBhdGggPSBmaWxlUGF0aC5yZXBsYWNlKHRoaXMuYXBpUm9vdFBhdGgsIFwiYXBpXCIpO1xuICAgICAgICAgIGNvbnN0IGNoYWxrID0gKGF3YWl0IGltcG9ydChcImNoYWxrXCIpKS5kZWZhdWx0O1xuICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgY2hhbGsuYm9sZChgRGV0ZWN0ZWQoJHtldmVudH0pOiAke2NoYWxrLmJsdWUocmVsYXRpdmVQYXRoKX0gLSBSZXN0YXJ0aW5nLi4uYCksXG4gICAgICAgICAgKTtcbiAgICAgICAgICBwcm9jZXNzLmtpbGwocHJvY2Vzcy5waWQsIFwiU0lHVVNSMlwiKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUZpbGVDaGFuZ2UoZXZlbnQsIGFic29sdXRlUGF0aCk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKlxuICAgICBBIGZ1bmN0aW9uIHRoYXQgYXV0b21hdGljYWxseSBoYW5kbGVzIGluaXQgYW5kIGRlc3Ryb3kgd2hlbiB1c2luZyBTb25hbXUgdmlhIHNjcmlwdHMuXG4gICovXG4gIGFzeW5jIHJ1blNjcmlwdChmbjogKCkgPT4gUHJvbWlzZTx2b2lkPikge1xuICAgIGF3YWl0IHRoaXMuaW5pdCh0cnVlLCBmYWxzZSwgdW5kZWZpbmVkLCBmYWxzZSk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGZuKCk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGF3YWl0IHRoaXMuZGVzdHJveSgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcmVnaXN0ZXJQbHVnaW5zKHNlcnZlcjogRmFzdGlmeUluc3RhbmNlLCBwbHVnaW5zOiBTb25hbXVTZXJ2ZXJPcHRpb25zW1wicGx1Z2luc1wiXSkge1xuICAgIGlmICghcGx1Z2lucykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIGNvbXByZXNzIO2UjOufrOq3uOyduOydgCDri6Trpbgg7ZSM65+s6re47J2467O064ukIOuovOyggCDrk7HroZ3rkJjslrTslbwg7ZWp64uI64ukLlxuICAgIGlmIChwbHVnaW5zLmNvbXByZXNzKSB7XG4gICAgICBjb25zdCBjb21wcmVzc1BsdWdpbiA9IChhd2FpdCBpbXBvcnQoXCJAZmFzdGlmeS9jb21wcmVzc1wiKSkuZGVmYXVsdDtcbiAgICAgIGNvbnN0IGRlZmF1bHRPcHRpb25zID0ge1xuICAgICAgICB0aHJlc2hvbGQ6IDEwMjQsXG4gICAgICAgIGVuY29kaW5nczogW1wiYnJcIiwgXCJnemlwXCIsIFwiZGVmbGF0ZVwiXSBhcyAoXCJiclwiIHwgXCJnemlwXCIgfCBcImRlZmxhdGVcIilbXSxcbiAgICAgIH07XG5cbiAgICAgIGlmIChwbHVnaW5zLmNvbXByZXNzID09PSB0cnVlKSB7XG4gICAgICAgIHNlcnZlci5yZWdpc3Rlcihjb21wcmVzc1BsdWdpbiwgZGVmYXVsdE9wdGlvbnMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2VydmVyLnJlZ2lzdGVyKGNvbXByZXNzUGx1Z2luLCB7XG4gICAgICAgICAgLi4uZGVmYXVsdE9wdGlvbnMsXG4gICAgICAgICAgLi4ucGx1Z2lucy5jb21wcmVzcyxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgcGx1Z2luc01vZHVsZXMgPSB7XG4gICAgICBjb3JzOiBcIkBmYXN0aWZ5L2NvcnNcIixcbiAgICAgIGZvcm1ib2R5OiBcIkBmYXN0aWZ5L2Zvcm1ib2R5XCIsXG4gICAgICBtdWx0aXBhcnQ6IFwiQGZhc3RpZnkvbXVsdGlwYXJ0XCIsXG4gICAgICBxczogXCJmYXN0aWZ5LXFzXCIsXG4gICAgICBzc2U6IFwiZmFzdGlmeS1zc2UtdjJcIixcbiAgICAgIHN0YXRpYzogXCJAZmFzdGlmeS9zdGF0aWNcIixcbiAgICB9IGFzIGNvbnN0O1xuXG4gICAgY29uc3QgcmVnaXN0ZXJQbHVnaW4gPSBhc3luYyA8SyBleHRlbmRzIGtleW9mIE5vbk51bGxhYmxlPHR5cGVvZiBwbHVnaW5zPj4oXG4gICAgICBrZXk6IEssXG4gICAgICBwbHVnaW5OYW1lOiBzdHJpbmcsXG4gICAgKSA9PiB7XG4gICAgICBjb25zdCBvcHRpb24gPSBwbHVnaW5zW2tleV07XG4gICAgICBpZiAoIW9wdGlvbikgcmV0dXJuO1xuXG4gICAgICBpZiAob3B0aW9uID09PSB0cnVlKSB7XG4gICAgICAgIHNlcnZlci5yZWdpc3RlcigoYXdhaXQgaW1wb3J0KHBsdWdpbk5hbWUpKS5kZWZhdWx0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNlcnZlci5yZWdpc3RlcigoYXdhaXQgaW1wb3J0KHBsdWdpbk5hbWUpKS5kZWZhdWx0LCBvcHRpb24pO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBmb3IgKGNvbnN0IFtrZXksIHBsdWdpbk5hbWVdIG9mIE9iamVjdC5lbnRyaWVzKHBsdWdpbnNNb2R1bGVzKSkge1xuICAgICAgYXdhaXQgcmVnaXN0ZXJQbHVnaW4oa2V5IGFzIGtleW9mIHR5cGVvZiBwbHVnaW5zLCBwbHVnaW5OYW1lKTtcbiAgICB9XG5cbiAgICBpZiAocGx1Z2lucy5jdXN0b20pIHtcbiAgICAgIHBsdWdpbnMuY3VzdG9tKHNlcnZlcik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIGJldHRlci1hdXRoIOudvOyasO2KuOulvCDrk7HroZ3tlanri4jri6QuXG4gICAqIC9hcGkvYXV0aC8qIOqyveuhnOuhnCDsnbjspp0gQVBJ6rCAIOyekOuPmSDrk7HroZ3rkKnri4jri6QuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHJlZ2lzdGVyQmV0dGVyQXV0aChcbiAgICBzZXJ2ZXI6IEZhc3RpZnlJbnN0YW5jZSxcbiAgICBvcHRpb25zOiBOb25OdWxsYWJsZTxTb25hbXVTZXJ2ZXJPcHRpb25zW1wiYXV0aFwiXT4sXG4gICkge1xuICAgIGlmICghb3B0aW9ucykgcmV0dXJuO1xuXG4gICAgY29uc3QgYmFzZVBhdGggPSBvcHRpb25zLmJhc2VQYXRoID8/IFwiL2FwaS9hdXRoXCI7XG5cbiAgICAvLyDsgqzsmqnsnpAg7ISk7KCV6rO8IOq4sOuzuOqwkuydhCBtZXJnZVxuICAgIGNvbnN0IG1lcmdlZEZpZWxkTWFwcGluZ3MgPSBtZXJnZShCQVNFX0ZJRUxEX01BUFBJTkdTLCBvcHRpb25zKTtcblxuICAgIC8vIGJldHRlci1hdXRoIOyduOyKpO2EtOyKpCDsg53shLFcbiAgICBjb25zdCB7IGJldHRlckF1dGggfSA9IGF3YWl0IGltcG9ydChcImJldHRlci1hdXRoXCIpO1xuICAgIGNvbnN0IHsgUG9vbCB9ID0gYXdhaXQgaW1wb3J0KFwicGdcIik7XG5cbiAgICB0aGlzLl9hdXRoID0gYmV0dGVyQXV0aCh7XG4gICAgICBkYXRhYmFzZTogbmV3IFBvb2woREIuZ2V0REJDb25maWcoXCJ3XCIpLmNvbm5lY3Rpb24gYXMgUG9vbENvbmZpZyksXG4gICAgICAuLi5tZXJnZWRGaWVsZE1hcHBpbmdzLFxuICAgIH0pO1xuXG4gICAgLy8gYmV0dGVyLWF1dGgg65287Jqw7Yq4IOuTseuhnVxuICAgIHNlcnZlci5yb3V0ZSh7XG4gICAgICBtZXRob2Q6IFtcIkdFVFwiLCBcIlBPU1RcIl0sXG4gICAgICB1cmw6IGAke2Jhc2VQYXRofS8qYCxcbiAgICAgIGhhbmRsZXI6IGFzeW5jIChyZXF1ZXN0LCByZXBseSkgPT4ge1xuICAgICAgICBjb25zdCB1cmwgPSBuZXcgVVJMKHJlcXVlc3QudXJsLCBgaHR0cDovLyR7cmVxdWVzdC5oZWFkZXJzLmhvc3R9YCk7XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSBjb252ZXJ0RmFzdGlmeUhlYWRlcnNUb1N0YW5kYXJkKHJlcXVlc3QuaGVhZGVycyk7XG4gICAgICAgIGNvbnN0IHJlcSA9IG5ldyBSZXF1ZXN0KHVybC50b1N0cmluZygpLCB7XG4gICAgICAgICAgbWV0aG9kOiByZXF1ZXN0Lm1ldGhvZCxcbiAgICAgICAgICBoZWFkZXJzLFxuICAgICAgICAgIC4uLihyZXF1ZXN0LmJvZHkgPyB7IGJvZHk6IEpTT04uc3RyaW5naWZ5KHJlcXVlc3QuYm9keSkgfSA6IHt9KSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmF1dGguaGFuZGxlcihyZXEpO1xuXG4gICAgICAgIHJlcGx5LnN0YXR1cyhyZXNwb25zZS5zdGF0dXMpO1xuICAgICAgICByZXNwb25zZS5oZWFkZXJzLmZvckVhY2goKHZhbHVlOiBzdHJpbmcsIGtleTogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgcmVwbHkuaGVhZGVyKGtleSwgdmFsdWUpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHJlcGx5LnNlbmQocmVzcG9uc2UuYm9keSA/IGF3YWl0IHJlc3BvbnNlLnRleHQoKSA6IG51bGwpO1xuICAgICAgfSxcbiAgICB9KTtcblxuICAgIGNvbnN0IGNoYWxrID0gKGF3YWl0IGltcG9ydChcImNoYWxrXCIpKS5kZWZhdWx0O1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyZWVuKGDinJMgYmV0dGVyLWF1dGggcmVnaXN0ZXJlZCBhdCAke2Jhc2VQYXRofS8qYCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBpbml0aWFsaXplQ2FjaGUoY29uZmlnOiBDYWNoZUNvbmZpZyB8IHVuZGVmaW5lZCwgZm9yVGVzdGluZzogYm9vbGVhbikge1xuICAgIGNvbnN0IHsgc2V0Q2FjaGVNYW5hZ2VyUmVmIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi9jYWNoZS9kZWNvcmF0b3JcIik7XG5cbiAgICAvLyDthYzsiqTtirgg7ZmY6rK97JeQ7IScIOuplOuqqOumrCDrk5zrnbzsnbTrsoQg7J6Q64+ZIOyCrOyaqVxuICAgIGlmIChmb3JUZXN0aW5nKSB7XG4gICAgICBjb25zdCB7IGNyZWF0ZVRlc3RDYWNoZU1hbmFnZXIgfSA9IGF3YWl0IGltcG9ydChcIi4uL2NhY2hlL2NhY2hlLW1hbmFnZXJcIik7XG4gICAgICB0aGlzLl9jYWNoZSA9IGNyZWF0ZVRlc3RDYWNoZU1hbmFnZXIoKTtcbiAgICAgIHNldENhY2hlTWFuYWdlclJlZih0aGlzLl9jYWNoZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8g7ISk7KCV7J20IOyXhuycvOuptCDsupDsi5wg67mE7Zmc7ISx7ZmUXG4gICAgaWYgKCFjb25maWcpIHtcbiAgICAgIHNldENhY2hlTWFuYWdlclJlZihudWxsKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyDshKTsoJXsl5Ag65Sw6528IENhY2hlTWFuYWdlciDsg53shLFcbiAgICBjb25zdCB7IGNyZWF0ZUNhY2hlTWFuYWdlciB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vY2FjaGUvY2FjaGUtbWFuYWdlclwiKTtcbiAgICB0aGlzLl9jYWNoZSA9IGNyZWF0ZUNhY2hlTWFuYWdlcihjb25maWcpO1xuICAgIHNldENhY2hlTWFuYWdlclJlZih0aGlzLl9jYWNoZSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGluaXRpYWxpemVXb3JrZmxvd3Mob3B0aW9uczogU29uYW11VGFza09wdGlvbnMgfCB1bmRlZmluZWQpIHtcbiAgICBjb25zdCB7IFdvcmtmbG93TWFuYWdlciB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vdGFza3Mvd29ya2Zsb3ctbWFuYWdlclwiKTtcbiAgICAvLyBOT1RFOiBAc29uYW11LWtpdC90YXNrcyDslYjsl5DshKAga25leCBjb25maWfrpbwg7IiY7KCV7ZWY6riwIOuVjOusuOyXkCBjb25uZWN0aW9u7J20IOyVhOuLjCBjb25maWcg7Ke466GcIOuztOuDheuLiOuLpC5cbiAgICB0aGlzLl93b3JrZmxvd3MgPSBuZXcgV29ya2Zsb3dNYW5hZ2VyKERCLmdldERCQ29uZmlnKFwid1wiKSk7XG4gICAgaWYgKCFvcHRpb25zKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZW5hYmxlV29ya2VyID0gb3B0aW9ucy5lbmFibGVXb3JrZXIgPz8gaXNEYWVtb25TZXJ2ZXIoKTtcbiAgICBjb25zdCBkZWZhdWx0V29ya2VyT3B0aW9ucyA9IHtcbiAgICAgIGNvbmN1cnJlbmN5OiBvcy5jcHVzKCkubGVuZ3RoIC0gMSxcbiAgICAgIHVzZVB1YlN1YjogdHJ1ZSxcbiAgICAgIGxpc3RlbkRlbGF5OiA1MDAsXG4gICAgfTtcblxuICAgIGlmIChlbmFibGVXb3JrZXIpIHtcbiAgICAgIHRoaXMud29ya2Zsb3dzLnNldHVwV29ya2VyKHtcbiAgICAgICAgLi4uZGVmYXVsdFdvcmtlck9wdGlvbnMsXG4gICAgICAgIC4uLm9wdGlvbnMud29ya2VyT3B0aW9ucyxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgYm9vdChzZXJ2ZXI6IEZhc3RpZnlJbnN0YW5jZSwgb3B0aW9uczogU29uYW11U2VydmVyT3B0aW9ucykge1xuICAgIGNvbnN0IHBvcnQgPSBvcHRpb25zLmxpc3Rlbj8ucG9ydCA/PyAzMDAwO1xuICAgIGNvbnN0IGhvc3QgPSBvcHRpb25zLmxpc3Rlbj8uaG9zdCA/PyBcImxvY2FsaG9zdFwiO1xuXG4gICAgc2VydmVyLmFkZEhvb2soXCJvbkNsb3NlXCIsIGFzeW5jICgpID0+IHtcbiAgICAgIGF3YWl0IG9wdGlvbnMubGlmZWN5Y2xlPy5vblNodXRkb3duPy4oc2VydmVyKTtcbiAgICAgIGF3YWl0IHRoaXMud29ya2Zsb3dzLmRlc3Ryb3koKTtcbiAgICAgIGF3YWl0IHRoaXMuZGVzdHJveSgpO1xuICAgIH0pO1xuXG4gICAgY29uc3Qgc2h1dGRvd24gPSBhc3luYyAoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBzZXJ2ZXIuY2xvc2UoKTtcbiAgICAgICAgcHJvY2Vzcy5leGl0KDApO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciBkdXJpbmcgc2h1dGRvd246XCIsIGVycik7XG4gICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgcHJvY2Vzcy5vbihcIlNJR0lOVFwiLCBzaHV0ZG93bik7XG4gICAgcHJvY2Vzcy5vbihcIlNJR1RFUk1cIiwgc2h1dGRvd24pO1xuXG4gICAgaWYgKG9wdGlvbnMubGlmZWN5Y2xlPy5vbkVycm9yKSB7XG4gICAgICBzZXJ2ZXIuc2V0RXJyb3JIYW5kbGVyKG9wdGlvbnMubGlmZWN5Y2xlPy5vbkVycm9yKTtcbiAgICB9XG5cbiAgICBzZXJ2ZXJcbiAgICAgIC5saXN0ZW4oeyBwb3J0LCBob3N0IH0pXG4gICAgICAudGhlbihhc3luYyAoKSA9PiB7XG4gICAgICAgIGF3YWl0IHRoaXMud29ya2Zsb3dzLnN0YXJ0V29ya2VyKCk7XG4gICAgICAgIGF3YWl0IG9wdGlvbnMubGlmZWN5Y2xlPy5vblN0YXJ0Py4oc2VydmVyKTtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goYXN5bmMgKGVycikgPT4ge1xuICAgICAgICBjb25zdCBjaGFsayA9IChhd2FpdCBpbXBvcnQoXCJjaGFsa1wiKSkuZGVmYXVsdDtcbiAgICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoXCJGYWlsZWQgdG8gc3RhcnQgc2VydmVyOlwiLCBlcnIpKTtcbiAgICAgICAgYXdhaXQgc2h1dGRvd24oKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBoYW5kbGVGaWxlQ2hhbmdlKGV2ZW50OiBzdHJpbmcsIGZpbGVQYXRoOiBBYnNvbHV0ZVBhdGgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyDssqsg67KI7Ke4IO2MjOydvOydtOuptCBITVIg7Iuc7J6RIOyLnOqwhCDquLDroZ1cbiAgICBpZiAodGhpcy5wZW5kaW5nRmlsZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLmhtclN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgfVxuICAgIHRoaXMucGVuZGluZ0ZpbGVzLnB1c2goZmlsZVBhdGgpO1xuXG4gICAgY29uc3QgcmVsYXRpdmVQYXRoID0gcGF0aC5yZWxhdGl2ZSh0aGlzLmFwaVJvb3RQYXRoLCBmaWxlUGF0aCk7XG4gICAgY29uc3QgY2hhbGsgPSAoYXdhaXQgaW1wb3J0KFwiY2hhbGtcIikpLmRlZmF1bHQ7XG4gICAgY29uc29sZS5sb2coY2hhbGsuYm9sZChgRGV0ZWN0ZWQoJHtldmVudH0pOiAke2NoYWxrLmJsdWUocmVsYXRpdmVQYXRoKX1gKSk7XG5cbiAgICBhd2FpdCB0aGlzLnN5bmNlci5zeW5jRnJvbVdhdGNoZXIoZXZlbnQsIGZpbGVQYXRoKTtcblxuICAgIC8vIOyymOumrCDsmYTro4zrkJwg7YyM7J287J2EIOuMgOq4sCDrqqnroZ3sl5DshJwg7KCc6rGwXG4gICAgdGhpcy5wZW5kaW5nRmlsZXMgPSB0aGlzLnBlbmRpbmdGaWxlcy5zbGljZSgxKTtcblxuICAgIC8vIOuqqOuToCDtjIzsnbwg7LKY66as6rCAIOyZhOujjOuQmOuptCDstZzsooUg66mU7Iuc7KeAIOy2nOugpVxuICAgIGlmICh0aGlzLnBlbmRpbmdGaWxlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIGF3YWl0IHRoaXMuZmluaXNoSE1SKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBmaW5pc2hITVIoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5zeW5jZXIucmVuZXdDaGVja3N1bXMoKTtcblxuICAgIGNvbnN0IGVuZFRpbWUgPSBEYXRlLm5vdygpO1xuICAgIGNvbnN0IHRvdGFsVGltZSA9IGVuZFRpbWUgLSB0aGlzLmhtclN0YXJ0VGltZTtcbiAgICBjb25zdCBbY2hhbGssIHsgY2VudGVyVGV4dCB9XSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgIChhd2FpdCBpbXBvcnQoXCJjaGFsa1wiKSkuZGVmYXVsdCxcbiAgICAgIGltcG9ydChcIi4uL3V0aWxzL2NvbnNvbGUtdXRpbFwiKSxcbiAgICBdKTtcbiAgICBjb25zdCBtc2cgPSBgSE1SIERvbmUhICR7Y2hhbGsuYm9sZC53aGl0ZShgJHt0b3RhbFRpbWV9bXNgKX1gO1xuXG4gICAgY29uc29sZS5sb2coY2hhbGsuYmxhY2suYmdHcmVlbihjZW50ZXJUZXh0KG1zZykpKTtcbiAgfVxuXG4gIGFzeW5jIGRlc3Ryb3koKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgeyBCYXNlTW9kZWwgfSA9IGF3YWl0IGltcG9ydChcIi4uL2RhdGFiYXNlL2Jhc2UtbW9kZWxcIik7XG4gICAgLy8g66i87KCAIOyymOumrO2VtOyVvO2VqC5cbiAgICBhd2FpdCBCYXNlTW9kZWwuZGVzdHJveSgpO1xuICAgIGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChbXG4gICAgICB0aGlzLl93b3JrZmxvd3M/LmRlc3Ryb3koKSA/PyBQcm9taXNlLnJlc29sdmUoKSxcbiAgICAgIHRoaXMuX2NhY2hlPy5kaXNjb25uZWN0KCkgPz8gUHJvbWlzZS5yZXNvbHZlKCksXG4gICAgICB0aGlzLl9kZXZWaXRlc3RNYW5hZ2VyPy5zaHV0ZG93bigpID8/IFByb21pc2UucmVzb2x2ZSgpLFxuICAgICAgdGhpcy53YXRjaGVyPy5jbG9zZSgpID8/IFByb21pc2UucmVzb2x2ZSgpLFxuICAgICAgbG9ndGFwZURpc3Bvc2UoKSxcbiAgICBdKTtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgU29uYW11ID0gbmV3IFNvbmFtdUNsYXNzKCk7XG5cbi8qKlxuICogc3RyZWFtIOuqqOuTnOyXkOyEnCDtgqQg7IOd7ISxIO2VqOyImOqwgCDsp4DsoJXrkJjsp4Ag7JWK7JWY7J2EIOuVjCDsgqzsmqntlZjripQg6riw67O4IO2VqOyImOyeheuLiOuLpC5cbiAqL1xuZnVuY3Rpb24gZGVmYXVsdEtleUdlbmVyYXRvcihmaWxlOiB7IGZpbGVuYW1lOiBzdHJpbmc7IG1pbWV0eXBlOiBzdHJpbmcgfSk6IHN0cmluZyB7XG4gIGNvbnN0IGV4dCA9IG1pbWUuZXh0ZW5zaW9uKGZpbGUubWltZXR5cGUpIHx8IFwiYmluXCI7XG4gIGNvbnN0IHRpbWVzdGFtcCA9IERhdGUubm93KCk7XG4gIGNvbnN0IHJhbmRvbSA9IE1hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnNsaWNlKDIsIDgpO1xuICByZXR1cm4gYHVwbG9hZHMvJHt0aW1lc3RhbXB9LSR7cmFuZG9tfS4ke2V4dH1gO1xufVxuIl0sIm5hbWVzIjpbImRpc3Bvc2UiLCJsb2d0YXBlRGlzcG9zZSIsImFzc2VydCIsIkFzeW5jTG9jYWxTdG9yYWdlIiwiZnMiLCJtaW1lIiwibG9va3VwIiwibWltZUxvb2t1cCIsIm9zIiwicGF0aCIsIkJBU0VfRklFTERfTUFQUElOR1MiLCJjb252ZXJ0RmFzdGlmeUhlYWRlcnNUb1N0YW5kYXJkIiwiY3JlYXRlTW9ja1NTRUZhY3RvcnkiLCJEQiIsImlzRGFlbW9uU2VydmVyIiwibWVyZ2UiLCJOb3RGb3VuZEV4Y2VwdGlvbiIsImFwcGx5Q2FjaGVIZWFkZXJzIiwiQ2FjaGVQcmVzZXRzIiwidG9GYXN0aWZ5Q29tcHJlc3NPcHRpb24iLCJTRCIsIk5haXRlIiwiQnVmZmVyZWRGaWxlIiwiVXBsb2FkZWRGaWxlIiwiZXhpc3RzIiwiZmlsZUV4aXN0cyIsImdldFNlY3JldHMiLCJTb25hbXVDbGFzcyIsImlzSW5pdGlhbGl6ZWQiLCJmb3JUZXN0aW5nIiwiYXN5bmNMb2NhbFN0b3JhZ2UiLCJnZXRDb250ZXh0Iiwic3RvcmUiLCJnZXRTdG9yZSIsImNvbnRleHQiLCJwcm9jZXNzIiwiZW52IiwiTk9ERV9FTlYiLCJyZXF1ZXN0IiwicmVwbHkiLCJoZWFkZXJzIiwiY3JlYXRlU1NFIiwic2NoZW1hIiwibmFpdGVTdG9yZSIsIk1hcCIsIkVycm9yIiwiX2FwaVJvb3RQYXRoIiwiYXBpUm9vdFBhdGgiLCJhcHBSb290UGF0aCIsInNwbGl0Iiwic2VwIiwic2xpY2UiLCJqb2luIiwiX2RiQ29uZmlnIiwiZGJDb25maWciLCJfc3luY2VyIiwic3luY2VyIiwiX2NvbmZpZyIsImNvbmZpZyIsInNlY3JldHMiLCJfc3RvcmFnZSIsInN0b3JhZ2UiLCJfY2FjaGUiLCJjYWNoZSIsIl93b3JrZmxvd3MiLCJ3b3JrZmxvd3MiLCJfYXV0aCIsImF1dGgiLCJfZGV2Vml0ZXN0TWFuYWdlciIsImRldlZpdGVzdE1hbmFnZXIiLCJtYW5hZ2VyIiwid2F0Y2hlciIsInBlbmRpbmdGaWxlcyIsImhtclN0YXJ0VGltZSIsInNlcnZlciIsImluaXRGb3JUZXN0aW5nIiwiaW5pdCIsInVuZGVmaW5lZCIsImRvU2lsZW50IiwiZW5hYmxlU3luYyIsImNoYWxrIiwiZGVmYXVsdCIsImNvbnNvbGUiLCJ0aW1lIiwiY3lhbiIsImZpbmRBcGlSb290UGF0aCIsImxvYWRDb25maWciLCJkYXRhYmFzZSIsImRlZmF1bHRPcHRpb25zIiwiY2xpZW50IiwiY29uZmlndXJlTG9nVGFwZSIsImxvZ2dpbmciLCJnZW5lcmF0ZURCQ29uZmlnIiwibG9nIiwiZ3JlZW4iLCJFbnRpdHlNYW5hZ2VyIiwiYXV0b2xvYWQiLCJpbml0aWFsaXplQ2FjaGUiLCJpbml0aWFsaXplV29ya2Zsb3dzIiwidGFza3MiLCJTeW5jZXIiLCJhdXRvbG9hZFR5cGVzIiwiYXV0b2xvYWRNb2RlbHMiLCJhdXRvbG9hZEFwaXMiLCJhdXRvbG9hZFdvcmtmbG93cyIsIlRlbXBsYXRlTWFuYWdlciIsImF1dG9sb2FkU1NSUm91dGVzIiwiaXNMb2NhbCIsImlzVGVzdCIsInNldHVwQmlvbWUiLCJpc0hvdFJlbG9hZFNlcnZlciIsInN5bmMiLCJzdGFydFdhdGNoZXIiLCJ0aW1lRW5kIiwiY3JlYXRlU2VydmVyIiwiaW5pdE9wdGlvbnMiLCJvcHRpb25zIiwiZmFzdGlmeSIsImdldExvZ1RhcGVGYXN0aWZ5TG9nZ2VyIiwibG9nZ2VyIiwiY2F0ZWdvcnkiLCJmYXN0aWZ5Q2F0ZWdvcnkiLCJTdG9yYWdlTWFuYWdlciIsInBsdWdpbnMiLCJyZWdpc3RlclBsdWdpbnMiLCJyZWdpc3RlckJldHRlckF1dGgiLCJ3aXRoRmFzdGlmeSIsImFwaUNvbmZpZyIsImJvb3QiLCJ0aW1lem9uZSIsImFwaSIsImZvcm1hdEluVGltZVpvbmUiLCJJU09fREFURV9SRUdFWCIsIkRBVEVfRk9STUFUIiwic2V0UmVwbHlTZXJpYWxpemVyIiwicGF5bG9hZCIsIkpTT04iLCJzdHJpbmdpZnkiLCJfa2V5IiwidmFsdWUiLCJ0ZXN0IiwiRGF0ZSIsImdldCIsInJvdXRlIiwicHJlZml4IiwiX3JlcXVlc3QiLCJfcmVwbHkiLCJhcGlzIiwic29uYW11VUlBcGlQbHVnaW4iLCJyZWdpc3RlciIsImRldlJ1bm5lciIsImVuYWJsZWQiLCJyZWdpc3RlckRldlRlc3RSb3V0ZXMiLCJ3ZWJQYXRoIiwiaGFzV2ViIiwicGx1Z2luQ29tcHJlc3MiLCJjb21wcmVzcyIsImdsb2JhbENvbXByZXNzT3B0aW9ucyIsInRocmVzaG9sZCIsImVuY29kaW5ncyIsImN1c3RvbVR5cGVzIiwiZGlzYWJsZUludGVncmF0ZWRXZWIiLCJTT05BTVVfRElTQUJMRV9JTlRFR1JBVEVEX1dFQiIsInNldHVwRGV2U2VydmVyV2l0aFZpdGUiLCJzZXR1cERldlNlcnZlciIsIm1vZGVscyIsIm1vZGVsTmFtZSIsIm1ldGhvZCIsImh0dHBNZXRob2QiLCJ1cmwiLCJoYW5kbGVyIiwiY3JlYXRlQXBpSGFuZGxlciIsInNldHVwU3RhdGljV2ViU2VydmVyIiwiaGFuZGxlRGV2QXBpUmVxdWVzdCIsImdldFBhdGhuYW1lRnJvbVVybCIsInN0YXJ0c1dpdGgiLCJtYXRjaGVkQXBpIiwiZmluZCIsImFwaU1ldGhvZCIsImZ1bGxQYXRoIiwiaXNQYXRoUGF0dGVybk1hdGNoIiwidml0ZVNlcnZlciIsInZpdGUiLCJyb290IiwibWlkZGxld2FyZU1vZGUiLCJobXIiLCJhcHBUeXBlIiwidXNlIiwicmVxIiwicmVzIiwibmV4dCIsIm1pZGRsZXdhcmVzIiwicmVzdWx0IiwibWF0Y2hTU1JSb3V0ZSIsInJlbmRlclNTUiIsInNzck1hdGNoIiwiaHRtbCIsInBhcmFtcyIsInR5cGUiLCJ0ZW1wbGF0ZSIsInJlYWRGaWxlIiwidHJhbnNmb3JtSW5kZXhIdG1sIiwiZSIsInNzckZpeFN0YWNrdHJhY2UiLCJlcnJvciIsInN0YXR1cyIsIm1lc3NhZ2UiLCJhZGRIb29rIiwiY2xvc2UiLCJ3ZWJEaXN0UGF0aCIsInNzclBhdGgiLCJzc3JFbnRyeVBhdGgiLCJzc3JSb3V0ZXNQYXRoIiwid2FybiIsInNzckF2YWlsYWJsZSIsInJlcXVlc3RlZEZpbGUiLCJmaWxlbmFtZSIsImFzc2V0c0RpciIsInNhZmVGaWxlUGF0aCIsInJlc29sdmVQYXRoV2l0aGluQmFzZURpciIsInNlbmQiLCJub3JtYWxpemVkUmVxdWVzdGVkRmlsZSIsInJlbGF0aXZlIiwicmVwbGFjZSIsImFzc2V0UGF0aCIsImdldENhY2hlQ29udHJvbEZvckFzc2V0IiwiY2FjaGVSZXEiLCJjYWNoZUNvbnRyb2xIYW5kbGVyIiwiaW1tdXRhYmxlIiwiZXh0IiwicG9wIiwiZmlsZXMiLCJyZWFkZGlyIiwiY3VycmVudEZpbGUiLCJmIiwiZW5kc1dpdGgiLCJmaWxlUGF0aCIsImNvbnRlbnQiLCJpbmNsdWRlcyIsImdldFNTUlJvdXRlcyIsInNzclJvdXRlcyIsImV4dHJhY3RQYXRoUGFyYW1zIiwiY3NyQ2FjaGVSZXEiLCJjc3JDYWNoZUNvbmZpZyIsInJlcXVlc3RQYXRoIiwiaW5kZXhQYXRoIiwiY3JlYXRlQ29udGV4dCIsInJ1biIsImd1YXJkcyIsImV2ZXJ5IiwiZ3VhcmQiLCJndWFyZEhhbmRsZXIiLCJnZXRab2RPYmplY3RGcm9tQXBpIiwiUmVxVHlwZSIsInR5cGVzIiwid2hpY2giLCJyZXFCb2R5IiwiYnVmZmVyZWRGaWxlcyIsInVwbG9hZGVkRmlsZXMiLCJib2R5IiwidXBsb2FkT3B0aW9ucyIsInBhcnRzIiwibGltaXRzIiwiZmllbGRzIiwiY29uc3VtZSIsInBhcnQiLCJidWZmZXIiLCJ0b0J1ZmZlciIsInB1c2giLCJmaWVsZG5hbWUiLCJTdHJpbmciLCJkaXNrTmFtZSIsImRlc3RpbmF0aW9uIiwiZGlzayIsImtleUdlbmVyYXRvciIsImRlZmF1bHRLZXlHZW5lcmF0b3IiLCJrZXkiLCJtaW1ldHlwZSIsInB1dFN0cmVhbSIsImZpbGUiLCJjb250ZW50VHlwZSIsImdldFVybCIsInNpZ25lZFVybCIsImdldFNpZ25lZFVybCIsInNpemUiLCJieXRlc1JlYWQiLCJxcyIsInBhcnNlZCIsInBhcnNlIiwiT2JqZWN0IiwiYXNzaWduIiwiZmFzdGlmeUNhc3RlciIsIlpvZEVycm9yIiwiaHVtYW5pemVab2RFcnJvciIsIm1lc3NhZ2VzIiwibWFwIiwiaXNzdWUiLCJCYWRSZXF1ZXN0RXhjZXB0aW9uIiwiem9kRXJyb3IiLCJhcGlDYWNoZUNvbmZpZyIsImdldEFwaUNhY2hlQ29udHJvbCIsIkFwaVBhcmFtVHlwZSIsImFyZ3MiLCJwYXJhbWV0ZXJzIiwicGFyYW0iLCJpc0NvbnRleHQiLCJuYW1lIiwiaW52b2tlTW9kZWxNZXRob2QiLCJwYXR0ZXJuIiwicGF0dGVyblBhcnRzIiwiZmlsdGVyIiwiQm9vbGVhbiIsInVybFBhcnRzIiwiaSIsImxlbmd0aCIsInBhdHRlcm5QYXJ0IiwidXJsUGFydCIsImJhc2VEaXIiLCJpbnB1dFBhdGgiLCJkZWNvZGVkIiwiZGVjb2RlVVJJQ29tcG9uZW50IiwicmVsYXRpdmVQYXRoIiwicmVzb2x2ZWRQYXRoIiwicmVzb2x2ZSIsInJlbGF0aXZlRnJvbUJhc2UiLCJpc0Fic29sdXRlIiwiY2FjaGVDb250cm9sIiwicm91dGVPcHRpb25zIiwiaW52b2tlQXBpRm9yU1NSIiwicGFyYW1zSW5kZXgiLCJtb2RlbCIsIm1ldGhvZE5hbWUiLCJhcHBseSIsImNyZWF0ZVNTRUZhY3RvcnkiLCJfZXZlbnRzIiwic29ja2V0IiwiYmluZCIsImxvY2FsZSIsImRldGVjdExvY2FsZSIsImkxOG4iLCJzdXBwb3J0ZWRMb2NhbGVzIiwiZGVmYXVsdExvY2FsZSIsInNlc3Npb24iLCJnZXRTZXNzaW9uIiwiUHJvbWlzZSIsImNvbnRleHRQcm92aWRlciIsImNyZWF0ZVN0b3JlIiwidXNlciIsImFjY2VwdExhbmd1YWdlIiwic3VwcG9ydGVkIiwibGFuZ3MiLCJsYW5nIiwiY29kZSIsInRyaW0iLCJ3YXRjaFBhdGgiLCJjaG9raWRhciIsIndhdGNoIiwiaWdub3JlZCIsInN0YXRzIiwiaXNGaWxlIiwicGVyc2lzdGVudCIsImlnbm9yZUluaXRpYWwiLCJvbiIsImV2ZW50IiwiYWJzb2x1dGVQYXRoIiwiaXNDb25maWdUcyIsImJvbGQiLCJibHVlIiwia2lsbCIsInBpZCIsImhhbmRsZUZpbGVDaGFuZ2UiLCJydW5TY3JpcHQiLCJmbiIsImRlc3Ryb3kiLCJjb21wcmVzc1BsdWdpbiIsInBsdWdpbnNNb2R1bGVzIiwiY29ycyIsImZvcm1ib2R5IiwibXVsdGlwYXJ0Iiwic3NlIiwic3RhdGljIiwicmVnaXN0ZXJQbHVnaW4iLCJwbHVnaW5OYW1lIiwib3B0aW9uIiwiZW50cmllcyIsImN1c3RvbSIsImJhc2VQYXRoIiwibWVyZ2VkRmllbGRNYXBwaW5ncyIsImJldHRlckF1dGgiLCJQb29sIiwiZ2V0REJDb25maWciLCJjb25uZWN0aW9uIiwiVVJMIiwiaG9zdCIsIlJlcXVlc3QiLCJ0b1N0cmluZyIsInJlc3BvbnNlIiwiZm9yRWFjaCIsImhlYWRlciIsInRleHQiLCJzZXRDYWNoZU1hbmFnZXJSZWYiLCJjcmVhdGVUZXN0Q2FjaGVNYW5hZ2VyIiwiY3JlYXRlQ2FjaGVNYW5hZ2VyIiwiV29ya2Zsb3dNYW5hZ2VyIiwiZW5hYmxlV29ya2VyIiwiZGVmYXVsdFdvcmtlck9wdGlvbnMiLCJjb25jdXJyZW5jeSIsImNwdXMiLCJ1c2VQdWJTdWIiLCJsaXN0ZW5EZWxheSIsInNldHVwV29ya2VyIiwid29ya2VyT3B0aW9ucyIsInBvcnQiLCJsaXN0ZW4iLCJsaWZlY3ljbGUiLCJvblNodXRkb3duIiwic2h1dGRvd24iLCJleGl0IiwiZXJyIiwib25FcnJvciIsInNldEVycm9ySGFuZGxlciIsInRoZW4iLCJzdGFydFdvcmtlciIsIm9uU3RhcnQiLCJjYXRjaCIsInJlZCIsIm5vdyIsInN5bmNGcm9tV2F0Y2hlciIsImZpbmlzaEhNUiIsInJlbmV3Q2hlY2tzdW1zIiwiZW5kVGltZSIsInRvdGFsVGltZSIsImNlbnRlclRleHQiLCJhbGwiLCJtc2ciLCJ3aGl0ZSIsImJsYWNrIiwiYmdHcmVlbiIsIkJhc2VNb2RlbCIsImFsbFNldHRsZWQiLCJkaXNjb25uZWN0IiwiU29uYW11IiwiZXh0ZW5zaW9uIiwidGltZXN0YW1wIiwicmFuZG9tIiwiTWF0aCJdLCJtYXBwaW5ncyI6IkFBQUEsU0FBU0EsV0FBV0MsY0FBYyxRQUFRLG1CQUFtQjtBQUM3RCxPQUFPQyxZQUFZLFNBQVM7QUFDNUIsU0FBU0MsaUJBQWlCLFFBQVEsY0FBYztBQUloRCxPQUFPQyxRQUFRLG1CQUFjO0FBRTdCLE9BQU9DLFFBQVFDLFVBQVVDLFVBQVUsUUFBUSxhQUFhO0FBQ3hELE9BQU9DLFFBQVEsS0FBSztBQUNwQixPQUFPQyxVQUFVLE9BQU87QUFHeEIsU0FDRUMsbUJBQW1CLEVBQ25CQywrQkFBK0IsRUFDL0JDLG9CQUFvQixFQUNwQkMsRUFBRSxFQUNGQyxjQUFjLEVBQ2RDLEtBQUssRUFDTEMsaUJBQWlCLFFB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