projen 0.101.26 → 0.101.28

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 (165) hide show
  1. package/.jsii +1065 -735
  2. package/lib/ai-instructions.js +2 -2
  3. package/lib/awscdk/auto-discover.js +6 -6
  4. package/lib/awscdk/awscdk-app-java.js +1 -1
  5. package/lib/awscdk/awscdk-app-py.js +1 -1
  6. package/lib/awscdk/awscdk-app-ts.js +1 -1
  7. package/lib/awscdk/awscdk-construct.js +1 -1
  8. package/lib/awscdk/awscdk-deps-java.js +1 -1
  9. package/lib/awscdk/awscdk-deps-js.js +1 -1
  10. package/lib/awscdk/awscdk-deps-py.js +1 -1
  11. package/lib/awscdk/awscdk-deps.js +1 -1
  12. package/lib/awscdk/cdk-config.js +3 -3
  13. package/lib/awscdk/cdk-tasks.js +1 -1
  14. package/lib/awscdk/integration-test.js +1 -1
  15. package/lib/awscdk/lambda-extension.js +1 -1
  16. package/lib/awscdk/lambda-function.js +2 -2
  17. package/lib/build/build-workflow.js +1 -1
  18. package/lib/cdk/auto-discover-base.js +2 -2
  19. package/lib/cdk/construct-lib.js +1 -1
  20. package/lib/cdk/integration-test-base.js +1 -1
  21. package/lib/cdk/jsii-build.js +1 -1
  22. package/lib/cdk/jsii-docgen.js +1 -1
  23. package/lib/cdk/jsii-project.js +1 -1
  24. package/lib/cdk8s/auto-discover.js +2 -2
  25. package/lib/cdk8s/cdk8s-app-py.js +1 -1
  26. package/lib/cdk8s/cdk8s-app-ts.js +1 -1
  27. package/lib/cdk8s/cdk8s-construct.js +1 -1
  28. package/lib/cdk8s/cdk8s-deps-py.js +1 -1
  29. package/lib/cdk8s/cdk8s-deps.js +1 -1
  30. package/lib/cdk8s/integration-test.js +1 -1
  31. package/lib/cdktf/cdktf-construct.js +1 -1
  32. package/lib/circleci/circleci.js +1 -1
  33. package/lib/cli/task-runtime.js +2 -2
  34. package/lib/component.js +2 -2
  35. package/lib/dependencies.js +1 -1
  36. package/lib/dev-env.js +1 -1
  37. package/lib/docker-compose/docker-compose-service.js +1 -1
  38. package/lib/docker-compose/docker-compose.js +1 -1
  39. package/lib/file.js +1 -1
  40. package/lib/gitattributes.js +1 -1
  41. package/lib/github/actions-provider.js +1 -1
  42. package/lib/github/auto-approve.js +1 -1
  43. package/lib/github/auto-merge.js +1 -1
  44. package/lib/github/auto-queue.js +1 -1
  45. package/lib/github/dependabot.js +1 -1
  46. package/lib/github/dependency-review.js +1 -1
  47. package/lib/github/github-credentials.js +1 -1
  48. package/lib/github/github-project.js +1 -1
  49. package/lib/github/github.js +1 -1
  50. package/lib/github/merge-queue.js +1 -1
  51. package/lib/github/mergify.js +1 -1
  52. package/lib/github/pr-template.js +1 -1
  53. package/lib/github/pull-request-backport.js +1 -1
  54. package/lib/github/pull-request-lint.js +1 -1
  55. package/lib/github/stale.js +1 -1
  56. package/lib/github/task-workflow-job.js +1 -1
  57. package/lib/github/task-workflow.js +1 -1
  58. package/lib/github/workflow-actions.js +1 -1
  59. package/lib/github/workflow-jobs.js +1 -1
  60. package/lib/github/workflow-steps.js +1 -1
  61. package/lib/github/workflows.js +1 -1
  62. package/lib/gitlab/configuration.js +1 -1
  63. package/lib/gitlab/gitlab-configuration.js +1 -1
  64. package/lib/gitlab/nested-configuration.js +1 -1
  65. package/lib/gitpod.js +1 -1
  66. package/lib/ignore-file.js +1 -1
  67. package/lib/ini.js +1 -1
  68. package/lib/java/java-project.js +1 -1
  69. package/lib/java/junit.js +1 -1
  70. package/lib/java/maven-compile.js +1 -1
  71. package/lib/java/maven-packaging.js +1 -1
  72. package/lib/java/maven-sample.js +1 -1
  73. package/lib/java/pom.js +2 -2
  74. package/lib/java/projenrc.js +1 -1
  75. package/lib/javascript/biome/biome-config.d.ts +292 -322
  76. package/lib/javascript/biome/biome-config.js +5 -5
  77. package/lib/javascript/biome/biome.js +1 -1
  78. package/lib/javascript/bundler.js +1 -1
  79. package/lib/javascript/eslint.js +1 -1
  80. package/lib/javascript/jest.js +4 -4
  81. package/lib/javascript/license-checker.js +1 -1
  82. package/lib/javascript/node-package.d.ts +57 -4
  83. package/lib/javascript/node-package.js +46 -6
  84. package/lib/javascript/node-project.js +1 -1
  85. package/lib/javascript/npm-config.js +1 -1
  86. package/lib/javascript/pnpm-workspace-config.js +2 -2
  87. package/lib/javascript/pnpm-workspace.js +1 -1
  88. package/lib/javascript/prettier.js +1 -1
  89. package/lib/javascript/projenrc.js +1 -1
  90. package/lib/javascript/typescript-config.js +2 -2
  91. package/lib/javascript/upgrade-dependencies.js +7 -3
  92. package/lib/javascript/yarnrc.d.ts +51 -3
  93. package/lib/javascript/yarnrc.js +22 -4
  94. package/lib/json-patch.js +1 -1
  95. package/lib/json.js +1 -1
  96. package/lib/license.js +1 -1
  97. package/lib/logger.js +1 -1
  98. package/lib/makefile.js +1 -1
  99. package/lib/object-file.js +1 -1
  100. package/lib/project-build.js +1 -1
  101. package/lib/project-tree.js +1 -1
  102. package/lib/project.js +1 -1
  103. package/lib/projects.js +1 -1
  104. package/lib/projenrc-json.js +1 -1
  105. package/lib/projenrc.js +1 -1
  106. package/lib/python/pip.js +1 -1
  107. package/lib/python/poetry.js +2 -2
  108. package/lib/python/projenrc.js +1 -1
  109. package/lib/python/pyproject-toml-file.js +1 -1
  110. package/lib/python/pytest-sample.js +1 -1
  111. package/lib/python/pytest.js +1 -1
  112. package/lib/python/python-project.js +1 -1
  113. package/lib/python/python-sample.js +1 -1
  114. package/lib/python/requirements-file.js +1 -1
  115. package/lib/python/setuppy.js +1 -1
  116. package/lib/python/setuptools.js +1 -1
  117. package/lib/python/uv-config.js +1 -1
  118. package/lib/python/uv.js +1 -1
  119. package/lib/python/venv.js +1 -1
  120. package/lib/readme.js +1 -1
  121. package/lib/release/publisher.js +1 -1
  122. package/lib/release/release-trigger.js +1 -1
  123. package/lib/release/release.js +1 -1
  124. package/lib/renovatebot.js +1 -1
  125. package/lib/run-task.cjs +61 -42
  126. package/lib/sample-file.js +2 -2
  127. package/lib/script-runner.js +1 -1
  128. package/lib/source-code.js +1 -1
  129. package/lib/task-shell.js +1 -1
  130. package/lib/task.js +1 -1
  131. package/lib/tasks.js +1 -1
  132. package/lib/testing.js +1 -1
  133. package/lib/textfile.js +1 -1
  134. package/lib/toml.js +1 -1
  135. package/lib/typescript/projenrc-ts.js +1 -1
  136. package/lib/typescript/projenrc.js +1 -1
  137. package/lib/typescript/typescript-runner.js +1 -1
  138. package/lib/typescript/typescript-typedoc.js +1 -1
  139. package/lib/typescript/typescript.js +5 -5
  140. package/lib/util/dax.d.ts +1 -0
  141. package/lib/util/dax.js +21 -0
  142. package/lib/util/exec.js +2 -2
  143. package/lib/util/node-compat.d.ts +23 -0
  144. package/lib/util/node-compat.js +40 -0
  145. package/lib/version.js +2 -2
  146. package/lib/vscode/devcontainer.js +1 -1
  147. package/lib/vscode/extensions.js +1 -1
  148. package/lib/vscode/launch-config.js +1 -1
  149. package/lib/vscode/settings.js +1 -1
  150. package/lib/vscode/vscode.js +1 -1
  151. package/lib/web/next.js +3 -3
  152. package/lib/web/postcss.js +1 -1
  153. package/lib/web/react.js +3 -3
  154. package/lib/web/tailwind.js +1 -1
  155. package/lib/xmlfile.js +1 -1
  156. package/lib/yaml.js +1 -1
  157. package/node_modules/js-yaml/dist/js-yaml.js +5 -2
  158. package/node_modules/js-yaml/dist/js-yaml.js.map +1 -1
  159. package/node_modules/js-yaml/dist/js-yaml.min.js +1 -1
  160. package/node_modules/js-yaml/dist/js-yaml.min.js.map +1 -1
  161. package/node_modules/js-yaml/dist/js-yaml.mjs +3 -3
  162. package/node_modules/js-yaml/dist/js-yaml.mjs.map +1 -1
  163. package/node_modules/js-yaml/lib/type/omap.js +3 -3
  164. package/node_modules/js-yaml/package.json +1 -1
  165. package/package.json +3 -2
@@ -77,7 +77,7 @@ var CodeArtifactAuthProvider;
77
77
  * Represents the npm `package.json` file.
78
78
  */
79
79
  class NodePackage extends component_1.Component {
80
- static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.javascript.NodePackage", version: "0.101.26" };
80
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.javascript.NodePackage", version: "0.101.28" };
81
81
  /**
82
82
  * Returns the `NodePackage` instance associated with a project or `undefined` if
83
83
  * there is no NodePackage.
@@ -200,13 +200,17 @@ class NodePackage extends component_1.Component {
200
200
  */
201
201
  lockFile;
202
202
  /**
203
- * The task for installing project dependencies (non-frozen)
203
+ * The task for installing project dependencies (non-frozen).
204
204
  */
205
205
  installTask;
206
206
  /**
207
- * The task for installing project dependencies (frozen)
207
+ * The task for installing project dependencies (frozen).
208
208
  */
209
209
  installCiTask;
210
+ /**
211
+ * The task for deduplicating project dependencies, if configured.
212
+ */
213
+ dedupeTask;
210
214
  /**
211
215
  * The package.json file.
212
216
  */
@@ -356,6 +360,38 @@ class NodePackage extends component_1.Component {
356
360
  description: "Install project dependencies using frozen lockfile",
357
361
  exec: this.installCommand,
358
362
  });
363
+ // Needs to happen after the install tasks have been added
364
+ this.dedupeTask = this.maybeAddDedupeTask(options);
365
+ }
366
+ /**
367
+ * Adds a `dedupe` task if enabled via `dedupeDeps` or implied by
368
+ * `yarnBerryOptions.dedupePackages`.
369
+ *
370
+ * @returns the dedupe task, or `undefined` if not enabled.
371
+ */
372
+ maybeAddDedupeTask(options) {
373
+ const yarnBerryDedupePackages = options.yarnBerryOptions?.dedupePackages;
374
+ if (!(options.dedupeDeps ?? yarnBerryDedupePackages !== undefined)) {
375
+ return undefined;
376
+ }
377
+ if (this.packageManager === NodePackageManager.BUN) {
378
+ throw new Error("The 'dedupeDeps' option is not supported for Bun: bun does not provide a dedupe command.");
379
+ }
380
+ const dedupeTask = this.project.addTask("dedupe", {
381
+ description: "Deduplicate project dependencies",
382
+ });
383
+ if ((0, util_1.isYarnClassic)(this.packageManager)) {
384
+ // Yarn Classic always deduplicates as part of `yarn install`
385
+ dedupeTask.say("The dedupe command isn't necessary. `yarn install` will already dedupe.");
386
+ }
387
+ else {
388
+ dedupeTask.execArgs((0, util_1.isYarnBerry)(this.packageManager)
389
+ ? ["yarn", "dedupe", ...(yarnBerryDedupePackages ?? [])]
390
+ : [this.packageManager, "dedupe"]);
391
+ // Add dedupe to mutable install task
392
+ this.installTask.spawn(dedupeTask);
393
+ }
394
+ return dedupeTask;
359
395
  }
360
396
  /**
361
397
  * Defines normal dependencies.
@@ -526,13 +562,17 @@ class NodePackage extends component_1.Component {
526
562
  }
527
563
  }
528
564
  /**
529
- * Returns the command to execute in order to install all dependencies (always frozen).
565
+ * Returns the package manager's immutable install command with a frozen lockfile, e.g. `npm ci` or `pnpm ci`.
566
+ *
567
+ * Prefer using `NodePackage.installCiTask`. The raw command string is intended for bootstrapping.
530
568
  */
531
569
  get installCommand() {
532
570
  return this.renderInstallCommand(true);
533
571
  }
534
572
  /**
535
- * Renders `pnpm install` or `npm install` with lockfile update (not frozen)
573
+ * Returns the package manager's mutable install command with lockfile update, e.g. `npm install` or `pnpm install`.
574
+ *
575
+ * Prefer using `NodePackage.installTask`. The raw command string is intended for bootstrapping.
536
576
  */
537
577
  get installAndUpdateLockfileCommand() {
538
578
  return this.renderInstallCommand(false);
@@ -1555,4 +1595,4 @@ function inferPackageManagerFromLockfile(outdir) {
1555
1595
  }
1556
1596
  return undefined;
1557
1597
  }
1558
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9kZS1wYWNrYWdlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2phdmFzY3JpcHQvbm9kZS1wYWNrYWdlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQTZ5RUEsMENBZUM7O0FBNXpFRCwyQkFPWTtBQUNaLCtCQUFxQztBQUNyQywrQ0FBaUM7QUFFakMscURBQXFEO0FBQ3JELGlDQU9nQjtBQUVoQixxQ0FBa0M7QUFDbEMsMENBQXFEO0FBQ3JELDRDQUF5QztBQUN6QyxrREFBaUQ7QUFDakQsa0NBQW1DO0FBRW5DLHdDQUF1RDtBQUV2RCxrQ0FBOEU7QUFFOUUsTUFBTSxVQUFVLEdBQUcsWUFBWSxDQUFDO0FBQ2hDLE1BQU0sd0JBQXdCLEdBQUcsNkJBQTZCLENBQUM7QUFDL0QsTUFBTSx3QkFBd0IsR0FBRyxvQkFBb0IsQ0FBQztBQUN0RCxNQUFNLHdCQUF3QixHQUFHLFdBQVcsQ0FBQztBQUM3QyxNQUFNLDJCQUEyQixHQUFHLGNBQWMsQ0FBQztBQUNuRCxNQUFNLG9CQUFvQixHQUFHLFNBQVMsQ0FBQztBQUN2QyxNQUFNLDBCQUEwQixHQUFHLFFBQVEsQ0FBQztBQUM1QyxNQUFNLDRCQUE0QixHQUFHLFNBQVMsQ0FBQztBQW1jL0M7O0dBRUc7QUFDSCxJQUFZLHdCQWFYO0FBYkQsV0FBWSx3QkFBd0I7SUFDbEM7O09BRUc7SUFDSCxxRkFBeUQsQ0FBQTtJQUV6RDs7Ozs7T0FLRztJQUNILHVEQUEyQixDQUFBO0FBQzdCLENBQUMsRUFiVyx3QkFBd0Isd0NBQXhCLHdCQUF3QixRQWFuQztBQThERDs7R0FFRztBQUNILE1BQWEsV0FBWSxTQUFRLHFCQUFTOztJQUN4Qzs7Ozs7T0FLRztJQUNJLE1BQU0sQ0FBQyxFQUFFLENBQUMsT0FBZ0I7UUFDL0IsTUFBTSxJQUFJLEdBQUcsQ0FBQyxDQUFZLEVBQW9CLEVBQUUsQ0FBQyxDQUFDLFlBQVksV0FBVyxDQUFDO1FBQzFFLE9BQU8sT0FBTyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDdkMsQ0FBQztJQUVEOztPQUVHO0lBQ2EsV0FBVyxDQUFTO0lBRXBDOztPQUVHO0lBQ2EsVUFBVSxDQUFTO0lBRW5DOztPQUVHO0lBQ2Esd0JBQXdCLENBQVU7SUFFbEQ7O09BRUc7SUFDYSxjQUFjLENBQXFCO0lBRW5EOztPQUVHO0lBQ2EsUUFBUSxDQUFNO0lBRTlCOzs7O09BSUc7SUFDYSxjQUFjLENBQVU7SUFFeEM7Ozs7T0FJRztJQUNhLGNBQWMsQ0FBVTtJQUV4Qzs7OztPQUlHO0lBQ0gsSUFBVyxXQUFXO1FBQ3BCLE9BQU8sSUFBSSxDQUFDLGNBQWMsS0FBSyxrQkFBa0IsQ0FBQyxJQUFJO1lBQ3BELENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWTtZQUNuQixDQUFDLENBQUMsU0FBUyxDQUFDO0lBQ2hCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsSUFBVyxVQUFVO1FBQ25CLE9BQU8sSUFBSSxDQUFDLGNBQWMsS0FBSyxrQkFBa0IsQ0FBQyxHQUFHO1lBQ25ELENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVztZQUNsQixDQUFDLENBQUMsU0FBUyxDQUFDO0lBQ2hCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsSUFBVyxXQUFXO1FBQ3BCLElBQUksSUFBQSxrQkFBVyxFQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDO1lBQ3JDLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDO1FBQ2hDLENBQUM7UUFDRCxJQUFJLElBQUEsb0JBQWEsRUFBQyxJQUFJLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQztZQUN2QyxPQUFPLDRCQUE0QixDQUFDO1FBQ3RDLENBQUM7UUFDRCxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBRWdCLFlBQVksQ0FBUztJQUNyQixXQUFXLENBQVM7SUFDcEIsaUJBQWlCLENBQVM7SUFDMUIsUUFBUSxDQUFxQjtJQUU5Qzs7T0FFRztJQUNhLE9BQU8sQ0FBVTtJQUVqQzs7T0FFRztJQUNhLGNBQWMsQ0FBUztJQUV2Qzs7T0FFRztJQUNhLFdBQVcsQ0FBUztJQUVwQzs7T0FFRztJQUNhLGNBQWMsQ0FBVTtJQUV4Qzs7Ozs7T0FLRztJQUNNLG1CQUFtQixDQUF1QjtJQUVuRDs7OztPQUlHO0lBQ00scUJBQXFCLENBQTJCO0lBRXpEOztPQUVHO0lBQ2EsU0FBUyxDQUFZO0lBRXJDOztPQUVHO0lBQ2EsYUFBYSxDQUFVO0lBRXZDOztPQUVHO0lBQ2EsUUFBUSxDQUFTO0lBRWpDOztPQUVHO0lBQ2EsV0FBVyxDQUFPO0lBRWxDOztPQUVHO0lBQ2EsYUFBYSxDQUFPO0lBRXBDOztPQUVHO0lBQ2EsSUFBSSxDQUFXO0lBRWQsT0FBTyxHQUEyQixFQUFFLENBQUM7SUFDckMsa0JBQWtCLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztJQUN2QyxRQUFRLEdBQWdCLElBQUksR0FBRyxFQUFFLENBQUM7SUFDbEMsY0FBYyxHQUFnQixJQUFJLEdBQUcsRUFBRSxDQUFDO0lBQ3hDLEdBQUcsR0FBMkIsRUFBRSxDQUFDO0lBQ2pDLE9BQU8sR0FBMkIsRUFBRSxDQUFDO0lBQ3JDLHFCQUFxQixDQUF3QjtJQUM3QyxLQUFLLENBQXVCO0lBQ3JDLGFBQWEsQ0FBbUI7SUFDdkIsdUJBQXVCLENBQVU7SUFFbEQsWUFBWSxPQUFnQixFQUFFLFVBQThCLEVBQUU7UUFDNUQsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRWYsSUFBSSxDQUFDLFdBQVcsR0FBRyxPQUFPLENBQUMsV0FBVyxJQUFJLE9BQU8sQ0FBQyxJQUFJLENBQUM7UUFDdkQsSUFBSSxDQUFDLHFCQUFxQixHQUFHO1lBQzNCLG1CQUFtQixFQUFFLElBQUk7WUFDekIsR0FBRyxPQUFPLENBQUMscUJBQXFCO1NBQ2pDLENBQUM7UUFDRixJQUFJLENBQUMsd0JBQXdCLEdBQUcsT0FBTyxDQUFDLHdCQUF3QixJQUFJLElBQUksQ0FBQztRQUV6RSxrRUFBa0U7UUFDbEUsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7UUFFcEMsNEVBQTRFO1FBQzVFLElBQUksT0FBTyxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQzNCLElBQUksQ0FBQyxjQUFjLEdBQUcsT0FBTyxDQUFDLGNBQWMsQ0FBQztZQUM3QyxJQUFJLENBQUMsdUJBQXVCLEdBQUcsSUFBSSxDQUFDO1FBQ3RDLENBQUM7YUFBTSxDQUFDO1lBQ04sSUFBSSxDQUFDLHVCQUF1QixHQUFHLEtBQUssQ0FBQztZQUNyQyxNQUFNLFdBQVcsR0FBRyw4QkFBOEIsQ0FDaEQsSUFBSSxDQUFDLEtBQUssRUFDVixPQUFPLENBQUMsTUFBTSxDQUNmLENBQUM7WUFDRixJQUFJLFdBQVcsRUFBRSxDQUFDO2dCQUNoQixJQUFJLENBQUMsY0FBYyxHQUFHLFdBQVcsQ0FBQztZQUNwQyxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUN0Qix3RUFBd0Usa0JBQWtCLENBQUMsWUFBWSxLQUFLO29CQUMxRyxtRkFBbUYsQ0FDdEYsQ0FBQztnQkFDRixJQUFJLENBQUMsY0FBYyxHQUFHLGtCQUFrQixDQUFDLFlBQVksQ0FBQztZQUN4RCxDQUFDO1FBQ0gsQ0FBQztRQUVELElBQUksQ0FBQyxVQUFVLEdBQUcsT0FBTyxDQUFDLFVBQVUsSUFBSSxjQUFjLENBQUM7UUFDdkQsSUFBSSxDQUFDLFFBQVEsR0FBRyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7UUFFdkQsa0VBQWtFO1FBQ2xFLElBQUksT0FBTyxDQUFDLHVCQUF1QixLQUFLLEtBQUssRUFBRSxDQUFDO1lBQzlDLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO1FBQ2pDLENBQUM7UUFFRCxJQUFJLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFDLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFFcEQsTUFBTSxFQUNKLFNBQVMsRUFDVCxXQUFXLEVBQ1gsY0FBYyxFQUNkLGNBQWMsRUFDZCxtQkFBbUIsRUFDbkIscUJBQXFCLEVBQ3JCLGFBQWEsR0FDZCxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDbEMsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7UUFDM0IsSUFBSSxDQUFDLFdBQVcsR0FBRyxXQUFXLENBQUM7UUFDL0IsSUFBSSxDQUFDLGNBQWMsR0FBRyxjQUFjLENBQUM7UUFDckMsSUFBSSxDQUFDLGNBQWMsR0FBRyxjQUFjLENBQUM7UUFDckMsSUFBSSxDQUFDLG1CQUFtQixHQUFHLG1CQUFtQixDQUFDO1FBQy9DLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxxQkFBcUIsQ0FBQztRQUNuRCxJQUFJLENBQUMsYUFBYSxHQUFHLGFBQWEsQ0FBQztRQUVuQyxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRTFCLHVFQUF1RTtRQUN2RSxJQUFJLENBQUMsUUFBUSxHQUFHO1lBQ2QsSUFBSSxFQUFFLElBQUksQ0FBQyxXQUFXO1lBQ3RCLFdBQVcsRUFBRSxPQUFPLENBQUMsV0FBVztZQUNoQyxVQUFVLEVBQUUsQ0FBQyxPQUFPLENBQUMsVUFBVTtnQkFDN0IsQ0FBQyxDQUFDLFNBQVM7Z0JBQ1gsQ0FBQyxDQUFDO29CQUNFLElBQUksRUFBRSxLQUFLO29CQUNYLEdBQUcsRUFBRSxPQUFPLENBQUMsVUFBVTtvQkFDdkIsU0FBUyxFQUFFLE9BQU8sQ0FBQyxtQkFBbUI7aUJBQ3ZDO1lBQ0wsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUU7WUFDM0IsT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUU7WUFDbkMsTUFBTSxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDO1lBQ2xDLGVBQWUsRUFBRSxFQUFFO1lBQ25CLGdCQUFnQixFQUFFLEVBQUU7WUFDcEIsWUFBWSxFQUFFLEVBQUU7WUFDaEIsbUJBQW1CLEVBQUUsRUFBRTtZQUN2QixHQUFHLElBQUksQ0FBQyx3QkFBd0IsRUFBRTtZQUNsQyxRQUFRLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRTtZQUNyQyxPQUFPLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRTtZQUNuQyxVQUFVLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFO1lBQ3pDLElBQUksRUFBRSxJQUFJLENBQUMsVUFBVSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsU0FBUztZQUMxRCxPQUFPLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sSUFBSSxVQUFVO1lBQ3pDLFFBQVEsRUFBRSxPQUFPLENBQUMsUUFBUTtZQUMxQixTQUFTLEVBQUUsT0FBTyxDQUFDLFNBQVM7WUFDNUIsYUFBYSxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsRUFBRTtZQUMvQyxhQUFhLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxhQUFhO1lBQ3hDLFlBQVksRUFDVixJQUFJLENBQUMsY0FBYyxLQUFLLGtCQUFrQixDQUFDLEdBQUc7Z0JBQzVDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMscUJBQXFCLEVBQUU7Z0JBQ3BDLENBQUMsQ0FBQyxTQUFTO1lBQ2YsbUJBQW1CLEVBQ2pCLElBQUksQ0FBQyxjQUFjLEtBQUssa0JBQWtCLENBQUMsR0FBRztnQkFDNUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyw0QkFBNEIsRUFBRTtnQkFDM0MsQ0FBQyxDQUFDLFNBQVM7WUFDZixnQkFBZ0IsRUFBRSxJQUFBLGtCQUFXLEVBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQztnQkFDaEQsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQywrQkFBK0IsRUFBRTtnQkFDOUMsQ0FBQyxDQUFDLFNBQVM7WUFFYiw0RUFBNEU7WUFDNUUsdUVBQXVFO1lBQ3ZFLE9BQU8sRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUM7WUFDbkQsSUFBSSxFQUNGLE9BQU8sQ0FBQyxTQUFTLElBQUksT0FBTyxDQUFDLE9BQU87Z0JBQ2xDLENBQUMsQ0FBQztvQkFDRSxLQUFLLEVBQUUsT0FBTyxDQUFDLFNBQVM7b0JBQ3hCLEdBQUcsRUFBRSxPQUFPLENBQUMsT0FBTztpQkFDckI7Z0JBQ0gsQ0FBQyxDQUFDLFNBQVM7U0FDaEIsQ0FBQztRQUVGLG1DQUFtQztRQUNuQyxJQUFJLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQztRQUN4QixJQUFJLENBQUMsWUFBWSxHQUFHLE9BQU8sQ0FBQyxXQUFXLElBQUksb0JBQW9CLENBQUM7UUFDaEUsSUFBSSxDQUFDLFdBQVcsR0FBRyxPQUFPLENBQUMsVUFBVSxJQUFJLFFBQVEsQ0FBQztRQUNsRCxJQUFJLENBQUMsaUJBQWlCO1lBQ3BCLE9BQU8sQ0FBQyxnQkFBZ0IsRUFBRSxPQUFPLElBQUksMEJBQTBCLENBQUM7UUFDbEUsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsWUFBWSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFFeEQsZ0NBQWdDO1FBQ2hDLElBQUksSUFBQSxrQkFBVyxFQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDO1lBQ3JDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDNUMsQ0FBQztRQUVELDBCQUEwQjtRQUMxQixJQUFJLElBQUksQ0FBQyxjQUFjLEtBQUssa0JBQWtCLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDcEQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDdkMsQ0FBQztRQUVELElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxlQUFRLENBQUMsSUFBSSxFQUFFLGNBQWMsRUFBRTtZQUM3QyxHQUFHLEVBQUUsSUFBSSxDQUFDLFFBQVE7WUFDbEIsUUFBUSxFQUFFLEtBQUssRUFBRSxxREFBcUQ7WUFDdEUsT0FBTyxFQUFFLElBQUksRUFBRSwwRkFBMEY7WUFDekcsU0FBUyxFQUFFLElBQUksRUFBRSw4REFBOEQ7U0FDaEYsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLFFBQVEsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQzlDLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUUvQixxREFBcUQ7UUFDckQsSUFBSSxPQUFPLENBQUMsYUFBYSxJQUFJLElBQUksRUFBRSxDQUFDO1lBQ2xDLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1FBQzlCLENBQUM7UUFFRCxlQUFlO1FBQ2YsSUFBSSxDQUFDLGNBQWMsR0FBRyxPQUFPLENBQUMsY0FBYyxDQUFDO1FBQzdDLElBQUksQ0FBQyxjQUFjLEdBQUcsT0FBTyxDQUFDLGNBQWMsQ0FBQztRQUM3QyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFFckIsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFFekIsSUFBSSxDQUFDLDBCQUEwQixFQUFFLENBQUM7UUFFbEMsVUFBVTtRQUNWLElBQUksT0FBTyxDQUFDLFFBQVEsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUM3QixJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQyxPQUFPLElBQUksWUFBWSxDQUFDO1FBQ2pELENBQUM7UUFFRCxJQUFJLENBQUMsV0FBVyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFO1lBQzVDLFdBQVcsRUFDVCwrREFBK0Q7WUFDakUsSUFBSSxFQUFFLElBQUksQ0FBQywrQkFBK0I7U0FDM0MsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLGFBQWEsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRTtZQUNqRCxXQUFXLEVBQUUsb0RBQW9EO1lBQ2pFLElBQUksRUFBRSxJQUFJLENBQUMsY0FBYztTQUMxQixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7Ozs7Ozs7O09BUUc7SUFDSSxPQUFPLENBQUMsR0FBRyxJQUFjO1FBQzlCLEtBQUssTUFBTSxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7WUFDdkIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsRUFBRSw2QkFBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQy9ELENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7Ozs7O09BUUc7SUFDSSxVQUFVLENBQUMsR0FBRyxJQUFjO1FBQ2pDLEtBQUssTUFBTSxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7WUFDdkIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsRUFBRSw2QkFBYyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzdELENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7OztPQVlHO0lBQ0ksV0FBVyxDQUFDLEdBQUcsSUFBYztRQUNsQyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLHdCQUF3QixFQUFFLENBQUM7WUFDL0QsTUFBTSxJQUFJLEtBQUssQ0FDYixtREFBbUQsTUFBTSxDQUFDLElBQUksQ0FDNUQsSUFBSSxDQUNMLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQ2QsQ0FBQztRQUNKLENBQUM7UUFFRCxLQUFLLE1BQU0sR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLEVBQUUsNkJBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM1RCxDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7Ozs7Ozs7OztPQVdHO0lBQ0ksY0FBYyxDQUFDLEdBQUcsSUFBYztRQUNyQyxJQUFJLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztZQUNsRCxNQUFNLElBQUksS0FBSyxDQUNiLHNEQUFzRCxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQ3ZFLENBQUM7UUFDSixDQUFDO1FBRUQsS0FBSyxNQUFNLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUN2QixJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxFQUFFLDZCQUFjLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDL0QsQ0FBQztJQUNILENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksU0FBUyxDQUFDLE1BQWMsRUFBRSxPQUFlO1FBQzlDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEdBQUcsT0FBTyxDQUFDO0lBQ2pDLENBQUM7SUFFRDs7O09BR0c7SUFDSSxXQUFXLENBQUMsR0FBRyxRQUFrQjtRQUN0QyxLQUFLLE1BQU0sQ0FBQyxJQUFJLFFBQVEsRUFBRSxDQUFDO1lBQ3pCLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3ZCLENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7T0FVRztJQUNJLGlCQUFpQixDQUFDLEdBQUcsUUFBa0I7UUFDNUMsS0FBSyxNQUFNLEdBQUcsSUFBSSxRQUFRLEVBQUUsQ0FBQztZQUMzQixJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMvQixDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSSxvQkFBb0IsQ0FBQyxHQUFHLFFBQWtCO1FBQy9DLEtBQUssTUFBTSxHQUFHLElBQUksUUFBUSxFQUFFLENBQUM7WUFDM0IsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDbEMsQ0FBQztJQUNILENBQUM7SUFFTSxNQUFNLENBQUMsSUFBNEI7UUFDeEMsS0FBSyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUMxQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNsQixDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ksU0FBUyxDQUFDLElBQVksRUFBRSxPQUFlO1FBQzVDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsT0FBTyxDQUFDO0lBQy9CLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksWUFBWSxDQUFDLElBQVk7UUFDOUIsNkRBQTZEO1FBQzdELElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbEMsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzVCLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNJLFFBQVEsQ0FBQyxJQUFZLEVBQUUsS0FBVTtRQUN0QyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLEtBQUssQ0FBQztJQUM5QixDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksVUFBVSxDQUFDLE9BQWU7UUFDL0IsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO0lBQ2xDLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0kscUJBQXFCLENBQUMsR0FBRyxXQUFxQjtRQUNuRCxLQUFLLE1BQU0sVUFBVSxJQUFJLFdBQVcsRUFBRSxDQUFDO1lBQ3JDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxVQUFVLEVBQUUsNkJBQWMsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN2RSxDQUFDO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFBVyxjQUFjO1FBQ3ZCLE9BQU8sSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3pDLENBQUM7SUFFRDs7T0FFRztJQUNILElBQVcsK0JBQStCO1FBQ3hDLE9BQU8sSUFBSSxDQUFDLG9CQUFvQixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzFDLENBQUM7SUFFRDs7Ozs7Ozs7OztPQVVHO0lBQ0ksMkJBQTJCLENBQ2hDLGNBQXNCO1FBRXRCLElBQUksQ0FBQztZQUNILE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBQ3BFLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLE9BQU8sRUFBRSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQ2xFLElBQUksT0FBTyxFQUFFLENBQUM7Z0JBQ1osT0FBTyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDMUIsQ0FBQztRQUNILENBQUM7UUFBQyxNQUFNLENBQUMsQ0FBQSxDQUFDO1FBQ1YsT0FBTyxJQUFBLGtDQUEyQixFQUFDLGNBQWMsRUFBRTtZQUNqRCxLQUFLLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQztTQUM3QixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsMEZBQTBGO0lBQ25GLFVBQVU7UUFDZixJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1FBQy9DLEtBQUssQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUNyQixDQUFDO0lBRU0sY0FBYztRQUNuQixLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7UUFFdkIsc0VBQXNFO1FBQ3RFLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyw4QkFBOEIsRUFBRSxDQUFDO1FBQzdELElBQUksY0FBYyxFQUFFLENBQUM7WUFDbkIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBQ3ZDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUMzQyxDQUFDO1FBRUQsa0VBQWtFO1FBQ2xFLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyw4QkFBOEIsRUFBRSxDQUFDO1FBQzFELElBQUksV0FBVyxFQUFFLE1BQU0sRUFBRSxDQUFDO1lBQ3hCLE1BQU0sT0FBTyxHQUFtQjtnQkFDOUIsTUFBTSxFQUFFLGFBQWEsQ0FBQyxhQUFhO2dCQUNuQyxXQUFXO2FBQ1osQ0FBQztZQUNGLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNoQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDcEMsQ0FBQztJQUNILENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSyw4QkFBOEI7UUFDcEMsTUFBTSxjQUFjLEdBQUcsSUFBQSxlQUFVLEVBQy9CLElBQUEsV0FBSSxFQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLGNBQWMsQ0FBQyxDQUMxQyxDQUFDO1FBRUYsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ3RCLE9BQU87Z0JBQ0wsTUFBTSxFQUFFLGFBQWEsQ0FBQyxvQkFBb0I7Z0JBQzFDLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7YUFDM0IsQ0FBQztRQUNKLENBQUM7UUFFRCxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDcEIsT0FBTyxFQUFFLE1BQU0sRUFBRSxhQUFhLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDbkQsQ0FBQztRQUVELE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFFRDs7O09BR0c7SUFDSyxpQkFBaUIsQ0FBQyxPQUF1QjtRQUMvQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQ3RCLHNEQUFzRCxDQUN2RCxDQUFDO1FBQ0YsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLG1CQUFtQixPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztRQUUvRCxJQUFJLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNqQixJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQ3ZCLHVCQUF1QixPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUNqRCxDQUFDO1FBQ0osQ0FBQztRQUVELElBQUksT0FBTyxDQUFDLFdBQVcsRUFBRSxNQUFNLEVBQUUsQ0FBQztZQUNoQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQ3RCLGtDQUFrQyxPQUFPLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUN4RixDQUFDO1FBQ0osQ0FBQztJQUNILENBQUM7SUFFRDs7O09BR0c7SUFDSCxJQUFXLFdBQVc7UUFDcEIsT0FBTyxJQUFBLGtCQUFXLEVBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBQzFDLENBQUM7SUFFRDs7T0FFRztJQUNILElBQVksZ0JBQWdCO1FBQzFCLE9BQU8sSUFBQSxlQUFRLEVBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNsQyxDQUFDO0lBRU8sZ0JBQWdCLENBQUMsV0FBb0I7UUFDM0MsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUN6QixPQUFPLE9BQU8sQ0FBQztRQUNqQixDQUFDO1FBRUQsT0FBTyxXQUFXLElBQUksT0FBTyxDQUFDO0lBQ2hDLENBQUM7SUFFRDs7T0FFRztJQUNILElBQVksY0FBYztRQUN4QixPQUFPLElBQUEsZUFBUSxFQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDdkMsQ0FBQztJQUVELDhGQUE4RjtJQUV0RixlQUFlLENBQUMsT0FBMkI7UUFDakQsTUFBTSxjQUFjLEdBQUcsT0FBTyxDQUFDLGNBQWMsQ0FBQztRQUU5QyxNQUFNLElBQUksR0FBRyxJQUFJLEdBQUcsQ0FBQyxjQUFjLElBQUksd0JBQXdCLENBQUMsQ0FBQztRQUNqRSxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUMxQyxNQUFNLElBQUksS0FBSyxDQUNiLGtEQUFrRCxjQUFjLHlCQUF5QixDQUMxRixDQUFDO1FBQ0osQ0FBQztRQUVELE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxTQUFTLElBQUksZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQzFFLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLFNBQVMsS0FBSyxTQUFTLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDdEUsTUFBTSxJQUFJLEtBQUssQ0FDYixnRUFBZ0UsSUFBSSxDQUFDLFdBQVcsR0FBRyxDQUNwRixDQUFDO1FBQ0osQ0FBQztRQUVELE1BQU0sYUFBYSxHQUNqQixPQUFPLENBQUMsYUFBYSxJQUFJLFNBQVMsS0FBSyxTQUFTLENBQUMsTUFBTSxDQUFDO1FBQzFELElBQUksYUFBYSxJQUFJLFNBQVMsS0FBSyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDcEQsTUFBTSxJQUFJLEtBQUssQ0FDYix5REFBeUQsQ0FDMUQsQ0FBQztRQUNKLENBQUM7UUFFRCxNQUFNLGlCQUFpQixHQUFHLElBQUEsbUNBQXlCLEVBQUMsY0FBYyxDQUFDLENBQUM7UUFDcEUsTUFBTSxnQkFBZ0IsR0FDcEIsT0FBTyxDQUFDLHFCQUFxQjtZQUM3QixPQUFPLENBQUMscUJBQXFCLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQztRQUU3QyxJQUFJLGlCQUFpQixFQUFFLENBQUM7WUFDdEIsSUFBSSxPQUFPLENBQUMsY0FBYyxFQUFFLENBQUM7Z0JBQzNCLE1BQU0sSUFBSSxLQUFLLENBQ2IsMEVBQTBFLENBQzNFLENBQUM7WUFDSixDQUFDO2lCQUFNLElBQ0wsT0FBTyxDQUFDLG1CQUFtQixFQUFFLFlBQVk7Z0JBQ3pDLHdCQUF3QixDQUFDLFdBQVcsRUFDcEMsQ0FBQztnQkFDRCxJQUNFLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxpQkFBaUI7b0JBQzdDLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxxQkFBcUIsRUFDakQsQ0FBQztvQkFDRCxNQUFNLElBQUksS0FBSyxDQUNiLDZHQUE2RyxDQUM5RyxDQUFDO2dCQUNKLENBQUM7cUJBQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxZQUFZLEVBQUUsQ0FBQztvQkFDckQsTUFBTSxJQUFJLEtBQUssQ0FDYix5RkFBeUYsQ0FDMUYsQ0FBQztnQkFDSixDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUM7YUFBTSxDQUFDO1lBQ04sSUFDRSxDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsRUFBRSxpQkFBaUI7Z0JBQzdDLE9BQU8sQ0FBQyxtQkFBbUIsRUFBRSxxQkFBcUI7Z0JBQ2xELE9BQU8sQ0FBQyxtQkFBbUIsRUFBRSxZQUFZLENBQUM7Z0JBQzVDLENBQUMsZ0JBQWdCLEVBQ2pCLENBQUM7Z0JBQ0QsTUFBTSxJQUFJLEtBQUssQ0FDYix5R0FBeUcsQ0FDMUcsQ0FBQztZQUNKLENBQUM7UUFDSCxDQUFDO1FBRUQsc0NBQXNDO1FBQ3RDLElBQUksbUJBQW9ELENBQUM7UUFDekQsSUFBSSxpQkFBaUIsSUFBSSxnQkFBZ0IsRUFBRSxDQUFDO1lBQzFDLE1BQU0sWUFBWSxHQUNoQixPQUFPLENBQUMsbUJBQW1CLEVBQUUsWUFBWTtnQkFDekMsd0JBQXdCLENBQUMsMEJBQTBCLENBQUM7WUFDdEQsTUFBTSx5QkFBeUIsR0FDN0IsWUFBWSxLQUFLLHdCQUF3QixDQUFDLDBCQUEwQixDQUFDO1lBQ3ZFLG1CQUFtQixHQUFHO2dCQUNwQixZQUFZO2dCQUNaLGlCQUFpQixFQUNmLE9BQU8sQ0FBQyxtQkFBbUIsRUFBRSxpQkFBaUI7b0JBQzlDLENBQUMseUJBQXlCLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7Z0JBQy9ELHFCQUFxQixFQUNuQixPQUFPLENBQUMsbUJBQW1CLEVBQUUscUJBQXFCO29CQUNsRCxDQUFDLHlCQUF5QixDQUFDLENBQUMsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO2dCQUNuRSxZQUFZLEVBQUUsT0FBTyxDQUFDLG1CQUFtQixFQUFFLFlBQVk7YUFDeEQsQ0FBQztRQUNKLENBQUM7UUFFRCxPQUFPO1lBQ0wsU0FBUztZQUNULFdBQVcsRUFBRSxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsUUFBUyxDQUFDO1lBQ3ZFLGNBQWMsRUFBRSxJQUFJLENBQUMsSUFBSTtZQUN6QixjQUFjLEVBQUUsT0FBTyxDQUFDLG9CQUFvQjtnQkFDMUMsQ0FBQyxDQUFDLFNBQVM7Z0JBQ1gsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsY0FBYyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUM7WUFDMUQsbUJBQW1CO1lBQ25CLHFCQUFxQixFQUFFLElBQUksQ0FBQywwQkFBMEIsQ0FDcEQsT0FBTyxDQUFDLHFCQUFxQixDQUM5QjtZQUNELGFBQWE7U0FDZCxDQUFDO0lBQ0osQ0FBQztJQUVPLDBCQUEwQixDQUNoQyxxQkFBK0M7UUFFL0MsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7WUFDM0IsT0FBTyxTQUFTLENBQUM7UUFDbkIsQ0FBQztRQUVELE9BQU8scUJBQXFCLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUF5QixFQUFFO1lBQ2pFLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7Z0JBQzVCLE1BQU0sSUFBSSxLQUFLLENBQ2IsK0NBQStDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FDOUQsQ0FBQztZQUNKLENBQUM7WUFFRCxJQUFJLENBQUMsSUFBQSxtQ0FBeUIsRUFBQyxNQUFNLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQztnQkFDbkQsTUFBTSxJQUFJLEtBQUssQ0FDYixzRUFBc0UsTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUMzRixDQUFDO1lBQ0osQ0FBQztZQUVELE1BQU0sTUFBTSxHQUEwQjtnQkFDcEMsV0FBVyxFQUFFLE1BQU0sQ0FBQyxXQUFXO2dCQUMvQixLQUFLLEVBQUUsTUFBTSxDQUFDLEtBQUs7YUFDcEIsQ0FBQztZQUVGLE9BQU8sTUFBTSxDQUFDO1FBQ2hCLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVPLDBCQUEwQjtRQUNoQyxJQUNFLENBQUMsSUFBSSxDQUFDLHFCQUFxQjtZQUMzQixJQUFJLENBQUMscUJBQXFCLENBQUMsTUFBTSxLQUFLLENBQUMsRUFDdkMsQ0FBQztZQUNELE9BQU87UUFDVCxDQUFDO1FBRUQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFO1lBQy9CLEtBQUssRUFBRTtnQkFDTCxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsRUFBRSxrQ0FBa0M7Z0JBQ3pELEdBQUcsSUFBSSxDQUFDLHFCQUFxQixDQUFDLEdBQUcsQ0FBQyxDQUFDLG9CQUFvQixFQUFFLEVBQUU7b0JBQ3pELE1BQU0sRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLEdBQUcsb0JBQW9CLENBQUM7b0JBQ3BELE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsR0FDM0MsSUFBQSxpQ0FBMEIsRUFBQyxXQUFXLENBQUMsQ0FBQztvQkFDMUMsOEVBQThFO29CQUM5RSxNQUFNLFFBQVEsR0FBRzt3QkFDZixrQkFBa0IsS0FBSyxhQUFhLFdBQVcsRUFBRTt3QkFDakQsb0JBQW9CLFFBQVEsc0NBQXNDO3FCQUNuRSxDQUFDO29CQUNGLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDO3dCQUNwRSxRQUFRLENBQUMsSUFBSSxDQUFDLG9CQUFvQixRQUFRLG1CQUFtQixDQUFDLENBQUM7b0JBQ2pFLENBQUM7b0JBQ0QsT0FBTzt3QkFDTCxHQUFHLEVBQUU7NEJBQ0gsdUJBQXVCLEVBQUUsdURBQXVELE1BQU0sYUFBYSxNQUFNLG1CQUFtQixTQUFTLDRDQUE0Qzt5QkFDbEw7d0JBQ0QsSUFBSSxFQUFFLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO3FCQUMxQixDQUFDO2dCQUNKLENBQUMsQ0FBQzthQUNIO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVPLGFBQWE7UUFDbkIsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDakQsT0FBTztRQUNULENBQUM7UUFFRCxJQUFJLFdBQVcsR0FBRyxFQUFFLENBQUM7UUFDckIsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDeEIsV0FBVyxJQUFJLE1BQU0sSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQzdDLENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUN4QixXQUFXLElBQUksT0FBTyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDOUMsQ0FBQztRQUNELElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFFTyxxQkFBcUIsQ0FBQyxJQUF3QjtRQUNwRCxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksSUFBSSxHQUFHLEVBQUUsQ0FBQztZQUN6QixPQUFPLEVBQUUsQ0FBQztRQUNaLENBQUM7YUFBTSxDQUFDO1lBQ04sT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO0lBQ0gsQ0FBQztJQUVPLG9CQUFvQixDQUFDLE1BQWU7UUFDMUMsUUFBUSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDNUIsS0FBSyxrQkFBa0IsQ0FBQyxJQUFJLENBQUM7WUFDN0IsS0FBSyxrQkFBa0IsQ0FBQyxZQUFZO2dCQUNsQyxPQUFPO29CQUNMLGNBQWM7b0JBQ2QsZUFBZSxFQUFFLHVFQUF1RTtvQkFDeEYsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7aUJBQ3pDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2QsS0FBSyxrQkFBa0IsQ0FBQyxLQUFLLENBQUM7WUFDOUIsS0FBSyxrQkFBa0IsQ0FBQyxVQUFVO2dCQUNoQyxPQUFPO29CQUNMLGNBQWM7b0JBQ2QsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2lCQUNuRCxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNkLEtBQUssa0JBQWtCLENBQUMsR0FBRztnQkFDekIsT0FBTyxNQUFNLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDO1lBQzNDLEtBQUssa0JBQWtCLENBQUMsSUFBSTtnQkFDMUIsT0FBTyxNQUFNO29CQUNYLENBQUMsQ0FBQywwQkFBMEI7b0JBQzVCLENBQUMsQ0FBQyw2QkFBNkIsQ0FBQztZQUNwQyxLQUFLLGtCQUFrQixDQUFDLEdBQUc7Z0JBQ3pCLE9BQU8sQ0FBQyxhQUFhLEVBQUUsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FDbkUsR0FBRyxDQUNKLENBQUM7WUFFSjtnQkFDRSxNQUFNLElBQUksS0FBSyxDQUFDLDhCQUE4QixJQUFJLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQztRQUN6RSxDQUFDO0lBQ0gsQ0FBQztJQUVPLFdBQVcsQ0FBQyxPQUEyQjtRQUM3QyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDdEMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLE9BQU8sSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQzVDLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxRQUFRLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztRQUM5QyxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsV0FBVyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDdEQsQ0FBQztJQUVPLGtCQUFrQjtRQUN4QixNQUFNLGVBQWUsR0FBMkIsRUFBRSxDQUFDO1FBQ25ELE1BQU0sZ0JBQWdCLEdBQTJCLEVBQUUsQ0FBQztRQUNwRCxNQUFNLFlBQVksR0FBMkIsRUFBRSxDQUFDO1FBQ2hELE1BQU0sbUJBQW1CLEdBQUcsSUFBSSxLQUFLLEVBQVUsQ0FBQztRQUVoRCx5RUFBeUU7UUFDekUsdURBQXVEO1FBQ3ZELElBQUksSUFBSSxDQUFDLHFCQUFxQixDQUFDLG1CQUFtQixFQUFFLENBQUM7WUFDbkQsS0FBSyxNQUFNLEdBQUcsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUM1QyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyw2QkFBYyxDQUFDLElBQUksQ0FDdEMsRUFBRSxDQUFDO2dCQUNGLElBQUksR0FBRyxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUM7Z0JBRW5CLHlGQUF5RjtnQkFDekYsb0VBQW9FO2dCQUNwRSxJQUNFLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUNoQyxHQUFHLENBQUMsSUFBSSxFQUNSLDZCQUFjLENBQUMsT0FBTyxDQUN2QjtvQkFDRCxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsNkJBQWMsQ0FBQyxLQUFLLENBQUMsRUFDbkUsQ0FBQztvQkFDRCxTQUFTO2dCQUNYLENBQUM7Z0JBRUQsSUFBSSxHQUFHLENBQUMsT0FBTyxFQUFFLENBQUM7b0JBQ2hCLE1BQU0sR0FBRyxHQUFHLElBQUEsaUJBQVUsRUFBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7b0JBQ3BDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQzt3QkFDVCxNQUFNLElBQUksS0FBSyxDQUNiLDBEQUEwRCxHQUFHLENBQUMsSUFBSSxJQUFJLEdBQUcsQ0FBQyxPQUFPLEVBQUUsQ0FDcEYsQ0FBQztvQkFDSixDQUFDO29CQUVELEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxDQUFDO2dCQUNuQixDQUFDO2dCQUNELElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDdkIsQ0FBQztRQUNILENBQUM7UUFFRCxLQUFLLE1BQU0sR0FBRyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ3hDLElBQUksT0FBTyxHQUFHLEdBQUcsQ0FBQyxPQUFPLElBQUksR0FBRyxDQUFDO1lBQ2pDLElBQUksSUFBSSxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUM7WUFFcEIsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7Z0JBQzdCLE1BQU0sbUJBQW1CLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDOUMsTUFBTSxjQUFjLEdBQUcsSUFBQSxjQUFPLEVBQzVCLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUNuQixtQkFBbUIsRUFDbkIsY0FBYyxDQUNmLENBQUM7Z0JBQ0YsTUFBTSxPQUFPLEdBQUcsSUFBQSxpQkFBWSxFQUFDLGNBQWMsRUFBRSxNQUFNLENBQUMsQ0FBQztnQkFDckQsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDaEMsT0FBTyxHQUFHLG1CQUFtQixDQUFDO2dCQUM5QixJQUFJLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQztZQUNsQixDQUFDO1lBRUQsUUFBUSxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQ2pCLEtBQUssNkJBQWMsQ0FBQyxPQUFPO29CQUN6QixtQkFBbUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBRS9CLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUFDLENBQUM7b0JBQ3RFLElBQUksUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyw2QkFBYyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7d0JBQ3pELE1BQU0sSUFBSSxLQUFLLENBQ2IscUJBQXFCLElBQUksMkZBQTJGLENBQ3JILENBQUM7b0JBQ0osQ0FBQztvQkFFRCxzRUFBc0U7b0JBQ3RFLDJFQUEyRTtvQkFDM0UsMENBQTBDO29CQUMxQyxJQUFJLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssNkJBQWMsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO3dCQUMxRCxNQUFNLElBQUksS0FBSyxDQUNiLHFCQUFxQixJQUFJLHdLQUF3SyxDQUNsTSxDQUFDO29CQUNKLENBQUM7b0JBRUQsbUNBQW1DO29CQUNuQyxZQUFZLENBQUMsSUFBSSxDQUFDLEdBQUcsT0FBTyxDQUFDO29CQUM3QixNQUFNO2dCQUVSLEtBQUssNkJBQWMsQ0FBQyxJQUFJO29CQUN0QixnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsR0FBRyxPQUFPLENBQUM7b0JBQ2pDLE1BQU07Z0JBRVIsS0FBSyw2QkFBYyxDQUFDLE9BQU87b0JBQ3pCLFlBQVksQ0FBQyxJQUFJLENBQUMsR0FBRyxPQUFPLENBQUM7b0JBQzdCLE1BQU07Z0JBRVIsS0FBSyw2QkFBYyxDQUFDLElBQUksQ0FBQztnQkFDekIsS0FBSyw2QkFBYyxDQUFDLE1BQU0sQ0FBQztnQkFDM0IsS0FBSyw2QkFBYyxDQUFDLEtBQUs7b0JBQ3ZCLGVBQWUsQ0FBQyxJQUFJLENBQUMsR0FBRyxPQUFPLENBQUM7b0JBQ2hDLE1BQU07WUFDVixDQUFDO1FBQ0gsQ0FBQztRQUVELHFEQUFxRDtRQUNyRCxNQUFNLFNBQVMsR0FBRyxDQUFDLEdBQVEsRUFBRSxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBQSxhQUFNLEVBQUMsR0FBRyxDQUFDLENBQUM7UUFFbEQsK0RBQStEO1FBQy9ELElBQUksQ0FBQyxRQUFRLENBQUMsZUFBZSxHQUFHLFNBQVMsQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUMzRCxJQUFJLENBQUMsUUFBUSxDQUFDLGdCQUFnQixHQUFHLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQzdELElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxHQUFHLFNBQVMsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUNyRCxJQUFJLENBQUMsUUFBUSxDQUFDLG1CQUFtQixHQUFHLElBQUEsYUFBTSxFQUFDLG1CQUFtQixDQUFDLENBQUM7UUFFaEUsNERBQTREO1FBQzVELElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDaEIsT0FBTyxFQUFFLGVBQWUsRUFBRSxnQkFBZ0IsRUFBRSxZQUFZLEVBQUUsQ0FBQztRQUM3RCxDQUFDO1FBRUQsTUFBTSxRQUFRLEdBQUcsQ0FDZixJQUE0QixFQUM1QixVQUFrQyxFQUFFLEVBQ3BDLEVBQUU7WUFDRixLQUFLLE1BQU0sQ0FBQyxJQUFJLEVBQUUsV0FBVyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO2dCQUN2RCxNQUFNLGNBQWMsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBRXJDLDBFQUEwRTtnQkFDMUUsSUFBSSxXQUFXLEtBQUssR0FBRyxJQUFJLENBQUMsY0FBYyxJQUFJLGNBQWMsS0FBSyxHQUFHLEVBQUUsQ0FBQztvQkFDckUsU0FBUztnQkFDWCxDQUFDO2dCQUVELG1FQUFtRTtnQkFDbkUsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLGNBQWMsQ0FBQztZQUM5QixDQUFDO1lBRUQsa0JBQWtCO1lBQ2xCLEtBQUssTUFBTSxJQUFJLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQztnQkFDOUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO29CQUNoQixJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxJQUFJLFdBQVcsQ0FBQyxDQUFDO2dCQUNsRCxDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUMsQ0FBQztRQUVGLFFBQVEsQ0FBQyxlQUFlLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUN0RCxRQUFRLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDaEQsUUFBUSxDQUFDLGdCQUFnQixFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUV4RCxPQUFPLEVBQUUsZUFBZSxFQUFFLFlBQVksRUFBRSxnQkFBZ0IsRUFBRSxDQUFDO0lBQzdELENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0ssOEJBQThCO1FBQ3BDLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDO1FBQ25DLE1BQU0sZUFBZSxHQUFHLElBQUEsV0FBSSxFQUFDLE1BQU0sRUFBRSxjQUFjLENBQUMsQ0FBQztRQUVyRCxNQUFNLFFBQVEsR0FBRyxJQUFBLGlCQUFZLEVBQUMsZUFBZSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ3ZELE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDakMsTUFBTSxPQUFPLEdBQWEsRUFBRSxDQUFDO1FBRTdCLE1BQU0sV0FBVyxHQUFHLENBQ2xCLE9BQW1DLEVBQ25DLElBQTRCLEVBQzVCLEVBQUU7WUFDRixNQUFNLE1BQU0sR0FBMkIsRUFBRSxDQUFDO1lBQzFDLE9BQU8sR0FBRyxPQUFPLElBQUksRUFBRSxDQUFDO1lBQ3hCLElBQUksR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO1lBRWxCLEtBQUssTUFBTSxDQUFDLElBQUksRUFBRSxpQkFBaUIsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztnQkFDN0Qsd0NBQXdDO2dCQUN4QyxJQUFJLGNBQWMsR0FBRyxpQkFBaUIsQ0FBQztnQkFFdkMsSUFBSSxpQkFBaUIsS0FBSyxHQUFHLEVBQUUsQ0FBQztvQkFDOUIsK0RBQStEO29CQUMvRCx5Q0FBeUM7b0JBQ3pDLE1BQU0sZUFBZSxHQUFHLElBQUEsa0NBQTJCLEVBQUMsSUFBSSxFQUFFO3dCQUN4RCxLQUFLLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQztxQkFDN0IsQ0FBQyxDQUFDO29CQUNILElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQzt3QkFDckIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUN0QixpQ0FBaUMsSUFBSSx5QkFBeUIsQ0FDL0QsQ0FBQzt3QkFDRixTQUFTO29CQUNYLENBQUM7b0JBQ0QsY0FBYyxHQUFHLElBQUksZUFBZSxFQUFFLENBQUM7Z0JBQ3pDLENBQUM7Z0JBRUQsSUFBSSxpQkFBaUIsS0FBSyxjQUFjLEVBQUUsQ0FBQztvQkFDekMsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksS0FBSyxpQkFBaUIsT0FBTyxjQUFjLEVBQUUsQ0FBQyxDQUFDO2dCQUNyRSxDQUFDO2dCQUVELE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxjQUFjLENBQUM7WUFDaEMsQ0FBQztZQUVELDJCQUEyQjtZQUMzQixLQUFLLE1BQU0sSUFBSSxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztnQkFDeEMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO29CQUNsQixPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxXQUFXLENBQUMsQ0FBQztnQkFDbkMsQ0FBQztZQUNILENBQUM7WUFFRCxPQUFPLE1BQU0sQ0FBQztRQUNoQixDQUFDLENBQUM7UUFFRixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDO1FBQ3BDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNkLE1BQU0sSUFBSSxLQUFLLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUN0QyxDQUFDO1FBRUQsTUFBTSxJQUFJLEdBQUcsV0FBVyxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsUUFBUSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ2xFLE1BQU0sT0FBTyxHQUFHLFdBQVcsQ0FBQyxHQUFHLENBQUMsZUFBZSxFQUFFLFFBQVEsQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUMzRSxNQUFNLFFBQVEsR0FBRyxXQUFXLENBQzFCLEdBQUcsQ0FBQyxnQkFBZ0IsRUFDcEIsUUFBUSxDQUFDLGdCQUFnQixDQUMxQixDQUFDO1FBRUYsSUFBSSxJQUFJLENBQUMscUJBQXFCLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztZQUNuRCxLQUFLLE1BQU0sQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO2dCQUN2RCw0REFBNEQ7Z0JBQzVELDhDQUE4QztnQkFDOUMsNkRBQTZEO2dCQUM3RCxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxRQUFRLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDO29CQUN6RCxTQUFTO2dCQUNYLENBQUM7Z0JBRUQseUNBQXlDO2dCQUN6QyxNQUFNLEdBQUcsR0FBRyxJQUFBLGlCQUFVLEVBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQ2hDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztvQkFDVCxNQUFNLElBQUksS0FBSyxDQUNiLDBEQUEwRCxJQUFJLElBQUksT0FBTyxFQUFFLENBQzVFLENBQUM7Z0JBQ0osQ0FBQztnQkFFRCxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxDQUFDO1lBQ3RCLENBQUM7UUFDSCxDQUFDO1FBRUQsR0FBRyxDQUFDLFlBQVksR0FBRyxJQUFBLGFBQU0sRUFBQyxJQUFJLENBQUMsQ0FBQztRQUNoQyxHQUFHLENBQUMsZUFBZSxHQUFHLElBQUEsYUFBTSxFQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3RDLEdBQUcsQ0FBQyxnQkFBZ0IsR0FBRyxJQUFBLGFBQU0sRUFBQyxRQUFRLENBQUMsQ0FBQztRQUV4QyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDO1FBRXpELElBQUksUUFBUSxLQUFLLE9BQU8sRUFBRSxDQUFDO1lBQ3pCLE9BQU8sRUFBRSxDQUFDO1FBQ1osQ0FBQztRQUVELElBQUEsZ0JBQVMsRUFBQyxlQUFlLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDcEMsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztJQUVPLHdCQUF3QjtRQUM5QixNQUFNLE1BQU0sR0FBRyxHQUFHLEVBQUU7WUFDbEIsTUFBTSxzQkFBc0IsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUN6RCxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLElBQUksS0FBSyw2QkFBYyxDQUFDLFFBQVEsQ0FDOUMsQ0FBQztZQUNGLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDbkMsT0FBTyxTQUFTLENBQUM7WUFDbkIsQ0FBQztZQUVELE9BQU8sTUFBTSxDQUFDLFdBQVcsQ0FDdkIsc0JBQXNCLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsT0FBTyxHQUFHLEdBQUcsRUFBRSxFQUFFLEVBQUUsQ0FBQztnQkFDdEQsSUFBSTtnQkFDSixPQUFPO2FBQ1IsQ0FBQyxDQUNILENBQUM7UUFDSixDQUFDLENBQUM7UUFFRixRQUFRLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUM1QixLQUFLLGtCQUFrQixDQUFDLEdBQUcsQ0FBQztZQUM1QixLQUFLLGtCQUFrQixDQUFDLEdBQUc7Z0JBQ3pCLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLENBQUM7WUFDL0IsS0FBSyxrQkFBa0IsQ0FBQyxJQUFJO2dCQUMxQixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTTtvQkFDeEIsQ0FBQyxDQUFDLFNBQVM7b0JBQ1gsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxFQUFFLENBQUM7WUFDdEMsS0FBSyxrQkFBa0IsQ0FBQyxJQUFJLENBQUM7WUFDN0IsS0FBSyxrQkFBa0IsQ0FBQyxLQUFLLENBQUM7WUFDOUIsS0FBSyxrQkFBa0IsQ0FBQyxZQUFZLENBQUM7WUFDckMsS0FBSyxrQkFBa0IsQ0FBQyxVQUFVLENBQUM7WUFDbkM7Z0JBQ0UsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLEVBQUUsQ0FBQztRQUNuQyxDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0sscUJBQXFCO1FBQzNCLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDbkMsT0FBTyxTQUFTLENBQUM7UUFDbkIsQ0FBQztRQUVELE9BQU8sTUFBTSxDQUFDLFdBQVcsQ0FDdkIsQ0FBQyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQzFELENBQUM7SUFDSixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSyw0QkFBNEI7UUFDbEMsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUNuQyxPQUFPLFNBQVMsQ0FBQztRQUNuQixDQUFDO1FBRUQsT0FBTyxDQUFDLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ3pDLENBQUM7SUFFRDs7Ozs7Ozs7T0FRRztJQUNLLCtCQUErQjtRQUNyQyxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ25DLE9BQU8sU0FBUyxDQUFDO1FBQ25CLENBQUM7UUFFRCxPQUFPLE1BQU0sQ0FBQyxXQUFXLENBQ3ZCLENBQUMsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQ3JFLENBQUM7SUFDSixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNLLHFCQUFxQjtRQUMzQixJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ25DLE9BQU87UUFDVCxDQUFDO1FBRUQsUUFBUSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDNUIsS0FBSyxrQkFBa0IsQ0FBQyxHQUFHLENBQUM7WUFDNUIsS0FBSyxrQkFBa0IsQ0FBQyxHQUFHO2dCQUN6Qix5RUFBeUU7Z0JBQ3pFLE9BQU87WUFFVCxLQUFLLGtCQUFrQixDQUFDLEtBQUssQ0FBQztZQUM5QixLQUFLLGtCQUFrQixDQUFDLFVBQVU7Z0JBQ2hDLHNFQUFzRTtnQkFDdEUsZ0VBQWdFO2dCQUNoRSxPQUFPO1lBRVQsS0FBSyxrQkFBa0IsQ0FBQyxJQUFJO2dCQUMxQiw4QkFBOEI7Z0JBQzlCLE9BQU87WUFFVDtnQkFDRSxNQUFNLElBQUksS0FBSyxDQUNiLHVEQUF1RCxJQUFJLENBQUMsY0FBYyxLQUFLO29CQUM3RSwrREFBK0QsQ0FDbEUsQ0FBQztRQUNOLENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7Ozs7O09BUUc7SUFDSyxhQUFhLENBQUMsT0FBZ0IsRUFBRSxPQUEyQjtRQUNqRSxNQUFNLEVBQUUsb0JBQW9CLEdBQUcsRUFBRSxFQUFFLEdBQUcsT0FBTyxDQUFDLFdBQVcsSUFBSSxFQUFFLENBQUM7UUFFaEUsTUFBTSwyQkFBMkIsR0FBRyxHQUFHLEVBQUU7WUFDdkMsTUFBTSxNQUFNLEdBQUcsSUFBSSxHQUFHLENBQUM7Z0JBQ3JCLEdBQUcsSUFBSSxDQUFDLGNBQWM7Z0JBQ3RCLEdBQUcsQ0FBQyxvQkFBb0IsQ0FBQyxxQkFBcUIsSUFBSSxFQUFFLENBQUM7YUFDdEQsQ0FBQyxDQUFDO1lBQ0gsT0FBTyxNQUFNLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFDMUQsQ0FBQyxDQUFDO1FBRUYsSUFBSSxrQ0FBaUIsQ0FBQyxPQUFPLEVBQUU7WUFDN0IsR0FBRyxvQkFBb0I7WUFDdkIsdUVBQXVFO1lBQ3ZFLG1FQUFtRTtZQUNuRSxrRUFBa0U7WUFDbEUsdUNBQXVDO1lBQ3ZDLElBQUkscUJBQXFCO2dCQUN2QixPQUFPLDJCQUEyQixFQUFFLENBQUM7WUFDdkMsQ0FBQztTQUNGLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTyxtQkFBbUI7UUFDekIsNkVBQTZFO1FBQzdFLHFFQUFxRTtRQUNyRSxNQUFNLGdCQUFnQixHQUNwQixDQUFDLElBQUksQ0FBQyxhQUFhO1lBQ25CLElBQUksQ0FBQyxTQUFTLEtBQUssZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBRXhELHVEQUF1RDtRQUN2RCxPQUFPLElBQUEsa0JBQVcsRUFDaEI7WUFDRSxRQUFRLEVBQ04sSUFBSSxDQUFDLGNBQWMsS0FBSyx3QkFBd0I7Z0JBQzlDLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYztnQkFDckIsQ0FBQyxDQUFDLFNBQVM7WUFDZixNQUFNLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVM7U0FDdEQsRUFDRCxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FDcEIsQ0FBQztJQUNKLENBQUM7SUFFTyxjQUFjO1FBQ3BCLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3ZDLE9BQU8sSUFBQSxhQUFNLEVBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7SUFDN0IsQ0FBQztJQUVPLGFBQWE7UUFDbkIsT0FBTyxJQUFBLGFBQU0sRUFBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDOUIsQ0FBQztJQUVPLGdCQUFnQjtRQUN0QixNQUFNLE9BQU8sR0FDWCxJQUFJLENBQUMsUUFBUSxDQUFDLDZCQUE2QixLQUFLLEtBQUs7WUFDckQsSUFBSSxDQUFDLHVCQUF1QixDQUFDO1FBRS9CLE1BQU0sSUFBSSxHQUFlLE9BQU87WUFDOUIsQ0FBQyxDQUFDLEVBQUUsY0FBYyxFQUFFLElBQUksQ0FBQyx5QkFBeUIsRUFBRSxFQUFFO1lBQ3RELENBQUMsQ0FBQyxFQUFFLENBQUM7UUFFUCxNQUFNLE1BQU0sR0FBRyxFQUFFLEdBQUcsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUN4RCxPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFDN0QsQ0FBQztJQUVPLHVCQUF1QjtRQUM3QixNQUFNLFdBQVcsR0FBRyxJQUFBLFdBQUksRUFBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDN0QsSUFBSSxDQUFDLElBQUEsZUFBVSxFQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUM7WUFDN0IsT0FBTztRQUNULENBQUM7UUFFRCxNQUFNLFlBQVksR0FBRztZQUNuQixXQUFXO1lBQ1gsbUJBQW1CO1lBQ25CLGdCQUFnQjtZQUNoQixXQUFXO1NBQ1osQ0FBQztRQUNGLEtBQUssTUFBTSxFQUFFLElBQUksWUFBWSxFQUFFLENBQUM7WUFDOUIsSUFBSSxFQUFFLEtBQUssSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO2dCQUN6QixTQUFTO1lBQ1gsQ0FBQztZQUNELE1BQU0sSUFBSSxHQUFHLElBQUEsV0FBSSxFQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQzNDLElBQUksSUFBQSxlQUFVLEVBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztnQkFDckIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLCtCQUErQixFQUFFLEVBQUUsQ0FBQyxDQUFDO2dCQUM5RCxJQUFBLGVBQVUsRUFBQyxJQUFJLENBQUMsQ0FBQztZQUNuQixDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFTyxvQkFBb0I7UUFDMUIsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDO1FBQ3JCLE1BQU0sTUFBTSxHQUFHLElBQUEsV0FBSSxFQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ2pELElBQUksSUFBQSxlQUFVLEVBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztZQUN2QixLQUFLLE1BQU0sSUFBSSxJQUFJLElBQUEsZ0JBQVcsRUFBQyxNQUFNLENBQUMsRUFBRSxDQUFDO2dCQUN2QyxJQUFJLENBQUM7b0JBQ0gsSUFBQSxlQUFVLEVBQUMsSUFBQSxXQUFJLEVBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxFQUFFLGNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFFL0MsTUFBTSxPQUFPLEdBQUcsSUFBQSxXQUFJLEVBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO29CQUNuQyxNQUFNLGNBQWMsR0FBRyxJQUFBLDZCQUFzQixFQUFDLE9BQU8sQ0FBQyxDQUFDO29CQUV2RCxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLGNBQWMsQ0FBQztnQkFDbEMsQ0FBQztnQkFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO29CQUNYLHVCQUF1QjtnQkFDekIsQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVPLFlBQVksQ0FBQyxPQUEyQjtRQUM5QyxJQUFJLE1BQU0sQ0FBQztRQUNYLElBQUksT0FBTyxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ3ZCLE1BQU0sR0FBRztnQkFDUCxJQUFJLEVBQUUsT0FBTyxDQUFDLFVBQVU7Z0JBQ3hCLEtBQUssRUFBRSxPQUFPLENBQUMsV0FBVztnQkFDMUIsR0FBRyxFQUFFLE9BQU8sQ0FBQyxTQUFTO2dCQUN0QixZQUFZLEVBQUUsT0FBTyxDQUFDLGtCQUFrQixJQUFJLEtBQUs7YUFDbEQsQ0FBQztRQUNKLENBQUM7YUFBTSxDQUFDO1lBQ04sSUFDRSxPQUFPLENBQUMsV0FBVztnQkFDbkIsT0FBTyxDQUFDLFNBQVM7Z0JBQ2pCLE9BQU8sQ0FBQyxrQkFBa0IsS0FBSyxTQUFTLEVBQ3hDLENBQUM7Z0JBQ0QsTUFBTSxJQUFJLEtBQUssQ0FDYixxRUFBcUUsQ0FDdEUsQ0FBQztZQUNKLENBQUM7UUFDSCxDQUFDO1FBQ0QsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUVPLFNBQVM7UUFDZixNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUV6Qyx1RUFBdUU7UUFDdkUsdUVBQXVFO1FBQ3ZFLGlEQUFpRDtRQUNqRCxvREFBb0Q7UUFDcEQsTUFBTSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsR0FBRyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDN0QsSUFBSSxJQUFBLGtCQUFXLEVBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDN0QsTUFBTSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDaEMsSUFBSSxHQUFHLEtBQUssT0FBTyxFQUFFLENBQUM7Z0JBQ3BCLE9BQU8sS0FBSyxDQUFDO1lBQ2YsQ0FBQztRQUNILENBQUM7UUFFRCxPQUFPLElBQUEsYUFBTSxFQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUMxQixDQUFDO0lBRU8sYUFBYTtRQUNuQix5RUFBeUU7UUFDekUsa0VBQWtFO1FBQ2xFLHNFQUFzRTtRQUN0RSxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztRQUU3QixNQUFNLE1BQU0sR0FBUSxFQUFFLENBQUM7UUFDdkIsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRzthQUNqQyxNQUFNLENBQ0wsQ0FBQyxDQUFDLEVBQUUsRUFBRTtRQUNKLDRFQUE0RTtRQUM1RSxDQUFDLENBQUMsSUFBSSxLQUFLLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSTtZQUNoQyxDQUFDLENBQUMsSUFBSSxLQUFLLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUNyQzthQUNBLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBRWhELE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1FBQ2xELEtBQUssTUFBTSxJQUFJLElBQUksS0FBSyxFQUFFLENBQUM7WUFDekIsSUFBSSxJQUFJLENBQUMsa0JBQWtCLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO2dCQUMzQyxTQUFTO1lBQ1gsQ0FBQztZQUNELE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxhQUFhLElBQUksSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3RELENBQUM7UUFFRCxPQUFPO1lBQ0wsR0FBRyxNQUFNO1lBQ1QsR0FBRyxJQUFJLENBQUMsT0FBTztTQUNoQixDQUFDO0lBQ0osQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ssb0JBQW9CO1FBQzFCLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDO1FBQ3ZDLE1BQU0sU0FBUyxHQUFHO1lBQ2hCLDhEQUE4RDtZQUM5RCxJQUFBLGtCQUFXLEVBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxRQUFRLENBQUM7WUFDMUMsOEVBQThFO1lBQzlFLFlBQVk7U0FDYixDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNoQixPQUFPLFNBQVMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7SUFDcEMsQ0FBQztJQUVPLGVBQWU7UUFDckIsTUFBTSxJQUFJLEdBQUcsSUFBQSxXQUFJLEVBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsY0FBYyxDQUFDLENBQUM7UUFDdkQsSUFBSSxDQUFDLElBQUEsZUFBVSxFQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDdEIsT0FBTyxTQUFTLENBQUM7UUFDbkIsQ0FBQztRQUVELE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFBLGlCQUFZLEVBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFDakQsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ08sbUJBQW1CLENBQUMsUUFBd0I7UUFDcEQsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLGdCQUFnQjtZQUNyQyxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWE7WUFDcEIsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUM7UUFDckIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM3QyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ssaUJBQWlCO1FBQ3ZCLElBQUksSUFBQSxrQkFBVyxFQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDO1lBQ3JDLElBQUksQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLEVBQUUsUUFBUSxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQyxDQUFDO1FBQ3BFLENBQUM7YUFBTSxJQUFJLElBQUksQ0FBQyxjQUFjLEtBQUssa0JBQWtCLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDM0QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsRUFBRSxRQUFRLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDO1FBQy9ELENBQUM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSyx5QkFBeUI7UUFDL0IsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDO1FBQ3hCLFFBQVEsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQzVCLEtBQUssa0JBQWtCLENBQUMsSUFBSSxDQUFDO1lBQzdCLEtBQUssa0JBQWtCLENBQUMsWUFBWTtnQkFDbEMsT0FBTztvQkFDTCxJQUFJLEVBQUUsTUFBTTtvQkFDWixPQUFPLEVBQUUsNEJBQTRCO29CQUNyQyxNQUFNO2lCQUNQLENBQUM7WUFDSixLQUFLLGtCQUFrQixDQUFDLEtBQUssQ0FBQztZQUM5QixLQUFLLGtCQUFrQixDQUFDLFVBQVU7Z0JBQ2hDLE9BQU87b0JBQ0wsSUFBSSxFQUFFLE1BQU07b0JBQ1osT0FBTyxFQUNMLElBQUksQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLEVBQUUsT0FBTzt3QkFDdkMsS0FBSyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFO29CQUM3QyxNQUFNO2lCQUNQLENBQUM7WUFDSixLQUFLLGtCQUFrQixDQUFDLEdBQUc7Z0JBQ3pCLE9BQU8sRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxDQUFDO1lBQ2pDLEtBQUssa0JBQWtCLENBQUMsSUFBSTtnQkFDMUIsT0FBTztvQkFDTCxJQUFJLEVBQUUsTUFBTTtvQkFDWixPQUFPLEVBQ0wsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLElBQUksS0FBSyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsRUFBRTtvQkFDckUsTUFBTTtpQkFDUCxDQUFDO1lBQ0osS0FBSyxrQkFBa0IsQ0FBQyxHQUFHO2dCQUN6QixPQUFPLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsQ0FBQztRQUNuQyxDQUFDO0lBQ0gsQ0FBQztJQUVPLGtCQUFrQixDQUFDLE9BQWdCLEVBQUUsT0FBMkI7UUFDdEUsTUFBTSxFQUFFLGFBQWEsR0FBRyxFQUFFLEVBQUUsWUFBWSxHQUFHLEtBQUssRUFBRSxHQUNoRCxPQUFPLENBQUMsZ0JBQWdCLElBQUksRUFBRSxDQUFDO1FBQ2pDLElBQUksQ0FBQyw4QkFBOEIsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUVuRCxJQUFJLENBQUMsMkJBQTJCLENBQUMsWUFBWSxDQUFDLENBQUM7UUFFL0MsdUVBQXVFO1FBQ3ZFLHdFQUF3RTtRQUN4RSxzRUFBc0U7UUFDdEUsNkNBQTZDO1FBQzdDLG1FQUFtRTtRQUNuRSxxREFBcUQ7UUFDckQsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDO1FBQ3pCLElBQUksZUFBTSxDQUFDLE9BQU8sRUFBRTtZQUNsQixJQUFJLGFBQWE7Z0JBQ2YsT0FBTyxXQUFXLENBQUMsY0FBYyxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1lBQ2pFLENBQUM7WUFDRCxHQUFHLGFBQWE7U0FDakIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVPLDhCQUE4QixDQUFDLGFBQTRCO1FBQ2pFLElBQ0UsSUFBSSxDQUFDLFNBQVM7WUFDZCxhQUFhLENBQUMsZ0JBQWdCO1lBQzlCLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFLEtBQUssYUFBYSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsRUFBRSxFQUN2RSxDQUFDO1lBQ0QsTUFBTSxJQUFJLEtBQUssQ0FDYix5QkFBeUIsSUFBSSxDQUFDLFNBQVMseUNBQXlDLGFBQWEsQ0FBQyxnQkFBZ0Isd0JBQXdCLENBQ3ZJLENBQUM7UUFDSixDQUFDO1FBRUQsSUFDRSxJQUFJLENBQUMsY0FBYztZQUNuQixhQUFhLENBQUMsaUJBQWlCO1lBQy9CLElBQUksQ0FBQyxjQUFjLEtBQUssYUFBYSxDQUFDLGlCQUFpQixFQUN2RCxDQUFDO1lBQ0QsTUFBTSxJQUFJLEtBQUssQ0FDYiw4QkFBOEIsSUFBSSxDQUFDLGNBQWMsMENBQTBDLGFBQWEsQ0FBQyxpQkFBaUIsd0JBQXdCLENBQ25KLENBQUM7UUFDSixDQUFDO0lBQ0gsQ0FBQztJQUVELGtGQUFrRjtJQUMxRSwyQkFBMkIsQ0FBQyxZQUFxQjtRQUN2RCxNQUFNLEVBQUUsU0FBUyxFQUFFLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQztRQUVuQyx3RUFBd0U7UUFDeEUsU0FBUyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUM3QixTQUFTLENBQUMsT0FBTyxDQUNmLGVBQWUsRUFDZixlQUFlLEVBQ2YsZ0JBQWdCLEVBQ2hCLFlBQVksRUFDWixnQkFBZ0IsQ0FDakIsQ0FBQztRQUVGLElBQUksWUFBWSxFQUFFLENBQUM7WUFDakIsU0FBUyxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUNwQyxDQUFDO2FBQU0sQ0FBQztZQUNOLFNBQVMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDOUIsQ0FBQztJQUNILENBQUM7O0FBMWtESCxrQ0Eya0RDO0FBVUQ7O0dBRUc7QUFDSCxJQUFZLGtCQXVDWDtBQXZDRCxXQUFZLGtCQUFrQjtJQUM1Qjs7OztPQUlHO0lBQ0gsbUNBQWEsQ0FBQTtJQUViOzs7O09BSUc7SUFDSCxxQ0FBZSxDQUFBO0lBRWY7O09BRUc7SUFDSCxtREFBNkIsQ0FBQTtJQUU3Qjs7T0FFRztJQUNILCtDQUF5QixDQUFBO0lBRXpCOztPQUVHO0lBQ0gsaUNBQVcsQ0FBQTtJQUVYOztPQUVHO0lBQ0gsbUNBQWEsQ0FBQTtJQUViOztPQUVHO0lBQ0gsaUNBQVcsQ0FBQTtBQUNiLENBQUMsRUF2Q1csa0JBQWtCLGtDQUFsQixrQkFBa0IsUUF1QzdCO0FBRUQ7O0dBRUc7QUFDSCxJQUFZLFNBVVg7QUFWRCxXQUFZLFNBQVM7SUFDbkI7O09BRUc7SUFDSCw4QkFBaUIsQ0FBQTtJQUVqQjs7T0FFRztJQUNILHNDQUF5QixDQUFBO0FBQzNCLENBQUMsRUFWVyxTQUFTLHlCQUFULFNBQVMsUUFVcEI7QUErQ0Q7O0dBRUc7QUFDSCxJQUFZLGFBT1g7QUFQRCxXQUFZLGFBQWE7SUFDdkIsaURBQWlEO0lBQ2pELDREQUEyQyxDQUFBO0lBQzNDLDJEQUEyRDtJQUMzRCxrRUFBaUQsQ0FBQTtJQUNqRCxxRUFBcUU7SUFDckUsdUVBQXNELENBQUE7QUFDeEQsQ0FBQyxFQVBXLGFBQWEsNkJBQWIsYUFBYSxRQU94QjtBQXNCRDs7R0FFRztBQUNILFNBQVMsUUFBUSxDQUFDLFdBQW1CO0lBQ25DLE9BQU8sV0FBVyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNyQyxDQUFDO0FBRUQsU0FBUyxnQkFBZ0IsQ0FBQyxXQUFtQjtJQUkzQyxJQUFJLFFBQVEsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDO1FBQzFCLE1BQU0sQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEdBQUcsV0FBVyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUM3QyxPQUFPLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDO0lBQ3pCLENBQUM7SUFDRCxPQUFPLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxDQUFDO0FBQy9CLENBQUM7QUFFRCxTQUFTLGdCQUFnQixDQUFDLFdBQW1CO0lBQzNDLE9BQU8sUUFBUSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDO0FBQ3pFLENBQUM7QUFFRCxTQUFnQixlQUFlLENBQzdCLFFBQTRCLEVBQzVCLFFBQTRCO0lBRTVCLHVHQUF1RztJQUN2RyxJQUFJLElBQUEsbUNBQXlCLEVBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztRQUN4QyxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBRUQsb0VBQW9FO0lBQ3BFLE1BQU0sZ0JBQWdCLEdBQUcsUUFBUSxLQUFLLHdCQUF3QixDQUFDO0lBQy9ELE9BQU8sQ0FDTCxRQUFRO1FBQ1IsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsMkJBQTJCLENBQUMsQ0FBQyxDQUFDLHdCQUF3QixDQUFDLENBQzVFLENBQUM7QUFDSixDQUFDO0FBRUQsU0FBUyxpQkFBaUIsQ0FBQyxjQUFrQztJQUMzRCxRQUFRLGNBQWMsRUFBRSxDQUFDO1FBQ3ZCLEtBQUssa0JBQWtCLENBQUMsSUFBSSxDQUFDO1FBQzdCLEtBQUssa0JBQWtCLENBQUMsWUFBWSxDQUFDO1FBQ3JDLEtBQUssa0JBQWtCLENBQUMsS0FBSyxDQUFDO1FBQzlCLEtBQUssa0JBQWtCLENBQUMsVUFBVTtZQUNoQyxPQUFPLFdBQVcsQ0FBQztRQUNyQixLQUFLLGtCQUFrQixDQUFDLEdBQUc7WUFDekIsT0FBTyxtQkFBbUIsQ0FBQztRQUM3QixLQUFLLGtCQUFrQixDQUFDLElBQUk7WUFDMUIsT0FBTyxnQkFBZ0IsQ0FBQztRQUMxQixLQUFLLGtCQUFrQixDQUFDLEdBQUc7WUFDekIsT0FBTyxXQUFXLENBQUM7UUFDckI7WUFDRSxNQUFNLElBQUksS0FBSyxDQUFDLCtCQUErQixjQUFjLEVBQUUsQ0FBQyxDQUFDO0lBQ3JFLENBQUM7QUFDSCxDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsU0FBUyx3QkFBd0IsQ0FDL0IsSUFBWSxFQUNaLFlBQXFCO0lBRXJCLFFBQVEsSUFBSSxFQUFFLENBQUM7UUFDYixLQUFLLEtBQUs7WUFDUixPQUFPLGtCQUFrQixDQUFDLEdBQUcsQ0FBQztRQUNoQyxLQUFLLE1BQU07WUFDVCxPQUFPLGtCQUFrQixDQUFDLElBQUksQ0FBQztRQUNqQyxLQUFLLEtBQUs7WUFDUixPQUFPLGtCQUFrQixDQUFDLEdBQUcsQ0FBQztRQUNoQyxLQUFLLE1BQU07WUFDVCxJQUFJLFlBQVksS0FBSyxTQUFTLElBQUksWUFBWSxJQUFJLENBQUMsRUFBRSxDQUFDO2dCQUNwRCxPQUFPLGtCQUFrQixDQUFDLFVBQVUsQ0FBQztZQUN2QyxDQUFDO1lBQ0QsT0FBTyxrQkFBa0IsQ0FBQyxZQUFZLENBQUM7UUFDekM7WUFDRSxPQUFPLFNBQVMsQ0FBQztJQUNyQixDQUFDO0FBQ0gsQ0FBQztBQUVEOzs7Ozs7Ozs7R0FTRztBQUNILFNBQVMsOEJBQThCLENBQ3JDLElBQXFDLEVBQ3JDLE1BQWM7SUFFZCxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDVixPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBRUQsaURBQWlEO0lBQ2pELE1BQU0sUUFBUSxHQUF1QixJQUFJLENBQUMsY0FBYyxDQUFDO0lBQ3pELElBQUksUUFBUSxFQUFFLENBQUM7UUFDYixNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQzdDLElBQUksS0FBSyxFQUFFLENBQUM7WUFDVixNQUFNLE1BQU0sR0FBRyx3QkFBd0IsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDcEUsSUFBSSxNQUFNLEVBQUUsQ0FBQztnQkFDWCxPQUFPLE1BQU0sQ0FBQztZQUNoQixDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFRCwrQkFBK0I7SUFDL0IsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRSxjQUFjLENBQUM7SUFDckQsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUNqQixJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDO1lBQ2pDLGVBQWU7WUFDZixPQUFPLHdCQUF3QixDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNyRCxDQUFDO1FBQ0QsSUFBSSxZQUFZLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQzlCLE9BQU8sd0JBQXdCLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3hELENBQUM7UUFDRCx1REFBdUQ7UUFDdkQsSUFBSSxZQUFZLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQzVCLE1BQU0sWUFBWSxHQUFHLCtCQUErQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQzdELElBQUksWUFBWSxFQUFFLENBQUM7Z0JBQ2pCLE9BQU8sWUFBWSxDQUFDO1lBQ3RCLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVELE9BQU8sU0FBUyxDQUFDO0FBQ25CLENBQUM7QUFFRDs7R0FFRztBQUNILFNBQVMsK0JBQStCLENBQ3RDLE1BQWM7SUFFZCxJQUFJLElBQUEsZUFBVSxFQUFDLElBQUEsV0FBSSxFQUFDLE1BQU0sRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUMvQyxPQUFPLGtCQUFrQixDQUFDLElBQUksQ0FBQztJQUNqQyxDQUFDO0lBQ0QsSUFBSSxJQUFBLGVBQVUsRUFBQyxJQUFBLFdBQUksRUFBQyxNQUFNLEVBQUUsV0FBVyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQzFDLE9BQU8sa0JBQWtCLENBQUMsR0FBRyxDQUFDO0lBQ2hDLENBQUM7SUFDRCxJQUFJLElBQUEsZUFBVSxFQUFDLElBQUEsV0FBSSxFQUFDLE1BQU0sRUFBRSxXQUFXLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDMUMsT0FBTyxrQkFBa0IsQ0FBQyxZQUFZLENBQUM7SUFDekMsQ0FBQztJQUNELElBQUksSUFBQSxlQUFVLEVBQUMsSUFBQSxXQUFJLEVBQUMsTUFBTSxFQUFFLG1CQUFtQixDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ2xELE9BQU8sa0JBQWtCLENBQUMsR0FBRyxDQUFDO0lBQ2hDLENBQUM7SUFDRCxPQUFPLFNBQVMsQ0FBQztBQUNuQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgYWNjZXNzU3luYyxcbiAgY29uc3RhbnRzLFxuICBleGlzdHNTeW5jLFxuICByZWFkZGlyU3luYyxcbiAgcmVhZEZpbGVTeW5jLFxuICB1bmxpbmtTeW5jLFxufSBmcm9tIFwiZnNcIjtcbmltcG9ydCB7IGpvaW4sIHJlc29sdmUgfSBmcm9tIFwicGF0aFwiO1xuaW1wb3J0ICogYXMgc2VtdmVyIGZyb20gXCJzZW12ZXJcIjtcbmltcG9ydCB0eXBlIHsgUG5wbVdvcmtzcGFjZVlhbWxPcHRpb25zIH0gZnJvbSBcIi4vcG5wbS13b3Jrc3BhY2VcIjtcbmltcG9ydCB7IFBucG1Xb3Jrc3BhY2VZYW1sIH0gZnJvbSBcIi4vcG5wbS13b3Jrc3BhY2VcIjtcbmltcG9ydCB7XG4gIGV4ZWNDb21tYW5kLFxuICBleHRyYWN0Q29kZUFydGlmYWN0RGV0YWlscyxcbiAgaXNZYXJuQmVycnksXG4gIGlzWWFybkNsYXNzaWMsXG4gIG1pblZlcnNpb24sXG4gIHRyeVJlc29sdmVEZXBlbmRlbmN5VmVyc2lvbixcbn0gZnJvbSBcIi4vdXRpbFwiO1xuaW1wb3J0IHR5cGUgeyBZYXJucmNPcHRpb25zIH0gZnJvbSBcIi4veWFybnJjXCI7XG5pbXBvcnQgeyBZYXJucmMgfSBmcm9tIFwiLi95YXJucmNcIjtcbmltcG9ydCB7IHJlc29sdmUgYXMgcmVzb2x2ZUpzb24gfSBmcm9tIFwiLi4vX3Jlc29sdmVcIjtcbmltcG9ydCB7IENvbXBvbmVudCB9IGZyb20gXCIuLi9jb21wb25lbnRcIjtcbmltcG9ydCB7IERlcGVuZGVuY3lUeXBlIH0gZnJvbSBcIi4uL2RlcGVuZGVuY2llc1wiO1xuaW1wb3J0IHsgSnNvbkZpbGUgfSBmcm9tIFwiLi4vanNvblwiO1xuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSBcIi4uL3Byb2plY3RcIjtcbmltcG9ydCB7IGlzQXdzQ29kZUFydGlmYWN0UmVnaXN0cnkgfSBmcm9tIFwiLi4vcmVsZWFzZVwiO1xuaW1wb3J0IHR5cGUgeyBUYXNrIH0gZnJvbSBcIi4uL3Rhc2tcIjtcbmltcG9ydCB7IGlzVHJ1dGh5LCBub3JtYWxpemVQZXJzaXN0ZWRQYXRoLCBzb3J0ZWQsIHdyaXRlRmlsZSB9IGZyb20gXCIuLi91dGlsXCI7XG5cbmNvbnN0IFVOTElDRU5TRUQgPSBcIlVOTElDRU5TRURcIjtcbmNvbnN0IERFRkFVTFRfTlBNX1JFR0lTVFJZX1VSTCA9IFwiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvXCI7XG5jb25zdCBHSVRIVUJfUEFDS0FHRVNfUkVHSVNUUlkgPSBcIm5wbS5wa2cuZ2l0aHViLmNvbVwiO1xuY29uc3QgREVGQVVMVF9OUE1fVE9LRU5fU0VDUkVUID0gXCJOUE1fVE9LRU5cIjtcbmNvbnN0IERFRkFVTFRfR0lUSFVCX1RPS0VOX1NFQ1JFVCA9IFwiR0lUSFVCX1RPS0VOXCI7XG5jb25zdCBERUZBVUxUX1BOUE1fVkVSU0lPTiA9IFwiMTAuMzMuMFwiO1xuY29uc3QgREVGQVVMVF9ZQVJOX0JFUlJZX1ZFUlNJT04gPSBcIjQuMTMuMFwiO1xuY29uc3QgREVGQVVMVF9ZQVJOX0NMQVNTSUNfVkVSU0lPTiA9IFwiMS4yMi4yMlwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIE5vZGVQYWNrYWdlT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgXCJuYW1lXCIgaW4gcGFja2FnZS5qc29uXG4gICAqIEBkZWZhdWx0IC0gZGVmYXVsdHMgdG8gcHJvamVjdCBuYW1lXG4gICAqIEBmZWF0dXJlZFxuICAgKi9cbiAgcmVhZG9ubHkgcGFja2FnZU5hbWU/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgZGVzY3JpcHRpb24gaXMganVzdCBhIHN0cmluZyB0aGF0IGhlbHBzIHBlb3BsZSB1bmRlcnN0YW5kIHRoZSBwdXJwb3NlIG9mIHRoZSBwYWNrYWdlLlxuICAgKiBJdCBjYW4gYmUgdXNlZCB3aGVuIHNlYXJjaGluZyBmb3IgcGFja2FnZXMgaW4gYSBwYWNrYWdlIG1hbmFnZXIgYXMgd2VsbC5cbiAgICogU2VlIGh0dHBzOi8vY2xhc3NpYy55YXJucGtnLmNvbS9lbi9kb2NzL3BhY2thZ2UtanNvbi8jdG9jLWRlc2NyaXB0aW9uXG4gICAqIEBmZWF0dXJlZFxuICAgKi9cbiAgcmVhZG9ubHkgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFJ1bnRpbWUgZGVwZW5kZW5jaWVzIG9mIHRoaXMgbW9kdWxlLlxuICAgKlxuICAgKiBUaGUgcmVjb21tZW5kYXRpb24gaXMgdG8gb25seSBzcGVjaWZ5IHRoZSBtb2R1bGUgbmFtZSBoZXJlIChlLmcuXG4gICAqIGBleHByZXNzYCkuIFRoaXMgd2lsbCBiZWhhdmUgc2ltaWxhciB0byBgcG5wbSBhZGRgIG9yIGBucG0gaW5zdGFsbGAgaW4gdGhlXG4gICAqIHNlbnNlIHRoYXQgaXQgd2lsbCBhZGQgdGhlIG1vZHVsZSBhcyBhIGRlcGVuZGVuY3kgdG8geW91ciBgcGFja2FnZS5qc29uYFxuICAgKiBmaWxlIHdpdGggdGhlIGxhdGVzdCB2ZXJzaW9uIChgXmApLiBZb3UgY2FuIHNwZWNpZnkgc2VtdmVyIHJlcXVpcmVtZW50cyBpblxuICAgKiB0aGUgc2FtZSBzeW50YXggcGFzc2VkIHRvIGBwbnBtIGFkZGAgb3IgYG5wbSBpYCAoZS5nLiBgZXhwcmVzc0BeMmApIGFuZFxuICAgKiB0aGlzIHdpbGwgYmUgd2hhdCB5b3VyIGBwYWNrYWdlLmpzb25gIHdpbGwgZXZlbnR1YWxseSBpbmNsdWRlLlxuICAgKlxuICAgKiBAZXhhbXBsZSBbICdleHByZXNzJywgJ2xvZGFzaCcsICdmb29AXjInIF1cbiAgICogQGRlZmF1bHQgW11cbiAgICogQGZlYXR1cmVkXG4gICAqL1xuICByZWFkb25seSBkZXBzPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIEJ1aWxkIGRlcGVuZGVuY2llcyBmb3IgdGhpcyBtb2R1bGUuIFRoZXNlIGRlcGVuZGVuY2llcyB3aWxsIG9ubHkgYmVcbiAgICogYXZhaWxhYmxlIGluIHlvdXIgYnVpbGQgZW52aXJvbm1lbnQgYnV0IHdpbGwgbm90IGJlIGZldGNoZWQgd2hlbiB0aGlzXG4gICAqIG1vZHVsZSBpcyBjb25zdW1lZC5cbiAgICpcbiAgICogVGhlIHJlY29tbWVuZGF0aW9uIGlzIHRvIG9ubHkgc3BlY2lmeSB0aGUgbW9kdWxlIG5hbWUgaGVyZSAoZS5nLlxuICAgKiBgZXhwcmVzc2ApLiBUaGlzIHdpbGwgYmVoYXZlIHNpbWlsYXIgdG8gYHBucG0gYWRkYCBvciBgbnBtIGluc3RhbGxgIGluIHRoZVxuICAgKiBzZW5zZSB0aGF0IGl0IHdpbGwgYWRkIHRoZSBtb2R1bGUgYXMgYSBkZXBlbmRlbmN5IHRvIHlvdXIgYHBhY2thZ2UuanNvbmBcbiAgICogZmlsZSB3aXRoIHRoZSBsYXRlc3QgdmVyc2lvbiAoYF5gKS4gWW91IGNhbiBzcGVjaWZ5IHNlbXZlciByZXF1aXJlbWVudHMgaW5cbiAgICogdGhlIHNhbWUgc3ludGF4IHBhc3NlZCB0byBgcG5wbSBhZGRgIG9yIGBucG0gaWAgKGUuZy4gYGV4cHJlc3NAXjJgKSBhbmRcbiAgICogdGhpcyB3aWxsIGJlIHdoYXQgeW91ciBgcGFja2FnZS5qc29uYCB3aWxsIGV2ZW50dWFsbHkgaW5jbHVkZS5cbiAgICpcbiAgICogQGV4YW1wbGUgWyAndHlwZXNjcmlwdCcsICdAdHlwZXMvZXhwcmVzcycgXVxuICAgKiBAZGVmYXVsdCBbXVxuICAgKiBAZmVhdHVyZWRcbiAgICovXG4gIHJlYWRvbmx5IGRldkRlcHM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogUGVlciBkZXBlbmRlbmNpZXMgZm9yIHRoaXMgbW9kdWxlLiBEZXBlbmRlbmNpZXMgbGlzdGVkIGhlcmUgYXJlIHJlcXVpcmVkIHRvXG4gICAqIGJlIGluc3RhbGxlZCAoYW5kIHNhdGlzZmllZCkgYnkgdGhlIF9jb25zdW1lcl8gb2YgdGhpcyBsaWJyYXJ5LiBVc2luZyBwZWVyXG4gICAqIGRlcGVuZGVuY2llcyBhbGxvd3MgeW91IHRvIGVuc3VyZSB0aGF0IG9ubHkgYSBzaW5nbGUgbW9kdWxlIG9mIGEgY2VydGFpblxuICAgKiBsaWJyYXJ5IGV4aXN0cyBpbiB0aGUgYG5vZGVfbW9kdWxlc2AgdHJlZSBvZiB5b3VyIGNvbnN1bWVycy5cbiAgICpcbiAgICogTm90ZSB0aGF0IHByaW9yIHRvIG5wbUA3LCBwZWVyIGRlcGVuZGVuY2llcyBhcmUgX25vdF8gYXV0b21hdGljYWxseVxuICAgKiBpbnN0YWxsZWQsIHdoaWNoIG1lYW5zIHRoYXQgYWRkaW5nIHBlZXIgZGVwZW5kZW5jaWVzIHRvIGEgbGlicmFyeSB3aWxsIGJlIGFcbiAgICogYnJlYWtpbmcgY2hhbmdlIGZvciB5b3VyIGN1c3RvbWVycy5cbiAgICpcbiAgICogVW5sZXNzIGBwZWVyRGVwZW5kZW5jeU9wdGlvbnMucGlubmVkRGV2RGVwZW5kZW5jeWAgaXMgZGlzYWJsZWQgKGl0IGlzXG4gICAqIGVuYWJsZWQgYnkgZGVmYXVsdCksIHByb2plbiB3aWxsIGF1dG9tYXRpY2FsbHkgYWRkIGEgZGV2IGRlcGVuZGVuY3kgd2l0aCBhXG4gICAqIHBpbm5lZCB2ZXJzaW9uIGZvciBlYWNoIHBlZXIgZGVwZW5kZW5jeS4gVGhpcyB3aWxsIGVuc3VyZSB0aGF0IHlvdSBidWlsZCAmXG4gICAqIHRlc3QgeW91ciBtb2R1bGUgYWdhaW5zdCB0aGUgbG93ZXN0IHBlZXIgdmVyc2lvbiByZXF1aXJlZC5cbiAgICpcbiAgICogQGRlZmF1bHQgW11cbiAgICovXG4gIHJlYWRvbmx5IHBlZXJEZXBzPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIExpc3Qgb2YgZGVwZW5kZW5jaWVzIHRvIGJ1bmRsZSBpbnRvIHRoaXMgbW9kdWxlLiBUaGVzZSBtb2R1bGVzIHdpbGwgYmVcbiAgICogYWRkZWQgYm90aCB0byB0aGUgYGRlcGVuZGVuY2llc2Agc2VjdGlvbiBhbmQgYGJ1bmRsZWREZXBlbmRlbmNpZXNgIHNlY3Rpb24gb2ZcbiAgICogeW91ciBgcGFja2FnZS5qc29uYC5cbiAgICpcbiAgICogVGhlIHJlY29tbWVuZGF0aW9uIGlzIHRvIG9ubHkgc3BlY2lmeSB0aGUgbW9kdWxlIG5hbWUgaGVyZSAoZS5nLlxuICAgKiBgZXhwcmVzc2ApLiBUaGlzIHdpbGwgYmVoYXZlIHNpbWlsYXIgdG8gYHBucG0gYWRkYCBvciBgbnBtIGluc3RhbGxgIGluIHRoZVxuICAgKiBzZW5zZSB0aGF0IGl0IHdpbGwgYWRkIHRoZSBtb2R1bGUgYXMgYSBkZXBlbmRlbmN5IHRvIHlvdXIgYHBhY2thZ2UuanNvbmBcbiAgICogZmlsZSB3aXRoIHRoZSBsYXRlc3QgdmVyc2lvbiAoYF5gKS4gWW91IGNhbiBzcGVjaWZ5IHNlbXZlciByZXF1aXJlbWVudHMgaW5cbiAgICogdGhlIHNhbWUgc3ludGF4IHBhc3NlZCB0byBgcG5wbSBhZGRgIG9yIGBucG0gaWAgKGUuZy4gYGV4cHJlc3NAXjJgKSBhbmRcbiAgICogdGhpcyB3aWxsIGJlIHdoYXQgeW91ciBgcGFja2FnZS5qc29uYCB3aWxsIGV2ZW50dWFsbHkgaW5jbHVkZS5cbiAgICovXG4gIHJlYWRvbmx5IGJ1bmRsZWREZXBzPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIE9wdGlvbnMgZm9yIGBwZWVyRGVwc2AuXG4gICAqL1xuICByZWFkb25seSBwZWVyRGVwZW5kZW5jeU9wdGlvbnM/OiBQZWVyRGVwZW5kZW5jeU9wdGlvbnM7XG5cbiAgLyoqXG4gICAqIEFsbG93IHRoZSBwcm9qZWN0IHRvIGluY2x1ZGUgYHBlZXJEZXBlbmRlbmNpZXNgIGFuZCBgYnVuZGxlZERlcGVuZGVuY2llc2AuXG4gICAqIFRoaXMgaXMgbm9ybWFsbHkgb25seSBhbGxvd2VkIGZvciBsaWJyYXJpZXMuIEZvciBhcHBzLCB0aGVyZSdzIG5vIG1lYW5pbmdcbiAgICogZm9yIHNwZWNpZnlpbmcgdGhlc2UuXG4gICAqXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIHJlYWRvbmx5IGFsbG93TGlicmFyeURlcGVuZGVuY2llcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEtleXdvcmRzIHRvIGluY2x1ZGUgaW4gYHBhY2thZ2UuanNvbmAuXG4gICAqL1xuICByZWFkb25seSBrZXl3b3Jkcz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBNb2R1bGUgZW50cnlwb2ludCAoYG1haW5gIGluIGBwYWNrYWdlLmpzb25gKVxuICAgKlxuICAgKiBTZXQgdG8gYW4gZW1wdHkgc3RyaW5nIHRvIG5vdCBpbmNsdWRlIGBtYWluYCBpbiB5b3VyIHBhY2thZ2UuanNvblxuICAgKlxuICAgKiBAZGVmYXVsdCBcImxpYi9pbmRleC5qc1wiXG4gICAqL1xuICByZWFkb25seSBlbnRyeXBvaW50Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBCaW5hcnkgcHJvZ3JhbXMgdmVuZGVkIHdpdGggeW91ciBtb2R1bGUuXG4gICAqXG4gICAqIFlvdSBjYW4gdXNlIHRoaXMgb3B0aW9uIHRvIGFkZC9jdXN0b21pemUgaG93IGJpbmFyaWVzIGFyZSByZXByZXNlbnRlZCBpblxuICAgKiB5b3VyIGBwYWNrYWdlLmpzb25gLCBidXQgdW5sZXNzIGBhdXRvRGV0ZWN0QmluYCBpcyBgZmFsc2VgLCBldmVyeVxuICAgKiBleGVjdXRhYmxlIGZpbGUgdW5kZXIgYGJpbmAgd2lsbCBhdXRvbWF0aWNhbGx5IGJlIGFkZGVkIHRvIHRoaXMgc2VjdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IGJpbj86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG5cbiAgLyoqXG4gICAqIEF1dG9tYXRpY2FsbHkgYWRkIGFsbCBleGVjdXRhYmxlcyB1bmRlciB0aGUgYGJpbmAgZGlyZWN0b3J5IHRvIHlvdXJcbiAgICogYHBhY2thZ2UuanNvbmAgZmlsZSB1bmRlciB0aGUgYGJpbmAgc2VjdGlvbi5cbiAgICpcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgcmVhZG9ubHkgYXV0b0RldGVjdEJpbj86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoZSBOb2RlIFBhY2thZ2UgTWFuYWdlciB1c2VkIHRvIGV4ZWN1dGUgc2NyaXB0c1xuICAgKlxuICAgKiBAZGVmYXVsdCAtIERldGVjdGVkIGZyb20gdGhlIGNhbGxpbmcgcHJvY2VzcyBvciBgWUFSTl9DTEFTU0lDYCBpZiBkZXRlY3Rpb24gZmFpbHMuXG4gICAqIEBwam5ldyAkUEFDS0FHRV9NQU5BR0VSXG4gICAqL1xuICByZWFkb25seSBwYWNrYWdlTWFuYWdlcj86IE5vZGVQYWNrYWdlTWFuYWdlcjtcblxuICAvKipcbiAgICogVGhlIHJlcG9zaXRvcnkgaXMgdGhlIGxvY2F0aW9uIHdoZXJlIHRoZSBhY3R1YWwgY29kZSBmb3IgeW91ciBwYWNrYWdlIGxpdmVzLlxuICAgKiBTZWUgaHR0cHM6Ly9jbGFzc2ljLnlhcm5wa2cuY29tL2VuL2RvY3MvcGFja2FnZS1qc29uLyN0b2MtcmVwb3NpdG9yeVxuICAgKi9cbiAgcmVhZG9ubHkgcmVwb3NpdG9yeT86IHN0cmluZztcblxuICAvKipcbiAgICogSWYgdGhlIHBhY2thZ2UuanNvbiBmb3IgeW91ciBwYWNrYWdlIGlzIG5vdCBpbiB0aGUgcm9vdCBkaXJlY3RvcnkgKGZvciBleGFtcGxlIGlmIGl0IGlzIHBhcnQgb2YgYSBtb25vcmVwbyksXG4gICAqIHlvdSBjYW4gc3BlY2lmeSB0aGUgZGlyZWN0b3J5IGluIHdoaWNoIGl0IGxpdmVzLlxuICAgKi9cbiAgcmVhZG9ubHkgcmVwb3NpdG9yeURpcmVjdG9yeT86IHN0cmluZztcblxuICAvKipcbiAgICogQXV0aG9yJ3MgbmFtZVxuICAgKi9cbiAgcmVhZG9ubHkgYXV0aG9yTmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogQXV0aG9yJ3MgZS1tYWlsXG4gICAqL1xuICByZWFkb25seSBhdXRob3JFbWFpbD86IHN0cmluZztcblxuICAvKipcbiAgICogQXV0aG9yJ3MgVVJMIC8gV2Vic2l0ZVxuICAgKi9cbiAgcmVhZG9ubHkgYXV0aG9yVXJsPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBJcyB0aGUgYXV0aG9yIGFuIG9yZ2FuaXphdGlvblxuICAgKi9cbiAgcmVhZG9ubHkgYXV0aG9yT3JnYW5pemF0aW9uPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogUGFja2FnZSdzIEhvbWVwYWdlIC8gV2Vic2l0ZVxuICAgKi9cbiAgcmVhZG9ubHkgaG9tZXBhZ2U/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFBhY2thZ2UncyBTdGFiaWxpdHlcbiAgICovXG4gIHJlYWRvbmx5IHN0YWJpbGl0eT86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG1pbmltdW0gbm9kZSB2ZXJzaW9uIHJlcXVpcmVkIGJ5IHRoaXMgcGFja2FnZSB0byBmdW5jdGlvbi5cbiAgICogTW9zdCBwcm9qZWN0cyBzaG91bGQgbm90IHVzZSB0aGlzIG9wdGlvbi5cbiAgICpcbiAgICogVGhlIHZhbHVlIGluZGljYXRlcyB0aGF0IHRoZSBwYWNrYWdlIGlzIGluY29tcGF0aWJsZSB3aXRoIGFueSBvbGRlciB2ZXJzaW9ucyBvZiBub2RlLlxuICAgKiBUaGlzIHJlcXVpcmVtZW50IGlzIGVuZm9yY2VkIHZpYSB0aGUgZW5naW5lcyBmaWVsZC5cbiAgICpcbiAgICogWW91IHdpbGwgbm9ybWFsbHkgbm90IG5lZWQgdG8gc2V0IHRoaXMgb3B0aW9uLCBldmVuIGlmIHlvdXIgcGFja2FnZSBpcyBpbmNvbXBhdGlibGUgd2l0aCBFT0wgdmVyc2lvbnMgb2Ygbm9kZS5cbiAgICogQ29uc2lkZXIgdGhpcyBvcHRpb24gb25seSBpZiB5b3VyIHBhY2thZ2UgZGVwZW5kcyBvbiBhIHNwZWNpZmljIGZlYXR1cmUsIHRoYXQgaXMgbm90IGF2YWlsYWJsZSBpbiBvdGhlciBMVFMgdmVyc2lvbnMuXG4gICAqIFNldHRpbmcgdGhpcyBvcHRpb24gaGFzIHZlcnkgaGlnaCBpbXBhY3Qgb24gdGhlIGNvbnN1bWVycyBvZiB5b3VyIHBhY2thZ2UsXG4gICAqIGFzIHBhY2thZ2UgbWFuYWdlcnMgd2lsbCBhY3RpdmVseSBwcmV2ZW50IHVzYWdlIHdpdGggbm9kZSB2ZXJzaW9ucyB5b3UgaGF2ZSBtYXJrZWQgYXMgaW5jb21wYXRpYmxlLlxuICAgKlxuICAgKiBUbyBjaGFuZ2UgdGhlIG5vZGUgdmVyc2lvbiBvZiB5b3VyIENJL0NEIHdvcmtmbG93cywgdXNlIGB3b3JrZmxvd05vZGVWZXJzaW9uYC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBubyBtaW5pbXVtIHZlcnNpb24gaXMgZW5mb3JjZWRcblxuICAgKi9cbiAgcmVhZG9ubHkgbWluTm9kZVZlcnNpb24/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBtYXhpbXVtIG5vZGUgdmVyc2lvbiBzdXBwb3J0ZWQgYnkgdGhpcyBwYWNrYWdlLlxuICAgKiBNb3N0IHByb2plY3RzIHNob3VsZCBub3QgdXNlIHRoaXMgb3B0aW9uLlxuICAgKlxuICAgKiBUaGUgdmFsdWUgaW5kaWNhdGVzIHRoYXQgdGhlIHBhY2thZ2UgaXMgaW5jb21wYXRpYmxlIHdpdGggYW55IG5ld2VyIHZlcnNpb25zIG9mIG5vZGUuXG4gICAqIFRoaXMgcmVxdWlyZW1lbnQgaXMgZW5mb3JjZWQgdmlhIHRoZSBlbmdpbmVzIGZpZWxkLlxuICAgKlxuICAgKiBZb3Ugd2lsbCBub3JtYWxseSBub3QgbmVlZCB0byBzZXQgdGhpcyBvcHRpb24uXG4gICAqIENvbnNpZGVyIHRoaXMgb3B0aW9uIG9ubHkgaWYgeW91ciBwYWNrYWdlIGlzIGtub3duIHRvIG5vdCBmdW5jdGlvbiB3aXRoIG5ld2VyIHZlcnNpb25zIG9mIG5vZGUuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gbWF4aW11bSB2ZXJzaW9uIGlzIGVuZm9yY2VkXG4gICAqL1xuICByZWFkb25seSBtYXhOb2RlVmVyc2lvbj86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHZlcnNpb24gb2YgUE5QTSB0byB1c2UgaWYgdXNpbmcgUE5QTSBhcyBhIHBhY2thZ2UgbWFuYWdlci5cbiAgICpcbiAgICogQGRlZmF1bHQgXCIxMC4zMy4wXCJcbiAgICovXG4gIHJlYWRvbmx5IHBucG1WZXJzaW9uPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgdmVyc2lvbiBvZiBCdW4gdG8gdXNlIGlmIHVzaW5nIEJ1biBhcyBhIHBhY2thZ2UgbWFuYWdlci5cbiAgICpcbiAgICogQGRlZmF1bHQgXCJsYXRlc3RcIlxuICAgKi9cbiAgcmVhZG9ubHkgYnVuVmVyc2lvbj86IHN0cmluZztcblxuICAvKipcbiAgICogTGljZW5zZSdzIFNQRFggaWRlbnRpZmllci5cbiAgICogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9wcm9qZW4vcHJvamVuL3RyZWUvbWFpbi9saWNlbnNlLXRleHQgZm9yIGEgbGlzdCBvZiBzdXBwb3J0ZWQgbGljZW5zZXMuXG4gICAqIFVzZSB0aGUgYGxpY2Vuc2VkYCBvcHRpb24gaWYgeW91IHdhbnQgdG8gbm8gbGljZW5zZSB0byBiZSBzcGVjaWZpZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IFwiQXBhY2hlLTIuMFwiXG4gICAqL1xuICByZWFkb25seSBsaWNlbnNlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgaWYgYSBsaWNlbnNlIHNob3VsZCBiZSBhZGRlZC5cbiAgICpcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgcmVhZG9ubHkgbGljZW5zZWQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgYmFzZSBVUkwgb2YgdGhlIG5wbSBwYWNrYWdlIHJlZ2lzdHJ5LlxuICAgKlxuICAgKiBNdXN0IGJlIGEgVVJMIChlLmcuIHN0YXJ0IHdpdGggXCJodHRwczovL1wiIG9yIFwiaHR0cDovL1wiKVxuICAgKlxuICAgKiBAZGVmYXVsdCBcImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnXCJcbiAgICovXG4gIHJlYWRvbmx5IG5wbVJlZ2lzdHJ5VXJsPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgdXJsIHRvIHlvdXIgcHJvamVjdCdzIGlzc3VlIHRyYWNrZXIuXG4gICAqL1xuICByZWFkb25seSBidWdzVXJsPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgZW1haWwgYWRkcmVzcyB0byB3aGljaCBpc3N1ZXMgc2hvdWxkIGJlIHJlcG9ydGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgYnVnc0VtYWlsPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBY2Nlc3MgbGV2ZWwgb2YgdGhlIG5wbSBwYWNrYWdlLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGZvciBzY29wZWQgcGFja2FnZXMgKGUuZy4gYGZvb0BiYXJgKSwgdGhlIGRlZmF1bHQgaXNcbiAgICogYE5wbUFjY2Vzcy5SRVNUUklDVEVEYCwgZm9yIG5vbi1zY29wZWQgcGFja2FnZXMsIHRoZSBkZWZhdWx0IGlzXG4gICAqIGBOcG1BY2Nlc3MuUFVCTElDYC5cbiAgICovXG4gIHJlYWRvbmx5IG5wbUFjY2Vzcz86IE5wbUFjY2VzcztcblxuICAvKipcbiAgICogU2hvdWxkIHByb3ZlbmFuY2Ugc3RhdGVtZW50cyBiZSBnZW5lcmF0ZWQgd2hlbiB0aGUgcGFja2FnZSBpcyBwdWJsaXNoZWQuXG4gICAqXG4gICAqIEEgc3VwcG9ydGVkIHBhY2thZ2UgbWFuYWdlciBpcyByZXF1aXJlZCB0byBwdWJsaXNoIGEgcGFja2FnZSB3aXRoIG5wbSBwcm92ZW5hbmNlIHN0YXRlbWVudHMgYW5kXG4gICAqIHlvdSB3aWxsIG5lZWQgdG8gdXNlIGEgc3VwcG9ydGVkIENJL0NEIHByb3ZpZGVyLlxuICAgKlxuICAgKiBOb3RlIHRoYXQgdGhlIHByb2plbiBgUmVsZWFzZWAgYW5kIGBQdWJsaXNoZXJgIGNvbXBvbmVudHMgYXJlIHVzaW5nIGBwdWJsaWJgIHRvIHB1Ymxpc2ggcGFja2FnZXMsXG4gICAqIHdoaWNoIGlzIHVzaW5nIG5wbSBpbnRlcm5hbGx5IGFuZCBzdXBwb3J0cyBwcm92ZW5hbmNlIHN0YXRlbWVudHMgaW5kZXBlbmRlbnRseSBvZiB0aGUgcGFja2FnZSBtYW5hZ2VyIHVzZWQuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLm5wbWpzLmNvbS9nZW5lcmF0aW5nLXByb3ZlbmFuY2Utc3RhdGVtZW50c1xuICAgKiBAZGVmYXVsdCAtIHRydWUgZm9yIHB1YmxpYyBwYWNrYWdlcywgZmFsc2Ugb3RoZXJ3aXNlXG4gICAqL1xuICByZWFkb25seSBucG1Qcm92ZW5hbmNlPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogR2l0SHViIHNlY3JldCB3aGljaCBjb250YWlucyB0aGUgTlBNIHRva2VuIHRvIHVzZSB3aGVuIHB1Ymxpc2hpbmcgcGFja2FnZXMuXG4gICAqXG4gICAqIEBkZWZhdWx0IFwiTlBNX1RPS0VOXCJcbiAgICovXG4gIHJlYWRvbmx5IG5wbVRva2VuU2VjcmV0Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBVc2UgdHJ1c3RlZCBwdWJsaXNoaW5nIGZvciBwdWJsaXNoaW5nIHRvIG5wbWpzLmNvbVxuICAgKiBOZWVkcyB0byBiZSBwcmUtY29uZmlndXJlZCBvbiBucG0uanMgdG8gd29yay5cbiAgICpcbiAgICogQHNlZVxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGZhbHNlXG4gICAqL1xuICByZWFkb25seSBucG1UcnVzdGVkUHVibGlzaGluZz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIE9wdGlvbnMgZm9yIG5wbSBwYWNrYWdlcyB1c2luZyBBV1MgQ29kZUFydGlmYWN0LlxuICAgKiBUaGlzIGlzIHJlcXVpcmVkIGlmIHB1Ymxpc2hpbmcgcGFja2FnZXMgdG8sIG9yIGluc3RhbGxpbmcgc2NvcGVkIHBhY2thZ2VzIGZyb20gQVdTIENvZGVBcnRpZmFjdFxuICAgKlxuICAgKiBAZGVmYXVsdCAtIHVuZGVmaW5lZFxuICAgKi9cbiAgcmVhZG9ubHkgY29kZUFydGlmYWN0T3B0aW9ucz86IENvZGVBcnRpZmFjdE9wdGlvbnM7XG5cbiAgLyoqXG4gICAqIE9wdGlvbnMgZm9yIHByaXZhdGVseSBob3N0ZWQgc2NvcGVkIHBhY2thZ2VzXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gZmV0Y2ggYWxsIHNjb3BlZCBwYWNrYWdlcyBmcm9tIHRoZSBwdWJsaWMgbnBtIHJlZ2lzdHJ5XG4gICAqL1xuICByZWFkb25seSBzY29wZWRQYWNrYWdlc09wdGlvbnM/OiBTY29wZWRQYWNrYWdlc09wdGlvbnNbXTtcblxuICAvKipcbiAgICogT3B0aW9ucyBmb3IgWWFybiBCZXJyeVxuICAgKlxuICAgKiBAZGVmYXVsdCAtIFlhcm4gQmVycnkgdjQgd2l0aCBhbGwgZGVmYXVsdCBvcHRpb25zXG4gICAqL1xuICByZWFkb25seSB5YXJuQmVycnlPcHRpb25zPzogWWFybkJlcnJ5T3B0aW9ucztcblxuICAvKipcbiAgICogT3B0aW9ucyBmb3IgcG5wbVxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGFsbCBkZWZhdWx0IG9wdGlvbnNcbiAgICovXG4gIHJlYWRvbmx5IHBucG1PcHRpb25zPzogUG5wbU9wdGlvbnM7XG5cbiAgLyoqXG4gICAqIENvbmZpZ3VyZSB0aGUgYGRldkVuZ2luZXNgIGZpZWxkIGluIGBwYWNrYWdlLmpzb25gLlxuICAgKlxuICAgKiBUaGUgYGRldkVuZ2luZXMucGFja2FnZU1hbmFnZXJgIGZpZWxkIGlzIGF1dG9tYXRpY2FsbHkgcG9wdWxhdGVkIGJhc2VkIG9uXG4gICAqIHRoZSByZXNvbHZlZCBgcGFja2FnZU1hbmFnZXJgIHZhbHVlLiBBbnkgZmllbGRzIHByb3ZpZGVkIGhlcmUgYXJlIG1lcmdlZFxuICAgKiB3aXRoIHRoZSBhdXRvLXBvcHVsYXRlZCBgcGFja2FnZU1hbmFnZXJgIGVudHJ5LlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5ucG1qcy5jb20vY2xpL3YxMC9jb25maWd1cmluZy1ucG0vcGFja2FnZS1qc29uI2RldmVuZ2luZXNcbiAgICovXG4gIHJlYWRvbmx5IGRldkVuZ2luZXM/OiBEZXZFbmdpbmVzO1xuXG4gIC8qKlxuICAgKiBBdXRvbWF0aWNhbGx5IGFkZCB0aGUgcmVzb2x2ZWQgYHBhY2thZ2VNYW5hZ2VyYCB0byBgZGV2RW5naW5lcy5wYWNrYWdlTWFuYWdlcmBcbiAgICogaW4gYHBhY2thZ2UuanNvbmAsIHNldHRpbmcgYG9uRmFpbGAgdG8gYGlnbm9yZWAuXG4gICAqXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIHJlYWRvbmx5IGFkZFBhY2thZ2VNYW5hZ2VyVG9EZXZFbmdpbmVzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQXV0b21hdGljYWxseSBkZWxldGUgbG9ja2ZpbGVzIGZyb20gcGFja2FnZSBtYW5hZ2VycyB0aGF0IGFyZSBub3QgdGhlXG4gICAqIGFjdGl2ZSBvbmUuIE9ubHkgdHJpZ2dlcmVkIHdoZW4gdGhlIGxvY2tmaWxlIGZvciB0aGUgY29uZmlndXJlZCBwYWNrYWdlXG4gICAqIG1hbmFnZXIgYWxyZWFkeSBleGlzdHMuXG4gICAqXG4gICAqIFRoaXMgaXMgdXNlZnVsIHdoZW4gbWlncmF0aW5nIGJldHdlZW4gcGFja2FnZSBtYW5hZ2VycyB0byBhdm9pZCBjb25mbGljdHMuXG4gICAqXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIHJlYWRvbmx5IGRlbGV0ZU9ycGhhbmVkTG9ja0ZpbGVzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogTGlzdCBvZiBkZXBlbmRlbmN5IChwYWNrYWdlKSBuYW1lcyB0aGF0IGFyZSBhbGxvd2VkIHRvIHJ1biBsaWZlY3ljbGVcbiAgICogaW5zdGFsbCBzY3JpcHRzIChgcHJlaW5zdGFsbGAsIGBpbnN0YWxsYCwgYHBvc3RpbnN0YWxsYCwgYHByZXBhcmVgKVxuICAgKiBkdXJpbmcgZGVwZW5kZW5jeSBpbnN0YWxsYXRpb24uXG4gICAqXG4gICAqIFRoZXNlIHNjcmlwdHMgY2FuIGV4ZWN1dGUgYXJiaXRyYXJ5IGNvZGUsIG1ha2luZyB0aGVtIGEgY29tbW9uXG4gICAqIHN1cHBseS1jaGFpbiBhdHRhY2sgdmVjdG9yLiBQYWNrYWdlIG1hbmFnZXJzIGFyZSBtb3ZpbmcgdG93YXJkXG4gICAqIGJsb2NraW5nIHRoZW0gYnkgZGVmYXVsdCBhbmQgcmVxdWlyaW5nIGFuIGV4cGxpY2l0IGFsbG93bGlzdC5cbiAgICogQ29uZmlndXJpbmcgYGFsbG93U2NyaXB0c2Agc2V0cyB1cCB0aGF0IGFsbG93bGlzdCBzbyBzY3JpcHRzIG9ubHkgcnVuXG4gICAqIGZvciB0aGUgcGFja2FnZXMgeW91IGhhdmUgZXhwbGljaXRseSByZXZpZXdlZCBhbmQgdHJ1c3QuXG4gICAqXG4gICAqIFN1cHBvcnQgZm9yIHRoaXMgc2V0dGluZyBkZXBlbmRzIG9uIHRoZSBjb25maWd1cmVkIGBwYWNrYWdlTWFuYWdlcmA6XG4gICAqXG4gICAqIC0gYE5QTWA6IHdyaXR0ZW4gdG8gdGhlIG5hdGl2ZSBgYWxsb3dTY3JpcHRzYCBmaWVsZCBpbiBgcGFja2FnZS5qc29uYFxuICAgKiAgIChyZXF1aXJlcyBucG0gPj0gMTEuMTY7IHNlZSBodHRwczovL2RvY3MubnBtanMuY29tL2NsaS92MTEvY29tbWFuZHMvbnBtLWFwcHJvdmUtc2NyaXB0cykuXG4gICAqIC0gYEJVTmA6IHdyaXR0ZW4gdG8gdGhlIG5hdGl2ZSBgdHJ1c3RlZERlcGVuZGVuY2llc2AgZmllbGQgaW5cbiAgICogICBgcGFja2FnZS5qc29uYCAoc2VlIGh0dHBzOi8vYnVuLmNvbS9kb2NzL3BtL2xpZmVjeWNsZSkuXG4gICAqIC0gYFBOUE1gOiB3cml0dGVuIHRvIHRoZSBgb25seUJ1aWx0RGVwZW5kZW5jaWVzYCBzZXR0aW5nIGluXG4gICAqICAgYHBucG0td29ya3NwYWNlLnlhbWxgIChzZWUgaHR0cHM6Ly9wbnBtLmlvL3NldHRpbmdzI29ubHlidWlsdGRlcGVuZGVuY2llcykuXG4gICAqIC0gYFlBUk4yYCwgYFlBUk5fQkVSUllgOiB3cml0dGVuIHRvIHRoZSBuYXRpdmVcbiAgICogICBgZGVwZW5kZW5jaWVzTWV0YS48cGtnPi5idWlsdGAgYWxsb3dsaXN0IGluIGBwYWNrYWdlLmpzb25gLCBjb21iaW5lZFxuICAgKiAgIHdpdGggYGVuYWJsZVNjcmlwdHM6IGZhbHNlYCBpbiBgLnlhcm5yYy55bWxgIChzZWVcbiAgICogICBodHRwczovL3lhcm5wa2cuY29tL2ZlYXR1cmVzL3NlY3VyaXR5I3Bvc3RpbnN0YWxscykuIElmIHlvdSBzZXRcbiAgICogICBgeWFybkJlcnJ5T3B0aW9ucy55YXJuUmNPcHRpb25zLmVuYWJsZVNjcmlwdHNgIGV4cGxpY2l0bHksIHRoYXQgdmFsdWVcbiAgICogICBpcyByZXNwZWN0ZWQgaW5zdGVhZCBvZiBiZWluZyBvdmVycmlkZGVuLlxuICAgKiAtIGBZQVJOYCwgYFlBUk5fQ0xBU1NJQ2A6IG5vdCBzdXBwb3J0ZWQuIFlhcm4gQ2xhc3NpYyBoYXMgbm8gbmF0aXZlXG4gICAqICAgbWVjaGFuaXNtIHRvIGFsbG93bGlzdCBpbnN0YWxsIHNjcmlwdHMgZm9yIHNwZWNpZmljIGRlcGVuZGVuY2llcy5cbiAgICogICBTZXR0aW5nIHRoaXMgb3B0aW9uIHdpdGggb25lIG9mIHRoZXNlIHBhY2thZ2UgbWFuYWdlcnMgdGhyb3dzIGFuXG4gICAqICAgZXJyb3IgYXQgc3ludGhlc2lzIHRpbWUuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gYWxsIGluc3RhbGwgc2NyaXB0cyBhcmUgYWxsb3dlZCB0byBydW4gKHBhY2thZ2UgbWFuYWdlciBkZWZhdWx0KVxuICAgKi9cbiAgcmVhZG9ubHkgYWxsb3dTY3JpcHRzPzogc3RyaW5nW107XG59XG5cbi8qKlxuICogQSBkZXBlbmRlbmN5IGVudHJ5IGZvciB0aGUgYGRldkVuZ2luZXNgIGZpZWxkIGluIGBwYWNrYWdlLmpzb25gLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERldkVuZ2luZURlcGVuZGVuY3kge1xuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIGRlcGVuZGVuY3kuXG4gICAqL1xuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSB2ZXJzaW9uIHJhbmdlIGZvciB0aGUgZGVwZW5kZW5jeS5cbiAgICpcbiAgICogQGRlZmF1bHQgXCIqXCJcbiAgICovXG4gIHJlYWRvbmx5IHZlcnNpb24/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoYXQgYWN0aW9uIHRvIHRha2UgaWYgdmFsaWRhdGlvbiBmYWlscy5cbiAgICpcbiAgICogQGRlZmF1bHQgXCJlcnJvclwiXG4gICAqL1xuICByZWFkb25seSBvbkZhaWw/OiBcImlnbm9yZVwiIHwgXCJ3YXJuXCIgfCBcImVycm9yXCIgfCBcImRvd25sb2FkXCI7XG59XG5cbi8qKlxuICogVGhlIGBkZXZFbmdpbmVzYCBmaWVsZCBpbiBgcGFja2FnZS5qc29uYC5cbiAqXG4gKiBAc2VlIGh0dHBzOi8vZG9jcy5ucG1qcy5jb20vY2xpL3YxMC9jb25maWd1cmluZy1ucG0vcGFja2FnZS1qc29uI2RldmVuZ2luZXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZXZFbmdpbmVzIHtcbiAgLyoqXG4gICAqIFN1cHBvcnRlZCBvcGVyYXRpbmcgc3lzdGVtcy5cbiAgICovXG4gIHJlYWRvbmx5IG9zPzogRGV2RW5naW5lRGVwZW5kZW5jeSB8IERldkVuZ2luZURlcGVuZGVuY3lbXTtcblxuICAvKipcbiAgICogU3VwcG9ydGVkIENQVSBhcmNoaXRlY3R1cmVzLlxuICAgKi9cbiAgcmVhZG9ubHkgY3B1PzogRGV2RW5naW5lRGVwZW5kZW5jeSB8IERldkVuZ2luZURlcGVuZGVuY3lbXTtcblxuICAvKipcbiAgICogU3VwcG9ydGVkIEMgc3RhbmRhcmQgbGlicmFyaWVzLlxuICAgKi9cbiAgcmVhZG9ubHkgbGliYz86IERldkVuZ2luZURlcGVuZGVuY3kgfCBEZXZFbmdpbmVEZXBlbmRlbmN5W107XG5cbiAgLyoqXG4gICAqIFN1cHBvcnRlZCBKYXZhU2NyaXB0IHJ1bnRpbWVzLlxuICAgKi9cbiAgcmVhZG9ubHkgcnVudGltZT86IERldkVuZ2luZURlcGVuZGVuY3kgfCBEZXZFbmdpbmVEZXBlbmRlbmN5W107XG5cbiAgLyoqXG4gICAqIFN1cHBvcnRlZCBwYWNrYWdlIG1hbmFnZXJzLlxuICAgKi9cbiAgcmVhZG9ubHkgcGFja2FnZU1hbmFnZXI/OiBEZXZFbmdpbmVEZXBlbmRlbmN5IHwgRGV2RW5naW5lRGVwZW5kZW5jeVtdO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIGF1dGhvcml6aW5nIHJlcXVlc3RzIHRvIGEgQVdTIENvZGVBcnRpZmFjdCBucG0gcmVwb3NpdG9yeS5cbiAqL1xuZXhwb3J0IGVudW0gQ29kZUFydGlmYWN0QXV0aFByb3ZpZGVyIHtcbiAgLyoqXG4gICAqIEZpeGVkIGNyZWRlbnRpYWxzIHByb3ZpZGVkIHZpYSBHaXRodWIgc2VjcmV0cy5cbiAgICovXG4gIEFDQ0VTU19BTkRfU0VDUkVUX0tFWV9QQUlSID0gXCJBQ0NFU1NfQU5EX1NFQ1JFVF9LRVlfUEFJUlwiLFxuXG4gIC8qKlxuICAgKiBFcGhlbWVyYWwgY3JlZGVudGlhbHMgcHJvdmlkZWQgdmlhIEdpdGh1YidzIE9JREMgaW50ZWdyYXRpb24gd2l0aCBhbiBJQU0gcm9sZS5cbiAgICogU2VlOlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvaWRfcm9sZXNfcHJvdmlkZXJzX2NyZWF0ZV9vaWRjLmh0bWxcbiAgICogaHR0cHM6Ly9kb2NzLmdpdGh1Yi5jb20vZW4vYWN0aW9ucy9kZXBsb3ltZW50L3NlY3VyaXR5LWhhcmRlbmluZy15b3VyLWRlcGxveW1lbnRzL2NvbmZpZ3VyaW5nLW9wZW5pZC1jb25uZWN0LWluLWFtYXpvbi13ZWItc2VydmljZXNcbiAgICovXG4gIEdJVEhVQl9PSURDID0gXCJHSVRIVUJfT0lEQ1wiLFxufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHB1Ymxpc2hpbmcgbnBtIHBhY2thZ2VzIHRvIEFXUyBDb2RlQXJ0aWZhY3QuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29kZUFydGlmYWN0T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBQcm92aWRlciB0byB1c2UgZm9yIGF1dGhvcml6aW5nIHJlcXVlc3RzIHRvIEFXUyBDb2RlQXJ0aWZhY3QuXG4gICAqXG4gICAqIEBkZWZhdWx0IENvZGVBcnRpZmFjdEF1dGhQcm92aWRlci5BQ0NFU1NfQU5EX1NFQ1JFVF9LRVlfUEFJUlxuICAgKi9cbiAgcmVhZG9ubHkgYXV0aFByb3ZpZGVyPzogQ29kZUFydGlmYWN0QXV0aFByb3ZpZGVyO1xuXG4gIC8qKlxuICAgKiBHaXRIdWIgc2VjcmV0IHdoaWNoIGNvbnRhaW5zIHRoZSBBV1MgYWNjZXNzIGtleSBJRCB0byB1c2Ugd2hlbiBwdWJsaXNoaW5nIHBhY2thZ2VzIHRvIEFXUyBDb2RlQXJ0aWZhY3QuXG4gICAqIFRoaXMgcHJvcGVydHkgbXVzdCBiZSBzcGVjaWZpZWQgb25seSB3aGVuIHB1Ymxpc2hpbmcgdG8gQVdTIENvZGVBcnRpZmFjdCAoYG5wbVJlZ2lzdHJ5VXJsYCBjb250YWlucyBBV1MgQ29kZUFydGlmYWN0IFVSTCkuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gV2hlbiB0aGUgYGF1dGhQcm92aWRlcmAgdmFsdWUgaXMgc2V0IHRvXG4gICAqIGBDb2RlQXJ0aWZhY3RBdXRoUHJvdmlkZXIuQUNDRVNTX0FORF9TRUNSRVRfS0VZX1BBSVJgLCB0aGUgZGVmYXVsdCBpc1xuICAgKiBcIkFXU19BQ0NFU1NfS0VZX0lEXCIuIEZvciBgQ29kZUFydGlmYWN0QXV0aFByb3ZpZGVyLkdJVEhVQl9PSURDYCwgdGhpc1xuICAgKiB2YWx1ZSBtdXN0IGJlIGxlZnQgdW5kZWZpbmVkLlxuICAgKi9cbiAgcmVhZG9ubHkgYWNjZXNzS2V5SWRTZWNyZXQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEdpdEh1YiBzZWNyZXQgd2hpY2ggY29udGFpbnMgdGhlIEFXUyBzZWNyZXQgYWNjZXNzIGtleSB0byB1c2Ugd2hlbiBwdWJsaXNoaW5nIHBhY2thZ2VzIHRvIEFXUyBDb2RlQXJ0aWZhY3QuXG4gICAqIFRoaXMgcHJvcGVydHkgbXVzdCBiZSBzcGVjaWZpZWQgb25seSB3aGVuIHB1Ymxpc2hpbmcgdG8gQVdTIENvZGVBcnRpZmFjdCAoYG5wbVJlZ2lzdHJ5VXJsYCBjb250YWlucyBBV1MgQ29kZUFydGlmYWN0IFVSTCkuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gV2hlbiB0aGUgYGF1dGhQcm92aWRlcmAgdmFsdWUgaXMgc2V0IHRvXG4gICAqIGBDb2RlQXJ0aWZhY3RBdXRoUHJvdmlkZXIuQUNDRVNTX0FORF9TRUNSRVRfS0VZX1BBSVJgLCB0aGUgZGVmYXVsdCBpc1xuICAgKiBcIkFXU19TRUNSRVRfQUNDRVNTX0tFWVwiLiBGb3IgYENvZGVBcnRpZmFjdEF1dGhQcm92aWRlci5HSVRIVUJfT0lEQ2AsIHRoaXNcbiAgICogdmFsdWUgbXVzdCBiZSBsZWZ0IHVuZGVmaW5lZC5cbiAgICovXG4gIHJlYWRvbmx5IHNlY3JldEFjY2Vzc0tleVNlY3JldD86IHN0cmluZztcblxuICAvKipcbiAgICogQVJOIG9mIEFXUyByb2xlIHRvIGJlIGFzc3VtZWQgcHJpb3IgdG8gZ2V0IGF1dGhvcml6YXRpb24gdG9rZW4gZnJvbSBBV1MgQ29kZUFydGlmYWN0XG4gICAqIFRoaXMgcHJvcGVydHkgbXVzdCBiZSBzcGVjaWZpZWQgb25seSB3aGVuIHB1Ymxpc2hpbmcgdG8gQVdTIENvZGVBcnRpZmFjdCAoYHJlZ2lzdHJ5YCBjb250YWlucyBBV1MgQ29kZUFydGlmYWN0IFVSTCkuXG4gICAqIFdoZW4gdXNpbmcgdGhlIGBDb2RlQXJ0aWZhY3RBdXRoUHJvdmlkZXIuR0lUSFVCX09JRENgIGF1dGggcHJvdmlkZXIsIHRoaXMgdmFsdWUgbXVzdCBiZSBkZWZpbmVkLlxuICAgKlxuICAgKiBAZGVmYXVsdCB1bmRlZmluZWRcbiAgICovXG4gIHJlYWRvbmx5IHJvbGVUb0Fzc3VtZT86IHN0cmluZztcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciBzY29wZWQgcGFja2FnZXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTY29wZWRQYWNrYWdlc09wdGlvbnMge1xuICAvKipcbiAgICogU2NvcGUgb2YgdGhlIHBhY2thZ2VzXG4gICAqXG4gICAqIEBleGFtcGxlIFwiQGFuZ3VsYXJcIlxuICAgKi9cbiAgcmVhZG9ubHkgc2NvcGU6IHN0cmluZztcblxuICAvKipcbiAgICogVVJMIG9mIHRoZSByZWdpc3RyeSBmb3Igc2NvcGVkIHBhY2thZ2VzXG4gICAqL1xuICByZWFkb25seSByZWdpc3RyeVVybDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFJlcHJlc2VudHMgdGhlIG5wbSBgcGFja2FnZS5qc29uYCBmaWxlLlxuICovXG5leHBvcnQgY2xhc3MgTm9kZVBhY2thZ2UgZXh0ZW5kcyBDb21wb25lbnQge1xuICAvKipcbiAgICogUmV0dXJucyB0aGUgYE5vZGVQYWNrYWdlYCBpbnN0YW5jZSBhc3NvY2lhdGVkIHdpdGggYSBwcm9qZWN0IG9yIGB1bmRlZmluZWRgIGlmXG4gICAqIHRoZXJlIGlzIG5vIE5vZGVQYWNrYWdlLlxuICAgKiBAcGFyYW0gcHJvamVjdCBUaGUgcHJvamVjdFxuICAgKiBAcmV0dXJucyBBIE5vZGVQYWNrYWdlLCBvciB1bmRlZmluZWRcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgb2YocHJvamVjdDogUHJvamVjdCk6IE5vZGVQYWNrYWdlIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBpc0l0ID0gKG86IENvbXBvbmVudCk6IG8gaXMgTm9kZVBhY2thZ2UgPT4gbyBpbnN0YW5jZW9mIE5vZGVQYWNrYWdlO1xuICAgIHJldHVybiBwcm9qZWN0LmNvbXBvbmVudHMuZmluZChpc0l0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgbnBtIHBhY2thZ2UuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcGFja2FnZU5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG1vZHVsZSdzIGVudHJ5cG9pbnQgKGUuZy4gYGxpYi9pbmRleC5qc2ApLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGVudHJ5cG9pbnQ6IHN0cmluZztcblxuICAvKipcbiAgICogQWxsb3cgcHJvamVjdCB0byB0YWtlIGxpYnJhcnkgZGVwZW5kZW5jaWVzLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGFsbG93TGlicmFyeURlcGVuZGVuY2llczogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIHBhY2thZ2UgbWFuYWdlciB0byB1c2UuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcGFja2FnZU1hbmFnZXI6IE5vZGVQYWNrYWdlTWFuYWdlcjtcblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgdXNlIGBhZGRGaWVsZCh4LCB5KWBcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBtYW5pZmVzdDogYW55O1xuXG4gIC8qKlxuICAgKiBUaGUgbWluaW11bSBub2RlIHZlcnNpb24gcmVxdWlyZWQgYnkgdGhpcyBwYWNrYWdlIHRvIGZ1bmN0aW9uLlxuICAgKlxuICAgKiBUaGlzIHZhbHVlIGluZGljYXRlcyB0aGUgcGFja2FnZSBpcyBpbmNvbXBhdGlibGUgd2l0aCBvbGRlciB2ZXJzaW9ucy5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBtaW5Ob2RlVmVyc2lvbj86IHN0cmluZztcblxuICAvKipcbiAgICogTWF4aW11bSBub2RlIHZlcnNpb24gc3VwcG9ydGVkIGJ5IHRoaXMgcGFja2FnZS5cbiAgICpcbiAgICogVGhlIHZhbHVlIGluZGljYXRlcyB0aGUgcGFja2FnZSBpcyBpbmNvbXBhdGlibGUgd2l0aCBuZXdlciB2ZXJzaW9ucy5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBtYXhOb2RlVmVyc2lvbj86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHZlcnNpb24gb2YgUE5QTSB0byB1c2UgaWYgdXNpbmcgUE5QTSBhcyBhIHBhY2thZ2UgbWFuYWdlci5cbiAgICpcbiAgICogQHJldHVybnMgYHVuZGVmaW5lZGAgaWYgdGhlIHBhY2thZ2UgbWFuYWdlciBpcyBub3QgUE5QTS5cbiAgICovXG4gIHB1YmxpYyBnZXQgcG5wbVZlcnNpb24oKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5wYWNrYWdlTWFuYWdlciA9PT0gTm9kZVBhY2thZ2VNYW5hZ2VyLlBOUE1cbiAgICAgID8gdGhpcy5fcG5wbVZlcnNpb25cbiAgICAgIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSB2ZXJzaW9uIG9mIEJ1biB0byB1c2UgaWYgdXNpbmcgQnVuIGFzIGEgcGFja2FnZSBtYW5hZ2VyLlxuICAgKlxuICAgKiBAcmV0dXJucyBgdW5kZWZpbmVkYCBpZiB0aGUgcGFja2FnZSBtYW5hZ2VyIGlzIG5vdCBCdW4uXG4gICAqL1xuICBwdWJsaWMgZ2V0IGJ1blZlcnNpb24oKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5wYWNrYWdlTWFuYWdlciA9PT0gTm9kZVBhY2thZ2VNYW5hZ2VyLkJVTlxuICAgICAgPyB0aGlzLl9idW5WZXJzaW9uXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgdmVyc2lvbiBvZiBZYXJuIHRvIHVzZSBpZiB1c2luZyBZYXJuIGFzIGEgcGFja2FnZSBtYW5hZ2VyLlxuICAgKlxuICAgKiBAcmV0dXJucyBgdW5kZWZpbmVkYCBpZiB0aGUgcGFja2FnZSBtYW5hZ2VyIGlzIG5vdCBZYXJuLlxuICAgKi9cbiAgcHVibGljIGdldCB5YXJuVmVyc2lvbigpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGlmIChpc1lhcm5CZXJyeSh0aGlzLnBhY2thZ2VNYW5hZ2VyKSkge1xuICAgICAgcmV0dXJuIHRoaXMuX3lhcm5CZXJyeVZlcnNpb247XG4gICAgfVxuICAgIGlmIChpc1lhcm5DbGFzc2ljKHRoaXMucGFja2FnZU1hbmFnZXIpKSB7XG4gICAgICByZXR1cm4gREVGQVVMVF9ZQVJOX0NMQVNTSUNfVkVSU0lPTjtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHByaXZhdGUgcmVhZG9ubHkgX3BucG1WZXJzaW9uOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2J1blZlcnNpb246IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBfeWFybkJlcnJ5VmVyc2lvbjogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IF9vcHRpb25zOiBOb2RlUGFja2FnZU9wdGlvbnM7XG5cbiAgLyoqXG4gICAqIFRoZSBTUERYIGxpY2Vuc2Ugb2YgdGhpcyBtb2R1bGUuIGB1bmRlZmluZWRgIGlmIHRoaXMgcGFja2FnZSBpcyBub3QgbGljZW5zZWQuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgbGljZW5zZT86IHN0cmluZztcblxuICAvKipcbiAgICogbnBtIHJlZ2lzdHJ5IChlLmcuIGBodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZ2ApLiBVc2UgYG5wbVJlZ2lzdHJ5SG9zdGAgdG8gZ2V0IGp1c3QgdGhlIGhvc3QgbmFtZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBucG1SZWdpc3RyeVVybDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgbnBtIHJlZ2lzdHJ5IGhvc3QgKGUuZy4gYHJlZ2lzdHJ5Lm5wbWpzLm9yZ2ApLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IG5wbVJlZ2lzdHJ5OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEdpdEh1YiBzZWNyZXQgd2hpY2ggY29udGFpbnMgdGhlIE5QTSB0b2tlbiB0byB1c2Ugd2hlbiBwdWJsaXNoaW5nIHBhY2thZ2VzLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IG5wbVRva2VuU2VjcmV0Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBPcHRpb25zIGZvciBucG0gcGFja2FnZXMgdXNpbmcgQVdTIENvZGVBcnRpZmFjdC5cbiAgICogVGhpcyBpcyByZXF1aXJlZCBpZiBwdWJsaXNoaW5nIHBhY2thZ2VzIHRvLCBvciBpbnN0YWxsaW5nIHNjb3BlZCBwYWNrYWdlcyBmcm9tIEFXUyBDb2RlQXJ0aWZhY3RcbiAgICpcbiAgICogQGRlZmF1bHQgLSB1bmRlZmluZWRcbiAgICovXG4gIHJlYWRvbmx5IGNvZGVBcnRpZmFjdE9wdGlvbnM/OiBDb2RlQXJ0aWZhY3RPcHRpb25zO1xuXG4gIC8qKlxuICAgKiBPcHRpb25zIGZvciBwcml2YXRlbHkgaG9zdGVkIHNjb3BlZCBwYWNrYWdlc1xuICAgKlxuICAgKiBAZGVmYXVsdCB1bmRlZmluZWRcbiAgICovXG4gIHJlYWRvbmx5IHNjb3BlZFBhY2thZ2VzT3B0aW9ucz86IFNjb3BlZFBhY2thZ2VzT3B0aW9uc1tdO1xuXG4gIC8qKlxuICAgKiBucG0gcGFja2FnZSBhY2Nlc3MgbGV2ZWwuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgbnBtQWNjZXNzOiBOcG1BY2Nlc3M7XG5cbiAgLyoqXG4gICAqIFNob3VsZCBwcm92ZW5hbmNlIHN0YXRlbWVudHMgYmUgZ2VuZXJhdGVkIHdoZW4gcGFja2FnZSBpcyBwdWJsaXNoZWQuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgbnBtUHJvdmVuYW5jZTogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIGxvY2sgZmlsZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBsb2NrRmlsZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgdGFzayBmb3IgaW5zdGFsbGluZyBwcm9qZWN0IGRlcGVuZGVuY2llcyAobm9uLWZyb3plbilcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBpbnN0YWxsVGFzazogVGFzaztcblxuICAvKipcbiAgICogVGhlIHRhc2sgZm9yIGluc3RhbGxpbmcgcHJvamVjdCBkZXBlbmRlbmNpZXMgKGZyb3plbilcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBpbnN0YWxsQ2lUYXNrOiBUYXNrO1xuXG4gIC8qKlxuICAgKiBUaGUgcGFja2FnZS5qc29uIGZpbGUuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZmlsZTogSnNvbkZpbGU7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBzY3JpcHRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gIHByaXZhdGUgcmVhZG9ubHkgc2NyaXB0c1RvQmVSZW1vdmVkID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkga2V5d29yZHM6IFNldDxzdHJpbmc+ID0gbmV3IFNldCgpO1xuICBwcml2YXRlIHJlYWRvbmx5IGFsbG93ZWRTY3JpcHRzOiBTZXQ8c3RyaW5nPiA9IG5ldyBTZXQoKTtcbiAgcHJpdmF0ZSByZWFkb25seSBiaW46IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgcHJpdmF0ZSByZWFkb25seSBlbmdpbmVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gIHByaXZhdGUgcmVhZG9ubHkgcGVlckRlcGVuZGVuY3lPcHRpb25zOiBQZWVyRGVwZW5kZW5jeU9wdGlvbnM7XG4gIHByaXZhdGUgcmVhZG9ubHkgX3ByZXY/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICBwcml2YXRlIF9yZW5kZXJlZERlcHM/OiBOcG1EZXBlbmRlbmNpZXM7XG4gIHByaXZhdGUgcmVhZG9ubHkgX3BhY2thZ2VNYW5hZ2VyRXhwbGljaXQ6IGJvb2xlYW47XG5cbiAgY29uc3RydWN0b3IocHJvamVjdDogUHJvamVjdCwgb3B0aW9uczogTm9kZVBhY2thZ2VPcHRpb25zID0ge30pIHtcbiAgICBzdXBlcihwcm9qZWN0KTtcblxuICAgIHRoaXMucGFja2FnZU5hbWUgPSBvcHRpb25zLnBhY2thZ2VOYW1lID8/IHByb2plY3QubmFtZTtcbiAgICB0aGlzLnBlZXJEZXBlbmRlbmN5T3B0aW9ucyA9IHtcbiAgICAgIHBpbm5lZERldkRlcGVuZGVuY3k6IHRydWUsXG4gICAgICAuLi5vcHRpb25zLnBlZXJEZXBlbmRlbmN5T3B0aW9ucyxcbiAgICB9O1xuICAgIHRoaXMuYWxsb3dMaWJyYXJ5RGVwZW5kZW5jaWVzID0gb3B0aW9ucy5hbGxvd0xpYnJhcnlEZXBlbmRlbmNpZXMgPz8gdHJ1ZTtcblxuICAgIC8vIFJlYWQgcHJldmlvdXMgcGFja2FnZS5qc29uIGVhcmx5IHNvIHdlIGNhbiB1c2UgaXQgZm9yIGluZmVyZW5jZVxuICAgIHRoaXMuX3ByZXYgPSB0aGlzLnJlYWRQYWNrYWdlSnNvbigpO1xuXG4gICAgLy8gUmVzb2x2ZSBwYWNrYWdlIG1hbmFnZXI6IGV4cGxpY2l0ID4gaW5mZXJyZWQgZnJvbSBwYWNrYWdlLmpzb24gPiBmYWxsYmFja1xuICAgIGlmIChvcHRpb25zLnBhY2thZ2VNYW5hZ2VyKSB7XG4gICAgICB0aGlzLnBhY2thZ2VNYW5hZ2VyID0gb3B0aW9ucy5wYWNrYWdlTWFuYWdlcjtcbiAgICAgIHRoaXMuX3BhY2thZ2VNYW5hZ2VyRXhwbGljaXQgPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9wYWNrYWdlTWFuYWdlckV4cGxpY2l0ID0gZmFsc2U7XG4gICAgICBjb25zdCBmcm9tUGtnSnNvbiA9IGluZmVyUGFja2FnZU1hbmFnZXJGcm9tUGtnSnNvbihcbiAgICAgICAgdGhpcy5fcHJldixcbiAgICAgICAgcHJvamVjdC5vdXRkaXIsXG4gICAgICApO1xuICAgICAgaWYgKGZyb21Qa2dKc29uKSB7XG4gICAgICAgIHRoaXMucGFja2FnZU1hbmFnZXIgPSBmcm9tUGtnSnNvbjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMucHJvamVjdC5sb2dnZXIud2FybihcbiAgICAgICAgICBgW0RFUFJFQ0FURURdIFwicGFja2FnZU1hbmFnZXJcIiBpcyBub3Qgc2V0IGluIHByb2plbnJjLCBkZWZhdWx0aW5nIHRvIFwiJHtOb2RlUGFja2FnZU1hbmFnZXIuWUFSTl9DTEFTU0lDfVwiLiBgICtcbiAgICAgICAgICAgIGBUaGlzIHdpbGwgYmVjb21lIGEgcmVxdWlyZWQgb3B0aW9uIGluIGEgZnV0dXJlIHZlcnNpb24uIFBsZWFzZSBzZXQgaXQgZXhwbGljaXRseS5gLFxuICAgICAgICApO1xuICAgICAgICB0aGlzLnBhY2thZ2VNYW5hZ2VyID0gTm9kZVBhY2thZ2VNYW5hZ2VyLllBUk5fQ0xBU1NJQztcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmVudHJ5cG9pbnQgPSBvcHRpb25zLmVudHJ5cG9pbnQgPz8gXCJsaWIvaW5kZXguanNcIjtcbiAgICB0aGlzLmxvY2tGaWxlID0gZGV0ZXJtaW5lTG9ja2ZpbGUodGhpcy5wYWNrYWdlTWFuYWdlcik7XG5cbiAgICAvLyBDbGVhbiB1cCBsb2NrZmlsZXMgZnJvbSBvdGhlciBwYWNrYWdlIG1hbmFnZXJzIGR1cmluZyBtaWdyYXRpb25cbiAgICBpZiAob3B0aW9ucy5kZWxldGVPcnBoYW5lZExvY2tGaWxlcyAhPT0gZmFsc2UpIHtcbiAgICAgIHRoaXMuZGVsZXRlT3JwaGFuZWRMb2NrRmlsZXMoKTtcbiAgICB9XG5cbiAgICB0aGlzLnByb2plY3QuYW5ub3RhdGVHZW5lcmF0ZWQoYC8ke3RoaXMubG9ja0ZpbGV9YCk7XG5cbiAgICBjb25zdCB7XG4gICAgICBucG1BY2Nlc3MsXG4gICAgICBucG1SZWdpc3RyeSxcbiAgICAgIG5wbVJlZ2lzdHJ5VXJsLFxuICAgICAgbnBtVG9rZW5TZWNyZXQsXG4gICAgICBjb2RlQXJ0aWZhY3RPcHRpb25zLFxuICAgICAgc2NvcGVkUGFja2FnZXNPcHRpb25zLFxuICAgICAgbnBtUHJvdmVuYW5jZSxcbiAgICB9ID0gdGhpcy5wYXJzZU5wbU9wdGlvbnMob3B0aW9ucyk7XG4gICAgdGhpcy5ucG1BY2Nlc3MgPSBucG1BY2Nlc3M7XG4gICAgdGhpcy5ucG1SZWdpc3RyeSA9IG5wbVJlZ2lzdHJ5O1xuICAgIHRoaXMubnBtUmVnaXN0cnlVcmwgPSBucG1SZWdpc3RyeVVybDtcbiAgICB0aGlzLm5wbVRva2VuU2VjcmV0ID0gbnBtVG9rZW5TZWNyZXQ7XG4gICAgdGhpcy5jb2RlQXJ0aWZhY3RPcHRpb25zID0gY29kZUFydGlmYWN0T3B0aW9ucztcbiAgICB0aGlzLnNjb3BlZFBhY2thZ2VzT3B0aW9ucyA9IHNjb3BlZFBhY2thZ2VzT3B0aW9ucztcbiAgICB0aGlzLm5wbVByb3ZlbmFuY2UgPSBucG1Qcm92ZW5hbmNlO1xuXG4gICAgdGhpcy5wcm9jZXNzRGVwcyhvcHRpb25zKTtcblxuICAgIC8vIGVtcHR5IG9iamVjdHMgYXJlIGhlcmUgdG8gcHJlc2VydmUgb3JkZXIgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5XG4gICAgdGhpcy5tYW5pZmVzdCA9IHtcbiAgICAgIG5hbWU6IHRoaXMucGFja2FnZU5hbWUsXG4gICAgICBkZXNjcmlwdGlvbjogb3B0aW9ucy5kZXNjcmlwdGlvbixcbiAgICAgIHJlcG9zaXRvcnk6ICFvcHRpb25zLnJlcG9zaXRvcnlcbiAgICAgICAgPyB1bmRlZmluZWRcbiAgICAgICAgOiB7XG4gICAgICAgICAgICB0eXBlOiBcImdpdFwiLFxuICAgICAgICAgICAgdXJsOiBvcHRpb25zLnJlcG9zaXRvcnksXG4gICAgICAgICAgICBkaXJlY3Rvcnk6IG9wdGlvbnMucmVwb3NpdG9yeURpcmVjdG9yeSxcbiAgICAgICAgICB9LFxuICAgICAgYmluOiAoKSA9PiB0aGlzLnJlbmRlckJpbigpLFxuICAgICAgc2NyaXB0czogKCkgPT4gdGhpcy5yZW5kZXJTY3JpcHRzKCksXG4gICAgICBhdXRob3I6IHRoaXMucmVuZGVyQXV0aG9yKG9wdGlvbnMpLFxuICAgICAgZGV2RGVwZW5kZW5jaWVzOiB7fSxcbiAgICAgIHBlZXJEZXBlbmRlbmNpZXM6IHt9LFxuICAgICAgZGVwZW5kZW5jaWVzOiB7fSxcbiAgICAgIGJ1bmRsZWREZXBlbmRlbmNpZXM6IFtdLFxuICAgICAgLi4udGhpcy5yZW5kZXJQYWNrYWdlUmVzb2x1dGlvbnMoKSxcbiAgICAgIGtleXdvcmRzOiAoKSA9PiB0aGlzLnJlbmRlcktleXdvcmRzKCksXG4gICAgICBlbmdpbmVzOiAoKSA9PiB0aGlzLnJlbmRlckVuZ2luZXMoKSxcbiAgICAgIGRldkVuZ2luZXM6ICgpID0+IHRoaXMucmVuZGVyRGV2RW5naW5lcygpLFxuICAgICAgbWFpbjogdGhpcy5lbnRyeXBvaW50ICE9PSBcIlwiID8gdGhpcy5lbnRyeXBvaW50IDogdW5kZWZpbmVkLFxuICAgICAgbGljZW5zZTogKCkgPT4gdGhpcy5saWNlbnNlID8/IFVOTElDRU5TRUQsXG4gICAgICBob21lcGFnZTogb3B0aW9ucy5ob21lcGFnZSxcbiAgICAgIHN0YWJpbGl0eTogb3B0aW9ucy5zdGFiaWxpdHksXG4gICAgICBwdWJsaXNoQ29uZmlnOiAoKSA9PiB0aGlzLnJlbmRlclB1Ymxpc2hDb25maWcoKSxcbiAgICAgIHR5cGVzVmVyc2lvbnM6IHRoaXMuX3ByZXY/LnR5cGVzVmVyc2lvbnMsXG4gICAgICBhbGxvd1NjcmlwdHM6XG4gICAgICAgIHRoaXMucGFja2FnZU1hbmFnZXIgPT09IE5vZGVQYWNrYWdlTWFuYWdlci5OUE1cbiAgICAgICAgICA/ICgpID0+IHRoaXMucmVuZGVyTnBtQWxsb3dTY3JpcHRzKClcbiAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgIHRydXN0ZWREZXBlbmRlbmNpZXM6XG4gICAgICAgIHRoaXMucGFja2FnZU1hbmFnZXIgPT09IE5vZGVQYWNrYWdlTWFuYWdlci5CVU5cbiAgICAgICAgICA/ICgpID0+IHRoaXMucmVuZGVyQnVuVHJ1c3RlZERlcGVuZGVuY2llcygpXG4gICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICBkZXBlbmRlbmNpZXNNZXRhOiBpc1lhcm5CZXJyeSh0aGlzLnBhY2thZ2VNYW5hZ2VyKVxuICAgICAgICA/ICgpID0+IHRoaXMucmVuZGVyWWFybkJlcnJ5RGVwZW5kZW5jaWVzTWV0YSgpXG4gICAgICAgIDogdW5kZWZpbmVkLFxuXG4gICAgICAvLyBpbiByZWxlYXNlIENJIGJ1aWxkcyB3ZSBidW1wIHRoZSB2ZXJzaW9uIGJlZm9yZSB3ZSBydW4gXCJidWlsZFwiIHNvIHdlIHdhbnRcbiAgICAgIC8vIHRvIHByZXNlcnZlIHRoZSB2ZXJzaW9uIG51bWJlci4gb3RoZXJ3aXNlLCB3ZSBhbHdheXMgc2V0IGl0IHRvIDAuMC4wXG4gICAgICB2ZXJzaW9uOiB0aGlzLmRldGVybWluZVZlcnNpb24odGhpcy5fcHJldj8udmVyc2lvbiksXG4gICAgICBidWdzOlxuICAgICAgICBvcHRpb25zLmJ1Z3NFbWFpbCB8fCBvcHRpb25zLmJ1Z3NVcmxcbiAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgZW1haWw6IG9wdGlvbnMuYnVnc0VtYWlsLFxuICAgICAgICAgICAgICB1cmw6IG9wdGlvbnMuYnVnc1VybCxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICB9O1xuXG4gICAgLy8gUmVzb2x2ZSBwYWNrYWdlIG1hbmFnZXIgdmVyc2lvbnNcbiAgICB0aGlzLl9vcHRpb25zID0gb3B0aW9ucztcbiAgICB0aGlzLl9wbnBtVmVyc2lvbiA9IG9wdGlvbnMucG5wbVZlcnNpb24gPz8gREVGQVVMVF9QTlBNX1ZFUlNJT047XG4gICAgdGhpcy5fYnVuVmVyc2lvbiA9IG9wdGlvbnMuYnVuVmVyc2lvbiA/PyBcImxhdGVzdFwiO1xuICAgIHRoaXMuX3lhcm5CZXJyeVZlcnNpb24gPVxuICAgICAgb3B0aW9ucy55YXJuQmVycnlPcHRpb25zPy52ZXJzaW9uID8/IERFRkFVTFRfWUFSTl9CRVJSWV9WRVJTSU9OO1xuICAgIHRoaXMuYWRkQWxsb3dlZFNjcmlwdHMoLi4uKG9wdGlvbnMuYWxsb3dTY3JpcHRzID8/IFtdKSk7XG5cbiAgICAvLyBDb25maWd1cmUgWWFybiBCZXJyeSBpZiB1c2luZ1xuICAgIGlmIChpc1lhcm5CZXJyeSh0aGlzLnBhY2thZ2VNYW5hZ2VyKSkge1xuICAgICAgdGhpcy5jb25maWd1cmVZYXJuQmVycnkocHJvamVjdCwgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgLy8gQ29uZmlndXJlIHBucG0gaWYgdXNpbmdcbiAgICBpZiAodGhpcy5wYWNrYWdlTWFuYWdlciA9PT0gTm9kZVBhY2thZ2VNYW5hZ2VyLlBOUE0pIHtcbiAgICAgIHRoaXMuY29uZmlndXJlUG5wbShwcm9qZWN0LCBvcHRpb25zKTtcbiAgICB9XG5cbiAgICB0aGlzLmZpbGUgPSBuZXcgSnNvbkZpbGUodGhpcywgXCJwYWNrYWdlLmpzb25cIiwge1xuICAgICAgb2JqOiB0aGlzLm1hbmlmZXN0LFxuICAgICAgcmVhZG9ubHk6IGZhbHNlLCAvLyB3ZSB3YW50IFwieWFybiBhZGRcIiB0byB3b3JrIGFuZCB3ZSBoYXZlIGFudGktdGFtcGVyXG4gICAgICBuZXdsaW5lOiB0cnVlLCAvLyBhbGwgcGFja2FnZSBtYW5hZ2VycyBwcmVmZXIgYSBuZXdsaW5lLCBzZWUgaHR0cHM6Ly9naXRodWIuY29tL3Byb2plbi9wcm9qZW4vaXNzdWVzLzIwNzZcbiAgICAgIGNvbW1pdHRlZDogdHJ1ZSwgLy8gbmVlZHMgdG8gYmUgY29tbWl0dGVkIHNvIHVzZXJzIGNhbiBpbnN0YWxsIHRoZSBkZXBlbmRlbmNpZXNcbiAgICB9KTtcblxuICAgIHRoaXMuYWRkS2V5d29yZHMoLi4uKG9wdGlvbnMua2V5d29yZHMgPz8gW10pKTtcbiAgICB0aGlzLmFkZEJpbihvcHRpb25zLmJpbiA/PyB7fSk7XG5cbiAgICAvLyBhdXRvbWF0aWNhbGx5IGFkZCBhbGwgZXhlY3V0YWJsZSBmaWxlcyB1bmRlciBcImJpblwiXG4gICAgaWYgKG9wdGlvbnMuYXV0b0RldGVjdEJpbiA/PyB0cnVlKSB7XG4gICAgICB0aGlzLmF1dG9EaXNjb3ZlckJpbmFyaWVzKCk7XG4gICAgfVxuXG4gICAgLy8gbm9kZSB2ZXJzaW9uXG4gICAgdGhpcy5taW5Ob2RlVmVyc2lvbiA9IG9wdGlvbnMubWluTm9kZVZlcnNpb247XG4gICAgdGhpcy5tYXhOb2RlVmVyc2lvbiA9IG9wdGlvbnMubWF4Tm9kZVZlcnNpb247XG4gICAgdGhpcy5hZGROb2RlRW5naW5lKCk7XG5cbiAgICB0aGlzLmNvbmZpZ3VyZUNvcmVwYWNrKCk7XG5cbiAgICB0aGlzLmFkZENvZGVBcnRpZmFjdExvZ2luU2NyaXB0KCk7XG5cbiAgICAvLyBsaWNlbnNlXG4gICAgaWYgKG9wdGlvbnMubGljZW5zZWQgPz8gdHJ1ZSkge1xuICAgICAgdGhpcy5saWNlbnNlID0gb3B0aW9ucy5saWNlbnNlID8/IFwiQXBhY2hlLTIuMFwiO1xuICAgIH1cblxuICAgIHRoaXMuaW5zdGFsbFRhc2sgPSBwcm9qZWN0LmFkZFRhc2soXCJpbnN0YWxsXCIsIHtcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICBcIkluc3RhbGwgcHJvamVjdCBkZXBlbmRlbmNpZXMgYW5kIHVwZGF0ZSBsb2NrZmlsZSAobm9uLWZyb3plbilcIixcbiAgICAgIGV4ZWM6IHRoaXMuaW5zdGFsbEFuZFVwZGF0ZUxvY2tmaWxlQ29tbWFuZCxcbiAgICB9KTtcblxuICAgIHRoaXMuaW5zdGFsbENpVGFzayA9IHByb2plY3QuYWRkVGFzayhcImluc3RhbGw6Y2lcIiwge1xuICAgICAgZGVzY3JpcHRpb246IFwiSW5zdGFsbCBwcm9qZWN0IGRlcGVuZGVuY2llcyB1c2luZyBmcm96ZW4gbG9ja2ZpbGVcIixcbiAgICAgIGV4ZWM6IHRoaXMuaW5zdGFsbENvbW1hbmQsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRGVmaW5lcyBub3JtYWwgZGVwZW5kZW5jaWVzLlxuICAgKlxuICAgKiBAcGFyYW0gZGVwcyBOYW1lcyBtb2R1bGVzIHRvIGluc3RhbGwuIEJ5IGRlZmF1bHQsIHRoZSB0aGUgZGVwZW5kZW5jeSB3aWxsXG4gICAqIGJlIGluc3RhbGxlZCBpbiB0aGUgbmV4dCBgcG5wbSBwcm9qZW5gIHJ1biBhbmQgdGhlIHZlcnNpb24gd2lsbCBiZSByZWNvcmRlZFxuICAgKiBpbiB5b3VyIGBwYWNrYWdlLmpzb25gIGZpbGUuIFlvdSBjYW4gdXBncmFkZSBtYW51YWxseSBvciB1c2luZyBgcG5wbVxuICAgKiBhZGQvdXBkYXRlYC4gSWYgeW91IHdpc2ggdG8gc3BlY2lmeSBhIHZlcnNpb24gcmFuZ2UgdXNlIHRoaXMgc3ludGF4OlxuICAgKiBgbW9kdWxlQF43YC5cbiAgICovXG4gIHB1YmxpYyBhZGREZXBzKC4uLmRlcHM6IHN0cmluZ1tdKSB7XG4gICAgZm9yIChjb25zdCBkZXAgb2YgZGVwcykge1xuICAgICAgdGhpcy5wcm9qZWN0LmRlcHMuYWRkRGVwZW5kZW5jeShkZXAsIERlcGVuZGVuY3lUeXBlLlJVTlRJTUUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEZWZpbmVzIGRldmVsb3BtZW50L3Rlc3QgZGVwZW5kZW5jaWVzLlxuICAgKlxuICAgKiBAcGFyYW0gZGVwcyBOYW1lcyBtb2R1bGVzIHRvIGluc3RhbGwuIEJ5IGRlZmF1bHQsIHRoZSB0aGUgZGVwZW5kZW5jeSB3aWxsXG4gICAqIGJlIGluc3RhbGxlZCBpbiB0aGUgbmV4dCBgcG5wbSBwcm9qZW5gIHJ1biBhbmQgdGhlIHZlcnNpb24gd2lsbCBiZSByZWNvcmRlZFxuICAgKiBpbiB5b3VyIGBwYWNrYWdlLmpzb25gIGZpbGUuIFlvdSBjYW4gdXBncmFkZSBtYW51YWxseSBvciB1c2luZyBgcG5wbVxuICAgKiBhZGQvdXBkYXRlYC4gSWYgeW91IHdpc2ggdG8gc3BlY2lmeSBhIHZlcnNpb24gcmFuZ2UgdXNlIHRoaXMgc3ludGF4OlxuICAgKiBgbW9kdWxlQF43YC5cbiAgICovXG4gIHB1YmxpYyBhZGREZXZEZXBzKC4uLmRlcHM6IHN0cmluZ1tdKSB7XG4gICAgZm9yIChjb25zdCBkZXAgb2YgZGVwcykge1xuICAgICAgdGhpcy5wcm9qZWN0LmRlcHMuYWRkRGVwZW5kZW5jeShkZXAsIERlcGVuZGVuY3lUeXBlLkJVSUxEKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRGVmaW5lcyBwZWVyIGRlcGVuZGVuY2llcy5cbiAgICpcbiAgICogV2hlbiBhZGRpbmcgcGVlciBkZXBlbmRlbmNpZXMsIGEgZGV2RGVwZW5kZW5jeSB3aWxsIGFsc28gYmUgYWRkZWQgb24gdGhlXG4gICAqIHBpbm5lZCB2ZXJzaW9uIG9mIHRoZSBkZWNsYXJlZCBwZWVyLiBUaGlzIHdpbGwgZW5zdXJlIHRoYXQgeW91IGFyZSB0ZXN0aW5nXG4gICAqIHlvdXIgY29kZSBhZ2FpbnN0IHRoZSBtaW5pbXVtIHZlcnNpb24gcmVxdWlyZWQgZnJvbSB5b3VyIGNvbnN1bWVycy5cbiAgICpcbiAgICogQHBhcmFtIGRlcHMgTmFtZXMgbW9kdWxlcyB0byBpbnN0YWxsLiBCeSBkZWZhdWx0LCB0aGUgdGhlIGRlcGVuZGVuY3kgd2lsbFxuICAgKiBiZSBpbnN0YWxsZWQgaW4gdGhlIG5leHQgYHBucG0gcHJvamVuYCBydW4gYW5kIHRoZSB2ZXJzaW9uIHdpbGwgYmUgcmVjb3JkZWRcbiAgICogaW4geW91ciBgcGFja2FnZS5qc29uYCBmaWxlLiBZb3UgY2FuIHVwZ3JhZGUgbWFudWFsbHkgb3IgdXNpbmcgYHBucG1cbiAgICogYWRkL3VwZGF0ZWAuIElmIHlvdSB3aXNoIHRvIHNwZWNpZnkgYSB2ZXJzaW9uIHJhbmdlIHVzZSB0aGlzIHN5bnRheDpcbiAgICogYG1vZHVsZUBeN2AuXG4gICAqL1xuICBwdWJsaWMgYWRkUGVlckRlcHMoLi4uZGVwczogc3RyaW5nW10pIHtcbiAgICBpZiAoT2JqZWN0LmtleXMoZGVwcykubGVuZ3RoICYmICF0aGlzLmFsbG93TGlicmFyeURlcGVuZGVuY2llcykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgY2Fubm90IGFkZCBwZWVyIGRlcGVuZGVuY2llcyB0byBhbiBBUFAgcHJvamVjdDogJHtPYmplY3Qua2V5cyhcbiAgICAgICAgICBkZXBzLFxuICAgICAgICApLmpvaW4oXCIsXCIpfWAsXG4gICAgICApO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgZGVwIG9mIGRlcHMpIHtcbiAgICAgIHRoaXMucHJvamVjdC5kZXBzLmFkZERlcGVuZGVuY3koZGVwLCBEZXBlbmRlbmN5VHlwZS5QRUVSKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRGVmaW5lcyBidW5kbGVkIGRlcGVuZGVuY2llcy5cbiAgICpcbiAgICogQnVuZGxlZCBkZXBlbmRlbmNpZXMgd2lsbCBiZSBhZGRlZCBhcyBub3JtYWwgZGVwZW5kZW5jaWVzIGFzIHdlbGwgYXMgdG8gdGhlXG4gICAqIGBidW5kbGVkRGVwZW5kZW5jaWVzYCBzZWN0aW9uIG9mIHlvdXIgYHBhY2thZ2UuanNvbmAuXG4gICAqXG4gICAqIEBwYXJhbSBkZXBzIE5hbWVzIG1vZHVsZXMgdG8gaW5zdGFsbC4gQnkgZGVmYXVsdCwgdGhlIHRoZSBkZXBlbmRlbmN5IHdpbGxcbiAgICogYmUgaW5zdGFsbGVkIGluIHRoZSBuZXh0IGBwbnBtIHByb2plbmAgcnVuIGFuZCB0aGUgdmVyc2lvbiB3aWxsIGJlIHJlY29yZGVkXG4gICAqIGluIHlvdXIgYHBhY2thZ2UuanNvbmAgZmlsZS4gWW91IGNhbiB1cGdyYWRlIG1hbnVhbGx5IG9yIHVzaW5nIGBwbnBtXG4gICAqIGFkZC91cGRhdGVgLiBJZiB5b3Ugd2lzaCB0byBzcGVjaWZ5IGEgdmVyc2lvbiByYW5nZSB1c2UgdGhpcyBzeW50YXg6XG4gICAqIGBtb2R1bGVAXjdgLlxuICAgKi9cbiAgcHVibGljIGFkZEJ1bmRsZWREZXBzKC4uLmRlcHM6IHN0cmluZ1tdKSB7XG4gICAgaWYgKGRlcHMubGVuZ3RoICYmICF0aGlzLmFsbG93TGlicmFyeURlcGVuZGVuY2llcykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgY2Fubm90IGFkZCBidW5kbGVkIGRlcGVuZGVuY2llcyB0byBhbiBBUFAgcHJvamVjdDogJHtkZXBzLmpvaW4oXCIsXCIpfWAsXG4gICAgICApO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgZGVwIG9mIGRlcHMpIHtcbiAgICAgIHRoaXMucHJvamVjdC5kZXBzLmFkZERlcGVuZGVuY3koZGVwLCBEZXBlbmRlbmN5VHlwZS5CVU5ETEVEKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhbiBgZW5naW5lc2AgcmVxdWlyZW1lbnQgdG8geW91ciBwYWNrYWdlLlxuICAgKiBAcGFyYW0gZW5naW5lIFRoZSBlbmdpbmUgKGUuZy4gYG5vZGVgKVxuICAgKiBAcGFyYW0gdmVyc2lvbiBUaGUgc2VtYW50aWMgdmVyc2lvbiByZXF1aXJlbWVudCAoZS5nLiBgXjEwYClcbiAgICovXG4gIHB1YmxpYyBhZGRFbmdpbmUoZW5naW5lOiBzdHJpbmcsIHZlcnNpb246IHN0cmluZykge1xuICAgIHRoaXMuZW5naW5lc1tlbmdpbmVdID0gdmVyc2lvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGtleXdvcmRzIHRvIHBhY2thZ2UuanNvbiAoZGVkdXBsaWNhdGVkKVxuICAgKiBAcGFyYW0ga2V5d29yZHMgVGhlIGtleXdvcmRzIHRvIGFkZFxuICAgKi9cbiAgcHVibGljIGFkZEtleXdvcmRzKC4uLmtleXdvcmRzOiBzdHJpbmdbXSkge1xuICAgIGZvciAoY29uc3QgayBvZiBrZXl3b3Jkcykge1xuICAgICAgdGhpcy5rZXl3b3Jkcy5hZGQoayk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFsbG93cyB0aGUgZ2l2ZW4gZGVwZW5kZW5jeSAocGFja2FnZSkgbmFtZXMgdG8gcnVuIGxpZmVjeWNsZSBpbnN0YWxsXG4gICAqIHNjcmlwdHMgKGBwcmVpbnN0YWxsYCwgYGluc3RhbGxgLCBgcG9zdGluc3RhbGxgLCBgcHJlcGFyZWApLCBpbiBhZGRpdGlvblxuICAgKiB0byBhbnkgYWxyZWFkeSBhbGxvd2VkIHZpYSB0aGUgYGFsbG93U2NyaXB0c2Agb3B0aW9uIG9yIHByZXZpb3VzIGNhbGxzLlxuICAgKlxuICAgKiBVc2VmdWwgZm9yIHByb2plY3QgdHlwZXMgdGhhdCB3YW50IHRvIGFsbG93bGlzdCBhIHBhY2thZ2UgYnkgZGVmYXVsdFxuICAgKiB3aGlsZSBzdGlsbCBsZXR0aW5nIGNvbnN1bWVycyBhZGQgZnVydGhlciBwYWNrYWdlcyB2aWEgYGFsbG93U2NyaXB0c2AuXG4gICAqXG4gICAqIEBwYXJhbSBwYWNrYWdlcyBUaGUgZGVwZW5kZW5jeSAocGFja2FnZSkgbmFtZXMgdG8gYWxsb3cuXG4gICAqIEBzZWUgTm9kZVBhY2thZ2VPcHRpb25zLmFsbG93U2NyaXB0c1xuICAgKi9cbiAgcHVibGljIGFkZEFsbG93ZWRTY3JpcHRzKC4uLnBhY2thZ2VzOiBzdHJpbmdbXSkge1xuICAgIGZvciAoY29uc3QgcGtnIG9mIHBhY2thZ2VzKSB7XG4gICAgICB0aGlzLmFsbG93ZWRTY3JpcHRzLmFkZChwa2cpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIHRoZSBnaXZlbiBkZXBlbmRlbmN5IChwYWNrYWdlKSBuYW1lcyBmcm9tIHRoZSBgYWxsb3dTY3JpcHRzYFxuICAgKiBhbGxvd2xpc3QsIHdoZXRoZXIgdGhleSB3ZXJlIGFkZGVkIHZpYSB0aGUgYGFsbG93U2NyaXB0c2Agb3B0aW9uLCBhXG4gICAqIHByb2plY3QgdHlwZSBkZWZhdWx0LCBvciBhIHByZXZpb3VzIGNhbGwgdG8gYGFkZEFsbG93ZWRTY3JpcHRzYC5cbiAgICpcbiAgICogQHBhcmFtIHBhY2thZ2VzIFRoZSBkZXBlbmRlbmN5IChwYWNrYWdlKSBuYW1lcyB0byByZW1vdmUuXG4gICAqIEBzZWUgTm9kZVBhY2thZ2VPcHRpb25zLmFsbG93U2NyaXB0c1xuICAgKi9cbiAgcHVibGljIHJlbW92ZUFsbG93ZWRTY3JpcHRzKC4uLnBhY2thZ2VzOiBzdHJpbmdbXSkge1xuICAgIGZvciAoY29uc3QgcGtnIG9mIHBhY2thZ2VzKSB7XG4gICAgICB0aGlzLmFsbG93ZWRTY3JpcHRzLmRlbGV0ZShwa2cpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBhZGRCaW4oYmluczogUmVjb3JkPHN0cmluZywgc3RyaW5nPikge1xuICAgIGZvciAoY29uc3QgW2ssIHZdIG9mIE9iamVjdC5lbnRyaWVzKGJpbnMpKSB7XG4gICAgICB0aGlzLmJpbltrXSA9IHY7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIG5wbSBwYWNrYWdlLmpzb24gc2NyaXB0LlxuICAgKlxuICAgKiBAcGFyYW0gbmFtZSBUaGUgc2NyaXB0IG5hbWVcbiAgICogQHBhcmFtIGNvbW1hbmQgVGhlIGNvbW1hbmQgdG8gZXhlY3V0ZVxuICAgKi9cbiAgcHVibGljIHNldFNjcmlwdChuYW1lOiBzdHJpbmcsIGNvbW1hbmQ6IHN0cmluZykge1xuICAgIHRoaXMuc2NyaXB0c1tuYW1lXSA9IGNvbW1hbmQ7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyBhbiBucG0gc2NyaXB0IChhbHdheXMgc3VjY2Vzc2Z1bCkuXG4gICAqXG4gICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBzY3JpcHQuXG4gICAqL1xuICBwdWJsaWMgcmVtb3ZlU2NyaXB0KG5hbWU6IHN0cmluZykge1xuICAgIC8vIG5lZWQgdG8ga2VlcCB0cmFjayBpbiBjYXNlIHRoZXJlJ3MgYSB0YXNrIG9mIHRoZSBzYW1lIG5hbWVcbiAgICB0aGlzLnNjcmlwdHNUb0JlUmVtb3ZlZC5hZGQobmFtZSk7XG4gICAgZGVsZXRlIHRoaXMuc2NyaXB0c1tuYW1lXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXJlY3RseSBzZXQgZmllbGRzIGluIGBwYWNrYWdlLmpzb25gLlxuICAgKiBAZXNjYXBlXG4gICAqIEBwYXJhbSBuYW1lIGZpZWxkIG5hbWVcbiAgICogQHBhcmFtIHZhbHVlIGZpZWxkIHZhbHVlXG4gICAqL1xuICBwdWJsaWMgYWRkRmllbGQobmFtZTogc3RyaW5nLCB2YWx1ZTogYW55KSB7XG4gICAgdGhpcy5tYW5pZmVzdFtuYW1lXSA9IHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIHBhY2thZ2UgdmVyc2lvbi5cbiAgICogQHBhcmFtIHZlcnNpb24gUGFja2FnZSB2ZXJzaW9uLlxuICAgKi9cbiAgcHVibGljIGFkZFZlcnNpb24odmVyc2lvbjogc3RyaW5nKSB7XG4gICAgdGhpcy5tYW5pZmVzdC52ZXJzaW9uID0gdmVyc2lvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWZpbmVzIHJlc29sdXRpb25zIGZvciBkZXBlbmRlbmNpZXMgdG8gY2hhbmdlIHRoZSBub3JtYWxseSByZXNvbHZlZFxuICAgKiB2ZXJzaW9uIG9mIGEgZGVwZW5kZW5jeSB0byBzb21ldGhpbmcgZWxzZS5cbiAgICpcbiAgICogQHBhcmFtIHJlc29sdXRpb25zIE5hbWVzIHJlc29sdXRpb25zIHRvIGJlIGFkZGVkLiBTcGVjaWZ5IGEgdmVyc2lvbiBvclxuICAgKiByYW5nZSB3aXRoIHRoaXMgc3ludGF4OlxuICAgKiBgbW9kdWxlQF43YFxuICAgKi9cbiAgcHVibGljIGFkZFBhY2thZ2VSZXNvbHV0aW9ucyguLi5yZXNvbHV0aW9uczogc3RyaW5nW10pIHtcbiAgICBmb3IgKGNvbnN0IHJlc29sdXRpb24gb2YgcmVzb2x1dGlvbnMpIHtcbiAgICAgIHRoaXMucHJvamVjdC5kZXBzLmFkZERlcGVuZGVuY3kocmVzb2x1dGlvbiwgRGVwZW5kZW5jeVR5cGUuT1ZFUlJJREUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBjb21tYW5kIHRvIGV4ZWN1dGUgaW4gb3JkZXIgdG8gaW5zdGFsbCBhbGwgZGVwZW5kZW5jaWVzIChhbHdheXMgZnJvemVuKS5cbiAgICovXG4gIHB1YmxpYyBnZXQgaW5zdGFsbENvbW1hbmQoKSB7XG4gICAgcmV0dXJuIHRoaXMucmVuZGVySW5zdGFsbENvbW1hbmQodHJ1ZSk7XG4gIH1cblxuICAvKipcbiAgICogUmVuZGVycyBgcG5wbSBpbnN0YWxsYCBvciBgbnBtIGluc3RhbGxgIHdpdGggbG9ja2ZpbGUgdXBkYXRlIChub3QgZnJvemVuKVxuICAgKi9cbiAgcHVibGljIGdldCBpbnN0YWxsQW5kVXBkYXRlTG9ja2ZpbGVDb21tYW5kKCkge1xuICAgIHJldHVybiB0aGlzLnJlbmRlckluc3RhbGxDb21tYW5kKGZhbHNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBdHRlbXB0IHRvIHJlc29sdmUgdGhlIGN1cnJlbnRseSBpbnN0YWxsZWQgdmVyc2lvbiBmb3IgYSBnaXZlbiBkZXBlbmRlbmN5LlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiBUaGlzIG1ldGhvZCB3aWxsIGZpcnN0IGxvb2sgdGhyb3VnaCB0aGUgY3VycmVudCBwcm9qZWN0J3MgZGVwZW5kZW5jaWVzLlxuICAgKiBJZiBmb3VuZCBhbmQgc2VtYW50aWNhbGx5IHZhbGlkIChub3QgJyonKSwgdGhhdCB3aWxsIGJlIHVzZWQuXG4gICAqIE90aGVyd2lzZSwgaXQgd2lsbCBmYWxsIGJhY2sgdG8gbG9jYXRpbmcgYSBgcGFja2FnZS5qc29uYCBtYW5pZmVzdCBmb3IgdGhlIGRlcGVuZGVuY3lcbiAgICogdGhyb3VnaCBub2RlJ3MgaW50ZXJuYWwgcmVzb2x1dGlvbiByZWFkaW5nIHRoZSB2ZXJzaW9uIGZyb20gdGhlcmUuXG4gICAqXG4gICAqIEBwYXJhbSBkZXBlbmRlbmN5TmFtZSBEZXBlbmRlbmN5IHRvIHJlc29sdmUgZm9yLlxuICAgKi9cbiAgcHVibGljIHRyeVJlc29sdmVEZXBlbmRlbmN5VmVyc2lvbihcbiAgICBkZXBlbmRlbmN5TmFtZTogc3RyaW5nLFxuICApOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBmcm9tRGVwcyA9IHRoaXMucHJvamVjdC5kZXBzLnRyeUdldERlcGVuZGVuY3koZGVwZW5kZW5jeU5hbWUpO1xuICAgICAgY29uc3QgdmVyc2lvbiA9IHNlbXZlci5jb2VyY2UoZnJvbURlcHM/LnZlcnNpb24sIHsgbG9vc2U6IHRydWUgfSk7XG4gICAgICBpZiAodmVyc2lvbikge1xuICAgICAgICByZXR1cm4gdmVyc2lvbi5mb3JtYXQoKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIHt9XG4gICAgcmV0dXJuIHRyeVJlc29sdmVEZXBlbmRlbmN5VmVyc2lvbihkZXBlbmRlbmN5TmFtZSwge1xuICAgICAgcGF0aHM6IFt0aGlzLnByb2plY3Qub3V0ZGlyXSxcbiAgICB9KTtcbiAgfVxuXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICBwdWJsaWMgc3ludGhlc2l6ZSgpIHtcbiAgICB0aGlzLl9yZW5kZXJlZERlcHMgPSB0aGlzLnJlbmRlckRlcGVuZGVuY2llcygpO1xuICAgIHN1cGVyLnN5bnRoZXNpemUoKTtcbiAgfVxuXG4gIHB1YmxpYyBwb3N0U3ludGhlc2l6ZSgpIHtcbiAgICBzdXBlci5wb3N0U3ludGhlc2l6ZSgpO1xuXG4gICAgLy8gUGhhc2UgMTogaW5zdGFsbCBpZiBwYWNrYWdlLmpzb24gY2hhbmdlZCBvciBub2RlX21vZHVsZXMgaXMgbWlzc2luZ1xuICAgIGNvbnN0IGluaXRpYWxUcmlnZ2VyID0gdGhpcy5kZXRlcm1pbmVJbml0aWFsSW5zdGFsbFRyaWdnZXIoKTtcbiAgICBpZiAoaW5pdGlhbFRyaWdnZXIpIHtcbiAgICAgIHRoaXMubG9nSW5zdGFsbFRyaWdnZXIoaW5pdGlhbFRyaWdnZXIpO1xuICAgICAgdGhpcy5pbnN0YWxsRGVwZW5kZW5jaWVzKGluaXRpYWxUcmlnZ2VyKTtcbiAgICB9XG5cbiAgICAvLyBQaGFzZSAyOiByZXNvbHZlIFwiKlwiIGRlcHMgYW5kIGluc3RhbGwgYWdhaW4gaWYgdmVyc2lvbnMgY2hhbmdlZFxuICAgIGNvbnN0IHJlc29sdXRpb25zID0gdGhpcy5yZXNvbHZlRGVwc0FuZFdyaXRlUGFja2FnZUpzb24oKTtcbiAgICBpZiAocmVzb2x1dGlvbnM/Lmxlbmd0aCkge1xuICAgICAgY29uc3QgdHJpZ2dlcjogSW5zdGFsbFRyaWdnZXIgPSB7XG4gICAgICAgIHJlYXNvbjogSW5zdGFsbFJlYXNvbi5ERVBTX1JFU09MVkVELFxuICAgICAgICByZXNvbHV0aW9ucyxcbiAgICAgIH07XG4gICAgICB0aGlzLmxvZ0luc3RhbGxUcmlnZ2VyKHRyaWdnZXIpO1xuICAgICAgdGhpcy5pbnN0YWxsRGVwZW5kZW5jaWVzKHRyaWdnZXIpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3Mgd2hldGhlciBkZXBlbmRlbmNpZXMgbmVlZCB0byBiZSBpbnN0YWxsZWQgYmVmb3JlIGRlcGVuZGVuY3lcbiAgICogcmVzb2x1dGlvbi5cbiAgICpcbiAgICogQHJldHVybnMgYSBzdHJ1Y3R1cmVkIHRyaWdnZXIgZGVzY3JpYmluZyB0aGUgcmVhc29uLCBvciBgdW5kZWZpbmVkYCBpZlxuICAgKiBubyBpbnN0YWxsIGlzIG5lZWRlZC5cbiAgICovXG4gIHByaXZhdGUgZGV0ZXJtaW5lSW5pdGlhbEluc3RhbGxUcmlnZ2VyKCk6IEluc3RhbGxUcmlnZ2VyIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBoYXNOb2RlTW9kdWxlcyA9IGV4aXN0c1N5bmMoXG4gICAgICBqb2luKHRoaXMucHJvamVjdC5vdXRkaXIsIFwibm9kZV9tb2R1bGVzXCIpLFxuICAgICk7XG5cbiAgICBpZiAodGhpcy5maWxlLmNoYW5nZWQpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHJlYXNvbjogSW5zdGFsbFJlYXNvbi5QQUNLQUdFX0pTT05fQ0hBTkdFRCxcbiAgICAgICAgZGlmZjogdGhpcy5maWxlLmRpZmYodHJ1ZSksXG4gICAgICB9O1xuICAgIH1cblxuICAgIGlmICghaGFzTm9kZU1vZHVsZXMpIHtcbiAgICAgIHJldHVybiB7IHJlYXNvbjogSW5zdGFsbFJlYXNvbi5OT19OT0RFX01PRFVMRVMgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIExvZ3MgdXNlci1mYWNpbmcgaW5mb3JtYXRpb24gYWJvdXQgd2h5IGRlcGVuZGVuY2llcyBhcmUgYmVpbmcgaW5zdGFsbGVkLlxuICAgKiBFbWl0cyBhbiBpbmZvLWxldmVsIHN1bW1hcnkgYW5kIGRlYnVnLWxldmVsIGRldGFpbHMgKHJlYXNvbiwgZGlmZiwgcmVzb2x1dGlvbnMpLlxuICAgKi9cbiAgcHJpdmF0ZSBsb2dJbnN0YWxsVHJpZ2dlcih0cmlnZ2VyOiBJbnN0YWxsVHJpZ2dlcikge1xuICAgIHRoaXMucHJvamVjdC5sb2dnZXIuaW5mbyhcbiAgICAgIFwiSW5zdGFsbGluZyBkZXBlbmRlbmNpZXMuLi4gKHVzZSAtLWRlYnVnIGZvciBkZXRhaWxzKVwiLFxuICAgICk7XG4gICAgdGhpcy5wcm9qZWN0LmxvZ2dlci5kZWJ1ZyhgSW5zdGFsbCByZWFzb246ICR7dHJpZ2dlci5yZWFzb259YCk7XG5cbiAgICBpZiAodHJpZ2dlci5kaWZmKSB7XG4gICAgICB0aGlzLnByb2plY3QubG9nZ2VyLmRlYnVnKFxuICAgICAgICBgcGFja2FnZS5qc29uIGRpZmY6XFxuJHt0cmlnZ2VyLmRpZmYuam9pbihcIlxcblwiKX1gLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAodHJpZ2dlci5yZXNvbHV0aW9ucz8ubGVuZ3RoKSB7XG4gICAgICB0aGlzLnByb2plY3QubG9nZ2VyLmluZm8oXG4gICAgICAgIGBSZXNvbHZlZCBkZXBlbmRlbmN5IHZlcnNpb25zOlxcbiR7dHJpZ2dlci5yZXNvbHV0aW9ucy5tYXAoKHIpID0+IGAgICR7cn1gKS5qb2luKFwiXFxuXCIpfWAsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgY29tbWFuZCBwcmVmaXggdG8gdXNlIHdoZW4gZXhlY3V0aW5nIGJpbmFyeSBjb21tYW5kcyBmb3IgdGhpcyBwYWNrYWdlXG4gICAqIG1hbmFnZXIgKGUuZy4gYG5weGAsIGBwbnBtIGV4ZWNgLCBgeWFybmAsIGBidW54YCkuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGV4ZWNDb21tYW5kKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGV4ZWNDb21tYW5kKHRoaXMucGFja2FnZU1hbmFnZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYHRydWVgIGlmIHdlIGFyZSBydW5uaW5nIHdpdGhpbiBhIENJIGJ1aWxkLlxuICAgKi9cbiAgcHJpdmF0ZSBnZXQgaXNBdXRvbWF0ZWRCdWlsZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gaXNUcnV0aHkocHJvY2Vzcy5lbnYuQ0kpO1xuICB9XG5cbiAgcHJpdmF0ZSBkZXRlcm1pbmVWZXJzaW9uKGN1cnJWZXJzaW9uPzogc3RyaW5nKSB7XG4gICAgaWYgKCF0aGlzLmlzUmVsZWFzZUJ1aWxkKSB7XG4gICAgICByZXR1cm4gXCIwLjAuMFwiO1xuICAgIH1cblxuICAgIHJldHVybiBjdXJyVmVyc2lvbiA/PyBcIjAuMC4wXCI7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhpcyBpcyBhIENJIHJlbGVhc2UgYnVpbGQuXG4gICAqL1xuICBwcml2YXRlIGdldCBpc1JlbGVhc2VCdWlsZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gaXNUcnV0aHkocHJvY2Vzcy5lbnYuUkVMRUFTRSk7XG4gIH1cblxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgcHJpdmF0ZSBwYXJzZU5wbU9wdGlvbnMob3B0aW9uczogTm9kZVBhY2thZ2VPcHRpb25zKSB7XG4gICAgY29uc3QgbnBtUmVnaXN0cnlVcmwgPSBvcHRpb25zLm5wbVJlZ2lzdHJ5VXJsO1xuXG4gICAgY29uc3QgbnBtciA9IG5ldyBVUkwobnBtUmVnaXN0cnlVcmwgPz8gREVGQVVMVF9OUE1fUkVHSVNUUllfVVJMKTtcbiAgICBpZiAoIW5wbXIgfHwgIW5wbXIuaG9zdG5hbWUgfHwgIW5wbXIuaHJlZikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgdW5hYmxlIHRvIGRldGVybWluZSBucG0gcmVnaXN0cnkgaG9zdCBmcm9tIHVybCAke25wbVJlZ2lzdHJ5VXJsfS4gSXMgdGhpcyByZWFsbHkgYSBVUkw/YCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgbnBtQWNjZXNzID0gb3B0aW9ucy5ucG1BY2Nlc3MgPz8gZGVmYXVsdE5wbUFjY2Vzcyh0aGlzLnBhY2thZ2VOYW1lKTtcbiAgICBpZiAoIWlzU2NvcGVkKHRoaXMucGFja2FnZU5hbWUpICYmIG5wbUFjY2VzcyA9PT0gTnBtQWNjZXNzLlJFU1RSSUNURUQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFwibnBtQWNjZXNzXCIgY2Fubm90IGJlIFJFU1RSSUNURUQgZm9yIG5vbi1zY29wZWQgbnBtIHBhY2thZ2UgXCIke3RoaXMucGFja2FnZU5hbWV9XCJgLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBucG1Qcm92ZW5hbmNlID1cbiAgICAgIG9wdGlvbnMubnBtUHJvdmVuYW5jZSA/PyBucG1BY2Nlc3MgPT09IE5wbUFjY2Vzcy5QVUJMSUM7XG4gICAgaWYgKG5wbVByb3ZlbmFuY2UgJiYgbnBtQWNjZXNzICE9PSBOcG1BY2Nlc3MuUFVCTElDKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBcIm5wbVByb3ZlbmFuY2VcIiBjYW4gb25seSBiZSBlbmFibGVkIGZvciBwdWJsaWMgcGFja2FnZXNgLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBpc0F3c0NvZGVBcnRpZmFjdCA9IGlzQXdzQ29kZUFydGlmYWN0UmVnaXN0cnkobnBtUmVnaXN0cnlVcmwpO1xuICAgIGNvbnN0IGhhc1Njb3BlZFBhY2thZ2UgPVxuICAgICAgb3B0aW9ucy5zY29wZWRQYWNrYWdlc09wdGlvbnMgJiZcbiAgICAgIG9wdGlvbnMuc2NvcGVkUGFja2FnZXNPcHRpb25zLmxlbmd0aCAhPT0gMDtcblxuICAgIGlmIChpc0F3c0NvZGVBcnRpZmFjdCkge1xuICAgICAgaWYgKG9wdGlvbnMubnBtVG9rZW5TZWNyZXQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICdcIm5wbVRva2VuU2VjcmV0XCIgbXVzdCBub3QgYmUgc3BlY2lmaWVkIHdoZW4gcHVibGlzaGluZyBBV1MgQ29kZUFydGlmYWN0LicsXG4gICAgICAgICk7XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICBvcHRpb25zLmNvZGVBcnRpZmFjdE9wdGlvbnM/LmF1dGhQcm92aWRlciA9PT1cbiAgICAgICAgQ29kZUFydGlmYWN0QXV0aFByb3ZpZGVyLkdJVEhVQl9PSURDXG4gICAgICApIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIG9wdGlvbnMuY29kZUFydGlmYWN0T3B0aW9ucy5hY2Nlc3NLZXlJZFNlY3JldCB8fFxuICAgICAgICAgIG9wdGlvbnMuY29kZUFydGlmYWN0T3B0aW9ucy5zZWNyZXRBY2Nlc3NLZXlTZWNyZXRcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgXCJhY2Nlc3MgYW5kIHNlY3JldCBrZXkgcGFpciBzaG91bGQgbm90IGJlIHByb3ZpZGVkIHdoZW4gdXNpbmcgR0lUSFVCX09JREMgYXV0aCBwcm92aWRlciBmb3IgQVdTIENvZGVBcnRpZmFjdFwiLFxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSBpZiAoIW9wdGlvbnMuY29kZUFydGlmYWN0T3B0aW9ucy5yb2xlVG9Bc3N1bWUpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAnXCJyb2xlVG9Bc3N1bWVcIiBwcm9wZXJ0eSBpcyByZXF1aXJlZCB3aGVuIHVzaW5nIEdJVEhVQl9PSURDIGZvciBBV1MgQ29kZUFydGlmYWN0IG9wdGlvbnMnLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKFxuICAgICAgICAob3B0aW9ucy5jb2RlQXJ0aWZhY3RPcHRpb25zPy5hY2Nlc3NLZXlJZFNlY3JldCB8fFxuICAgICAgICAgIG9wdGlvbnMuY29kZUFydGlmYWN0T3B0aW9ucz8uc2VjcmV0QWNjZXNzS2V5U2VjcmV0IHx8XG4gICAgICAgICAgb3B0aW9ucy5jb2RlQXJ0aWZhY3RPcHRpb25zPy5yb2xlVG9Bc3N1bWUpICYmXG4gICAgICAgICFoYXNTY29wZWRQYWNrYWdlXG4gICAgICApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIFwiY29kZUFydGlmYWN0T3B0aW9ucyBtdXN0IG9ubHkgYmUgc3BlY2lmaWVkIHdoZW4gcHVibGlzaGluZyBBV1MgQ29kZUFydGlmYWN0IG9yIHVzZWQgaW4gc2NvcGVkIHBhY2thZ2VzLlwiLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGFwcGx5IGRlZmF1bHRzIGZvciBBV1MgQ29kZUFydGlmYWN0XG4gICAgbGV0IGNvZGVBcnRpZmFjdE9wdGlvbnM6IENvZGVBcnRpZmFjdE9wdGlvbnMgfCB1bmRlZmluZWQ7XG4gICAgaWYgKGlzQXdzQ29kZUFydGlmYWN0IHx8IGhhc1Njb3BlZFBhY2thZ2UpIHtcbiAgICAgIGNvbnN0IGF1dGhQcm92aWRlciA9XG4gICAgICAgIG9wdGlvbnMuY29kZUFydGlmYWN0T3B0aW9ucz8uYXV0aFByb3ZpZGVyID8/XG4gICAgICAgIENvZGVBcnRpZmFjdEF1dGhQcm92aWRlci5BQ0NFU1NfQU5EX1NFQ1JFVF9LRVlfUEFJUjtcbiAgICAgIGNvbnN0IGlzQWNjZXNzU2VjcmV0S2V5UGFpckF1dGggPVxuICAgICAgICBhdXRoUHJvdmlkZXIgPT09IENvZGVBcnRpZmFjdEF1dGhQcm92aWRlci5BQ0NFU1NfQU5EX1NFQ1JFVF9LRVlfUEFJUjtcbiAgICAgIGNvZGVBcnRpZmFjdE9wdGlvbnMgPSB7XG4gICAgICAgIGF1dGhQcm92aWRlcixcbiAgICAgICAgYWNjZXNzS2V5SWRTZWNyZXQ6XG4gICAgICAgICAgb3B0aW9ucy5jb2RlQXJ0aWZhY3RPcHRpb25zPy5hY2Nlc3NLZXlJZFNlY3JldCA/P1xuICAgICAgICAgIChpc0FjY2Vzc1NlY3JldEtleVBhaXJBdXRoID8gXCJBV1NfQUNDRVNTX0tFWV9JRFwiIDogdW5kZWZpbmVkKSxcbiAgICAgICAgc2VjcmV0QWNjZXNzS2V5U2VjcmV0OlxuICAgICAgICAgIG9wdGlvbnMuY29kZUFydGlmYWN0T3B0aW9ucz8uc2VjcmV0QWNjZXNzS2V5U2VjcmV0ID8/XG4gICAgICAgICAgKGlzQWNjZXNzU2VjcmV0S2V5UGFpckF1dGggPyBcIkFXU19TRUNSRVRfQUNDRVNTX0tFWVwiIDogdW5kZWZpbmVkKSxcbiAgICAgICAgcm9sZVRvQXNzdW1lOiBvcHRpb25zLmNvZGVBcnRpZmFjdE9wdGlvbnM/LnJvbGVUb0Fzc3VtZSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIG5wbUFjY2VzcyxcbiAgICAgIG5wbVJlZ2lzdHJ5OiBucG1yLmhvc3RuYW1lICsgdGhpcy5yZW5kZXJOcG1SZWdpc3RyeVBhdGgobnBtci5wYXRobmFtZSEpLFxuICAgICAgbnBtUmVnaXN0cnlVcmw6IG5wbXIuaHJlZixcbiAgICAgIG5wbVRva2VuU2VjcmV0OiBvcHRpb25zLm5wbVRydXN0ZWRQdWJsaXNoaW5nXG4gICAgICAgID8gdW5kZWZpbmVkXG4gICAgICAgIDogZGVmYXVsdE5wbVRva2VuKG9wdGlvbnMubnBtVG9rZW5TZWNyZXQsIG5wbXIuaG9zdG5hbWUpLFxuICAgICAgY29kZUFydGlmYWN0T3B0aW9ucyxcbiAgICAgIHNjb3BlZFBhY2thZ2VzT3B0aW9uczogdGhpcy5wYXJzZVNjb3BlZFBhY2thZ2VzT3B0aW9ucyhcbiAgICAgICAgb3B0aW9ucy5zY29wZWRQYWNrYWdlc09wdGlvbnMsXG4gICAgICApLFxuICAgICAgbnBtUHJvdmVuYW5jZSxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBwYXJzZVNjb3BlZFBhY2thZ2VzT3B0aW9ucyhcbiAgICBzY29wZWRQYWNrYWdlc09wdGlvbnM/OiBTY29wZWRQYWNrYWdlc09wdGlvbnNbXSxcbiAgKTogU2NvcGVkUGFja2FnZXNPcHRpb25zW10gfCB1bmRlZmluZWQge1xuICAgIGlmICghc2NvcGVkUGFja2FnZXNPcHRpb25zKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIHJldHVybiBzY29wZWRQYWNrYWdlc09wdGlvbnMubWFwKChvcHRpb24pOiBTY29wZWRQYWNrYWdlc09wdGlvbnMgPT4ge1xuICAgICAgaWYgKCFpc1Njb3BlZChvcHRpb24uc2NvcGUpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgU2NvcGUgbXVzdCBzdGFydCB3aXRoIFwiQFwiIGluIG9wdGlvbnMsIGZvdW5kICR7b3B0aW9uLnNjb3BlfWAsXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGlmICghaXNBd3NDb2RlQXJ0aWZhY3RSZWdpc3RyeShvcHRpb24ucmVnaXN0cnlVcmwpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgT25seSBBV1MgQ29kZSBhcnRpZmFjdCBzY29wZWQgcmVnaXN0cnkgaXMgc3VwcG9ydGVkIGZvciBub3csIGZvdW5kICR7b3B0aW9uLnJlZ2lzdHJ5VXJsfWAsXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlc3VsdDogU2NvcGVkUGFja2FnZXNPcHRpb25zID0ge1xuICAgICAgICByZWdpc3RyeVVybDogb3B0aW9uLnJlZ2lzdHJ5VXJsLFxuICAgICAgICBzY29wZTogb3B0aW9uLnNjb3BlLFxuICAgICAgfTtcblxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYWRkQ29kZUFydGlmYWN0TG9naW5TY3JpcHQoKSB7XG4gICAgaWYgKFxuICAgICAgIXRoaXMuc2NvcGVkUGFja2FnZXNPcHRpb25zIHx8XG4gICAgICB0aGlzLnNjb3BlZFBhY2thZ2VzT3B0aW9ucy5sZW5ndGggPT09IDBcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnByb2plY3QuYWRkVGFzayhcImNhOmxvZ2luXCIsIHtcbiAgICAgIHN0ZXBzOiBbXG4gICAgICAgIHsgZXhlYzogXCJ3aGljaCBhd3NcIiB9LCAvLyBjaGVjayB0aGF0IEFXUyBDTEkgaXMgaW5zdGFsbGVkXG4gICAgICAgIC4uLnRoaXMuc2NvcGVkUGFja2FnZXNPcHRpb25zLm1hcCgoc2NvcGVkUGFja2FnZXNPcHRpb24pID0+IHtcbiAgICAgICAgICBjb25zdCB7IHJlZ2lzdHJ5VXJsLCBzY29wZSB9ID0gc2NvcGVkUGFja2FnZXNPcHRpb247XG4gICAgICAgICAgY29uc3QgeyBkb21haW4sIHJlZ2lvbiwgYWNjb3VudElkLCByZWdpc3RyeSB9ID1cbiAgICAgICAgICAgIGV4dHJhY3RDb2RlQXJ0aWZhY3REZXRhaWxzKHJlZ2lzdHJ5VXJsKTtcbiAgICAgICAgICAvLyByZWZlcmVuY2U6IGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9jb2RlYXJ0aWZhY3QvbGF0ZXN0L3VnL25wbS1hdXRoLmh0bWxcbiAgICAgICAgICBjb25zdCBjb21tYW5kcyA9IFtcbiAgICAgICAgICAgIGBucG0gY29uZmlnIHNldCAke3Njb3BlfTpyZWdpc3RyeSAke3JlZ2lzdHJ5VXJsfWAsXG4gICAgICAgICAgICBgbnBtIGNvbmZpZyBzZXQgLy8ke3JlZ2lzdHJ5fTpfYXV0aFRva2VuPSRDT0RFQVJUSUZBQ1RfQVVUSF9UT0tFTmAsXG4gICAgICAgICAgXTtcbiAgICAgICAgICBpZiAoIXRoaXMubWluTm9kZVZlcnNpb24gfHwgc2VtdmVyLm1ham9yKHRoaXMubWluTm9kZVZlcnNpb24pIDw9IDE2KSB7XG4gICAgICAgICAgICBjb21tYW5kcy5wdXNoKGBucG0gY29uZmlnIHNldCAvLyR7cmVnaXN0cnl9OmFsd2F5cy1hdXRoPXRydWVgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGVudjoge1xuICAgICAgICAgICAgICBDT0RFQVJUSUZBQ1RfQVVUSF9UT0tFTjogYCQoYXdzIGNvZGVhcnRpZmFjdCBnZXQtYXV0aG9yaXphdGlvbi10b2tlbiAtLWRvbWFpbiAke2RvbWFpbn0gLS1yZWdpb24gJHtyZWdpb259IC0tZG9tYWluLW93bmVyICR7YWNjb3VudElkfSAtLXF1ZXJ5IGF1dGhvcml6YXRpb25Ub2tlbiAtLW91dHB1dCB0ZXh0KWAsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZXhlYzogY29tbWFuZHMuam9pbihcIjsgXCIpLFxuICAgICAgICAgIH07XG4gICAgICAgIH0pLFxuICAgICAgXSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYWRkTm9kZUVuZ2luZSgpIHtcbiAgICBpZiAoIXRoaXMubWluTm9kZVZlcnNpb24gJiYgIXRoaXMubWF4Tm9kZVZlcnNpb24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgbm9kZVZlcnNpb24gPSBcIlwiO1xuICAgIGlmICh0aGlzLm1pbk5vZGVWZXJzaW9uKSB7XG4gICAgICBub2RlVmVyc2lvbiArPSBgPj0gJHt0aGlzLm1pbk5vZGVWZXJzaW9ufWA7XG4gICAgfVxuICAgIGlmICh0aGlzLm1heE5vZGVWZXJzaW9uKSB7XG4gICAgICBub2RlVmVyc2lvbiArPSBgIDw9ICR7dGhpcy5tYXhOb2RlVmVyc2lvbn1gO1xuICAgIH1cbiAgICB0aGlzLmFkZEVuZ2luZShcIm5vZGVcIiwgbm9kZVZlcnNpb24pO1xuICB9XG5cbiAgcHJpdmF0ZSByZW5kZXJOcG1SZWdpc3RyeVBhdGgocGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkKTogc3RyaW5nIHtcbiAgICBpZiAoIXBhdGggfHwgcGF0aCA9PSBcIi9cIikge1xuICAgICAgcmV0dXJuIFwiXCI7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBwYXRoO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcmVuZGVySW5zdGFsbENvbW1hbmQoZnJvemVuOiBib29sZWFuKSB7XG4gICAgc3dpdGNoICh0aGlzLnBhY2thZ2VNYW5hZ2VyKSB7XG4gICAgICBjYXNlIE5vZGVQYWNrYWdlTWFuYWdlci5ZQVJOOlxuICAgICAgY2FzZSBOb2RlUGFja2FnZU1hbmFnZXIuWUFSTl9DTEFTU0lDOlxuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgIFwieWFybiBpbnN0YWxsXCIsXG4gICAgICAgICAgXCItLWNoZWNrLWZpbGVzXCIsIC8vIGVuc3VyZSBhbGwgbW9kdWxlcyBleGlzdCAoZXNwZWNpYWxseSBwcm9qZW4gd2hpY2ggd2FzIGp1c3QgcmVtb3ZlZCkuXG4gICAgICAgICAgLi4uKGZyb3plbiA/IFtcIi0tZnJvemVuLWxvY2tmaWxlXCJdIDogW10pLFxuICAgICAgICBdLmpvaW4oXCIgXCIpO1xuICAgICAgY2FzZSBOb2RlUGFja2FnZU1hbmFnZXIuWUFSTjI6XG4gICAgICBjYXNlIE5vZGVQYWNrYWdlTWFuYWdlci5ZQVJOX0JFUlJZOlxuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgIFwieWFybiBpbnN0YWxsXCIsXG4gICAgICAgICAgLi4uKGZyb3plbiA/IFtcIi0taW1tdXRhYmxlXCJdIDogW1wiLS1uby1pbW11dGFibGVcIl0pLFxuICAgICAgICBdLmpvaW4oXCIgXCIpO1xuICAgICAgY2FzZSBOb2RlUGFja2FnZU1hbmFnZXIuTlBNOlxuICAgICAgICByZXR1cm4gZnJvemVuID8gXCJucG0gY2lcIiA6IFwibnBtIGluc3RhbGxcIjtcbiAgICAgIGNhc2UgTm9kZVBhY2thZ2VNYW5hZ2VyLlBOUE06XG4gICAgICAgIHJldHVybiBmcm96ZW5cbiAgICAgICAgICA/IFwicG5wbSBpIC0tZnJvemVuLWxvY2tmaWxlXCJcbiAgICAgICAgICA6IFwicG5wbSBpIC0tbm8tZnJvemVuLWxvY2tmaWxlXCI7XG4gICAgICBjYXNlIE5vZGVQYWNrYWdlTWFuYWdlci5CVU46XG4gICAgICAgIHJldHVybiBbXCJidW4gaW5zdGFsbFwiLCAuLi4oZnJvemVuID8gW1wiLS1mcm96ZW4tbG9ja2ZpbGVcIl0gOiBbXSldLmpvaW4oXG4gICAgICAgICAgXCIgXCIsXG4gICAgICAgICk7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgdW5leHBlY3RlZCBwYWNrYWdlIG1hbmFnZXIgJHt0aGlzLnBhY2thZ2VNYW5hZ2VyfWApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcHJvY2Vzc0RlcHMob3B0aW9uczogTm9kZVBhY2thZ2VPcHRpb25zKSB7XG4gICAgdGhpcy5hZGREZXBzKC4uLihvcHRpb25zLmRlcHMgPz8gW10pKTtcbiAgICB0aGlzLmFkZERldkRlcHMoLi4uKG9wdGlvbnMuZGV2RGVwcyA/PyBbXSkpO1xuICAgIHRoaXMuYWRkUGVlckRlcHMoLi4uKG9wdGlvbnMucGVlckRlcHMgPz8gW10pKTtcbiAgICB0aGlzLmFkZEJ1bmRsZWREZXBzKC4uLihvcHRpb25zLmJ1bmRsZWREZXBzID8/IFtdKSk7XG4gIH1cblxuICBwcml2YXRlIHJlbmRlckRlcGVuZGVuY2llcygpOiBOcG1EZXBlbmRlbmNpZXMge1xuICAgIGNvbnN0IGRldkRlcGVuZGVuY2llczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICAgIGNvbnN0IHBlZXJEZXBlbmRlbmNpZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgICBjb25zdCBkZXBlbmRlbmNpZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgICBjb25zdCBidW5kbGVkRGVwZW5kZW5jaWVzID0gbmV3IEFycmF5PHN0cmluZz4oKTtcblxuICAgIC8vIHN5bnRoZXRpYyBkZXBlbmRlbmNpZXM6IGFkZCBhIHBpbm5lZCBidWlsZCBkZXBlbmRlbmN5IHRvIGVuc3VyZSB3ZSBhcmVcbiAgICAvLyB0ZXN0aW5nIGFnYWluc3QgdGhlIG1pbmltdW0gcmVxdWlyZW1lbnQgb2YgdGhlIHBlZXIuXG4gICAgaWYgKHRoaXMucGVlckRlcGVuZGVuY3lPcHRpb25zLnBpbm5lZERldkRlcGVuZGVuY3kpIHtcbiAgICAgIGZvciAoY29uc3QgZGVwIG9mIHRoaXMucHJvamVjdC5kZXBzLmFsbC5maWx0ZXIoXG4gICAgICAgIChkKSA9PiBkLnR5cGUgPT09IERlcGVuZGVuY3lUeXBlLlBFRVIsXG4gICAgICApKSB7XG4gICAgICAgIGxldCByZXEgPSBkZXAubmFtZTtcblxuICAgICAgICAvLyBTa2lwIGlmIHdlIGFscmVhZHkgaGF2ZSBhIHJ1bnRpbWUgZGVwZW5kZW5jeSBvbiB0aGlzIHBlZXIgYW5kIG5vIGJ1aWxkIGRlcGVuZGVuY3kgeWV0LlxuICAgICAgICAvLyBJZiB0aGVyZSBpcyBhIGJ1aWxkIGRlcCBhbHJlYWR5LCB3ZSBuZWVkIHRvIG92ZXJyaWRlIGl0cyB2ZXJzaW9uLlxuICAgICAgICBpZiAoXG4gICAgICAgICAgdGhpcy5wcm9qZWN0LmRlcHMudHJ5R2V0RGVwZW5kZW5jeShcbiAgICAgICAgICAgIGRlcC5uYW1lLFxuICAgICAgICAgICAgRGVwZW5kZW5jeVR5cGUuUlVOVElNRSxcbiAgICAgICAgICApICYmXG4gICAgICAgICAgIXRoaXMucHJvamVjdC5kZXBzLnRyeUdldERlcGVuZGVuY3koZGVwLm5hbWUsIERlcGVuZGVuY3lUeXBlLkJVSUxEKVxuICAgICAgICApIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChkZXAudmVyc2lvbikge1xuICAgICAgICAgIGNvbnN0IHZlciA9IG1pblZlcnNpb24oZGVwLnZlcnNpb24pO1xuICAgICAgICAgIGlmICghdmVyKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgIGB1bmFibGUgdG8gZGV0ZXJtaW5lIG1pbmltdW0gc2VtdmVyIGZvciBwZWVyIGRlcGVuZGVuY3kgJHtkZXAubmFtZX1AJHtkZXAudmVyc2lvbn1gLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXEgKz0gXCJAXCIgKyB2ZXI7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hZGREZXZEZXBzKHJlcSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBkZXAgb2YgdGhpcy5wcm9qZWN0LmRlcHMuYWxsKSB7XG4gICAgICBsZXQgdmVyc2lvbiA9IGRlcC52ZXJzaW9uID8/IFwiKlwiO1xuICAgICAgbGV0IG5hbWUgPSBkZXAubmFtZTtcblxuICAgICAgaWYgKG5hbWUuc3RhcnRzV2l0aChcImZpbGU6XCIpKSB7XG4gICAgICAgIGNvbnN0IGxvY2FsRGVwZW5kZW5jeVBhdGggPSBuYW1lLnN1YnN0cmluZyg1KTtcbiAgICAgICAgY29uc3QgZGVwUGFja2FnZUpzb24gPSByZXNvbHZlKFxuICAgICAgICAgIHRoaXMucHJvamVjdC5vdXRkaXIsXG4gICAgICAgICAgbG9jYWxEZXBlbmRlbmN5UGF0aCxcbiAgICAgICAgICBcInBhY2thZ2UuanNvblwiLFxuICAgICAgICApO1xuICAgICAgICBjb25zdCBwa2dGaWxlID0gcmVhZEZpbGVTeW5jKGRlcFBhY2thZ2VKc29uLCBcInV0ZjhcIik7XG4gICAgICAgIGNvbnN0IHBrZyA9IEpTT04ucGFyc2UocGtnRmlsZSk7XG4gICAgICAgIHZlcnNpb24gPSBsb2NhbERlcGVuZGVuY3lQYXRoO1xuICAgICAgICBuYW1lID0gcGtnLm5hbWU7XG4gICAgICB9XG5cbiAgICAgIHN3aXRjaCAoZGVwLnR5cGUpIHtcbiAgICAgICAgY2FzZSBEZXBlbmRlbmN5VHlwZS5CVU5ETEVEOlxuICAgICAgICAgIGJ1bmRsZWREZXBlbmRlbmNpZXMucHVzaChuYW1lKTtcblxuICAgICAgICAgIGNvbnN0IGRlcERlY2xzID0gdGhpcy5wcm9qZWN0LmRlcHMuYWxsLmZpbHRlcigoZCkgPT4gZC5uYW1lID09PSBuYW1lKTtcbiAgICAgICAgICBpZiAoZGVwRGVjbHMuc29tZSgoZCkgPT4gZC50eXBlID09PSBEZXBlbmRlbmN5VHlwZS5QRUVSKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICBgdW5hYmxlIHRvIGJ1bmRsZSBcIiR7bmFtZX1cIjogaXQgY2Fubm90IGFwcGVhciBhcyBhIHBlZXIgZGVwZW5kZW5jeSAoYnVuZGxlZCB3b3VsZCBhbHdheXMgdGFrZSBwcmVjZWRlbmNlIG92ZXIgcGVlcilgLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBJJ3ZlIG9ic2VydmVkIHRoYXQgYXQgbGVhc3QgbnBtIDEwLjguMiB3aWxsIHNpbGVudGx5IGZhaWwgdG8gYnVuZGxlXG4gICAgICAgICAgLy8gYSBkZXBlbmRlbmN5IGlmIGl0IGlzIFthbHNvXSBwYXJ0IG9mIGBkZXZEZXBlbmRlbmNpZXNgLiBJdCBtdXN0IGV4aXN0IGluXG4gICAgICAgICAgLy8gYGRlcGVuZGVuY2llc2AgYW5kIGBkZXBlbmRlbmNpZXNgIG9ubHkuXG4gICAgICAgICAgaWYgKGRlcERlY2xzLnNvbWUoKGQpID0+IGQudHlwZSA9PT0gRGVwZW5kZW5jeVR5cGUuQlVJTEQpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgIGB1bmFibGUgdG8gYnVuZGxlIFwiJHtuYW1lfVwiOiBpdCBjYW5ub3QgYXBwZWFyIGFzIGEgZGV2RGVwZW5kZW5jeSAob25seSBwcm9kIGRlcGVuZGVuY2llcyBhcmUgYnVuZGxlZCwgYW5kIGFueSBkZXBlbmRlbmN5IGFwcGVhcmluZyBhcyBhIGRldkRlcGVuZGVuY3kgaXMgY29uc2lkZXJlZCB0byBiZSBub3QgYSBwcm9kIGRlcGVuZGVuY3kpYCxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gYWxzbyBhZGQgYXMgYSBydW50aW1lIGRlcGVuZGVuY3lcbiAgICAgICAgICBkZXBlbmRlbmNpZXNbbmFtZV0gPSB2ZXJzaW9uO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgRGVwZW5kZW5jeVR5cGUuUEVFUjpcbiAgICAgICAgICBwZWVyRGVwZW5kZW5jaWVzW25hbWVdID0gdmVyc2lvbjtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIERlcGVuZGVuY3lUeXBlLlJVTlRJTUU6XG4gICAgICAgICAgZGVwZW5kZW5jaWVzW25hbWVdID0gdmVyc2lvbjtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIERlcGVuZGVuY3lUeXBlLlRFU1Q6XG4gICAgICAgIGNhc2UgRGVwZW5kZW5jeVR5cGUuREVWRU5WOlxuICAgICAgICBjYXNlIERlcGVuZGVuY3lUeXBlLkJVSUxEOlxuICAgICAgICAgIGRldkRlcGVuZGVuY2llc1tuYW1lXSA9IHZlcnNpb247XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gcmV0dXJucyBhIGxhenkgdmFsdWUgdG8gbm9ybWFsaXplIGR1cmluZyBzeW50aGVzaXNcbiAgICBjb25zdCBub3JtYWxpemUgPSAob2JqOiBhbnkpID0+ICgpID0+IHNvcnRlZChvYmopO1xuXG4gICAgLy8gdXBkYXRlIHRoZSBtYW5pZmVzdCB3ZSBhcmUgYWJvdXQgdG8gc2F2ZSBpbnRvIGBwYWNrYWdlLmpzb25gXG4gICAgdGhpcy5tYW5pZmVzdC5kZXZEZXBlbmRlbmNpZXMgPSBub3JtYWxpemUoZGV2RGVwZW5kZW5jaWVzKTtcbiAgICB0aGlzLm1hbmlmZXN0LnBlZXJEZXBlbmRlbmNpZXMgPSBub3JtYWxpemUocGVlckRlcGVuZGVuY2llcyk7XG4gICAgdGhpcy5tYW5pZmVzdC5kZXBlbmRlbmNpZXMgPSBub3JtYWxpemUoZGVwZW5kZW5jaWVzKTtcbiAgICB0aGlzLm1hbmlmZXN0LmJ1bmRsZWREZXBlbmRlbmNpZXMgPSBzb3J0ZWQoYnVuZGxlZERlcGVuZGVuY2llcyk7XG5cbiAgICAvLyBub3RoaW5nIGZ1cnRoZXIgdG8gZG8gaWYgcGFja2FnZS5qc29uIGZpbGUgZG9lcyBub3QgZXhpc3RcbiAgICBpZiAoIXRoaXMuX3ByZXYpIHtcbiAgICAgIHJldHVybiB7IGRldkRlcGVuZGVuY2llcywgcGVlckRlcGVuZGVuY2llcywgZGVwZW5kZW5jaWVzIH07XG4gICAgfVxuXG4gICAgY29uc3QgcmVhZERlcHMgPSAoXG4gICAgICB1c2VyOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LFxuICAgICAgY3VycmVudDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9LFxuICAgICkgPT4ge1xuICAgICAgZm9yIChjb25zdCBbbmFtZSwgdXNlclZlcnNpb25dIG9mIE9iamVjdC5lbnRyaWVzKHVzZXIpKSB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRWZXJzaW9uID0gY3VycmVudFtuYW1lXTtcblxuICAgICAgICAvLyByZXNwZWN0IHVzZXIgdmVyc2lvbiBpZiBpdCdzIG5vdCAnKicgb3IgaWYgY3VycmVudCB2ZXJzaW9uIGlzIHVuZGVmaW5lZFxuICAgICAgICBpZiAodXNlclZlcnNpb24gIT09IFwiKlwiIHx8ICFjdXJyZW50VmVyc2lvbiB8fCBjdXJyZW50VmVyc2lvbiA9PT0gXCIqXCIpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIG1lbW9pemUgY3VycmVudCB2ZXJzaW9uIGluIG1lbW9yeSBzbyBpdCBpcyBwcmVzZXJ2ZWQgd2hlbiBzYXZpbmdcbiAgICAgICAgdXNlcltuYW1lXSA9IGN1cnJlbnRWZXJzaW9uO1xuICAgICAgfVxuXG4gICAgICAvLyByZXBvcnQgcmVtb3ZhbHNcbiAgICAgIGZvciAoY29uc3QgbmFtZSBvZiBPYmplY3Qua2V5cyhjdXJyZW50ID8/IHt9KSkge1xuICAgICAgICBpZiAoIXVzZXJbbmFtZV0pIHtcbiAgICAgICAgICB0aGlzLnByb2plY3QubG9nZ2VyLnZlcmJvc2UoYCR7bmFtZX06IHJlbW92ZWRgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG5cbiAgICByZWFkRGVwcyhkZXZEZXBlbmRlbmNpZXMsIHRoaXMuX3ByZXYuZGV2RGVwZW5kZW5jaWVzKTtcbiAgICByZWFkRGVwcyhkZXBlbmRlbmNpZXMsIHRoaXMuX3ByZXYuZGVwZW5kZW5jaWVzKTtcbiAgICByZWFkRGVwcyhwZWVyRGVwZW5kZW5jaWVzLCB0aGlzLl9wcmV2LnBlZXJEZXBlbmRlbmNpZXMpO1xuXG4gICAgcmV0dXJuIHsgZGV2RGVwZW5kZW5jaWVzLCBkZXBlbmRlbmNpZXMsIHBlZXJEZXBlbmRlbmNpZXMgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyBhbnkgZGVwcyB0aGF0IGRvIG5vdCBoYXZlIGEgc3BlY2lmaWVkIHZlcnNpb24gKGUuZy4gYCpgKSBhbmRcbiAgICogdXBkYXRlcyBgcGFja2FnZS5qc29uYCBpZiBuZWVkZWQuIERvZXMgbm90IGxvZyBvciBpbnN0YWxsIOKAlCB0aGUgY2FsbGVyXG4gICAqIGlzIHJlc3BvbnNpYmxlIGZvciBhY3Rpbmcgb24gdGhlIHJldHVybmVkIGNoYW5nZXMuXG4gICAqXG4gICAqIEByZXR1cm5zIGxpc3Qgb2YgaHVtYW4tcmVhZGFibGUgcmVzb2x1dGlvbiBjaGFuZ2VzLCBvciBgdW5kZWZpbmVkYCBpZlxuICAgKiBgcGFja2FnZS5qc29uYCBkb2VzIG5vdCBleGlzdC4gQW4gZW1wdHkgYXJyYXkgbWVhbnMgbm8gY2hhbmdlcyB3ZXJlIG1hZGUuXG4gICAqL1xuICBwcml2YXRlIHJlc29sdmVEZXBzQW5kV3JpdGVQYWNrYWdlSnNvbigpOiBzdHJpbmdbXSB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3Qgb3V0ZGlyID0gdGhpcy5wcm9qZWN0Lm91dGRpcjtcbiAgICBjb25zdCByb290UGFja2FnZUpzb24gPSBqb2luKG91dGRpciwgXCJwYWNrYWdlLmpzb25cIik7XG5cbiAgICBjb25zdCBvcmlnaW5hbCA9IHJlYWRGaWxlU3luYyhyb290UGFja2FnZUpzb24sIFwidXRmOFwiKTtcbiAgICBjb25zdCBwa2cgPSBKU09OLnBhcnNlKG9yaWdpbmFsKTtcbiAgICBjb25zdCBjaGFuZ2VzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgY29uc3QgcmVzb2x2ZURlcHMgPSAoXG4gICAgICBjdXJyZW50OiB7IFtuYW1lOiBzdHJpbmddOiBzdHJpbmcgfSxcbiAgICAgIHVzZXI6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXG4gICAgKSA9PiB7XG4gICAgICBjb25zdCByZXN1bHQ6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgICAgIGN1cnJlbnQgPSBjdXJyZW50ID8/IHt9O1xuICAgICAgdXNlciA9IHVzZXIgPz8ge307XG5cbiAgICAgIGZvciAoY29uc3QgW25hbWUsIGN1cnJlbnREZWZpbml0aW9uXSBvZiBPYmplY3QuZW50cmllcyh1c2VyKSkge1xuICAgICAgICAvLyBmaW5kIGFjdHVhbCB2ZXJzaW9uIGZyb20gbm9kZV9tb2R1bGVzXG4gICAgICAgIGxldCBkZXNpcmVkVmVyc2lvbiA9IGN1cnJlbnREZWZpbml0aW9uO1xuXG4gICAgICAgIGlmIChjdXJyZW50RGVmaW5pdGlvbiA9PT0gXCIqXCIpIHtcbiAgICAgICAgICAvLyB3ZSBhbHJlYWR5IGtub3cgd2UgZG9uJ3QgaGF2ZSB0aGUgdmVyc2lvbiBpbiBwcm9qZWN0IGBkZXBzYCxcbiAgICAgICAgICAvLyBzbyBza2lwIHN0cmFpZ2h0IHRvIGNoZWNraW5nIG1hbmlmZXN0LlxuICAgICAgICAgIGNvbnN0IHJlc29sdmVkVmVyc2lvbiA9IHRyeVJlc29sdmVEZXBlbmRlbmN5VmVyc2lvbihuYW1lLCB7XG4gICAgICAgICAgICBwYXRoczogW3RoaXMucHJvamVjdC5vdXRkaXJdLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGlmICghcmVzb2x2ZWRWZXJzaW9uKSB7XG4gICAgICAgICAgICB0aGlzLnByb2plY3QubG9nZ2VyLndhcm4oXG4gICAgICAgICAgICAgIGB1bmFibGUgdG8gcmVzb2x2ZSB2ZXJzaW9uIGZvciAke25hbWV9IGZyb20gaW5zdGFsbGVkIG1vZHVsZXNgLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBkZXNpcmVkVmVyc2lvbiA9IGBeJHtyZXNvbHZlZFZlcnNpb259YDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjdXJyZW50RGVmaW5pdGlvbiAhPT0gZGVzaXJlZFZlcnNpb24pIHtcbiAgICAgICAgICBjaGFuZ2VzLnB1c2goYCR7bmFtZX06ICR7Y3VycmVudERlZmluaXRpb259ID0+ICR7ZGVzaXJlZFZlcnNpb259YCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXN1bHRbbmFtZV0gPSBkZXNpcmVkVmVyc2lvbjtcbiAgICAgIH1cblxuICAgICAgLy8gY29sbGVjdCByZW1vdmVkIHBhY2thZ2VzXG4gICAgICBmb3IgKGNvbnN0IG5hbWUgb2YgT2JqZWN0LmtleXMoY3VycmVudCkpIHtcbiAgICAgICAgaWYgKCFyZXN1bHRbbmFtZV0pIHtcbiAgICAgICAgICBjaGFuZ2VzLnB1c2goYCR7bmFtZX06IHJlbW92ZWRgKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG5cbiAgICBjb25zdCByZW5kZXJlZCA9IHRoaXMuX3JlbmRlcmVkRGVwcztcbiAgICBpZiAoIXJlbmRlcmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJhc3NlcnRpb24gZmFpbGVkXCIpO1xuICAgIH1cblxuICAgIGNvbnN0IGRlcHMgPSByZXNvbHZlRGVwcyhwa2cuZGVwZW5kZW5jaWVzLCByZW5kZXJlZC5kZXBlbmRlbmNpZXMpO1xuICAgIGNvbnN0IGRldkRlcHMgPSByZXNvbHZlRGVwcyhwa2cuZGV2RGVwZW5kZW5jaWVzLCByZW5kZXJlZC5kZXZEZXBlbmRlbmNpZXMpO1xuICAgIGNvbnN0IHBlZXJEZXBzID0gcmVzb2x2ZURlcHMoXG4gICAgICBwa2cucGVlckRlcGVuZGVuY2llcyxcbiAgICAgIHJlbmRlcmVkLnBlZXJEZXBlbmRlbmNpZXMsXG4gICAgKTtcblxuICAgIGlmICh0aGlzLnBlZXJEZXBlbmRlbmN5T3B0aW9ucy5waW5uZWREZXZEZXBlbmRlbmN5KSB7XG4gICAgICBmb3IgKGNvbnN0IFtuYW1lLCB2ZXJzaW9uXSBvZiBPYmplY3QuZW50cmllcyhwZWVyRGVwcykpIHtcbiAgICAgICAgLy8gU2tpcCBpZiB3ZSBhbHJlYWR5IGhhdmUgYSBydW50aW1lIGRlcGVuZGVuY3kgb24gdGhpcyBwZWVyXG4gICAgICAgIC8vIG9yIGlmIGRldkRlcGVuZGVuY3kgdmVyc2lvbiBpcyBhbHJlYWR5IHNldC5cbiAgICAgICAgLy8gUmVsaWVzIG9uIHRoZSBcIipcIiBkZXZEZXBlbmRlbmN5IGFkZGVkIGluIHRoZSBwcmVzeW50aCBzdGVwXG4gICAgICAgIGlmIChkZXBzW25hbWVdIHx8IHJlbmRlcmVkLmRldkRlcGVuZGVuY2llc1tuYW1lXSAhPT0gXCIqXCIpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRha2UgdmVyc2lvbiBhbmQgcGluIGFzIGRldiBkZXBlbmRlbmN5XG4gICAgICAgIGNvbnN0IHZlciA9IG1pblZlcnNpb24odmVyc2lvbik7XG4gICAgICAgIGlmICghdmVyKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYHVuYWJsZSB0byBkZXRlcm1pbmUgbWluaW11bSBzZW12ZXIgZm9yIHBlZXIgZGVwZW5kZW5jeSAke25hbWV9QCR7dmVyc2lvbn1gLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBkZXZEZXBzW25hbWVdID0gdmVyO1xuICAgICAgfVxuICAgIH1cblxuICAgIHBrZy5kZXBlbmRlbmNpZXMgPSBzb3J0ZWQoZGVwcyk7XG4gICAgcGtnLmRldkRlcGVuZGVuY2llcyA9IHNvcnRlZChkZXZEZXBzKTtcbiAgICBwa2cucGVlckRlcGVuZGVuY2llcyA9IHNvcnRlZChwZWVyRGVwcyk7XG5cbiAgICBjb25zdCB1cGRhdGVkID0gSlNPTi5zdHJpbmdpZnkocGtnLCB1bmRlZmluZWQsIDIpICsgXCJcXG5cIjtcblxuICAgIGlmIChvcmlnaW5hbCA9PT0gdXBkYXRlZCkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIHdyaXRlRmlsZShyb290UGFja2FnZUpzb24sIHVwZGF0ZWQpO1xuICAgIHJldHVybiBjaGFuZ2VzO1xuICB9XG5cbiAgcHJpdmF0ZSByZW5kZXJQYWNrYWdlUmVzb2x1dGlvbnMoKSB7XG4gICAgY29uc3QgcmVuZGVyID0gKCkgPT4ge1xuICAgICAgY29uc3Qgb3ZlcnJpZGluZ0RlcGVuZGVuY2llcyA9IHRoaXMucHJvamVjdC5kZXBzLmFsbC5maWx0ZXIoXG4gICAgICAgIChkZXApID0+IGRlcC50eXBlID09PSBEZXBlbmRlbmN5VHlwZS5PVkVSUklERSxcbiAgICAgICk7XG4gICAgICBpZiAoIW92ZXJyaWRpbmdEZXBlbmRlbmNpZXMubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICAgIG92ZXJyaWRpbmdEZXBlbmRlbmNpZXMubWFwKCh7IG5hbWUsIHZlcnNpb24gPSBcIipcIiB9KSA9PiBbXG4gICAgICAgICAgbmFtZSxcbiAgICAgICAgICB2ZXJzaW9uLFxuICAgICAgICBdKSxcbiAgICAgICk7XG4gICAgfTtcblxuICAgIHN3aXRjaCAodGhpcy5wYWNrYWdlTWFuYWdlcikge1xuICAgICAgY2FzZSBOb2RlUGFja2FnZU1hbmFnZXIuTlBNOlxuICAgICAgY2FzZSBOb2RlUGFja2FnZU1hbmFnZXIuQlVOOlxuICAgICAgICByZXR1cm4geyBvdmVycmlkZXM6IHJlbmRlciB9O1xuICAgICAgY2FzZSBOb2RlUGFja2FnZU1hbmFnZXIuUE5QTTpcbiAgICAgICAgcmV0dXJuIHRoaXMucHJvamVjdC5wYXJlbnRcbiAgICAgICAgICA/IHVuZGVmaW5lZFxuICAgICAgICAgIDogeyBwbnBtOiB7IG92ZXJyaWRlczogcmVuZGVyIH0gfTtcbiAgICAgIGNhc2UgTm9kZVBhY2thZ2VNYW5hZ2VyLllBUk46XG4gICAgICBjYXNlIE5vZGVQYWNrYWdlTWFuYWdlci5ZQVJOMjpcbiAgICAgIGNhc2UgTm9kZVBhY2thZ2VNYW5hZ2VyLllBUk5fQ0xBU1NJQzpcbiAgICAgIGNhc2UgTm9kZVBhY2thZ2VNYW5hZ2VyLllBUk5fQkVSUlk6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4geyByZXNvbHV0aW9uczogcmVuZGVyIH07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlbmRlcnMgdGhlIG5hdGl2ZSBucG0gYGFsbG93U2NyaXB0c2AgZmllbGQgKGB7IFwicGtnXCI6IHRydWUgfWApIGZyb20gdGhlXG4gICAqIGBhbGxvd1NjcmlwdHNgIGFsbG93bGlzdC5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2RvY3MubnBtanMuY29tL2NsaS92MTEvY29tbWFuZHMvbnBtLWFwcHJvdmUtc2NyaXB0c1xuICAgKi9cbiAgcHJpdmF0ZSByZW5kZXJOcG1BbGxvd1NjcmlwdHMoKSB7XG4gICAgaWYgKHRoaXMuYWxsb3dlZFNjcmlwdHMuc2l6ZSA9PT0gMCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgWy4uLnRoaXMuYWxsb3dlZFNjcmlwdHNdLnNvcnQoKS5tYXAoKHBrZykgPT4gW3BrZywgdHJ1ZV0pLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogUmVuZGVycyB0aGUgbmF0aXZlIGJ1biBgdHJ1c3RlZERlcGVuZGVuY2llc2AgZmllbGQgZnJvbSB0aGVcbiAgICogYGFsbG93U2NyaXB0c2AgYWxsb3dsaXN0LlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vYnVuLmNvbS9kb2NzL3BtL2xpZmVjeWNsZVxuICAgKi9cbiAgcHJpdmF0ZSByZW5kZXJCdW5UcnVzdGVkRGVwZW5kZW5jaWVzKCkge1xuICAgIGlmICh0aGlzLmFsbG93ZWRTY3JpcHRzLnNpemUgPT09IDApIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIFsuLi50aGlzLmFsbG93ZWRTY3JpcHRzXS5zb3J0KCk7XG4gIH1cblxuICAvKipcbiAgICogUmVuZGVycyB0aGUgbmF0aXZlIHlhcm4gYmVycnkgcGVyLXBhY2thZ2Ugc2NyaXB0IGFsbG93bGlzdCB2aWFcbiAgICogYGRlcGVuZGVuY2llc01ldGEuPHBrZz4uYnVpbHQgPSB0cnVlYC4gQ29tYmluZWQgd2l0aCB0aGUgZ2xvYmFsXG4gICAqIGBlbmFibGVTY3JpcHRzOiBmYWxzZWAgeWFybnJjIHNldHRpbmcgKHNldCBpbiBgY29uZmlndXJlWWFybkJlcnJ5YCksXG4gICAqIHRoaXMgYWxsb3dzIGluc3RhbGwgc2NyaXB0cyB0byBydW4gb25seSBmb3IgdGhlIGxpc3RlZCBwYWNrYWdlcy5cbiAgICpcbiAgICogQHNlZSBodHRwczovL3lhcm5wa2cuY29tL2NvbmZpZ3VyYXRpb24vbWFuaWZlc3QjZGVwZW5kZW5jaWVzTWV0YS5idWlsdFxuICAgKiBAc2VlIGh0dHBzOi8veWFybnBrZy5jb20vZmVhdHVyZXMvc2VjdXJpdHkjcG9zdGluc3RhbGxzXG4gICAqL1xuICBwcml2YXRlIHJlbmRlcllhcm5CZXJyeURlcGVuZGVuY2llc01ldGEoKSB7XG4gICAgaWYgKHRoaXMuYWxsb3dlZFNjcmlwdHMuc2l6ZSA9PT0gMCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgWy4uLnRoaXMuYWxsb3dlZFNjcmlwdHNdLnNvcnQoKS5tYXAoKHBrZykgPT4gW3BrZywgeyBidWlsdDogdHJ1ZSB9XSksXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgYW5kIGNvbmZpZ3VyZXMgdGhlIGBhbGxvd1NjcmlwdHNgIGFsbG93bGlzdCBmb3IgdGhlIHJlc29sdmVkXG4gICAqIHBhY2thZ2UgbWFuYWdlciwgdGhyb3dpbmcgYSBkZXNjcmlwdGl2ZSBlcnJvciBmb3IgcGFja2FnZSBtYW5hZ2VycyB0aGF0XG4gICAqIGhhdmUgbm8gbmF0aXZlIHdheSB0byBhbGxvd2xpc3QgaW5zdGFsbCBzY3JpcHRzIHBlci1kZXBlbmRlbmN5LlxuICAgKi9cbiAgcHJpdmF0ZSBjb25maWd1cmVBbGxvd1NjcmlwdHMoKSB7XG4gICAgaWYgKHRoaXMuYWxsb3dlZFNjcmlwdHMuc2l6ZSA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHN3aXRjaCAodGhpcy5wYWNrYWdlTWFuYWdlcikge1xuICAgICAgY2FzZSBOb2RlUGFja2FnZU1hbmFnZXIuTlBNOlxuICAgICAgY2FzZSBOb2RlUGFja2FnZU1hbmFnZXIuQlVOOlxuICAgICAgICAvLyBoYW5kbGVkIHZpYSB0aGUgYGFsbG93U2NyaXB0c2AgLyBgdHJ1c3RlZERlcGVuZGVuY2llc2AgbWFuaWZlc3QgZmllbGRzXG4gICAgICAgIHJldHVybjtcblxuICAgICAgY2FzZSBOb2RlUGFja2FnZU1hbmFnZXIuWUFSTjI6XG4gICAgICBjYXNlIE5vZGVQYWNrYWdlTWFuYWdlci5ZQVJOX0JFUlJZOlxuICAgICAgICAvLyBoYW5kbGVkIHZpYSBgZGVwZW5kZW5jaWVzTWV0YS48cGtnPi5idWlsdGAgKyBgZW5hYmxlU2NyaXB0czogZmFsc2VgXG4gICAgICAgIC8vIGluIGByZW5kZXJZYXJuQmVycnlEZXBlbmRlbmNpZXNNZXRhYCBhbmQgYGNvbmZpZ3VyZVlhcm5CZXJyeWBcbiAgICAgICAgcmV0dXJuO1xuXG4gICAgICBjYXNlIE5vZGVQYWNrYWdlTWFuYWdlci5QTlBNOlxuICAgICAgICAvLyBoYW5kbGVkIHZpYSBgY29uZmlndXJlUG5wbWBcbiAgICAgICAgcmV0dXJuO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYFwiYWxsb3dTY3JpcHRzXCIgaXMgbm90IHN1cHBvcnRlZCBmb3IgcGFja2FnZU1hbmFnZXIgXCIke3RoaXMucGFja2FnZU1hbmFnZXJ9XCIuIGAgK1xuICAgICAgICAgICAgXCJTd2l0Y2ggdG8gYSBtb2Rlcm4gcGFja2FnZSBtYW5hZ2VyIHRoYXQgc3VwcG9ydHMgdGhpcyBvcHRpb24uXCIsXG4gICAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENvbmZpZ3VyZXMgdGhlIGBQbnBtV29ya3NwYWNlWWFtbGAgY29tcG9uZW50LCBtZXJnaW5nIGBvbmx5QnVpbHREZXBlbmRlbmNpZXNgXG4gICAqIGZyb20gYGFsbG93U2NyaXB0c2AgYW5kIGFueSBleHBsaWNpdCBgcG5wbU9wdGlvbnMud29ya3NwYWNlWWFtbE9wdGlvbnNgLlxuICAgKiBUaGUgbWVyZ2UgaXMgcmVzb2x2ZWQgbGF6aWx5IChhdCBzeW50aGVzaXMgdGltZSksIHNvIGNhbGxzIHRvXG4gICAqIGBhZGRBbGxvd2VkU2NyaXB0c2AvYHJlbW92ZUFsbG93ZWRTY3JpcHRzYCBtYWRlIGFmdGVyIHRoaXMgcnVucyBhcmVcbiAgICogc3RpbGwgcmVmbGVjdGVkLiBUaGUgZmlsZSBpcyBvbmx5IHdyaXR0ZW4gaWYgaXQgZW5kcyB1cCB3aXRoIGFjdHVhbFxuICAgKiBjb250ZW50IChzZWUgYG9taXRFbXB0eWApLCBzbyB0aGlzIGlzIHNhZmUgdG8gY2FsbCB1bmNvbmRpdGlvbmFsbHkgZm9yXG4gICAqIGV2ZXJ5IHBucG0gcHJvamVjdC5cbiAgICovXG4gIHByaXZhdGUgY29uZmlndXJlUG5wbShwcm9qZWN0OiBQcm9qZWN0LCBvcHRpb25zOiBOb2RlUGFja2FnZU9wdGlvbnMpIHtcbiAgICBjb25zdCB7IHdvcmtzcGFjZVlhbWxPcHRpb25zID0ge30gfSA9IG9wdGlvbnMucG5wbU9wdGlvbnMgPz8ge307XG5cbiAgICBjb25zdCByZW5kZXJPbmx5QnVpbHREZXBlbmRlbmNpZXMgPSAoKSA9PiB7XG4gICAgICBjb25zdCBtZXJnZWQgPSBuZXcgU2V0KFtcbiAgICAgICAgLi4udGhpcy5hbGxvd2VkU2NyaXB0cyxcbiAgICAgICAgLi4uKHdvcmtzcGFjZVlhbWxPcHRpb25zLm9ubHlCdWlsdERlcGVuZGVuY2llcyA/PyBbXSksXG4gICAgICBdKTtcbiAgICAgIHJldHVybiBtZXJnZWQuc2l6ZSA+IDAgPyBbLi4ubWVyZ2VkXS5zb3J0KCkgOiB1bmRlZmluZWQ7XG4gICAgfTtcblxuICAgIG5ldyBQbnBtV29ya3NwYWNlWWFtbChwcm9qZWN0LCB7XG4gICAgICAuLi53b3Jrc3BhY2VZYW1sT3B0aW9ucyxcbiAgICAgIC8vIGBvbmx5QnVpbHREZXBlbmRlbmNpZXNgIGlzIHR5cGVkIGFzIGBzdHJpbmdbXWAsIGJ1dCBkZWZpbmluZyBpdCBhcyBhXG4gICAgICAvLyBnZXR0ZXIgbGV0cyB1cyByZXNvbHZlIHRoZSBtZXJnZWQgYWxsb3dsaXN0IGxhemlseSAoYXQgc3ludGhlc2lzXG4gICAgICAvLyB0aW1lKSwgc28gYGFkZEFsbG93ZWRTY3JpcHRzYC9gcmVtb3ZlQWxsb3dlZFNjcmlwdHNgIGNhbGxzIG1hZGVcbiAgICAgIC8vIGFmdGVyIHRoaXMgcnVucyBhcmUgc3RpbGwgcmVmbGVjdGVkLlxuICAgICAgZ2V0IG9ubHlCdWlsdERlcGVuZGVuY2llcygpOiBzdHJpbmdbXSB8IHVuZGVmaW5lZCB7XG4gICAgICAgIHJldHVybiByZW5kZXJPbmx5QnVpbHREZXBlbmRlbmNpZXMoKTtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHJlbmRlclB1Ymxpc2hDb25maWcoKSB7XG4gICAgLy8gV2hlbiBucG0gcHJvdmVuYW5jZSBpcyBlbmFibGVkLCB3ZSBuZWVkIHRvIGFsd2F5cyByZW5kZXIgdGhlIHB1YmxpYyBhY2Nlc3NcbiAgICAvLyBCdXQgd2hlbiBucG1BY2Nlc3MgaXMgdGhlIHNldCB0byB0aGUgZGVmYXVsdCwgd2UgcHJlZmVyIHRvIG9taXQgaXRcbiAgICBjb25zdCBzaG91bGRPbWl0QWNjZXNzID1cbiAgICAgICF0aGlzLm5wbVByb3ZlbmFuY2UgJiZcbiAgICAgIHRoaXMubnBtQWNjZXNzID09PSBkZWZhdWx0TnBtQWNjZXNzKHRoaXMucGFja2FnZU5hbWUpO1xuXG4gICAgLy8gb21pdCB2YWx1ZXMgaWYgdGhleSBhcmUgdGhlIHNhbWUgYXMgdGhlIG5wbSBkZWZhdWx0c1xuICAgIHJldHVybiByZXNvbHZlSnNvbihcbiAgICAgIHtcbiAgICAgICAgcmVnaXN0cnk6XG4gICAgICAgICAgdGhpcy5ucG1SZWdpc3RyeVVybCAhPT0gREVGQVVMVF9OUE1fUkVHSVNUUllfVVJMXG4gICAgICAgICAgICA/IHRoaXMubnBtUmVnaXN0cnlVcmxcbiAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICBhY2Nlc3M6IHNob3VsZE9taXRBY2Nlc3MgPyB1bmRlZmluZWQgOiB0aGlzLm5wbUFjY2VzcyxcbiAgICAgIH0sXG4gICAgICB7IG9taXRFbXB0eTogdHJ1ZSB9LFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIHJlbmRlcktleXdvcmRzKCkge1xuICAgIGNvbnN0IGt3ZHMgPSBBcnJheS5mcm9tKHRoaXMua2V5d29yZHMpO1xuICAgIHJldHVybiBzb3J0ZWQoa3dkcy5zb3J0KCkpO1xuICB9XG5cbiAgcHJpdmF0ZSByZW5kZXJFbmdpbmVzKCkge1xuICAgIHJldHVybiBzb3J0ZWQodGhpcy5lbmdpbmVzKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVuZGVyRGV2RW5naW5lcygpOiBEZXZFbmdpbmVzIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBhdXRvQWRkID1cbiAgICAgIHRoaXMuX29wdGlvbnMuYWRkUGFja2FnZU1hbmFnZXJUb0RldkVuZ2luZXMgIT09IGZhbHNlICYmXG4gICAgICB0aGlzLl9wYWNrYWdlTWFuYWdlckV4cGxpY2l0O1xuXG4gICAgY29uc3QgYmFzZTogRGV2RW5naW5lcyA9IGF1dG9BZGRcbiAgICAgID8geyBwYWNrYWdlTWFuYWdlcjogdGhpcy5wYWNrYWdlTWFuYWdlclRvRGV2RW5naW5lKCkgfVxuICAgICAgOiB7fTtcblxuICAgIGNvbnN0IG1lcmdlZCA9IHsgLi4uYmFzZSwgLi4udGhpcy5fb3B0aW9ucy5kZXZFbmdpbmVzIH07XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKG1lcmdlZCkubGVuZ3RoID4gMCA/IG1lcmdlZCA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHByaXZhdGUgZGVsZXRlT3JwaGFuZWRMb2NrRmlsZXMoKSB7XG4gICAgY29uc3Qgb3duTG9ja0ZpbGUgPSBqb2luKHRoaXMucHJvamVjdC5vdXRkaXIsIHRoaXMubG9ja0ZpbGUpO1xuICAgIGlmICghZXhpc3RzU3luYyhvd25Mb2NrRmlsZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBhbGxMb2NrRmlsZXMgPSBbXG4gICAgICBcInlhcm4ubG9ja1wiLFxuICAgICAgXCJwYWNrYWdlLWxvY2suanNvblwiLFxuICAgICAgXCJwbnBtLWxvY2sueWFtbFwiLFxuICAgICAgXCJidW4ubG9ja2JcIixcbiAgICBdO1xuICAgIGZvciAoY29uc3QgbGYgb2YgYWxsTG9ja0ZpbGVzKSB7XG4gICAgICBpZiAobGYgPT09IHRoaXMubG9ja0ZpbGUpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjb25zdCBwYXRoID0gam9pbih0aGlzLnByb2plY3Qub3V0ZGlyLCBsZik7XG4gICAgICBpZiAoZXhpc3RzU3luYyhwYXRoKSkge1xuICAgICAgICB0aGlzLnByb2plY3QubG9nZ2VyLmluZm8oYERlbGV0aW5nIG9ycGhhbmVkIGxvY2tmaWxlOiAke2xmfWApO1xuICAgICAgICB1bmxpbmtTeW5jKHBhdGgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXV0b0Rpc2NvdmVyQmluYXJpZXMoKSB7XG4gICAgY29uc3QgYmlucmVsID0gXCJiaW5cIjtcbiAgICBjb25zdCBiaW5kaXIgPSBqb2luKHRoaXMucHJvamVjdC5vdXRkaXIsIGJpbnJlbCk7XG4gICAgaWYgKGV4aXN0c1N5bmMoYmluZGlyKSkge1xuICAgICAgZm9yIChjb25zdCBmaWxlIG9mIHJlYWRkaXJTeW5jKGJpbmRpcikpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhY2Nlc3NTeW5jKGpvaW4oYmluZGlyLCBmaWxlKSwgY29uc3RhbnRzLlhfT0spO1xuXG4gICAgICAgICAgY29uc3QgYmluUGF0aCA9IGpvaW4oYmlucmVsLCBmaWxlKTtcbiAgICAgICAgICBjb25zdCBub3JtYWxpemVkUGF0aCA9IG5vcm1hbGl6ZVBlcnNpc3RlZFBhdGgoYmluUGF0aCk7XG5cbiAgICAgICAgICB0aGlzLmJpbltmaWxlXSA9IG5vcm1hbGl6ZWRQYXRoO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgLy8gbm90IGV4ZWN1dGFibGUsIHNraXBcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcmVuZGVyQXV0aG9yKG9wdGlvbnM6IE5vZGVQYWNrYWdlT3B0aW9ucykge1xuICAgIGxldCBhdXRob3I7XG4gICAgaWYgKG9wdGlvbnMuYXV0aG9yTmFtZSkge1xuICAgICAgYXV0aG9yID0ge1xuICAgICAgICBuYW1lOiBvcHRpb25zLmF1dGhvck5hbWUsXG4gICAgICAgIGVtYWlsOiBvcHRpb25zLmF1dGhvckVtYWlsLFxuICAgICAgICB1cmw6IG9wdGlvbnMuYXV0aG9yVXJsLFxuICAgICAgICBvcmdhbml6YXRpb246IG9wdGlvbnMuYXV0aG9yT3JnYW5pemF0aW9uID8/IGZhbHNlLFxuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKFxuICAgICAgICBvcHRpb25zLmF1dGhvckVtYWlsIHx8XG4gICAgICAgIG9wdGlvbnMuYXV0aG9yVXJsIHx8XG4gICAgICAgIG9wdGlvbnMuYXV0aG9yT3JnYW5pemF0aW9uICE9PSB1bmRlZmluZWRcbiAgICAgICkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgJ1wiYXV0aG9yTmFtZVwiIGlzIHJlcXVpcmVkIGlmIHNwZWNpZnlpbmcgXCJhdXRob3JFbWFpbFwiIG9yIFwiYXV0aG9yVXJsXCInLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYXV0aG9yO1xuICB9XG5cbiAgcHJpdmF0ZSByZW5kZXJCaW4oKSB7XG4gICAgY29uc3QgZW50cmllcyA9IE9iamVjdC5lbnRyaWVzKHRoaXMuYmluKTtcblxuICAgIC8vIFlhcm4gQmVycnkgcmV3cml0ZXMgYFwiYmluXCI6IHtcIm5hbWVcIjogXCIuL3BhdGhcIn1gIHRvIGBcImJpblwiOiBcIi4vcGF0aFwiYFxuICAgIC8vIHdoZW4gdGhlIGtleSBtYXRjaGVzIHRoZSBwYWNrYWdlIG5hbWUsIGNhdXNpbmcgYW50aS10YW1wZXIgZmFpbHVyZXMuXG4gICAgLy8gUmVuZGVyIHRoZSBzdHJpbmcgZm9ybSBkaXJlY3RseSB0byBhdm9pZCB0aGlzLlxuICAgIC8vIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL3lhcm5wa2cvYmVycnkvaXNzdWVzLzYxODRcbiAgICBjb25zdCB7IG5hbWU6IGJpbk5hbWUgfSA9IHBhcnNlUGFja2FnZU5hbWUodGhpcy5wYWNrYWdlTmFtZSk7XG4gICAgaWYgKGlzWWFybkJlcnJ5KHRoaXMucGFja2FnZU1hbmFnZXIpICYmIGVudHJpZXMubGVuZ3RoID09PSAxKSB7XG4gICAgICBjb25zdCBba2V5LCB2YWx1ZV0gPSBlbnRyaWVzWzBdO1xuICAgICAgaWYgKGtleSA9PT0gYmluTmFtZSkge1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHNvcnRlZCh0aGlzLmJpbik7XG4gIH1cblxuICBwcml2YXRlIHJlbmRlclNjcmlwdHMoKSB7XG4gICAgLy8gVmFsaWRhdGUgdGhlIGBhbGxvd1NjcmlwdHNgIGFsbG93bGlzdCBsYXppbHkgKGF0IHN5bnRoZXNpcyB0aW1lLCBzaW5jZVxuICAgIC8vIGBzY3JpcHRzYCBpcyBhbHdheXMgcmVzb2x2ZWQgcmVnYXJkbGVzcyBvZiBwYWNrYWdlIG1hbmFnZXIpLCBzb1xuICAgIC8vIGBhZGRBbGxvd2VkU2NyaXB0c2AgY2FsbHMgbWFkZSBhZnRlciBjb25zdHJ1Y3Rpb24gYXJlIGFsc28gY2hlY2tlZC5cbiAgICB0aGlzLmNvbmZpZ3VyZUFsbG93U2NyaXB0cygpO1xuXG4gICAgY29uc3QgcmVzdWx0OiBhbnkgPSB7fTtcbiAgICBjb25zdCB0YXNrcyA9IHRoaXMucHJvamVjdC50YXNrcy5hbGxcbiAgICAgIC5maWx0ZXIoXG4gICAgICAgICh0KSA9PlxuICAgICAgICAgIC8vIE11c3QgcmVtb3ZlIHRvIHByZXZlbnQgb3ZlcnJpZGluZyBidWlsdC1pbiBucG0gY29tbWFuZCAod2hpY2ggd291bGQgbG9vcClcbiAgICAgICAgICB0Lm5hbWUgIT09IHRoaXMuaW5zdGFsbFRhc2submFtZSAmJlxuICAgICAgICAgIHQubmFtZSAhPT0gdGhpcy5pbnN0YWxsQ2lUYXNrLm5hbWUsXG4gICAgICApXG4gICAgICAuc29ydCgoeCwgeSkgPT4geC5uYW1lLmxvY2FsZUNvbXBhcmUoeS5uYW1lKSk7XG5cbiAgICBjb25zdCBzY3JpcHRDb21tYW5kID0gdGhpcy5yZXNvbHZlU2NyaXB0Q29tbWFuZCgpO1xuICAgIGZvciAoY29uc3QgdGFzayBvZiB0YXNrcykge1xuICAgICAgaWYgKHRoaXMuc2NyaXB0c1RvQmVSZW1vdmVkLmhhcyh0YXNrLm5hbWUpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgcmVzdWx0W3Rhc2submFtZV0gPSBgJHtzY3JpcHRDb21tYW5kfSAke3Rhc2submFtZX1gO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAuLi5yZXN1bHQsXG4gICAgICAuLi50aGlzLnNjcmlwdHMsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIHRoZSBjb21tYW5kIHRvIHVzZSBmb3IgcHJvamVuIGluIHBhY2thZ2UuanNvbiBzY3JpcHRzLlxuICAgKlxuICAgKiBTaW5jZSBgbm9kZV9tb2R1bGVzLy5iaW5gIGlzIGFsd2F5cyBvbiBQQVRIIGluIG5wbSBzY3JpcHRzLCB3ZSBjYW4gdXNlXG4gICAqIGJhcmUgYHByb2plbmAgdW5sZXNzIHRoZSB1c2VyIGhhcyBzZXQgYSBjdXN0b20gYHByb2plbkNvbW1hbmRgLlxuICAgKi9cbiAgcHJpdmF0ZSByZXNvbHZlU2NyaXB0Q29tbWFuZCgpOiBzdHJpbmcge1xuICAgIGNvbnN0IGNtZCA9IHRoaXMucHJvamVjdC5wcm9qZW5Db21tYW5kO1xuICAgIGNvbnN0IGlzRGVmYXVsdCA9IFtcbiAgICAgIC8vIE5vZGVQcm9qZWN0IHNldHMgcHJvamVuQ29tbWFuZCBiYXNlZCBvbiB0aGUgcGFja2FnZSBtYW5hZ2VyXG4gICAgICBleGVjQ29tbWFuZCh0aGlzLnBhY2thZ2VNYW5hZ2VyLCBcInByb2plblwiKSxcbiAgICAgIC8vIFBsYWluIFByb2plY3QgYWx3YXlzIGRlZmF1bHRzIHRvIFwibnB4IHByb2plblwiIHJlZ2FyZGxlc3Mgb2YgcGFja2FnZSBtYW5hZ2VyXG4gICAgICBcIm5weCBwcm9qZW5cIixcbiAgICBdLmluY2x1ZGVzKGNtZCk7XG4gICAgcmV0dXJuIGlzRGVmYXVsdCA/IFwicHJvamVuXCIgOiBjbWQ7XG4gIH1cblxuICBwcml2YXRlIHJlYWRQYWNrYWdlSnNvbigpIHtcbiAgICBjb25zdCBmaWxlID0gam9pbih0aGlzLnByb2plY3Qub3V0ZGlyLCBcInBhY2thZ2UuanNvblwiKTtcbiAgICBpZiAoIWV4aXN0c1N5bmMoZmlsZSkpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIEpTT04ucGFyc2UocmVhZEZpbGVTeW5jKGZpbGUsIFwidXRmLThcIikpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgdGhlIGluc3RhbGwgb3IgaW5zdGFsbDpjaSB0YXNrLiBEb2VzIG5vdCBsb2cg4oCUIHRoZSBjYWxsZXIgaXNcbiAgICogcmVzcG9uc2libGUgZm9yIGluZm9ybWluZyB0aGUgdXNlciBiZWZvcmUgY2FsbGluZyB0aGlzIG1ldGhvZC5cbiAgICpcbiAgICogQHBhcmFtIF90cmlnZ2VyIHRoZSByZWFzb24gZm9yIHRoZSBpbnN0YWxsLCBhdmFpbGFibGUgZm9yIHN1YmNsYXNzZXMgdG8gYWN0IG9uLlxuICAgKi9cbiAgcHJvdGVjdGVkIGluc3RhbGxEZXBlbmRlbmNpZXMoX3RyaWdnZXI6IEluc3RhbGxUcmlnZ2VyKSB7XG4gICAgY29uc3QgdGFza1RvUnVuID0gdGhpcy5pc0F1dG9tYXRlZEJ1aWxkXG4gICAgICA/IHRoaXMuaW5zdGFsbENpVGFza1xuICAgICAgOiB0aGlzLmluc3RhbGxUYXNrO1xuICAgIHRoaXMucHJvamVjdC50YXNrcy5ydW5UYXNrKHRhc2tUb1J1bi5uYW1lKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBgcGFja2FnZU1hbmFnZXJgIGZpZWxkIGluIGBwYWNrYWdlLmpzb25gIGZvciBjb3JlcGFjay1tYW5hZ2VkXG4gICAqIHBhY2thZ2UgbWFuYWdlcnMgKHlhcm4gYmVycnkgYW5kIHBucG0pLlxuICAgKi9cbiAgcHJpdmF0ZSBjb25maWd1cmVDb3JlcGFjaygpIHtcbiAgICBpZiAoaXNZYXJuQmVycnkodGhpcy5wYWNrYWdlTWFuYWdlcikpIHtcbiAgICAgIHRoaXMuYWRkRmllbGQoXCJwYWNrYWdlTWFuYWdlclwiLCBgeWFybkAke3RoaXMuX3lhcm5CZXJyeVZlcnNpb259YCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLnBhY2thZ2VNYW5hZ2VyID09PSBOb2RlUGFja2FnZU1hbmFnZXIuUE5QTSkge1xuICAgICAgdGhpcy5hZGRGaWVsZChcInBhY2thZ2VNYW5hZ2VyXCIsIGBwbnBtQCR7dGhpcy5fcG5wbVZlcnNpb259YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE1hcHMgdGhlIGN1cnJlbnQgcGFja2FnZSBtYW5hZ2VyIHRvIGEgYERldkVuZ2luZURlcGVuZGVuY3lgLlxuICAgKi9cbiAgcHJpdmF0ZSBwYWNrYWdlTWFuYWdlclRvRGV2RW5naW5lKCk6IERldkVuZ2luZURlcGVuZGVuY3kge1xuICAgIGNvbnN0IG9uRmFpbCA9IFwiaWdub3JlXCI7XG4gICAgc3dpdGNoICh0aGlzLnBhY2thZ2VNYW5hZ2VyKSB7XG4gICAgICBjYXNlIE5vZGVQYWNrYWdlTWFuYWdlci5ZQVJOOlxuICAgICAgY2FzZSBOb2RlUGFja2FnZU1hbmFnZXIuWUFSTl9DTEFTU0lDOlxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIG5hbWU6IFwieWFyblwiLFxuICAgICAgICAgIHZlcnNpb246IERFRkFVTFRfWUFSTl9DTEFTU0lDX1ZFUlNJT04sXG4gICAgICAgICAgb25GYWlsLFxuICAgICAgICB9O1xuICAgICAgY2FzZSBOb2RlUGFja2FnZU1hbmFnZXIuWUFSTjI6XG4gICAgICBjYXNlIE5vZGVQYWNrYWdlTWFuYWdlci5ZQVJOX0JFUlJZOlxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIG5hbWU6IFwieWFyblwiLFxuICAgICAgICAgIHZlcnNpb246XG4gICAgICAgICAgICB0aGlzLl9vcHRpb25zLnlhcm5CZXJyeU9wdGlvbnM/LnZlcnNpb24gPz9cbiAgICAgICAgICAgIGA+PSR7c2VtdmVyLm1ham9yKHRoaXMuX3lhcm5CZXJyeVZlcnNpb24pfWAsXG4gICAgICAgICAgb25GYWlsLFxuICAgICAgICB9O1xuICAgICAgY2FzZSBOb2RlUGFja2FnZU1hbmFnZXIuTlBNOlxuICAgICAgICByZXR1cm4geyBuYW1lOiBcIm5wbVwiLCBvbkZhaWwgfTtcbiAgICAgIGNhc2UgTm9kZVBhY2thZ2VNYW5hZ2VyLlBOUE06XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbmFtZTogXCJwbnBtXCIsXG4gICAgICAgICAgdmVyc2lvbjpcbiAgICAgICAgICAgIHRoaXMuX29wdGlvbnMucG5wbVZlcnNpb24gPz8gYD49JHtzZW12ZXIubWFqb3IodGhpcy5fcG5wbVZlcnNpb24pfWAsXG4gICAgICAgICAgb25GYWlsLFxuICAgICAgICB9O1xuICAgICAgY2FzZSBOb2RlUGFja2FnZU1hbmFnZXIuQlVOOlxuICAgICAgICByZXR1cm4geyBuYW1lOiBcImJ1blwiLCBvbkZhaWwgfTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNvbmZpZ3VyZVlhcm5CZXJyeShwcm9qZWN0OiBQcm9qZWN0LCBvcHRpb25zOiBOb2RlUGFja2FnZU9wdGlvbnMpIHtcbiAgICBjb25zdCB7IHlhcm5SY09wdGlvbnMgPSB7fSwgemVyb0luc3RhbGxzID0gZmFsc2UgfSA9XG4gICAgICBvcHRpb25zLnlhcm5CZXJyeU9wdGlvbnMgfHwge307XG4gICAgdGhpcy5jaGVja0ZvckNvbmZsaWN0aW5nWWFybk9wdGlvbnMoeWFyblJjT3B0aW9ucyk7XG5cbiAgICB0aGlzLmNvbmZpZ3VyZVlhcm5CZXJyeUdpdGlnbm9yZSh6ZXJvSW5zdGFsbHMpO1xuXG4gICAgLy8gV2hlbiBhbiBhbGxvd2xpc3QgaXMgcHJvdmlkZWQsIGRpc2FibGUgc2NyaXB0cyBnbG9iYWxseSBzbyB0aGF0IG9ubHlcbiAgICAvLyB0aGUgcGFja2FnZXMgZXhwbGljaXRseSBtYXJrZWQgdmlhIGBkZXBlbmRlbmNpZXNNZXRhLjxwa2c+LmJ1aWx0YCBhcmVcbiAgICAvLyBhbGxvd2VkIHRvIHJ1biB0aGVpciBpbnN0YWxsIHNjcmlwdHMuIFJlc29sdmVkIGxhemlseSAoYXQgc3ludGhlc2lzXG4gICAgLy8gdGltZSwgdmlhIGEgZ2V0dGVyKSBzbyB0aGF0IGxhdGVyIGNhbGxzIHRvXG4gICAgLy8gYGFkZEFsbG93ZWRTY3JpcHRzYC9gcmVtb3ZlQWxsb3dlZFNjcmlwdHNgIGFyZSByZWZsZWN0ZWQuIEhhcyBub1xuICAgIC8vIGVmZmVjdCBpZiB0aGUgdXNlciBzZXQgYGVuYWJsZVNjcmlwdHNgIGV4cGxpY2l0bHkuXG4gICAgY29uc3Qgbm9kZVBhY2thZ2UgPSB0aGlzO1xuICAgIG5ldyBZYXJucmMocHJvamVjdCwge1xuICAgICAgZ2V0IGVuYWJsZVNjcmlwdHMoKTogYm9vbGVhbiB8IHVuZGVmaW5lZCB7XG4gICAgICAgIHJldHVybiBub2RlUGFja2FnZS5hbGxvd2VkU2NyaXB0cy5zaXplID4gMCA/IGZhbHNlIDogdW5kZWZpbmVkO1xuICAgICAgfSxcbiAgICAgIC4uLnlhcm5SY09wdGlvbnMsXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGNoZWNrRm9yQ29uZmxpY3RpbmdZYXJuT3B0aW9ucyh5YXJuUmNPcHRpb25zOiBZYXJucmNPcHRpb25zKSB7XG4gICAgaWYgKFxuICAgICAgdGhpcy5ucG1BY2Nlc3MgJiZcbiAgICAgIHlhcm5SY09wdGlvbnMubnBtUHVibGlzaEFjY2VzcyAmJlxuICAgICAgdGhpcy5ucG1BY2Nlc3MudG9TdHJpbmcoKSAhPT0geWFyblJjT3B0aW9ucy5ucG1QdWJsaXNoQWNjZXNzLnRvU3RyaW5nKClcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYENhbm5vdCBzZXQgbnBtQWNjZXNzICgke3RoaXMubnBtQWNjZXNzfSkgYW5kIHlhcm5SY09wdGlvbnMubnBtUHVibGlzaEFjY2VzcyAoJHt5YXJuUmNPcHRpb25zLm5wbVB1Ymxpc2hBY2Nlc3N9KSB0byBkaWZmZXJlbnQgdmFsdWVzLmAsXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIHRoaXMubnBtUmVnaXN0cnlVcmwgJiZcbiAgICAgIHlhcm5SY09wdGlvbnMubnBtUmVnaXN0cnlTZXJ2ZXIgJiZcbiAgICAgIHRoaXMubnBtUmVnaXN0cnlVcmwgIT09IHlhcm5SY09wdGlvbnMubnBtUmVnaXN0cnlTZXJ2ZXJcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYENhbm5vdCBzZXQgbnBtUmVnaXN0cnlVcmwgKCR7dGhpcy5ucG1SZWdpc3RyeVVybH0pIGFuZCB5YXJuUmNPcHRpb25zLm5wbVJlZ2lzdHJ5U2VydmVyICgke3lhcm5SY09wdGlvbnMubnBtUmVnaXN0cnlTZXJ2ZXJ9KSB0byBkaWZmZXJlbnQgdmFsdWVzLmAsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBTZWUgaHR0cHM6Ly95YXJucGtnLmNvbS9nZXR0aW5nLXN0YXJ0ZWQvcWEjd2hpY2gtZmlsZXMtc2hvdWxkLWJlLWdpdGlnbm9yZWQgKi9cbiAgcHJpdmF0ZSBjb25maWd1cmVZYXJuQmVycnlHaXRpZ25vcmUoemVyb0luc3RhbGxzOiBib29sZWFuKSB7XG4gICAgY29uc3QgeyBnaXRpZ25vcmUgfSA9IHRoaXMucHJvamVjdDtcblxuICAgIC8vIFRoZXNlIHBhdHRlcm5zIGFyZSB0aGUgc2FtZSB3aGV0aGVyIG9yIG5vdCB5b3UncmUgdXNpbmcgemVyby1pbnN0YWxsc1xuICAgIGdpdGlnbm9yZS5leGNsdWRlKFwiLnlhcm4vKlwiKTtcbiAgICBnaXRpZ25vcmUuaW5jbHVkZShcbiAgICAgIFwiLnlhcm4vcGF0Y2hlc1wiLFxuICAgICAgXCIueWFybi9wbHVnaW5zXCIsXG4gICAgICBcIi55YXJuL3JlbGVhc2VzXCIsXG4gICAgICBcIi55YXJuL3Nka3NcIixcbiAgICAgIFwiLnlhcm4vdmVyc2lvbnNcIixcbiAgICApO1xuXG4gICAgaWYgKHplcm9JbnN0YWxscykge1xuICAgICAgZ2l0aWdub3JlLmluY2x1ZGUoXCIhLnlhcm4vY2FjaGVcIik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGdpdGlnbm9yZS5leGNsdWRlKFwiLnBucC4qXCIpO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBlZXJEZXBlbmRlbmN5T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBBdXRvbWF0aWNhbGx5IGFkZCBhIHBpbm5lZCBkZXYgZGVwZW5kZW5jeS5cbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgcmVhZG9ubHkgcGlubmVkRGV2RGVwZW5kZW5jeT86IGJvb2xlYW47XG59XG5cbi8qKlxuICogVGhlIG5vZGUgcGFja2FnZSBtYW5hZ2VyIHRvIHVzZS5cbiAqL1xuZXhwb3J0IGVudW0gTm9kZVBhY2thZ2VNYW5hZ2VyIHtcbiAgLyoqXG4gICAqIFVzZSBgeWFybmAgYXMgdGhlIHBhY2thZ2UgbWFuYWdlci5cbiAgICpcbiAgICogQGRlcHJlY2F0ZWQgRm9yIGB5YXJuYCAxLnggdXNlIGBZQVJOX0NMQVNTSUNgIGZvciBgeWFybmAgPj0gMiB1c2UgYFlBUk5fQkVSUllgLiBDdXJyZW50bHksIGBOb2RlUGFja2FnZU1hbmFnZXIuWUFSTmAgbWVhbnMgYFlBUk5fQ0xBU1NJQ2AuIEluIHRoZSBmdXR1cmUsIHdlIG1pZ2h0IHJlcHVycG9zZSBpdCB0byBtZWFuIGBZQVJOX0JFUlJZYC5cbiAgICovXG4gIFlBUk4gPSBcInlhcm5cIixcblxuICAvKipcbiAgICogVXNlIGB5YXJuYCB2ZXJzaW9ucyA+PSAyIGFzIHRoZSBwYWNrYWdlIG1hbmFnZXIuXG4gICAqXG4gICAqIEBkZXByZWNhdGVkIHVzZSBZQVJOX0JFUlJZIGluc3RlYWRcbiAgICovXG4gIFlBUk4yID0gXCJ5YXJuMlwiLFxuXG4gIC8qKlxuICAgKiBVc2UgYHlhcm5gIDEueCBhcyB0aGUgcGFja2FnZSBtYW5hZ2VyLlxuICAgKi9cbiAgWUFSTl9DTEFTU0lDID0gXCJ5YXJuX2NsYXNzaWNcIixcblxuICAvKipcbiAgICogVXNlIGB5YXJuYCB2ZXJzaW9ucyA+PSAyIGFzIHRoZSBwYWNrYWdlIG1hbmFnZXIuXG4gICAqL1xuICBZQVJOX0JFUlJZID0gXCJ5YXJuX2JlcnJ5XCIsXG5cbiAgLyoqXG4gICAqIFVzZSBgbnBtYCBhcyB0aGUgcGFja2FnZSBtYW5hZ2VyLlxuICAgKi9cbiAgTlBNID0gXCJucG1cIixcblxuICAvKipcbiAgICogVXNlIGBwbnBtYCBhcyB0aGUgcGFja2FnZSBtYW5hZ2VyLlxuICAgKi9cbiAgUE5QTSA9IFwicG5wbVwiLFxuXG4gIC8qKlxuICAgKiBVc2UgYGJ1bmAgYXMgdGhlIHBhY2thZ2UgbWFuYWdlclxuICAgKi9cbiAgQlVOID0gXCJidW5cIixcbn1cblxuLyoqXG4gKiBOcG0gcGFja2FnZSBhY2Nlc3MgbGV2ZWxcbiAqL1xuZXhwb3J0IGVudW0gTnBtQWNjZXNzIHtcbiAgLyoqXG4gICAqIFBhY2thZ2UgaXMgcHVibGljLlxuICAgKi9cbiAgUFVCTElDID0gXCJwdWJsaWNcIixcblxuICAvKipcbiAgICogUGFja2FnZSBjYW4gb25seSBiZSBhY2Nlc3NlZCB3aXRoIGNyZWRlbnRpYWxzLlxuICAgKi9cbiAgUkVTVFJJQ1RFRCA9IFwicmVzdHJpY3RlZFwiLFxufVxuXG4vKipcbiAqIENvbmZpZ3VyZSBZYXJuIEJlcnJ5XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgWWFybkJlcnJ5T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBBIGZ1bGx5IHNwZWNpZmllZCB2ZXJzaW9uIHRvIHVzZSBmb3IgeWFybiAoZS5nLiwgeC54LngpXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gNC4xMy4wXG4gICAqL1xuICByZWFkb25seSB2ZXJzaW9uPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgeWFybnJjIGNvbmZpZ3VyYXRpb24uXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gYSBibGFuayBZYXJuIFJDIGZpbGVcbiAgICovXG4gIHJlYWRvbmx5IHlhcm5SY09wdGlvbnM/OiBZYXJucmNPcHRpb25zO1xuXG4gIC8qKlxuICAgKiBTaG91bGQgemVyby1pbnN0YWxscyBiZSBlbmFibGVkP1xuICAgKiBMZWFybiBtb3JlIGF0OiBodHRwczovL3lhcm5wa2cuY29tL2ZlYXR1cmVzL2NhY2hpbmcjemVyby1pbnN0YWxsc1xuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgemVyb0luc3RhbGxzPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBDb25maWd1cmUgcG5wbVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBucG1PcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSBgcG5wbS13b3Jrc3BhY2UueWFtbGAgY29uZmlndXJhdGlvbi5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBhIGJsYW5rIHBucG0td29ya3NwYWNlLnlhbWwgZmlsZVxuICAgKi9cbiAgcmVhZG9ubHkgd29ya3NwYWNlWWFtbE9wdGlvbnM/OiBQbnBtV29ya3NwYWNlWWFtbE9wdGlvbnM7XG59XG5cbmludGVyZmFjZSBOcG1EZXBlbmRlbmNpZXMge1xuICByZWFkb25seSBkZXBlbmRlbmNpZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIHJlYWRvbmx5IGRldkRlcGVuZGVuY2llczogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgcmVhZG9ubHkgcGVlckRlcGVuZGVuY2llczogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbn1cblxuLyoqXG4gKiBXaHkgYSBkZXBlbmRlbmN5IGluc3RhbGwgd2FzIHRyaWdnZXJlZCBkdXJpbmcgc3ludGhlc2lzLlxuICovXG5leHBvcnQgZW51bSBJbnN0YWxsUmVhc29uIHtcbiAgLyoqIFRoZSBub2RlX21vZHVsZXMgZGlyZWN0b3J5IGRvZXMgbm90IGV4aXN0LiAqL1xuICBOT19OT0RFX01PRFVMRVMgPSBcIm5vZGVfbW9kdWxlcyBpcyBtaXNzaW5nXCIsXG4gIC8qKiBUaGUgcGFja2FnZS5qc29uIGZpbGUgd2FzIG1vZGlmaWVkIGR1cmluZyBzeW50aGVzaXMuICovXG4gIFBBQ0tBR0VfSlNPTl9DSEFOR0VEID0gXCJwYWNrYWdlLmpzb24gaGFzIGNoYW5nZWRcIixcbiAgLyoqIFdpbGRjYXJkIGRlcGVuZGVuY3kgdmVyc2lvbnMgd2VyZSByZXNvbHZlZCB0byBjb25jcmV0ZSByYW5nZXMuICovXG4gIERFUFNfUkVTT0xWRUQgPSBcInJlc29sdmVkIGRlcGVuZGVuY3kgdmVyc2lvbnMgY2hhbmdlZFwiLFxufVxuXG4vKipcbiAqIERlc2NyaWJlcyB3aHkgZGVwZW5kZW5jaWVzIG5lZWQgdG8gYmUgaW5zdGFsbGVkLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEluc3RhbGxUcmlnZ2VyIHtcbiAgLyoqIFRoZSByZWFzb24gZm9yIHRoZSBpbnN0YWxsLiAqL1xuICByZWFkb25seSByZWFzb246IEluc3RhbGxSZWFzb247XG5cbiAgLyoqXG4gICAqIEEgdW5pZmllZCBkaWZmIG9mIHRoZSBwYWNrYWdlLmpzb24gY2hhbmdlcy5cbiAgICogT25seSBwcmVzZW50IHdoZW4gcmVhc29uIGlzIGBQQUNLQUdFX0pTT05fQ0hBTkdFRGAuXG4gICAqL1xuICByZWFkb25seSBkaWZmPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIEh1bWFuLXJlYWRhYmxlIGRlc2NyaXB0aW9ucyBvZiByZXNvbHZlZCBkZXBlbmRlbmN5IHZlcnNpb24gY2hhbmdlcy5cbiAgICogT25seSBwcmVzZW50IHdoZW4gcmVhc29uIGlzIGBERVBTX1JFU09MVkVEYC5cbiAgICovXG4gIHJlYWRvbmx5IHJlc29sdXRpb25zPzogc3RyaW5nW107XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lcyBpZiBhbiBucG0gcGFja2FnZSBpcyBcInNjb3BlZFwiIChpLmUuIGl0IHN0YXJ0cyB3aXRoIFwieHh4QFwiKS5cbiAqL1xuZnVuY3Rpb24gaXNTY29wZWQocGFja2FnZU5hbWU6IHN0cmluZykge1xuICByZXR1cm4gcGFja2FnZU5hbWUuc3RhcnRzV2l0aChcIkBcIik7XG59XG5cbmZ1bmN0aW9uIHBhcnNlUGFja2FnZU5hbWUocGFja2FnZU5hbWU6IHN0cmluZyk6IHtcbiAgc2NvcGU/OiBzdHJpbmc7XG4gIG5hbWU6IHN0cmluZztcbn0ge1xuICBpZiAoaXNTY29wZWQocGFja2FnZU5hbWUpKSB7XG4gICAgY29uc3QgW3Njb3BlLCBuYW1lXSA9IHBhY2thZ2VOYW1lLnNwbGl0KFwiL1wiKTtcbiAgICByZXR1cm4geyBzY29wZSwgbmFtZSB9O1xuICB9XG4gIHJldHVybiB7IG5hbWU6IHBhY2thZ2VOYW1lIH07XG59XG5cbmZ1bmN0aW9uIGRlZmF1bHROcG1BY2Nlc3MocGFja2FnZU5hbWU6IHN0cmluZykge1xuICByZXR1cm4gaXNTY29wZWQocGFja2FnZU5hbWUpID8gTnBtQWNjZXNzLlJFU1RSSUNURUQgOiBOcG1BY2Nlc3MuUFVCTElDO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGVmYXVsdE5wbVRva2VuKFxuICBucG1Ub2tlbjogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICByZWdpc3RyeTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuKSB7XG4gIC8vIGlmIHdlIGFyZSBwdWJsaXNoaW5nIHRvIEFXUyBDb2RlQXJ0aWZhY3QsIG5vIE5QTV9UT0tFTiB1c2VkICh3aWxsIGJlIHJlcXVlc3RlZCB1c2luZyBBV1MgQ0xJIGxhdGVyKS5cbiAgaWYgKGlzQXdzQ29kZUFydGlmYWN0UmVnaXN0cnkocmVnaXN0cnkpKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8vIGlmIHdlIGFyZSBwdWJsaXNoaW5nIHRvIEdpdEh1YiBQYWNrYWdlcywgZGVmYXVsdCB0byBHSVRIVUJfVE9LRU4uXG4gIGNvbnN0IGlzR2l0SHViUGFja2FnZXMgPSByZWdpc3RyeSA9PT0gR0lUSFVCX1BBQ0tBR0VTX1JFR0lTVFJZO1xuICByZXR1cm4gKFxuICAgIG5wbVRva2VuID8/XG4gICAgKGlzR2l0SHViUGFja2FnZXMgPyBERUZBVUxUX0dJVEhVQl9UT0tFTl9TRUNSRVQgOiBERUZBVUxUX05QTV9UT0tFTl9TRUNSRVQpXG4gICk7XG59XG5cbmZ1bmN0aW9uIGRldGVybWluZUxvY2tmaWxlKHBhY2thZ2VNYW5hZ2VyOiBOb2RlUGFja2FnZU1hbmFnZXIpIHtcbiAgc3dpdGNoIChwYWNrYWdlTWFuYWdlcikge1xuICAgIGNhc2UgTm9kZVBhY2thZ2VNYW5hZ2VyLllBUk46XG4gICAgY2FzZSBOb2RlUGFja2FnZU1hbmFnZXIuWUFSTl9DTEFTU0lDOlxuICAgIGNhc2UgTm9kZVBhY2thZ2VNYW5hZ2VyLllBUk4yOlxuICAgIGNhc2UgTm9kZVBhY2thZ2VNYW5hZ2VyLllBUk5fQkVSUlk6XG4gICAgICByZXR1cm4gXCJ5YXJuLmxvY2tcIjtcbiAgICBjYXNlIE5vZGVQYWNrYWdlTWFuYWdlci5OUE06XG4gICAgICByZXR1cm4gXCJwYWNrYWdlLWxvY2suanNvblwiO1xuICAgIGNhc2UgTm9kZVBhY2thZ2VNYW5hZ2VyLlBOUE06XG4gICAgICByZXR1cm4gXCJwbnBtLWxvY2sueWFtbFwiO1xuICAgIGNhc2UgTm9kZVBhY2thZ2VNYW5hZ2VyLkJVTjpcbiAgICAgIHJldHVybiBcImJ1bi5sb2NrYlwiO1xuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYHVuc3VwcG9ydGVkIHBhY2thZ2UgbWFuYWdlciAke3BhY2thZ2VNYW5hZ2VyfWApO1xuICB9XG59XG5cbi8qKlxuICogTWFwcyBhIHBhY2thZ2UgbWFuYWdlciBuYW1lIChhcyB1c2VkIGluIHBhY2thZ2UuanNvbiBgcGFja2FnZU1hbmFnZXJgIGFuZFxuICogYGRldkVuZ2luZXMucGFja2FnZU1hbmFnZXJgIGZpZWxkcykgdG8gYSBgTm9kZVBhY2thZ2VNYW5hZ2VyYCBlbnVtIHZhbHVlLlxuICovXG5mdW5jdGlvbiBwYWNrYWdlTWFuYWdlck5hbWVUb0VudW0oXG4gIG5hbWU6IHN0cmluZyxcbiAgbWFqb3JWZXJzaW9uPzogbnVtYmVyLFxuKTogTm9kZVBhY2thZ2VNYW5hZ2VyIHwgdW5kZWZpbmVkIHtcbiAgc3dpdGNoIChuYW1lKSB7XG4gICAgY2FzZSBcIm5wbVwiOlxuICAgICAgcmV0dXJuIE5vZGVQYWNrYWdlTWFuYWdlci5OUE07XG4gICAgY2FzZSBcInBucG1cIjpcbiAgICAgIHJldHVybiBOb2RlUGFja2FnZU1hbmFnZXIuUE5QTTtcbiAgICBjYXNlIFwiYnVuXCI6XG4gICAgICByZXR1cm4gTm9kZVBhY2thZ2VNYW5hZ2VyLkJVTjtcbiAgICBjYXNlIFwieWFyblwiOlxuICAgICAgaWYgKG1ham9yVmVyc2lvbiAhPT0gdW5kZWZpbmVkICYmIG1ham9yVmVyc2lvbiA+PSAyKSB7XG4gICAgICAgIHJldHVybiBOb2RlUGFja2FnZU1hbmFnZXIuWUFSTl9CRVJSWTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBOb2RlUGFja2FnZU1hbmFnZXIuWUFSTl9DTEFTU0lDO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbi8qKlxuICogSW5mZXJzIHRoZSBgTm9kZVBhY2thZ2VNYW5hZ2VyYCBmcm9tIGFuIGV4aXN0aW5nIGBwYWNrYWdlLmpzb25gLlxuICpcbiAqIENoZWNrcyBpbiBvcmRlcjpcbiAqIDEuIGBwYWNrYWdlTWFuYWdlcmAgZmllbGQgKGNvcmVwYWNrLCBlLmcuIGBcInlhcm5ANC4xLjBcImApXG4gKiAyLiBgZGV2RW5naW5lcy5wYWNrYWdlTWFuYWdlcmAgZmllbGQgKHNpbmdsZSBlbnRyeSBvbmx5OyBhcnJheXMgYXJlXG4gKiAgICBhbWJpZ3VvdXMgYW5kIHNraXBwZWQgdW5sZXNzIGEgbG9ja2ZpbGUgZGlzYW1iaWd1YXRlcylcbiAqXG4gKiBAcmV0dXJucyB0aGUgaW5mZXJyZWQgcGFja2FnZSBtYW5hZ2VyLCBvciBgdW5kZWZpbmVkYFxuICovXG5mdW5jdGlvbiBpbmZlclBhY2thZ2VNYW5hZ2VyRnJvbVBrZ0pzb24oXG4gIHByZXY6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQsXG4gIG91dGRpcjogc3RyaW5nLFxuKTogTm9kZVBhY2thZ2VNYW5hZ2VyIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFwcmV2KSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8vIDEuIENvcmVwYWNrIHBhY2thZ2VNYW5hZ2VyIGZpZWxkOiBcInlhcm5ANC4xLjBcIlxuICBjb25zdCBjb3JlcGFjazogc3RyaW5nIHwgdW5kZWZpbmVkID0gcHJldi5wYWNrYWdlTWFuYWdlcjtcbiAgaWYgKGNvcmVwYWNrKSB7XG4gICAgY29uc3QgbWF0Y2ggPSBjb3JlcGFjay5tYXRjaCgvXihcXHcrKUAoXFxkKykvKTtcbiAgICBpZiAobWF0Y2gpIHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHBhY2thZ2VNYW5hZ2VyTmFtZVRvRW51bShtYXRjaFsxXSwgTnVtYmVyKG1hdGNoWzJdKSk7XG4gICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gMi4gZGV2RW5naW5lcy5wYWNrYWdlTWFuYWdlclxuICBjb25zdCBkZXZFbmdpbmVzUG0gPSBwcmV2LmRldkVuZ2luZXM/LnBhY2thZ2VNYW5hZ2VyO1xuICBpZiAoZGV2RW5naW5lc1BtKSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGRldkVuZ2luZXNQbSkpIHtcbiAgICAgIC8vIFNpbmdsZSBlbnRyeVxuICAgICAgcmV0dXJuIHBhY2thZ2VNYW5hZ2VyTmFtZVRvRW51bShkZXZFbmdpbmVzUG0ubmFtZSk7XG4gICAgfVxuICAgIGlmIChkZXZFbmdpbmVzUG0ubGVuZ3RoID09PSAxKSB7XG4gICAgICByZXR1cm4gcGFja2FnZU1hbmFnZXJOYW1lVG9FbnVtKGRldkVuZ2luZXNQbVswXS5uYW1lKTtcbiAgICB9XG4gICAgLy8gTXVsdGlwbGUgZW50cmllcyDigJQgdHJ5IHRvIGRpc2FtYmlndWF0ZSB3aXRoIGxvY2tmaWxlXG4gICAgaWYgKGRldkVuZ2luZXNQbS5sZW5ndGggPiAxKSB7XG4gICAgICBjb25zdCBmcm9tTG9ja2ZpbGUgPSBpbmZlclBhY2thZ2VNYW5hZ2VyRnJvbUxvY2tmaWxlKG91dGRpcik7XG4gICAgICBpZiAoZnJvbUxvY2tmaWxlKSB7XG4gICAgICAgIHJldHVybiBmcm9tTG9ja2ZpbGU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBJbmZlcnMgdGhlIGBOb2RlUGFja2FnZU1hbmFnZXJgIGZyb20gdGhlIHByZXNlbmNlIG9mIGEgbG9ja2ZpbGUuXG4gKi9cbmZ1bmN0aW9uIGluZmVyUGFja2FnZU1hbmFnZXJGcm9tTG9ja2ZpbGUoXG4gIG91dGRpcjogc3RyaW5nLFxuKTogTm9kZVBhY2thZ2VNYW5hZ2VyIHwgdW5kZWZpbmVkIHtcbiAgaWYgKGV4aXN0c1N5bmMoam9pbihvdXRkaXIsIFwicG5wbS1sb2NrLnlhbWxcIikpKSB7XG4gICAgcmV0dXJuIE5vZGVQYWNrYWdlTWFuYWdlci5QTlBNO1xuICB9XG4gIGlmIChleGlzdHNTeW5jKGpvaW4ob3V0ZGlyLCBcImJ1bi5sb2NrYlwiKSkpIHtcbiAgICByZXR1cm4gTm9kZVBhY2thZ2VNYW5hZ2VyLkJVTjtcbiAgfVxuICBpZiAoZXhpc3RzU3luYyhqb2luKG91dGRpciwgXCJ5YXJuLmxvY2tcIikpKSB7XG4gICAgcmV0dXJuIE5vZGVQYWNrYWdlTWFuYWdlci5ZQVJOX0NMQVNTSUM7XG4gIH1cbiAgaWYgKGV4aXN0c1N5bmMoam9pbihvdXRkaXIsIFwicGFja2FnZS1sb2NrLmpzb25cIikpKSB7XG4gICAgcmV0dXJuIE5vZGVQYWNrYWdlTWFuYWdlci5OUE07XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cbiJdfQ==
1598
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9kZS1wYWNrYWdlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2phdmFzY3JpcHQvbm9kZS1wYWNrYWdlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQTA0RUEsMENBZUM7O0FBejVFRCwyQkFPWTtBQUNaLCtCQUFxQztBQUNyQywrQ0FBaUM7QUFFakMscURBQXFEO0FBQ3JELGlDQU9nQjtBQUVoQixxQ0FBa0M7QUFDbEMsMENBQXFEO0FBQ3JELDRDQUF5QztBQUN6QyxrREFBaUQ7QUFDakQsa0NBQW1DO0FBRW5DLHdDQUF1RDtBQUV2RCxrQ0FBOEU7QUFFOUUsTUFBTSxVQUFVLEdBQUcsWUFBWSxDQUFDO0FBQ2hDLE1BQU0sd0JBQXdCLEdBQUcsNkJBQTZCLENBQUM7QUFDL0QsTUFBTSx3QkFBd0IsR0FBRyxvQkFBb0IsQ0FBQztBQUN0RCxNQUFNLHdCQUF3QixHQUFHLFdBQVcsQ0FBQztBQUM3QyxNQUFNLDJCQUEyQixHQUFHLGNBQWMsQ0FBQztBQUNuRCxNQUFNLG9CQUFvQixHQUFHLFNBQVMsQ0FBQztBQUN2QyxNQUFNLDBCQUEwQixHQUFHLFFBQVEsQ0FBQztBQUM1QyxNQUFNLDRCQUE0QixHQUFHLFNBQVMsQ0FBQztBQXlkL0M7O0dBRUc7QUFDSCxJQUFZLHdCQWFYO0FBYkQsV0FBWSx3QkFBd0I7SUFDbEM7O09BRUc7SUFDSCxxRkFBeUQsQ0FBQTtJQUV6RDs7Ozs7T0FLRztJQUNILHVEQUEyQixDQUFBO0FBQzdCLENBQUMsRUFiVyx3QkFBd0Isd0NBQXhCLHdCQUF3QixRQWFuQztBQThERDs7R0FFRztBQUNILE1BQWEsV0FBWSxTQUFRLHFCQUFTOztJQUN4Qzs7Ozs7T0FLRztJQUNJLE1BQU0sQ0FBQyxFQUFFLENBQUMsT0FBZ0I7UUFDL0IsTUFBTSxJQUFJLEdBQUcsQ0FBQyxDQUFZLEVBQW9CLEVBQUUsQ0FBQyxDQUFDLFlBQVksV0FBVyxDQUFD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Q0FBQyxFQUFFLENBQUM7WUFDNUIsTUFBTSxZQUFZLEdBQUcsK0JBQStCLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDN0QsSUFBSSxZQUFZLEVBQUUsQ0FBQztnQkFDakIsT0FBTyxZQUFZLENBQUM7WUFDdEIsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRUQsT0FBTyxTQUFTLENBQUM7QUFDbkIsQ0FBQztBQUVEOztHQUVHO0FBQ0gsU0FBUywrQkFBK0IsQ0FDdEMsTUFBYztJQUVkLElBQUksSUFBQSxlQUFVLEVBQUMsSUFBQSxXQUFJLEVBQUMsTUFBTSxFQUFFLGdCQUFnQixDQUFDLENBQUMsRUFBRSxDQUFDO1FBQy9DLE9BQU8sa0JBQWtCLENBQUMsSUFBSSxDQUFDO0lBQ2pDLENBQUM7SUFDRCxJQUFJLElBQUEsZUFBVSxFQUFDLElBQUEsV0FBSSxFQUFDLE1BQU0sRUFBRSxXQUFXLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDMUMsT0FBTyxrQkFBa0IsQ0FBQyxHQUFHLENBQUM7SUFDaEMsQ0FBQztJQUNELElBQUksSUFBQSxlQUFVLEVBQUMsSUFBQSxXQUFJLEVBQUMsTUFBTSxFQUFFLFdBQVcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUMxQyxPQUFPLGtCQUFrQixDQUFDLFlBQVksQ0FBQztJQUN6QyxDQUFDO0lBQ0QsSUFBSSxJQUFBLGVBQVUsRUFBQyxJQUFBLFdBQUksRUFBQyxNQUFNLEVBQUUsbUJBQW1CLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDbEQsT0FBTyxrQkFBa0IsQ0FBQyxHQUFHLENBQUM7SUFDaEMsQ0FBQztJQUNELE9BQU8sU0FBUyxDQUFDO0FBQ25CLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBhY2Nlc3NTeW5jLFxuICBjb25zdGFudHMsXG4gIGV4aXN0c1N5bmMsXG4gIHJlYWRkaXJTeW5jLFxuICByZWFkRmlsZVN5bmMsXG4gIHVubGlua1N5bmMsXG59IGZyb20gXCJmc1wiO1xuaW1wb3J0IHsgam9pbiwgcmVzb2x2ZSB9IGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgKiBhcyBzZW12ZXIgZnJvbSBcInNlbXZlclwiO1xuaW1wb3J0IHR5cGUgeyBQbnBtV29ya3NwYWNlWWFtbE9wdGlvbnMgfSBmcm9tIFwiLi9wbnBtLXdvcmtzcGFjZVwiO1xuaW1wb3J0IHsgUG5wbVdvcmtzcGFjZVlhbWwgfSBmcm9tIFwiLi9wbnBtLXdvcmtzcGFjZVwiO1xuaW1wb3J0IHtcbiAgZXhlY0NvbW1hbmQsXG4gIGV4dHJhY3RDb2RlQXJ0aWZhY3REZXRhaWxzLFxuICBpc1lhcm5CZXJyeSxcbiAgaXNZYXJuQ2xhc3NpYyxcbiAgbWluVmVyc2lvbixcbiAgdHJ5UmVzb2x2ZURlcGVuZGVuY3lWZXJzaW9uLFxufSBmcm9tIFwiLi91dGlsXCI7XG5pbXBvcnQgdHlwZSB7IFlhcm5yY09wdGlvbnMgfSBmcm9tIFwiLi95YXJucmNcIjtcbmltcG9ydCB7IFlhcm5yYyB9IGZyb20gXCIuL3lhcm5yY1wiO1xuaW1wb3J0IHsgcmVzb2x2ZSBhcyByZXNvbHZlSnNvbiB9IGZyb20gXCIuLi9fcmVzb2x2ZVwiO1xuaW1wb3J0IHsgQ29tcG9uZW50IH0gZnJvbSBcIi4uL2NvbXBvbmVudFwiO1xuaW1wb3J0IHsgRGVwZW5kZW5jeVR5cGUgfSBmcm9tIFwiLi4vZGVwZW5kZW5jaWVzXCI7XG5pbXBvcnQgeyBKc29uRmlsZSB9IGZyb20gXCIuLi9qc29uXCI7XG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tIFwiLi4vcHJvamVjdFwiO1xuaW1wb3J0IHsgaXNBd3NDb2RlQXJ0aWZhY3RSZWdpc3RyeSB9IGZyb20gXCIuLi9yZWxlYXNlXCI7XG5pbXBvcnQgdHlwZSB7IFRhc2sgfSBmcm9tIFwiLi4vdGFza1wiO1xuaW1wb3J0IHsgaXNUcnV0aHksIG5vcm1hbGl6ZVBlcnNpc3RlZFBhdGgsIHNvcnRlZCwgd3JpdGVGaWxlIH0gZnJvbSBcIi4uL3V0aWxcIjtcblxuY29uc3QgVU5MSUNFTlNFRCA9IFwiVU5MSUNFTlNFRFwiO1xuY29uc3QgREVGQVVMVF9OUE1fUkVHSVNUUllfVVJMID0gXCJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9cIjtcbmNvbnN0IEdJVEhVQl9QQUNLQUdFU19SRUdJU1RSWSA9IFwibnBtLnBrZy5naXRodWIuY29tXCI7XG5jb25zdCBERUZBVUxUX05QTV9UT0tFTl9TRUNSRVQgPSBcIk5QTV9UT0tFTlwiO1xuY29uc3QgREVGQVVMVF9HSVRIVUJfVE9LRU5fU0VDUkVUID0gXCJHSVRIVUJfVE9LRU5cIjtcbmNvbnN0IERFRkFVTFRfUE5QTV9WRVJTSU9OID0gXCIxMC4zMy4wXCI7XG5jb25zdCBERUZBVUxUX1lBUk5fQkVSUllfVkVSU0lPTiA9IFwiNC4xMy4wXCI7XG5jb25zdCBERUZBVUxUX1lBUk5fQ0xBU1NJQ19WRVJTSU9OID0gXCIxLjIyLjIyXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTm9kZVBhY2thZ2VPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSBcIm5hbWVcIiBpbiBwYWNrYWdlLmpzb25cbiAgICogQGRlZmF1bHQgLSBkZWZhdWx0cyB0byBwcm9qZWN0IG5hbWVcbiAgICogQGZlYXR1cmVkXG4gICAqL1xuICByZWFkb25seSBwYWNrYWdlTmFtZT86IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBkZXNjcmlwdGlvbiBpcyBqdXN0IGEgc3RyaW5nIHRoYXQgaGVscHMgcGVvcGxlIHVuZGVyc3RhbmQgdGhlIHB1cnBvc2Ugb2YgdGhlIHBhY2thZ2UuXG4gICAqIEl0IGNhbiBiZSB1c2VkIHdoZW4gc2VhcmNoaW5nIGZvciBwYWNrYWdlcyBpbiBhIHBhY2thZ2UgbWFuYWdlciBhcyB3ZWxsLlxuICAgKiBTZWUgaHR0cHM6Ly9jbGFzc2ljLnlhcm5wa2cuY29tL2VuL2RvY3MvcGFja2FnZS1qc29uLyN0b2MtZGVzY3JpcHRpb25cbiAgICogQGZlYXR1cmVkXG4gICAqL1xuICByZWFkb25seSBkZXNjcmlwdGlvbj86IHN0cmluZztcblxuICAvKipcbiAgICogUnVudGltZSBkZXBlbmRlbmNpZXMgb2YgdGhpcyBtb2R1bGUuXG4gICAqXG4gICAqIFRoZSByZWNvbW1lbmRhdGlvbiBpcyB0byBvbmx5IHNwZWNpZnkgdGhlIG1vZHVsZSBuYW1lIGhlcmUgKGUuZy5cbiAgICogYGV4cHJlc3NgKS4gVGhpcyB3aWxsIGJlaGF2ZSBzaW1pbGFyIHRvIGBwbnBtIGFkZGAgb3IgYG5wbSBpbnN0YWxsYCBpbiB0aGVcbiAgICogc2Vuc2UgdGhhdCBpdCB3aWxsIGFkZCB0aGUgbW9kdWxlIGFzIGEgZGVwZW5kZW5jeSB0byB5b3VyIGBwYWNrYWdlLmpzb25gXG4gICAqIGZpbGUgd2l0aCB0aGUgbGF0ZXN0IHZlcnNpb24gKGBeYCkuIFlvdSBjYW4gc3BlY2lmeSBzZW12ZXIgcmVxdWlyZW1lbnRzIGluXG4gICAqIHRoZSBzYW1lIHN5bnRheCBwYXNzZWQgdG8gYHBucG0gYWRkYCBvciBgbnBtIGlgIChlLmcuIGBleHByZXNzQF4yYCkgYW5kXG4gICAqIHRoaXMgd2lsbCBiZSB3aGF0IHlvdXIgYHBhY2thZ2UuanNvbmAgd2lsbCBldmVudHVhbGx5IGluY2x1ZGUuXG4gICAqXG4gICAqIEBleGFtcGxlIFsgJ2V4cHJlc3MnLCAnbG9kYXNoJywgJ2Zvb0BeMicgXVxuICAgKiBAZGVmYXVsdCBbXVxuICAgKiBAZmVhdHVyZWRcbiAgICovXG4gIHJlYWRvbmx5IGRlcHM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogQnVpbGQgZGVwZW5kZW5jaWVzIGZvciB0aGlzIG1vZHVsZS4gVGhlc2UgZGVwZW5kZW5jaWVzIHdpbGwgb25seSBiZVxuICAgKiBhdmFpbGFibGUgaW4geW91ciBidWlsZCBlbnZpcm9ubWVudCBidXQgd2lsbCBub3QgYmUgZmV0Y2hlZCB3aGVuIHRoaXNcbiAgICogbW9kdWxlIGlzIGNvbnN1bWVkLlxuICAgKlxuICAgKiBUaGUgcmVjb21tZW5kYXRpb24gaXMgdG8gb25seSBzcGVjaWZ5IHRoZSBtb2R1bGUgbmFtZSBoZXJlIChlLmcuXG4gICAqIGBleHByZXNzYCkuIFRoaXMgd2lsbCBiZWhhdmUgc2ltaWxhciB0byBgcG5wbSBhZGRgIG9yIGBucG0gaW5zdGFsbGAgaW4gdGhlXG4gICAqIHNlbnNlIHRoYXQgaXQgd2lsbCBhZGQgdGhlIG1vZHVsZSBhcyBhIGRlcGVuZGVuY3kgdG8geW91ciBgcGFja2FnZS5qc29uYFxuICAgKiBmaWxlIHdpdGggdGhlIGxhdGVzdCB2ZXJzaW9uIChgXmApLiBZb3UgY2FuIHNwZWNpZnkgc2VtdmVyIHJlcXVpcmVtZW50cyBpblxuICAgKiB0aGUgc2FtZSBzeW50YXggcGFzc2VkIHRvIGBwbnBtIGFkZGAgb3IgYG5wbSBpYCAoZS5nLiBgZXhwcmVzc0BeMmApIGFuZFxuICAgKiB0aGlzIHdpbGwgYmUgd2hhdCB5b3VyIGBwYWNrYWdlLmpzb25gIHdpbGwgZXZlbnR1YWxseSBpbmNsdWRlLlxuICAgKlxuICAgKiBAZXhhbXBsZSBbICd0eXBlc2NyaXB0JywgJ0B0eXBlcy9leHByZXNzJyBdXG4gICAqIEBkZWZhdWx0IFtdXG4gICAqIEBmZWF0dXJlZFxuICAgKi9cbiAgcmVhZG9ubHkgZGV2RGVwcz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBQZWVyIGRlcGVuZGVuY2llcyBmb3IgdGhpcyBtb2R1bGUuIERlcGVuZGVuY2llcyBsaXN0ZWQgaGVyZSBhcmUgcmVxdWlyZWQgdG9cbiAgICogYmUgaW5zdGFsbGVkIChhbmQgc2F0aXNmaWVkKSBieSB0aGUgX2NvbnN1bWVyXyBvZiB0aGlzIGxpYnJhcnkuIFVzaW5nIHBlZXJcbiAgICogZGVwZW5kZW5jaWVzIGFsbG93cyB5b3UgdG8gZW5zdXJlIHRoYXQgb25seSBhIHNpbmdsZSBtb2R1bGUgb2YgYSBjZXJ0YWluXG4gICAqIGxpYnJhcnkgZXhpc3RzIGluIHRoZSBgbm9kZV9tb2R1bGVzYCB0cmVlIG9mIHlvdXIgY29uc3VtZXJzLlxuICAgKlxuICAgKiBOb3RlIHRoYXQgcHJpb3IgdG8gbnBtQDcsIHBlZXIgZGVwZW5kZW5jaWVzIGFyZSBfbm90XyBhdXRvbWF0aWNhbGx5XG4gICAqIGluc3RhbGxlZCwgd2hpY2ggbWVhbnMgdGhhdCBhZGRpbmcgcGVlciBkZXBlbmRlbmNpZXMgdG8gYSBsaWJyYXJ5IHdpbGwgYmUgYVxuICAgKiBicmVha2luZyBjaGFuZ2UgZm9yIHlvdXIgY3VzdG9tZXJzLlxuICAgKlxuICAgKiBVbmxlc3MgYHBlZXJEZXBlbmRlbmN5T3B0aW9ucy5waW5uZWREZXZEZXBlbmRlbmN5YCBpcyBkaXNhYmxlZCAoaXQgaXNcbiAgICogZW5hYmxlZCBieSBkZWZhdWx0KSwgcHJvamVuIHdpbGwgYXV0b21hdGljYWxseSBhZGQgYSBkZXYgZGVwZW5kZW5jeSB3aXRoIGFcbiAgICogcGlubmVkIHZlcnNpb24gZm9yIGVhY2ggcGVlciBkZXBlbmRlbmN5LiBUaGlzIHdpbGwgZW5zdXJlIHRoYXQgeW91IGJ1aWxkICZcbiAgICogdGVzdCB5b3VyIG1vZHVsZSBhZ2FpbnN0IHRoZSBsb3dlc3QgcGVlciB2ZXJzaW9uIHJlcXVpcmVkLlxuICAgKlxuICAgKiBAZGVmYXVsdCBbXVxuICAgKi9cbiAgcmVhZG9ubHkgcGVlckRlcHM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogTGlzdCBvZiBkZXBlbmRlbmNpZXMgdG8gYnVuZGxlIGludG8gdGhpcyBtb2R1bGUuIFRoZXNlIG1vZHVsZXMgd2lsbCBiZVxuICAgKiBhZGRlZCBib3RoIHRvIHRoZSBgZGVwZW5kZW5jaWVzYCBzZWN0aW9uIGFuZCBgYnVuZGxlZERlcGVuZGVuY2llc2Agc2VjdGlvbiBvZlxuICAgKiB5b3VyIGBwYWNrYWdlLmpzb25gLlxuICAgKlxuICAgKiBUaGUgcmVjb21tZW5kYXRpb24gaXMgdG8gb25seSBzcGVjaWZ5IHRoZSBtb2R1bGUgbmFtZSBoZXJlIChlLmcuXG4gICAqIGBleHByZXNzYCkuIFRoaXMgd2lsbCBiZWhhdmUgc2ltaWxhciB0byBgcG5wbSBhZGRgIG9yIGBucG0gaW5zdGFsbGAgaW4gdGhlXG4gICAqIHNlbnNlIHRoYXQgaXQgd2lsbCBhZGQgdGhlIG1vZHVsZSBhcyBhIGRlcGVuZGVuY3kgdG8geW91ciBgcGFja2FnZS5qc29uYFxuICAgKiBmaWxlIHdpdGggdGhlIGxhdGVzdCB2ZXJzaW9uIChgXmApLiBZb3UgY2FuIHNwZWNpZnkgc2VtdmVyIHJlcXVpcmVtZW50cyBpblxuICAgKiB0aGUgc2FtZSBzeW50YXggcGFzc2VkIHRvIGBwbnBtIGFkZGAgb3IgYG5wbSBpYCAoZS5nLiBgZXhwcmVzc0BeMmApIGFuZFxuICAgKiB0aGlzIHdpbGwgYmUgd2hhdCB5b3VyIGBwYWNrYWdlLmpzb25gIHdpbGwgZXZlbnR1YWxseSBpbmNsdWRlLlxuICAgKi9cbiAgcmVhZG9ubHkgYnVuZGxlZERlcHM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogT3B0aW9ucyBmb3IgYHBlZXJEZXBzYC5cbiAgICovXG4gIHJlYWRvbmx5IHBlZXJEZXBlbmRlbmN5T3B0aW9ucz86IFBlZXJEZXBlbmRlbmN5T3B0aW9ucztcblxuICAvKipcbiAgICogQWxsb3cgdGhlIHByb2plY3QgdG8gaW5jbHVkZSBgcGVlckRlcGVuZGVuY2llc2AgYW5kIGBidW5kbGVkRGVwZW5kZW5jaWVzYC5cbiAgICogVGhpcyBpcyBub3JtYWxseSBvbmx5IGFsbG93ZWQgZm9yIGxpYnJhcmllcy4gRm9yIGFwcHMsIHRoZXJlJ3Mgbm8gbWVhbmluZ1xuICAgKiBmb3Igc3BlY2lmeWluZyB0aGVzZS5cbiAgICpcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgcmVhZG9ubHkgYWxsb3dMaWJyYXJ5RGVwZW5kZW5jaWVzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogS2V5d29yZHMgdG8gaW5jbHVkZSBpbiBgcGFja2FnZS5qc29uYC5cbiAgICovXG4gIHJlYWRvbmx5IGtleXdvcmRzPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIE1vZHVsZSBlbnRyeXBvaW50IChgbWFpbmAgaW4gYHBhY2thZ2UuanNvbmApXG4gICAqXG4gICAqIFNldCB0byBhbiBlbXB0eSBzdHJpbmcgdG8gbm90IGluY2x1ZGUgYG1haW5gIGluIHlvdXIgcGFja2FnZS5qc29uXG4gICAqXG4gICAqIEBkZWZhdWx0IFwibGliL2luZGV4LmpzXCJcbiAgICovXG4gIHJlYWRvbmx5IGVudHJ5cG9pbnQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEJpbmFyeSBwcm9ncmFtcyB2ZW5kZWQgd2l0aCB5b3VyIG1vZHVsZS5cbiAgICpcbiAgICogWW91IGNhbiB1c2UgdGhpcyBvcHRpb24gdG8gYWRkL2N1c3RvbWl6ZSBob3cgYmluYXJpZXMgYXJlIHJlcHJlc2VudGVkIGluXG4gICAqIHlvdXIgYHBhY2thZ2UuanNvbmAsIGJ1dCB1bmxlc3MgYGF1dG9EZXRlY3RCaW5gIGlzIGBmYWxzZWAsIGV2ZXJ5XG4gICAqIGV4ZWN1dGFibGUgZmlsZSB1bmRlciBgYmluYCB3aWxsIGF1dG9tYXRpY2FsbHkgYmUgYWRkZWQgdG8gdGhpcyBzZWN0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgYmluPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcblxuICAvKipcbiAgICogQXV0b21hdGljYWxseSBhZGQgYWxsIGV4ZWN1dGFibGVzIHVuZGVyIHRoZSBgYmluYCBkaXJlY3RvcnkgdG8geW91clxuICAgKiBgcGFja2FnZS5qc29uYCBmaWxlIHVuZGVyIHRoZSBgYmluYCBzZWN0aW9uLlxuICAgKlxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICByZWFkb25seSBhdXRvRGV0ZWN0QmluPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIE5vZGUgUGFja2FnZSBNYW5hZ2VyIHVzZWQgdG8gZXhlY3V0ZSBzY3JpcHRzXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gRGV0ZWN0ZWQgZnJvbSB0aGUgY2FsbGluZyBwcm9jZXNzIG9yIGBZQVJOX0NMQVNTSUNgIGlmIGRldGVjdGlvbiBmYWlscy5cbiAgICogQHBqbmV3ICRQQUNLQUdFX01BTkFHRVJcbiAgICovXG4gIHJlYWRvbmx5IHBhY2thZ2VNYW5hZ2VyPzogTm9kZVBhY2thZ2VNYW5hZ2VyO1xuXG4gIC8qKlxuICAgKiBBZGQgYSBgZGVkdXBlYCB0YXNrIHRoYXQgZGVkdXBsaWNhdGVzIHByb2plY3QgZGVwZW5kZW5jaWVzLlxuICAgKlxuICAgKiBEZWR1cGxpY2F0aW9uIHByZXZlbnRzIG11bHRpcGxlIHZlcnNpb25zIG9mIHRoZSBzYW1lIHBhY2thZ2UgZnJvbSBiZWluZ1xuICAgKiBpbnN0YWxsZWQsIGlmIGEgc2luZ2xlIHZlcnNpb24gY2FuIHNhdGlzZnkgYWxsIHJlcXVlc3RlZCB2ZXJzaW9uIHJhbmdlcy5cbiAgICogVGhpcyBwcmV2ZW50cyB2ZXJzaW9uIHByb2xpZmVyYXRpb24gYW5kIHJlZHVjZXMgdGhlIHNpemUgb2YgdGhlIGRlcGVuZGVuY3lcbiAgICogdHJlZS5cbiAgICpcbiAgICogVGhlIGJlaGF2aW9yIGRlcGVuZHMgb24gdGhlIHBhY2thZ2UgbWFuYWdlcjpcbiAgICogLSBucG06IHJ1bnMgYG5wbSBkZWR1cGVgIGFmdGVyIGV2ZXJ5IG11dGF0aW5nIGluc3RhbGwuXG4gICAqIC0gcG5wbTogcnVucyBgcG5wbSBkZWR1cGVgIGFmdGVyIGV2ZXJ5IG11dGF0aW5nIGluc3RhbGwuXG4gICAqIC0gWWFybiBCZXJyeTogcnVucyBgeWFybiBkZWR1cGVgIGFmdGVyIGV2ZXJ5IG11dGF0aW5nIGluc3RhbGwuIElmXG4gICAqICAgYHlhcm5CZXJyeU9wdGlvbnMuZGVkdXBlUGFja2FnZXNgIGlzIHNldCwgb25seSB0aGUgbGlzdGVkIHBhY2thZ2VzIGFyZVxuICAgKiAgIGRlZHVwbGljYXRlZC5cbiAgICogLSBZYXJuIENsYXNzaWM6IGB5YXJuIGluc3RhbGxgIGFscmVhZHkgZGVkdXBsaWNhdGVzLCBzbyB0aGUgdGFzayBvbmx5XG4gICAqICAgcHJpbnRzIGFuIGluZm9ybWF0aW9uYWwgbWVzc2FnZS5cbiAgICogLSBCdW46IG5vdCBzdXBwb3J0ZWQsIGVuYWJsaW5nIHRoaXMgb3B0aW9uIHRocm93cyBhbiBlcnJvci5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBmYWxzZSwgdW5sZXNzIGB5YXJuQmVycnlPcHRpb25zLmRlZHVwZVBhY2thZ2VzYCBpcyBzZXRcbiAgICovXG4gIHJlYWRvbmx5IGRlZHVwZURlcHM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgcmVwb3NpdG9yeSBpcyB0aGUgbG9jYXRpb24gd2hlcmUgdGhlIGFjdHVhbCBjb2RlIGZvciB5b3VyIHBhY2thZ2UgbGl2ZXMuXG4gICAqIFNlZSBodHRwczovL2NsYXNzaWMueWFybnBrZy5jb20vZW4vZG9jcy9wYWNrYWdlLWpzb24vI3RvYy1yZXBvc2l0b3J5XG4gICAqL1xuICByZWFkb25seSByZXBvc2l0b3J5Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBJZiB0aGUgcGFja2FnZS5qc29uIGZvciB5b3VyIHBhY2thZ2UgaXMgbm90IGluIHRoZSByb290IGRpcmVjdG9yeSAoZm9yIGV4YW1wbGUgaWYgaXQgaXMgcGFydCBvZiBhIG1vbm9yZXBvKSxcbiAgICogeW91IGNhbiBzcGVjaWZ5IHRoZSBkaXJlY3RvcnkgaW4gd2hpY2ggaXQgbGl2ZXMuXG4gICAqL1xuICByZWFkb25seSByZXBvc2l0b3J5RGlyZWN0b3J5Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBdXRob3IncyBuYW1lXG4gICAqL1xuICByZWFkb25seSBhdXRob3JOYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBdXRob3IncyBlLW1haWxcbiAgICovXG4gIHJlYWRvbmx5IGF1dGhvckVtYWlsPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBdXRob3IncyBVUkwgLyBXZWJzaXRlXG4gICAqL1xuICByZWFkb25seSBhdXRob3JVcmw/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIElzIHRoZSBhdXRob3IgYW4gb3JnYW5pemF0aW9uXG4gICAqL1xuICByZWFkb25seSBhdXRob3JPcmdhbml6YXRpb24/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBQYWNrYWdlJ3MgSG9tZXBhZ2UgLyBXZWJzaXRlXG4gICAqL1xuICByZWFkb25seSBob21lcGFnZT86IHN0cmluZztcblxuICAvKipcbiAgICogUGFja2FnZSdzIFN0YWJpbGl0eVxuICAgKi9cbiAgcmVhZG9ubHkgc3RhYmlsaXR5Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgbWluaW11bSBub2RlIHZlcnNpb24gcmVxdWlyZWQgYnkgdGhpcyBwYWNrYWdlIHRvIGZ1bmN0aW9uLlxuICAgKiBNb3N0IHByb2plY3RzIHNob3VsZCBub3QgdXNlIHRoaXMgb3B0aW9uLlxuICAgKlxuICAgKiBUaGUgdmFsdWUgaW5kaWNhdGVzIHRoYXQgdGhlIHBhY2thZ2UgaXMgaW5jb21wYXRpYmxlIHdpdGggYW55IG9sZGVyIHZlcnNpb25zIG9mIG5vZGUuXG4gICAqIFRoaXMgcmVxdWlyZW1lbnQgaXMgZW5mb3JjZWQgdmlhIHRoZSBlbmdpbmVzIGZpZWxkLlxuICAgKlxuICAgKiBZb3Ugd2lsbCBub3JtYWxseSBub3QgbmVlZCB0byBzZXQgdGhpcyBvcHRpb24sIGV2ZW4gaWYgeW91ciBwYWNrYWdlIGlzIGluY29tcGF0aWJsZSB3aXRoIEVPTCB2ZXJzaW9ucyBvZiBub2RlLlxuICAgKiBDb25zaWRlciB0aGlzIG9wdGlvbiBvbmx5IGlmIHlvdXIgcGFja2FnZSBkZXBlbmRzIG9uIGEgc3BlY2lmaWMgZmVhdHVyZSwgdGhhdCBpcyBub3QgYXZhaWxhYmxlIGluIG90aGVyIExUUyB2ZXJzaW9ucy5cbiAgICogU2V0dGluZyB0aGlzIG9wdGlvbiBoYXMgdmVyeSBoaWdoIGltcGFjdCBvbiB0aGUgY29uc3VtZXJzIG9mIHlvdXIgcGFja2FnZSxcbiAgICogYXMgcGFja2FnZSBtYW5hZ2VycyB3aWxsIGFjdGl2ZWx5IHByZXZlbnQgdXNhZ2Ugd2l0aCBub2RlIHZlcnNpb25zIHlvdSBoYXZlIG1hcmtlZCBhcyBpbmNvbXBhdGlibGUuXG4gICAqXG4gICAqIFRvIGNoYW5nZSB0aGUgbm9kZSB2ZXJzaW9uIG9mIHlvdXIgQ0kvQ0Qgd29ya2Zsb3dzLCB1c2UgYHdvcmtmbG93Tm9kZVZlcnNpb25gLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIG1pbmltdW0gdmVyc2lvbiBpcyBlbmZvcmNlZFxuXG4gICAqL1xuICByZWFkb25seSBtaW5Ob2RlVmVyc2lvbj86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG1heGltdW0gbm9kZSB2ZXJzaW9uIHN1cHBvcnRlZCBieSB0aGlzIHBhY2thZ2UuXG4gICAqIE1vc3QgcHJvamVjdHMgc2hvdWxkIG5vdCB1c2UgdGhpcyBvcHRpb24uXG4gICAqXG4gICAqIFRoZSB2YWx1ZSBpbmRpY2F0ZXMgdGhhdCB0aGUgcGFja2FnZSBpcyBpbmNvbXBhdGlibGUgd2l0aCBhbnkgbmV3ZXIgdmVyc2lvbnMgb2Ygbm9kZS5cbiAgICogVGhpcyByZXF1aXJlbWVudCBpcyBlbmZvcmNlZCB2aWEgdGhlIGVuZ2luZXMgZmllbGQuXG4gICAqXG4gICAqIFlvdSB3aWxsIG5vcm1hbGx5IG5vdCBuZWVkIHRvIHNldCB0aGlzIG9wdGlvbi5cbiAgICogQ29uc2lkZXIgdGhpcyBvcHRpb24gb25seSBpZiB5b3VyIHBhY2thZ2UgaXMga25vd24gdG8gbm90IGZ1bmN0aW9uIHdpdGggbmV3ZXIgdmVyc2lvbnMgb2Ygbm9kZS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBubyBtYXhpbXVtIHZlcnNpb24gaXMgZW5mb3JjZWRcbiAgICovXG4gIHJlYWRvbmx5IG1heE5vZGVWZXJzaW9uPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgdmVyc2lvbiBvZiBQTlBNIHRvIHVzZSBpZiB1c2luZyBQTlBNIGFzIGEgcGFja2FnZSBtYW5hZ2VyLlxuICAgKlxuICAgKiBAZGVmYXVsdCBcIjEwLjMzLjBcIlxuICAgKi9cbiAgcmVhZG9ubHkgcG5wbVZlcnNpb24/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSB2ZXJzaW9uIG9mIEJ1biB0byB1c2UgaWYgdXNpbmcgQnVuIGFzIGEgcGFja2FnZSBtYW5hZ2VyLlxuICAgKlxuICAgKiBAZGVmYXVsdCBcImxhdGVzdFwiXG4gICAqL1xuICByZWFkb25seSBidW5WZXJzaW9uPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBMaWNlbnNlJ3MgU1BEWCBpZGVudGlmaWVyLlxuICAgKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3Byb2plbi9wcm9qZW4vdHJlZS9tYWluL2xpY2Vuc2UtdGV4dCBmb3IgYSBsaXN0IG9mIHN1cHBvcnRlZCBsaWNlbnNlcy5cbiAgICogVXNlIHRoZSBgbGljZW5zZWRgIG9wdGlvbiBpZiB5b3Ugd2FudCB0byBubyBsaWNlbnNlIHRvIGJlIHNwZWNpZmllZC5cbiAgICpcbiAgICogQGRlZmF1bHQgXCJBcGFjaGUtMi4wXCJcbiAgICovXG4gIHJlYWRvbmx5IGxpY2Vuc2U/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyBpZiBhIGxpY2Vuc2Ugc2hvdWxkIGJlIGFkZGVkLlxuICAgKlxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICByZWFkb25seSBsaWNlbnNlZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoZSBiYXNlIFVSTCBvZiB0aGUgbnBtIHBhY2thZ2UgcmVnaXN0cnkuXG4gICAqXG4gICAqIE11c3QgYmUgYSBVUkwgKGUuZy4gc3RhcnQgd2l0aCBcImh0dHBzOi8vXCIgb3IgXCJodHRwOi8vXCIpXG4gICAqXG4gICAqIEBkZWZhdWx0IFwiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmdcIlxuICAgKi9cbiAgcmVhZG9ubHkgbnBtUmVnaXN0cnlVcmw/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSB1cmwgdG8geW91ciBwcm9qZWN0J3MgaXNzdWUgdHJhY2tlci5cbiAgICovXG4gIHJlYWRvbmx5IGJ1Z3NVcmw/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBlbWFpbCBhZGRyZXNzIHRvIHdoaWNoIGlzc3VlcyBzaG91bGQgYmUgcmVwb3J0ZWQuXG4gICAqL1xuICByZWFkb25seSBidWdzRW1haWw/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFjY2VzcyBsZXZlbCBvZiB0aGUgbnBtIHBhY2thZ2UuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gZm9yIHNjb3BlZCBwYWNrYWdlcyAoZS5nLiBgZm9vQGJhcmApLCB0aGUgZGVmYXVsdCBpc1xuICAgKiBgTnBtQWNjZXNzLlJFU1RSSUNURURgLCBmb3Igbm9uLXNjb3BlZCBwYWNrYWdlcywgdGhlIGRlZmF1bHQgaXNcbiAgICogYE5wbUFjY2Vzcy5QVUJMSUNgLlxuICAgKi9cbiAgcmVhZG9ubHkgbnBtQWNjZXNzPzogTnBtQWNjZXNzO1xuXG4gIC8qKlxuICAgKiBTaG91bGQgcHJvdmVuYW5jZSBzdGF0ZW1lbnRzIGJlIGdlbmVyYXRlZCB3aGVuIHRoZSBwYWNrYWdlIGlzIHB1Ymxpc2hlZC5cbiAgICpcbiAgICogQSBzdXBwb3J0ZWQgcGFja2FnZSBtYW5hZ2VyIGlzIHJlcXVpcmVkIHRvIHB1Ymxpc2ggYSBwYWNrYWdlIHdpdGggbnBtIHByb3ZlbmFuY2Ugc3RhdGVtZW50cyBhbmRcbiAgICogeW91IHdpbGwgbmVlZCB0byB1c2UgYSBzdXBwb3J0ZWQgQ0kvQ0QgcHJvdmlkZXIuXG4gICAqXG4gICAqIE5vdGUgdGhhdCB0aGUgcHJvamVuIGBSZWxlYXNlYCBhbmQgYFB1Ymxpc2hlcmAgY29tcG9uZW50cyBhcmUgdXNpbmcgYHB1YmxpYmAgdG8gcHVibGlzaCBwYWNrYWdlcyxcbiAgICogd2hpY2ggaXMgdXNpbmcgbnBtIGludGVybmFsbHkgYW5kIHN1cHBvcnRzIHByb3ZlbmFuY2Ugc3RhdGVtZW50cyBpbmRlcGVuZGVudGx5IG9mIHRoZSBwYWNrYWdlIG1hbmFnZXIgdXNlZC5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2RvY3MubnBtanMuY29tL2dlbmVyYXRpbmctcHJvdmVuYW5jZS1zdGF0ZW1lbnRzXG4gICAqIEBkZWZhdWx0IC0gdHJ1ZSBmb3IgcHVibGljIHBhY2thZ2VzLCBmYWxzZSBvdGhlcndpc2VcbiAgICovXG4gIHJlYWRvbmx5IG5wbVByb3ZlbmFuY2U/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBHaXRIdWIgc2VjcmV0IHdoaWNoIGNvbnRhaW5zIHRoZSBOUE0gdG9rZW4gdG8gdXNlIHdoZW4gcHVibGlzaGluZyBwYWNrYWdlcy5cbiAgICpcbiAgICogQGRlZmF1bHQgXCJOUE1fVE9LRU5cIlxuICAgKi9cbiAgcmVhZG9ubHkgbnBtVG9rZW5TZWNyZXQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFVzZSB0cnVzdGVkIHB1Ymxpc2hpbmcgZm9yIHB1Ymxpc2hpbmcgdG8gbnBtanMuY29tXG4gICAqIE5lZWRzIHRvIGJlIHByZS1jb25maWd1cmVkIG9uIG5wbS5qcyB0byB3b3JrLlxuICAgKlxuICAgKiBAc2VlXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IG5wbVRydXN0ZWRQdWJsaXNoaW5nPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogT3B0aW9ucyBmb3IgbnBtIHBhY2thZ2VzIHVzaW5nIEFXUyBDb2RlQXJ0aWZhY3QuXG4gICAqIFRoaXMgaXMgcmVxdWlyZWQgaWYgcHVibGlzaGluZyBwYWNrYWdlcyB0bywgb3IgaW5zdGFsbGluZyBzY29wZWQgcGFja2FnZXMgZnJvbSBBV1MgQ29kZUFydGlmYWN0XG4gICAqXG4gICAqIEBkZWZhdWx0IC0gdW5kZWZpbmVkXG4gICAqL1xuICByZWFkb25seSBjb2RlQXJ0aWZhY3RPcHRpb25zPzogQ29kZUFydGlmYWN0T3B0aW9ucztcblxuICAvKipcbiAgICogT3B0aW9ucyBmb3IgcHJpdmF0ZWx5IGhvc3RlZCBzY29wZWQgcGFja2FnZXNcbiAgICpcbiAgICogQGRlZmF1bHQgLSBmZXRjaCBhbGwgc2NvcGVkIHBhY2thZ2VzIGZyb20gdGhlIHB1YmxpYyBucG0gcmVnaXN0cnlcbiAgICovXG4gIHJlYWRvbmx5IHNjb3BlZFBhY2thZ2VzT3B0aW9ucz86IFNjb3BlZFBhY2thZ2VzT3B0aW9uc1tdO1xuXG4gIC8qKlxuICAgKiBPcHRpb25zIGZvciBZYXJuIEJlcnJ5XG4gICAqXG4gICAqIEBkZWZhdWx0IC0gWWFybiBCZXJyeSB2NCB3aXRoIGFsbCBkZWZhdWx0IG9wdGlvbnNcbiAgICovXG4gIHJlYWRvbmx5IHlhcm5CZXJyeU9wdGlvbnM/OiBZYXJuQmVycnlPcHRpb25zO1xuXG4gIC8qKlxuICAgKiBPcHRpb25zIGZvciBwbnBtXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gYWxsIGRlZmF1bHQgb3B0aW9uc1xuICAgKi9cbiAgcmVhZG9ubHkgcG5wbU9wdGlvbnM/OiBQbnBtT3B0aW9ucztcblxuICAvKipcbiAgICogQ29uZmlndXJlIHRoZSBgZGV2RW5naW5lc2AgZmllbGQgaW4gYHBhY2thZ2UuanNvbmAuXG4gICAqXG4gICAqIFRoZSBgZGV2RW5naW5lcy5wYWNrYWdlTWFuYWdlcmAgZmllbGQgaXMgYXV0b21hdGljYWxseSBwb3B1bGF0ZWQgYmFzZWQgb25cbiAgICogdGhlIHJlc29sdmVkIGBwYWNrYWdlTWFuYWdlcmAgdmFsdWUuIEFueSBmaWVsZHMgcHJvdmlkZWQgaGVyZSBhcmUgbWVyZ2VkXG4gICAqIHdpdGggdGhlIGF1dG8tcG9wdWxhdGVkIGBwYWNrYWdlTWFuYWdlcmAgZW50cnkuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLm5wbWpzLmNvbS9jbGkvdjEwL2NvbmZpZ3VyaW5nLW5wbS9wYWNrYWdlLWpzb24jZGV2ZW5naW5lc1xuICAgKi9cbiAgcmVhZG9ubHkgZGV2RW5naW5lcz86IERldkVuZ2luZXM7XG5cbiAgLyoqXG4gICAqIEF1dG9tYXRpY2FsbHkgYWRkIHRoZSByZXNvbHZlZCBgcGFja2FnZU1hbmFnZXJgIHRvIGBkZXZFbmdpbmVzLnBhY2thZ2VNYW5hZ2VyYFxuICAgKiBpbiBgcGFja2FnZS5qc29uYCwgc2V0dGluZyBgb25GYWlsYCB0byBgaWdub3JlYC5cbiAgICpcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgcmVhZG9ubHkgYWRkUGFja2FnZU1hbmFnZXJUb0RldkVuZ2luZXM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBBdXRvbWF0aWNhbGx5IGRlbGV0ZSBsb2NrZmlsZXMgZnJvbSBwYWNrYWdlIG1hbmFnZXJzIHRoYXQgYXJlIG5vdCB0aGVcbiAgICogYWN0aXZlIG9uZS4gT25seSB0cmlnZ2VyZWQgd2hlbiB0aGUgbG9ja2ZpbGUgZm9yIHRoZSBjb25maWd1cmVkIHBhY2thZ2VcbiAgICogbWFuYWdlciBhbHJlYWR5IGV4aXN0cy5cbiAgICpcbiAgICogVGhpcyBpcyB1c2VmdWwgd2hlbiBtaWdyYXRpbmcgYmV0d2VlbiBwYWNrYWdlIG1hbmFnZXJzIHRvIGF2b2lkIGNvbmZsaWN0cy5cbiAgICpcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgcmVhZG9ubHkgZGVsZXRlT3JwaGFuZWRMb2NrRmlsZXM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBMaXN0IG9mIGRlcGVuZGVuY3kgKHBhY2thZ2UpIG5hbWVzIHRoYXQgYXJlIGFsbG93ZWQgdG8gcnVuIGxpZmVjeWNsZVxuICAgKiBpbnN0YWxsIHNjcmlwdHMgKGBwcmVpbnN0YWxsYCwgYGluc3RhbGxgLCBgcG9zdGluc3RhbGxgLCBgcHJlcGFyZWApXG4gICAqIGR1cmluZyBkZXBlbmRlbmN5IGluc3RhbGxhdGlvbi5cbiAgICpcbiAgICogVGhlc2Ugc2NyaXB0cyBjYW4gZXhlY3V0ZSBhcmJpdHJhcnkgY29kZSwgbWFraW5nIHRoZW0gYSBjb21tb25cbiAgICogc3VwcGx5LWNoYWluIGF0dGFjayB2ZWN0b3IuIFBhY2thZ2UgbWFuYWdlcnMgYXJlIG1vdmluZyB0b3dhcmRcbiAgICogYmxvY2tpbmcgdGhlbSBieSBkZWZhdWx0IGFuZCByZXF1aXJpbmcgYW4gZXhwbGljaXQgYWxsb3dsaXN0LlxuICAgKiBDb25maWd1cmluZyBgYWxsb3dTY3JpcHRzYCBzZXRzIHVwIHRoYXQgYWxsb3dsaXN0IHNvIHNjcmlwdHMgb25seSBydW5cbiAgICogZm9yIHRoZSBwYWNrYWdlcyB5b3UgaGF2ZSBleHBsaWNpdGx5IHJldmlld2VkIGFuZCB0cnVzdC5cbiAgICpcbiAgICogU3VwcG9ydCBmb3IgdGhpcyBzZXR0aW5nIGRlcGVuZHMgb24gdGhlIGNvbmZpZ3VyZWQgYHBhY2thZ2VNYW5hZ2VyYDpcbiAgICpcbiAgICogLSBgTlBNYDogd3JpdHRlbiB0byB0aGUgbmF0aXZlIGBhbGxvd1NjcmlwdHNgIGZpZWxkIGluIGBwYWNrYWdlLmpzb25gXG4gICAqICAgKHJlcXVpcmVzIG5wbSA+PSAxMS4xNjsgc2VlIGh0dHBzOi8vZG9jcy5ucG1qcy5jb20vY2xpL3YxMS9jb21tYW5kcy9ucG0tYXBwcm92ZS1zY3JpcHRzKS5cbiAgICogLSBgQlVOYDogd3JpdHRlbiB0byB0aGUgbmF0aXZlIGB0cnVzdGVkRGVwZW5kZW5jaWVzYCBmaWVsZCBpblxuICAgKiAgIGBwYWNrYWdlLmpzb25gIChzZWUgaHR0cHM6Ly9idW4uY29tL2RvY3MvcG0vbGlmZWN5Y2xlKS5cbiAgICogLSBgUE5QTWA6IHdyaXR0ZW4gdG8gdGhlIGBvbmx5QnVpbHREZXBlbmRlbmNpZXNgIHNldHRpbmcgaW5cbiAgICogICBgcG5wbS13b3Jrc3BhY2UueWFtbGAgKHNlZSBodHRwczovL3BucG0uaW8vc2V0dGluZ3Mjb25seWJ1aWx0ZGVwZW5kZW5jaWVzKS5cbiAgICogLSBgWUFSTjJgLCBgWUFSTl9CRVJSWWA6IHdyaXR0ZW4gdG8gdGhlIG5hdGl2ZVxuICAgKiAgIGBkZXBlbmRlbmNpZXNNZXRhLjxwa2c+LmJ1aWx0YCBhbGxvd2xpc3QgaW4gYHBhY2thZ2UuanNvbmAsIGNvbWJpbmVkXG4gICAqICAgd2l0aCBgZW5hYmxlU2NyaXB0czogZmFsc2VgIGluIGAueWFybnJjLnltbGAgKHNlZVxuICAgKiAgIGh0dHBzOi8veWFybnBrZy5jb20vZmVhdHVyZXMvc2VjdXJpdHkjcG9zdGluc3RhbGxzKS4gSWYgeW91IHNldFxuICAgKiAgIGB5YXJuQmVycnlPcHRpb25zLnlhcm5SY09wdGlvbnMuZW5hYmxlU2NyaXB0c2AgZXhwbGljaXRseSwgdGhhdCB2YWx1ZVxuICAgKiAgIGlzIHJlc3BlY3RlZCBpbnN0ZWFkIG9mIGJlaW5nIG92ZXJyaWRkZW4uXG4gICAqIC0gYFlBUk5gLCBgWUFSTl9DTEFTU0lDYDogbm90IHN1cHBvcnRlZC4gWWFybiBDbGFzc2ljIGhhcyBubyBuYXRpdmVcbiAgICogICBtZWNoYW5pc20gdG8gYWxsb3dsaXN0IGluc3RhbGwgc2NyaXB0cyBmb3Igc3BlY2lmaWMgZGVwZW5kZW5jaWVzLlxuICAgKiAgIFNldHRpbmcgdGhpcyBvcHRpb24gd2l0aCBvbmUgb2YgdGhlc2UgcGFja2FnZSBtYW5hZ2VycyB0aHJvd3MgYW5cbiAgICogICBlcnJvciBhdCBzeW50aGVzaXMgdGltZS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBhbGwgaW5zdGFsbCBzY3JpcHRzIGFyZSBhbGxvd2VkIHRvIHJ1biAocGFja2FnZSBtYW5hZ2VyIGRlZmF1bHQpXG4gICAqL1xuICByZWFkb25seSBhbGxvd1NjcmlwdHM/OiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBBIGRlcGVuZGVuY3kgZW50cnkgZm9yIHRoZSBgZGV2RW5naW5lc2AgZmllbGQgaW4gYHBhY2thZ2UuanNvbmAuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGV2RW5naW5lRGVwZW5kZW5jeSB7XG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgZGVwZW5kZW5jeS5cbiAgICovXG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHZlcnNpb24gcmFuZ2UgZm9yIHRoZSBkZXBlbmRlbmN5LlxuICAgKlxuICAgKiBAZGVmYXVsdCBcIipcIlxuICAgKi9cbiAgcmVhZG9ubHkgdmVyc2lvbj86IHN0cmluZztcblxuICAvKipcbiAgICogV2hhdCBhY3Rpb24gdG8gdGFrZSBpZiB2YWxpZGF0aW9uIGZhaWxzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBcImVycm9yXCJcbiAgICovXG4gIHJlYWRvbmx5IG9uRmFpbD86IFwiaWdub3JlXCIgfCBcIndhcm5cIiB8IFwiZXJyb3JcIiB8IFwiZG93bmxvYWRcIjtcbn1cblxuLyoqXG4gKiBUaGUgYGRldkVuZ2luZXNgIGZpZWxkIGluIGBwYWNrYWdlLmpzb25gLlxuICpcbiAqIEBzZWUgaHR0cHM6Ly9kb2NzLm5wbWpzLmNvbS9jbGkvdjEwL2NvbmZpZ3VyaW5nLW5wbS9wYWNrYWdlLWpzb24jZGV2ZW5naW5lc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIERldkVuZ2luZXMge1xuICAvKipcbiAgICogU3VwcG9ydGVkIG9wZXJhdGluZyBzeXN0ZW1zLlxuICAgKi9cbiAgcmVhZG9ubHkgb3M/OiBEZXZFbmdpbmVEZXBlbmRlbmN5IHwgRGV2RW5naW5lRGVwZW5kZW5jeVtdO1xuXG4gIC8qKlxuICAgKiBTdXBwb3J0ZWQgQ1BVIGFyY2hpdGVjdHVyZXMuXG4gICAqL1xuICByZWFkb25seSBjcHU/OiBEZXZFbmdpbmVEZXBlbmRlbmN5IHwgRGV2RW5naW5lRGVwZW5kZW5jeVtdO1xuXG4gIC8qKlxuICAgKiBTdXBwb3J0ZWQgQyBzdGFuZGFyZCBsaWJyYXJpZXMuXG4gICAqL1xuICByZWFkb25seSBsaWJjPzogRGV2RW5naW5lRGVwZW5kZW5jeSB8IERldkVuZ2luZURlcGVuZGVuY3lbXTtcblxuICAvKipcbiAgICogU3VwcG9ydGVkIEphdmFTY3JpcHQgcnVudGltZXMuXG4gICAqL1xuICByZWFkb25seSBydW50aW1lPzogRGV2RW5naW5lRGVwZW5kZW5jeSB8IERldkVuZ2luZURlcGVuZGVuY3lbXTtcblxuICAvKipcbiAgICogU3VwcG9ydGVkIHBhY2thZ2UgbWFuYWdlcnMuXG4gICAqL1xuICByZWFkb25seSBwYWNrYWdlTWFuYWdlcj86IERldkVuZ2luZURlcGVuZGVuY3kgfCBEZXZFbmdpbmVEZXBlbmRlbmN5W107XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgYXV0aG9yaXppbmcgcmVxdWVzdHMgdG8gYSBBV1MgQ29kZUFydGlmYWN0IG5wbSByZXBvc2l0b3J5LlxuICovXG5leHBvcnQgZW51bSBDb2RlQXJ0aWZhY3RBdXRoUHJvdmlkZXIge1xuICAvKipcbiAgICogRml4ZWQgY3JlZGVudGlhbHMgcHJvdmlkZWQgdmlhIEdpdGh1YiBzZWNyZXRzLlxuICAgKi9cbiAgQUNDRVNTX0FORF9TRUNSRVRfS0VZX1BBSVIgPSBcIkFDQ0VTU19BTkRfU0VDUkVUX0tFWV9QQUlSXCIsXG5cbiAgLyoqXG4gICAqIEVwaGVtZXJhbCBjcmVkZW50aWFscyBwcm92aWRlZCB2aWEgR2l0aHViJ3MgT0lEQyBpbnRlZ3JhdGlvbiB3aXRoIGFuIElBTSByb2xlLlxuICAgKiBTZWU6XG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9pZF9yb2xlc19wcm92aWRlcnNfY3JlYXRlX29pZGMuaHRtbFxuICAgKiBodHRwczovL2RvY3MuZ2l0aHViLmNvbS9lbi9hY3Rpb25zL2RlcGxveW1lbnQvc2VjdXJpdHktaGFyZGVuaW5nLXlvdXItZGVwbG95bWVudHMvY29uZmlndXJpbmctb3BlbmlkLWNvbm5lY3QtaW4tYW1hem9uLXdlYi1zZXJ2aWNlc1xuICAgKi9cbiAgR0lUSFVCX09JREMgPSBcIkdJVEhVQl9PSURDXCIsXG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgcHVibGlzaGluZyBucG0gcGFja2FnZXMgdG8gQVdTIENvZGVBcnRpZmFjdC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb2RlQXJ0aWZhY3RPcHRpb25zIHtcbiAgLyoqXG4gICAqIFByb3ZpZGVyIHRvIHVzZSBmb3IgYXV0aG9yaXppbmcgcmVxdWVzdHMgdG8gQVdTIENvZGVBcnRpZmFjdC5cbiAgICpcbiAgICogQGRlZmF1bHQgQ29kZUFydGlmYWN0QXV0aFByb3ZpZGVyLkFDQ0VTU19BTkRfU0VDUkVUX0tFWV9QQUlSXG4gICAqL1xuICByZWFkb25seSBhdXRoUHJvdmlkZXI/OiBDb2RlQXJ0aWZhY3RBdXRoUHJvdmlkZXI7XG5cbiAgLyoqXG4gICAqIEdpdEh1YiBzZWNyZXQgd2hpY2ggY29udGFpbnMgdGhlIEFXUyBhY2Nlc3Mga2V5IElEIHRvIHVzZSB3aGVuIHB1Ymxpc2hpbmcgcGFja2FnZXMgdG8gQVdTIENvZGVBcnRpZmFjdC5cbiAgICogVGhpcyBwcm9wZXJ0eSBtdXN0IGJlIHNwZWNpZmllZCBvbmx5IHdoZW4gcHVibGlzaGluZyB0byBBV1MgQ29kZUFydGlmYWN0IChgbnBtUmVnaXN0cnlVcmxgIGNvbnRhaW5zIEFXUyBDb2RlQXJ0aWZhY3QgVVJMKS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBXaGVuIHRoZSBgYXV0aFByb3ZpZGVyYCB2YWx1ZSBpcyBzZXQgdG9cbiAgICogYENvZGVBcnRpZmFjdEF1dGhQcm92aWRlci5BQ0NFU1NfQU5EX1NFQ1JFVF9LRVlfUEFJUmAsIHRoZSBkZWZhdWx0IGlzXG4gICAqIFwiQVdTX0FDQ0VTU19LRVlfSURcIi4gRm9yIGBDb2RlQXJ0aWZhY3RBdXRoUHJvdmlkZXIuR0lUSFVCX09JRENgLCB0aGlzXG4gICAqIHZhbHVlIG11c3QgYmUgbGVmdCB1bmRlZmluZWQuXG4gICAqL1xuICByZWFkb25seSBhY2Nlc3NLZXlJZFNlY3JldD86IHN0cmluZztcblxuICAvKipcbiAgICogR2l0SHViIHNlY3JldCB3aGljaCBjb250YWlucyB0aGUgQVdTIHNlY3JldCBhY2Nlc3Mga2V5IHRvIHVzZSB3aGVuIHB1Ymxpc2hpbmcgcGFja2FnZXMgdG8gQVdTIENvZGVBcnRpZmFjdC5cbiAgICogVGhpcyBwcm9wZXJ0eSBtdXN0IGJlIHNwZWNpZmllZCBvbmx5IHdoZW4gcHVibGlzaGluZyB0byBBV1MgQ29kZUFydGlmYWN0IChgbnBtUmVnaXN0cnlVcmxgIGNvbnRhaW5zIEFXUyBDb2RlQXJ0aWZhY3QgVVJMKS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBXaGVuIHRoZSBgYXV0aFByb3ZpZGVyYCB2YWx1ZSBpcyBzZXQgdG9cbiAgICogYENvZGVBcnRpZmFjdEF1dGhQcm92aWRlci5BQ0NFU1NfQU5EX1NFQ1JFVF9LRVlfUEFJUmAsIHRoZSBkZWZhdWx0IGlzXG4gICAqIFwiQVdTX1NFQ1JFVF9BQ0NFU1NfS0VZXCIuIEZvciBgQ29kZUFydGlmYWN0QXV0aFByb3ZpZGVyLkdJVEhVQl9PSURDYCwgdGhpc1xuICAgKiB2YWx1ZSBtdXN0IGJlIGxlZnQgdW5kZWZpbmVkLlxuICAgKi9cbiAgcmVhZG9ubHkgc2VjcmV0QWNjZXNzS2V5U2VjcmV0Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBUk4gb2YgQVdTIHJvbGUgdG8gYmUgYXNzdW1lZCBwcmlvciB0byBnZXQgYXV0aG9yaXphdGlvbiB0b2tlbiBmcm9tIEFXUyBDb2RlQXJ0aWZhY3RcbiAgICogVGhpcyBwcm9wZXJ0eSBtdXN0IGJlIHNwZWNpZmllZCBvbmx5IHdoZW4gcHVibGlzaGluZyB0byBBV1MgQ29kZUFydGlmYWN0IChgcmVnaXN0cnlgIGNvbnRhaW5zIEFXUyBDb2RlQXJ0aWZhY3QgVVJMKS5cbiAgICogV2hlbiB1c2luZyB0aGUgYENvZGVBcnRpZmFjdEF1dGhQcm92aWRlci5HSVRIVUJfT0lEQ2AgYXV0aCBwcm92aWRlciwgdGhpcyB2YWx1ZSBtdXN0IGJlIGRlZmluZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IHVuZGVmaW5lZFxuICAgKi9cbiAgcmVhZG9ubHkgcm9sZVRvQXNzdW1lPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHNjb3BlZCBwYWNrYWdlc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFNjb3BlZFBhY2thZ2VzT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBTY29wZSBvZiB0aGUgcGFja2FnZXNcbiAgICpcbiAgICogQGV4YW1wbGUgXCJAYW5ndWxhclwiXG4gICAqL1xuICByZWFkb25seSBzY29wZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBVUkwgb2YgdGhlIHJlZ2lzdHJ5IGZvciBzY29wZWQgcGFja2FnZXNcbiAgICovXG4gIHJlYWRvbmx5IHJlZ2lzdHJ5VXJsOiBzdHJpbmc7XG59XG5cbi8qKlxuICogUmVwcmVzZW50cyB0aGUgbnBtIGBwYWNrYWdlLmpzb25gIGZpbGUuXG4gKi9cbmV4cG9ydCBjbGFzcyBOb2RlUGFja2FnZSBleHRlbmRzIENvbXBvbmVudCB7XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBgTm9kZVBhY2thZ2VgIGluc3RhbmNlIGFzc29jaWF0ZWQgd2l0aCBhIHByb2plY3Qgb3IgYHVuZGVmaW5lZGAgaWZcbiAgICogdGhlcmUgaXMgbm8gTm9kZVBhY2thZ2UuXG4gICAqIEBwYXJhbSBwcm9qZWN0IFRoZSBwcm9qZWN0XG4gICAqIEByZXR1cm5zIEEgTm9kZVBhY2thZ2UsIG9yIHVuZGVmaW5lZFxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBvZihwcm9qZWN0OiBQcm9qZWN0KTogTm9kZVBhY2thZ2UgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGlzSXQgPSAobzogQ29tcG9uZW50KTogbyBpcyBOb2RlUGFja2FnZSA9PiBvIGluc3RhbmNlb2YgTm9kZVBhY2thZ2U7XG4gICAgcmV0dXJuIHByb2plY3QuY29tcG9uZW50cy5maW5kKGlzSXQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBucG0gcGFja2FnZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBwYWNrYWdlTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgbW9kdWxlJ3MgZW50cnlwb2ludCAoZS5nLiBgbGliL2luZGV4LmpzYCkuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZW50cnlwb2ludDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBbGxvdyBwcm9qZWN0IHRvIHRha2UgbGlicmFyeSBkZXBlbmRlbmNpZXMuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgYWxsb3dMaWJyYXJ5RGVwZW5kZW5jaWVzOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgcGFja2FnZSBtYW5hZ2VyIHRvIHVzZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBwYWNrYWdlTWFuYWdlcjogTm9kZVBhY2thZ2VNYW5hZ2VyO1xuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCB1c2UgYGFkZEZpZWxkKHgsIHkpYFxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IG1hbmlmZXN0OiBhbnk7XG5cbiAgLyoqXG4gICAqIFRoZSBtaW5pbXVtIG5vZGUgdmVyc2lvbiByZXF1aXJlZCBieSB0aGlzIHBhY2thZ2UgdG8gZnVuY3Rpb24uXG4gICAqXG4gICAqIFRoaXMgdmFsdWUgaW5kaWNhdGVzIHRoZSBwYWNrYWdlIGlzIGluY29tcGF0aWJsZSB3aXRoIG9sZGVyIHZlcnNpb25zLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IG1pbk5vZGVWZXJzaW9uPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBNYXhpbXVtIG5vZGUgdmVyc2lvbiBzdXBwb3J0ZWQgYnkgdGhpcyBwYWNrYWdlLlxuICAgKlxuICAgKiBUaGUgdmFsdWUgaW5kaWNhdGVzIHRoZSBwYWNrYWdlIGlzIGluY29tcGF0aWJsZSB3aXRoIG5ld2VyIHZlcnNpb25zLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IG1heE5vZGVWZXJzaW9uPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgdmVyc2lvbiBvZiBQTlBNIHRvIHVzZSBpZiB1c2luZyBQTlBNIGFzIGEgcGFja2FnZSBtYW5hZ2VyLlxuICAgKlxuICAgKiBAcmV0dXJucyBgdW5kZWZpbmVkYCBpZiB0aGUgcGFja2FnZSBtYW5hZ2VyIGlzIG5vdCBQTlBNLlxuICAgKi9cbiAgcHVibGljIGdldCBwbnBtVmVyc2lvbigpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnBhY2thZ2VNYW5hZ2VyID09PSBOb2RlUGFja2FnZU1hbmFnZXIuUE5QTVxuICAgICAgPyB0aGlzLl9wbnBtVmVyc2lvblxuICAgICAgOiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHZlcnNpb24gb2YgQnVuIHRvIHVzZSBpZiB1c2luZyBCdW4gYXMgYSBwYWNrYWdlIG1hbmFnZXIuXG4gICAqXG4gICAqIEByZXR1cm5zIGB1bmRlZmluZWRgIGlmIHRoZSBwYWNrYWdlIG1hbmFnZXIgaXMgbm90IEJ1bi5cbiAgICovXG4gIHB1YmxpYyBnZXQgYnVuVmVyc2lvbigpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnBhY2thZ2VNYW5hZ2VyID09PSBOb2RlUGFja2FnZU1hbmFnZXIuQlVOXG4gICAgICA/IHRoaXMuX2J1blZlcnNpb25cbiAgICAgIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSB2ZXJzaW9uIG9mIFlhcm4gdG8gdXNlIGlmIHVzaW5nIFlhcm4gYXMgYSBwYWNrYWdlIG1hbmFnZXIuXG4gICAqXG4gICAqIEByZXR1cm5zIGB1bmRlZmluZWRgIGlmIHRoZSBwYWNrYWdlIG1hbmFnZXIgaXMgbm90IFlhcm4uXG4gICAqL1xuICBwdWJsaWMgZ2V0IHlhcm5WZXJzaW9uKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKGlzWWFybkJlcnJ5KHRoaXMucGFja2FnZU1hbmFnZXIpKSB7XG4gICAgICByZXR1cm4gdGhpcy5feWFybkJlcnJ5VmVyc2lvbjtcbiAgICB9XG4gICAgaWYgKGlzWWFybkNsYXNzaWModGhpcy5wYWNrYWdlTWFuYWdlcikpIHtcbiAgICAgIHJldHVybiBERUZBVUxUX1lBUk5fQ0xBU1NJQ19WRVJTSU9OO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfcG5wbVZlcnNpb246IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBfYnVuVmVyc2lvbjogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IF95YXJuQmVycnlWZXJzaW9uOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgX29wdGlvbnM6IE5vZGVQYWNrYWdlT3B0aW9ucztcblxuICAvKipcbiAgICogVGhlIFNQRFggbGljZW5zZSBvZiB0aGlzIG1vZHVsZS4gYHVuZGVmaW5lZGAgaWYgdGhpcyBwYWNrYWdlIGlzIG5vdCBsaWNlbnNlZC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBsaWNlbnNlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBucG0gcmVnaXN0cnkgKGUuZy4gYGh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnYCkuIFVzZSBgbnBtUmVnaXN0cnlIb3N0YCB0byBnZXQganVzdCB0aGUgaG9zdCBuYW1lLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IG5wbVJlZ2lzdHJ5VXJsOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBucG0gcmVnaXN0cnkgaG9zdCAoZS5nLiBgcmVnaXN0cnkubnBtanMub3JnYCkuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgbnBtUmVnaXN0cnk6IHN0cmluZztcblxuICAvKipcbiAgICogR2l0SHViIHNlY3JldCB3aGljaCBjb250YWlucyB0aGUgTlBNIHRva2VuIHRvIHVzZSB3aGVuIHB1Ymxpc2hpbmcgcGFja2FnZXMuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgbnBtVG9rZW5TZWNyZXQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIE9wdGlvbnMgZm9yIG5wbSBwYWNrYWdlcyB1c2luZyBBV1MgQ29kZUFydGlmYWN0LlxuICAgKiBUaGlzIGlzIHJlcXVpcmVkIGlmIHB1Ymxpc2hpbmcgcGFja2FnZXMgdG8sIG9yIGluc3RhbGxpbmcgc2NvcGVkIHBhY2thZ2VzIGZyb20gQVdTIENvZGVBcnRpZmFjdFxuICAgKlxuICAgKiBAZGVmYXVsdCAtIHVuZGVmaW5lZFxuICAgKi9cbiAgcmVhZG9ubHkgY29kZUFydGlmYWN0T3B0aW9ucz86IENvZGVBcnRpZmFjdE9wdGlvbnM7XG5cbiAgLyoqXG4gICAqIE9wdGlvbnMgZm9yIHByaXZhdGVseSBob3N0ZWQgc2NvcGVkIHBhY2thZ2VzXG4gICAqXG4gICAqIEBkZWZhdWx0IHVuZGVmaW5lZFxuICAgKi9cbiAgcmVhZG9ubHkgc2NvcGVkUGFja2FnZXNPcHRpb25zPzogU2NvcGVkUGFja2FnZXNPcHRpb25zW107XG5cbiAgLyoqXG4gICAqIG5wbSBwYWNrYWdlIGFjY2VzcyBsZXZlbC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBucG1BY2Nlc3M6IE5wbUFjY2VzcztcblxuICAvKipcbiAgICogU2hvdWxkIHByb3ZlbmFuY2Ugc3RhdGVtZW50cyBiZSBnZW5lcmF0ZWQgd2hlbiBwYWNrYWdlIGlzIHB1Ymxpc2hlZC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBucG1Qcm92ZW5hbmNlOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgbG9jayBmaWxlLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGxvY2tGaWxlOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSB0YXNrIGZvciBpbnN0YWxsaW5nIHByb2plY3QgZGVwZW5kZW5jaWVzIChub24tZnJvemVuKS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBpbnN0YWxsVGFzazogVGFzaztcblxuICAvKipcbiAgICogVGhlIHRhc2sgZm9yIGluc3RhbGxpbmcgcHJvamVjdCBkZXBlbmRlbmNpZXMgKGZyb3plbikuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgaW5zdGFsbENpVGFzazogVGFzaztcblxuICAvKipcbiAgICogVGhlIHRhc2sgZm9yIGRlZHVwbGljYXRpbmcgcHJvamVjdCBkZXBlbmRlbmNpZXMsIGlmIGNvbmZpZ3VyZWQuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZGVkdXBlVGFzaz86IFRhc2s7XG5cbiAgLyoqXG4gICAqIFRoZSBwYWNrYWdlLmpzb24gZmlsZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBmaWxlOiBKc29uRmlsZTtcblxuICBwcml2YXRlIHJlYWRvbmx5IHNjcmlwdHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgcHJpdmF0ZSByZWFkb25seSBzY3JpcHRzVG9CZVJlbW92ZWQgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBrZXl3b3JkczogU2V0PHN0cmluZz4gPSBuZXcgU2V0KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgYWxsb3dlZFNjcmlwdHM6IFNldDxzdHJpbmc+ID0gbmV3IFNldCgpO1xuICBwcml2YXRlIHJlYWRvbmx5IGJpbjogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICBwcml2YXRlIHJlYWRvbmx5IGVuZ2luZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgcHJpdmF0ZSByZWFkb25seSBwZWVyRGVwZW5kZW5jeU9wdGlvbnM6IFBlZXJEZXBlbmRlbmN5T3B0aW9ucztcbiAgcHJpdmF0ZSByZWFkb25seSBfcHJldj86IFJlY29yZDxzdHJpbmcsIGFueT47XG4gIHByaXZhdGUgX3JlbmRlcmVkRGVwcz86IE5wbURlcGVuZGVuY2llcztcbiAgcHJpdmF0ZSByZWFkb25seSBfcGFja2FnZU1hbmFnZXJFeHBsaWNpdDogYm9vbGVhbjtcblxuICBjb25zdHJ1Y3Rvcihwcm9qZWN0OiBQcm9qZWN0LCBvcHRpb25zOiBOb2RlUGFja2FnZU9wdGlvbnMgPSB7fSkge1xuICAgIHN1cGVyKHByb2plY3QpO1xuXG4gICAgdGhpcy5wYWNrYWdlTmFtZSA9IG9wdGlvbnMucGFja2FnZU5hbWUgPz8gcHJvamVjdC5uYW1lO1xuICAgIHRoaXMucGVlckRlcGVuZGVuY3lPcHRpb25zID0ge1xuICAgICAgcGlubmVkRGV2RGVwZW5kZW5jeTogdHJ1ZSxcbiAgICAgIC4uLm9wdGlvbnMucGVlckRlcGVuZGVuY3lPcHRpb25zLFxuICAgIH07XG4gICAgdGhpcy5hbGxvd0xpYnJhcnlEZXBlbmRlbmNpZXMgPSBvcHRpb25zLmFsbG93TGlicmFyeURlcGVuZGVuY2llcyA/PyB0cnVlO1xuXG4gICAgLy8gUmVhZCBwcmV2aW91cyBwYWNrYWdlLmpzb24gZWFybHkgc28gd2UgY2FuIHVzZSBpdCBmb3IgaW5mZXJlbmNlXG4gICAgdGhpcy5fcHJldiA9IHRoaXMucmVhZFBhY2thZ2VKc29uKCk7XG5cbiAgICAvLyBSZXNvbHZlIHBhY2thZ2UgbWFuYWdlcjogZXhwbGljaXQgPiBpbmZlcnJlZCBmcm9tIHBhY2thZ2UuanNvbiA+IGZhbGxiYWNrXG4gICAgaWYgKG9wdGlvbnMucGFja2FnZU1hbmFnZXIpIHtcbiAgICAgIHRoaXMucGFja2FnZU1hbmFnZXIgPSBvcHRpb25zLnBhY2thZ2VNYW5hZ2VyO1xuICAgICAgdGhpcy5fcGFja2FnZU1hbmFnZXJFeHBsaWNpdCA9IHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3BhY2thZ2VNYW5hZ2VyRXhwbGljaXQgPSBmYWxzZTtcbiAgICAgIGNvbnN0IGZyb21Qa2dKc29uID0gaW5mZXJQYWNrYWdlTWFuYWdlckZyb21Qa2dKc29uKFxuICAgICAgICB0aGlzLl9wcmV2LFxuICAgICAgICBwcm9qZWN0Lm91dGRpcixcbiAgICAgICk7XG4gICAgICBpZiAoZnJvbVBrZ0pzb24pIHtcbiAgICAgICAgdGhpcy5wYWNrYWdlTWFuYWdlciA9IGZyb21Qa2dKc29uO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5wcm9qZWN0LmxvZ2dlci53YXJuKFxuICAgICAgICAgIGBbREVQUkVDQVRFRF0gXCJwYWNrYWdlTWFuYWdlclwiIGlzIG5vdCBzZXQgaW4gcHJvamVucmMsIGRlZmF1bHRpbmcgdG8gXCIke05vZGVQYWNrYWdlTWFuYWdlci5ZQVJOX0NMQVNTSUN9XCIuIGAgK1xuICAgICAgICAgICAgYFRoaXMgd2lsbCBiZWNvbWUgYSByZXF1aXJlZCBvcHRpb24gaW4gYSBmdXR1cmUgdmVyc2lvbi4gUGxlYXNlIHNldCBpdCBleHBsaWNpdGx5LmAsXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMucGFja2FnZU1hbmFnZXIgPSBOb2RlUGFja2FnZU1hbmFnZXIuWUFSTl9DTEFTU0lDO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuZW50cnlwb2ludCA9IG9wdGlvbnMuZW50cnlwb2ludCA/PyBcImxpYi9pbmRleC5qc1wiO1xuICAgIHRoaXMubG9ja0ZpbGUgPSBkZXRlcm1pbmVMb2NrZmlsZSh0aGlzLnBhY2thZ2VNYW5hZ2VyKTtcblxuICAgIC8vIENsZWFuIHVwIGxvY2tmaWxlcyBmcm9tIG90aGVyIHBhY2thZ2UgbWFuYWdlcnMgZHVyaW5nIG1pZ3JhdGlvblxuICAgIGlmIChvcHRpb25zLmRlbGV0ZU9ycGhhbmVkTG9ja0ZpbGVzICE9PSBmYWxzZSkge1xuICAgICAgdGhpcy5kZWxldGVPcnBoYW5lZExvY2tGaWxlcygpO1xuICAgIH1cblxuICAgIHRoaXMucHJvamVjdC5hbm5vdGF0ZUdlbmVyYXRlZChgLyR7dGhpcy5sb2NrRmlsZX1gKTtcblxuICAgIGNvbnN0IHtcbiAgICAgIG5wbUFjY2VzcyxcbiAgICAgIG5wbVJlZ2lzdHJ5LFxuICAgICAgbnBtUmVnaXN0cnlVcmwsXG4gICAgICBucG1Ub2tlblNlY3JldCxcbiAgICAgIGNvZGVBcnRpZmFjdE9wdGlvbnMsXG4gICAgICBzY29wZWRQYWNrYWdlc09wdGlvbnMsXG4gICAgICBucG1Qcm92ZW5hbmNlLFxuICAgIH0gPSB0aGlzLnBhcnNlTnBtT3B0aW9ucyhvcHRpb25zKTtcbiAgICB0aGlzLm5wbUFjY2VzcyA9IG5wbUFjY2VzcztcbiAgICB0aGlzLm5wbVJlZ2lzdHJ5ID0gbnBtUmVnaXN0cnk7XG4gICAgdGhpcy5ucG1SZWdpc3RyeVVybCA9IG5wbVJlZ2lzdHJ5VXJsO1xuICAgIHRoaXMubnBtVG9rZW5TZWNyZXQgPSBucG1Ub2tlblNlY3JldDtcbiAgICB0aGlzLmNvZGVBcnRpZmFjdE9wdGlvbnMgPSBjb2RlQXJ0aWZhY3RPcHRpb25zO1xuICAgIHRoaXMuc2NvcGVkUGFja2FnZXNPcHRpb25zID0gc2NvcGVkUGFja2FnZXNPcHRpb25zO1xuICAgIHRoaXMubnBtUHJvdmVuYW5jZSA9IG5wbVByb3ZlbmFuY2U7XG5cbiAgICB0aGlzLnByb2Nlc3NEZXBzKG9wdGlvbnMpO1xuXG4gICAgLy8gZW1wdHkgb2JqZWN0cyBhcmUgaGVyZSB0byBwcmVzZXJ2ZSBvcmRlciBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHlcbiAgICB0aGlzLm1hbmlmZXN0ID0ge1xuICAgICAgbmFtZTogdGhpcy5wYWNrYWdlTmFtZSxcbiAgICAgIGRlc2NyaXB0aW9uOiBvcHRpb25zLmRlc2NyaXB0aW9uLFxuICAgICAgcmVwb3NpdG9yeTogIW9wdGlvbnMucmVwb3NpdG9yeVxuICAgICAgICA/IHVuZGVmaW5lZFxuICAgICAgICA6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiZ2l0XCIsXG4gICAgICAgICAgICB1cmw6IG9wdGlvbnMucmVwb3NpdG9yeSxcbiAgICAgICAgICAgIGRpcmVjdG9yeTogb3B0aW9ucy5yZXBvc2l0b3J5RGlyZWN0b3J5LFxuICAgICAgICAgIH0sXG4gICAgICBiaW46ICgpID0+IHRoaXMucmVuZGVyQmluKCksXG4gICAgICBzY3JpcHRzOiAoKSA9PiB0aGlzLnJlbmRlclNjcmlwdHMoKSxcbiAgICAgIGF1dGhvcjogdGhpcy5yZW5kZXJBdXRob3Iob3B0aW9ucyksXG4gICAgICBkZXZEZXBlbmRlbmNpZXM6IHt9LFxuICAgICAgcGVlckRlcGVuZGVuY2llczoge30sXG4gICAgICBkZXBlbmRlbmNpZXM6IHt9LFxuICAgICAgYnVuZGxlZERlcGVuZGVuY2llczogW10sXG4gICAgICAuLi50aGlzLnJlbmRlclBhY2thZ2VSZXNvbHV0aW9ucygpLFxuICAgICAga2V5d29yZHM6ICgpID0+IHRoaXMucmVuZGVyS2V5d29yZHMoKSxcbiAgICAgIGVuZ2luZXM6ICgpID0+IHRoaXMucmVuZGVyRW5naW5lcygpLFxuICAgICAgZGV2RW5naW5lczogKCkgPT4gdGhpcy5yZW5kZXJEZXZFbmdpbmVzKCksXG4gICAgICBtYWluOiB0aGlzLmVudHJ5cG9pbnQgIT09IFwiXCIgPyB0aGlzLmVudHJ5cG9pbnQgOiB1bmRlZmluZWQsXG4gICAgICBsaWNlbnNlOiAoKSA9PiB0aGlzLmxpY2Vuc2UgPz8gVU5MSUNFTlNFRCxcbiAgICAgIGhvbWVwYWdlOiBvcHRpb25zLmhvbWVwYWdlLFxuICAgICAgc3RhYmlsaXR5OiBvcHRpb25zLnN0YWJpbGl0eSxcbiAgICAgIHB1Ymxpc2hDb25maWc6ICgpID0+IHRoaXMucmVuZGVyUHVibGlzaENvbmZpZygpLFxuICAgICAgdHlwZXNWZXJzaW9uczogdGhpcy5fcHJldj8udHlwZXNWZXJzaW9ucyxcbiAgICAgIGFsbG93U2NyaXB0czpcbiAgICAgICAgdGhpcy5wYWNrYWdlTWFuYWdlciA9PT0gTm9kZVBhY2thZ2VNYW5hZ2VyLk5QTVxuICAgICAgICAgID8gKCkgPT4gdGhpcy5yZW5kZXJOcG1BbGxvd1NjcmlwdHMoKVxuICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgdHJ1c3RlZERlcGVuZGVuY2llczpcbiAgICAgICAgdGhpcy5wYWNrYWdlTWFuYWdlciA9PT0gTm9kZVBhY2thZ2VNYW5hZ2VyLkJVTlxuICAgICAgICAgID8gKCkgPT4gdGhpcy5yZW5kZXJCdW5UcnVzdGVkRGVwZW5kZW5jaWVzKClcbiAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgIGRlcGVuZGVuY2llc01ldGE6IGlzWWFybkJlcnJ5KHRoaXMucGFja2FnZU1hbmFnZXIpXG4gICAgICAgID8gKCkgPT4gdGhpcy5yZW5kZXJZYXJuQmVycnlEZXBlbmRlbmNpZXNNZXRhKClcbiAgICAgICAgOiB1bmRlZmluZWQsXG5cbiAgICAgIC8vIGluIHJlbGVhc2UgQ0kgYnVpbGRzIHdlIGJ1bXAgdGhlIHZlcnNpb24gYmVmb3JlIHdlIHJ1biBcImJ1aWxkXCIgc28gd2Ugd2FudFxuICAgICAgLy8gdG8gcHJlc2VydmUgdGhlIHZlcnNpb24gbnVtYmVyLiBvdGhlcndpc2UsIHdlIGFsd2F5cyBzZXQgaXQgdG8gMC4wLjBcbiAgICAgIHZlcnNpb246IHRoaXMuZGV0ZXJtaW5lVmVyc2lvbih0aGlzLl9wcmV2Py52ZXJzaW9uKSxcbiAgICAgIGJ1Z3M6XG4gICAgICAgIG9wdGlvbnMuYnVnc0VtYWlsIHx8IG9wdGlvbnMuYnVnc1VybFxuICAgICAgICAgID8ge1xuICAgICAgICAgICAgICBlbWFpbDogb3B0aW9ucy5idWdzRW1haWwsXG4gICAgICAgICAgICAgIHVybDogb3B0aW9ucy5idWdzVXJsLFxuICAgICAgICAgICAgfVxuICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgIH07XG5cbiAgICAvLyBSZXNvbHZlIHBhY2thZ2UgbWFuYWdlciB2ZXJzaW9uc1xuICAgIHRoaXMuX29wdGlvbnMgPSBvcHRpb25zO1xuICAgIHRoaXMuX3BucG1WZXJzaW9uID0gb3B0aW9ucy5wbnBtVmVyc2lvbiA/PyBERUZBVUxUX1BOUE1fVkVSU0lPTjtcbiAgICB0aGlzLl9idW5WZXJzaW9uID0gb3B0aW9ucy5idW5WZXJzaW9uID8/IFwibGF0ZXN0XCI7XG4gICAgdGhpcy5feWFybkJlcnJ5VmVyc2lvbiA9XG4gICAgICBvcHRpb25zLnlhcm5CZXJyeU9wdGlvbnM/LnZlcnNpb24gPz8gREVGQVVMVF9ZQVJOX0JFUlJZX1ZFUlNJT047XG4gICAgdGhpcy5hZGRBbGxvd2VkU2NyaXB0cyguLi4ob3B0aW9ucy5hbGxvd1NjcmlwdHMgPz8gW10pKTtcblxuICAgIC8vIENvbmZpZ3VyZSBZYXJuIEJlcnJ5IGlmIHVzaW5nXG4gICAgaWYgKGlzWWFybkJlcnJ5KHRoaXMucGFja2FnZU1hbmFnZXIpKSB7XG4gICAgICB0aGlzLmNvbmZpZ3VyZVlhcm5CZXJyeShwcm9qZWN0LCBvcHRpb25zKTtcbiAgICB9XG5cbiAgICAvLyBDb25maWd1cmUgcG5wbSBpZiB1c2luZ1xuICAgIGlmICh0aGlzLnBhY2thZ2VNYW5hZ2VyID09PSBOb2RlUGFja2FnZU1hbmFnZXIuUE5QTSkge1xuICAgICAgdGhpcy5jb25maWd1cmVQbnBtKHByb2plY3QsIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIHRoaXMuZmlsZSA9IG5ldyBKc29uRmlsZSh0aGlzLCBcInBhY2thZ2UuanNvblwiLCB7XG4gICAgICBvYmo6IHRoaXMubWFuaWZlc3QsXG4gICAgICByZWFkb25seTogZmFsc2UsIC8vIHdlIHdhbnQgXCJ5YXJuIGFkZFwiIHRvIHdvcmsgYW5kIHdlIGhhdmUgYW50aS10YW1wZXJcbiAgICAgIG5ld2xpbmU6IHRydWUsIC8vIGFsbCBwYWNrYWdlIG1hbmFnZXJzIHByZWZlciBhIG5ld2xpbmUsIHNlZSBodHRwczovL2dpdGh1Yi5jb20vcHJvamVuL3Byb2plbi9pc3N1ZXMvMjA3NlxuICAgICAgY29tbWl0dGVkOiB0cnVlLCAvLyBuZWVkcyB0byBiZSBjb21taXR0ZWQgc28gdXNlcnMgY2FuIGluc3RhbGwgdGhlIGRlcGVuZGVuY2llc1xuICAgIH0pO1xuXG4gICAgdGhpcy5hZGRLZXl3b3JkcyguLi4ob3B0aW9ucy5rZXl3b3JkcyA/PyBbXSkpO1xuICAgIHRoaXMuYWRkQmluKG9wdGlvbnMuYmluID8/IHt9KTtcblxuICAgIC8vIGF1dG9tYXRpY2FsbHkgYWRkIGFsbCBleGVjdXRhYmxlIGZpbGVzIHVuZGVyIFwiYmluXCJcbiAgICBpZiAob3B0aW9ucy5hdXRvRGV0ZWN0QmluID8/IHRydWUpIHtcbiAgICAgIHRoaXMuYXV0b0Rpc2NvdmVyQmluYXJpZXMoKTtcbiAgICB9XG5cbiAgICAvLyBub2RlIHZlcnNpb25cbiAgICB0aGlzLm1pbk5vZGVWZXJzaW9uID0gb3B0aW9ucy5taW5Ob2RlVmVyc2lvbjtcbiAgICB0aGlzLm1heE5vZGVWZXJzaW9uID0gb3B0aW9ucy5tYXhOb2RlVmVyc2lvbjtcbiAgICB0aGlzLmFkZE5vZGVFbmdpbmUoKTtcblxuICAgIHRoaXMuY29uZmlndXJlQ29yZXBhY2soKTtcblxuICAgIHRoaXMuYWRkQ29kZUFydGlmYWN0TG9naW5TY3JpcHQoKTtcblxuICAgIC8vIGxpY2Vuc2VcbiAgICBpZiAob3B0aW9ucy5saWNlbnNlZCA/PyB0cnVlKSB7XG4gICAgICB0aGlzLmxpY2Vuc2UgPSBvcHRpb25zLmxpY2Vuc2UgPz8gXCJBcGFjaGUtMi4wXCI7XG4gICAgfVxuXG4gICAgdGhpcy5pbnN0YWxsVGFzayA9IHByb2plY3QuYWRkVGFzayhcImluc3RhbGxcIiwge1xuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgIFwiSW5zdGFsbCBwcm9qZWN0IGRlcGVuZGVuY2llcyBhbmQgdXBkYXRlIGxvY2tmaWxlIChub24tZnJvemVuKVwiLFxuICAgICAgZXhlYzogdGhpcy5pbnN0YWxsQW5kVXBkYXRlTG9ja2ZpbGVDb21tYW5kLFxuICAgIH0pO1xuXG4gICAgdGhpcy5pbnN0YWxsQ2lUYXNrID0gcHJvamVjdC5hZGRUYXNrKFwiaW5zdGFsbDpjaVwiLCB7XG4gICAgICBkZXNjcmlwdGlvbjogXCJJbnN0YWxsIHByb2plY3QgZGVwZW5kZW5jaWVzIHVzaW5nIGZyb3plbiBsb2NrZmlsZVwiLFxuICAgICAgZXhlYzogdGhpcy5pbnN0YWxsQ29tbWFuZCxcbiAgICB9KTtcblxuICAgIC8vIE5lZWRzIHRvIGhhcHBlbiBhZnRlciB0aGUgaW5zdGFsbCB0YXNrcyBoYXZlIGJlZW4gYWRkZWRcbiAgICB0aGlzLmRlZHVwZVRhc2sgPSB0aGlzLm1heWJlQWRkRGVkdXBlVGFzayhvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgYGRlZHVwZWAgdGFzayBpZiBlbmFibGVkIHZpYSBgZGVkdXBlRGVwc2Agb3IgaW1wbGllZCBieVxuICAgKiBgeWFybkJlcnJ5T3B0aW9ucy5kZWR1cGVQYWNrYWdlc2AuXG4gICAqXG4gICAqIEByZXR1cm5zIHRoZSBkZWR1cGUgdGFzaywgb3IgYHVuZGVmaW5lZGAgaWYgbm90IGVuYWJsZWQuXG4gICAqL1xuICBwcml2YXRlIG1heWJlQWRkRGVkdXBlVGFzayhvcHRpb25zOiBOb2RlUGFja2FnZU9wdGlvbnMpOiBUYXNrIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCB5YXJuQmVycnlEZWR1cGVQYWNrYWdlcyA9IG9wdGlvbnMueWFybkJlcnJ5T3B0aW9ucz8uZGVkdXBlUGFja2FnZXM7XG4gICAgaWYgKCEob3B0aW9ucy5kZWR1cGVEZXBzID8/IHlhcm5CZXJyeURlZHVwZVBhY2thZ2VzICE9PSB1bmRlZmluZWQpKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnBhY2thZ2VNYW5hZ2VyID09PSBOb2RlUGFja2FnZU1hbmFnZXIuQlVOKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIFwiVGhlICdkZWR1cGVEZXBzJyBvcHRpb24gaXMgbm90IHN1cHBvcnRlZCBmb3IgQnVuOiBidW4gZG9lcyBub3QgcHJvdmlkZSBhIGRlZHVwZSBjb21tYW5kLlwiLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBkZWR1cGVUYXNrID0gdGhpcy5wcm9qZWN0LmFkZFRhc2soXCJkZWR1cGVcIiwge1xuICAgICAgZGVzY3JpcHRpb246IFwiRGVkdXBsaWNhdGUgcHJvamVjdCBkZXBlbmRlbmNpZXNcIixcbiAgICB9KTtcblxuICAgIGlmIChpc1lhcm5DbGFzc2ljKHRoaXMucGFja2FnZU1hbmFnZXIpKSB7XG4gICAgICAvLyBZYXJuIENsYXNzaWMgYWx3YXlzIGRlZHVwbGljYXRlcyBhcyBwYXJ0IG9mIGB5YXJuIGluc3RhbGxgXG4gICAgICBkZWR1cGVUYXNrLnNheShcbiAgICAgICAgXCJUaGUgZGVkdXBlIGNvbW1hbmQgaXNuJ3QgbmVjZXNzYXJ5LiBgeWFybiBpbnN0YWxsYCB3aWxsIGFscmVhZHkgZGVkdXBlLlwiLFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGVkdXBlVGFzay5leGVjQXJncyhcbiAgICAgICAgaXNZYXJuQmVycnkodGhpcy5wYWNrYWdlTWFuYWdlcilcbiAgICAgICAgICA/IFtcInlhcm5cIiwgXCJkZWR1cGVcIiwgLi4uKHlhcm5CZXJyeURlZHVwZVBhY2thZ2VzID8/IFtdKV1cbiAgICAgICAgICA6IFt0aGlzLnBhY2thZ2VNYW5hZ2VyLCBcImRlZHVwZVwiXSxcbiAgICAgICk7XG5cbiAgICAgIC8vIEFkZCBkZWR1cGUgdG8gbXV0YWJsZSBpbnN0YWxsIHRhc2tcbiAgICAgIHRoaXMuaW5zdGFsbFRhc2suc3Bhd24oZGVkdXBlVGFzayk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGRlZHVwZVRhc2s7XG4gIH1cblxuICAvKipcbiAgICogRGVmaW5lcyBub3JtYWwgZGVwZW5kZW5jaWVzLlxuICAgKlxuICAgKiBAcGFyYW0gZGVwcyBOYW1lcyBtb2R1bGVzIHRvIGluc3RhbGwuIEJ5IGRlZmF1bHQsIHRoZSB0aGUgZGVwZW5kZW5jeSB3aWxsXG4gICAqIGJlIGluc3RhbGxlZCBpbiB0aGUgbmV4dCBgcG5wbSBwcm9qZW5gIHJ1biBhbmQgdGhlIHZlcnNpb24gd2lsbCBiZSByZWNvcmRlZFxuICAgKiBpbiB5b3VyIGBwYWNrYWdlLmpzb25gIGZpbGUuIFlvdSBjYW4gdXBncmFkZSBtYW51YWxseSBvciB1c2luZyBgcG5wbVxuICAgKiBhZGQvdXBkYXRlYC4gSWYgeW91IHdpc2ggdG8gc3BlY2lmeSBhIHZlcnNpb24gcmFuZ2UgdXNlIHRoaXMgc3ludGF4OlxuICAgKiBgbW9kdWxlQF43YC5cbiAgICovXG4gIHB1YmxpYyBhZGREZXBzKC4uLmRlcHM6IHN0cmluZ1tdKSB7XG4gICAgZm9yIChjb25zdCBkZXAgb2YgZGVwcykge1xuICAgICAgdGhpcy5wcm9qZWN0LmRlcHMuYWRkRGVwZW5kZW5jeShkZXAsIERlcGVuZGVuY3lUeXBlLlJVTlRJTUUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEZWZpbmVzIGRldmVsb3BtZW50L3Rlc3QgZGVwZW5kZW5jaWVzLlxuICAgKlxuICAgKiBAcGFyYW0gZGVwcyBOYW1lcyBtb2R1bGVzIHRvIGluc3RhbGwuIEJ5IGRlZmF1bHQsIHRoZSB0aGUgZGVwZW5kZW5jeSB3aWxsXG4gICAqIGJlIGluc3RhbGxlZCBpbiB0aGUgbmV4dCBgcG5wbSBwcm9qZW5gIHJ1biBhbmQgdGhlIHZlcnNpb24gd2lsbCBiZSByZWNvcmRlZFxuICAgKiBpbiB5b3VyIGBwYWNrYWdlLmpzb25gIGZpbGUuIFlvdSBjYW4gdXBncmFkZSBtYW51YWxseSBvciB1c2luZyBgcG5wbVxuICAgKiBhZGQvdXBkYXRlYC4gSWYgeW91IHdpc2ggdG8gc3BlY2lmeSBhIHZlcnNpb24gcmFuZ2UgdXNlIHRoaXMgc3ludGF4OlxuICAgKiBgbW9kdWxlQF43YC5cbiAgICovXG4gIHB1YmxpYyBhZGREZXZEZXBzKC4uLmRlcHM6IHN0cmluZ1tdKSB7XG4gICAgZm9yIChjb25zdCBkZXAgb2YgZGVwcykge1xuICAgICAgdGhpcy5wcm9qZWN0LmRlcHMuYWRkRGVwZW5kZW5jeShkZXAsIERlcGVuZGVuY3lUeXBlLkJVSUxEKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRGVmaW5lcyBwZWVyIGRlcGVuZGVuY2llcy5cbiAgICpcbiAgICogV2hlbiBhZGRpbmcgcGVlciBkZXBlbmRlbmNpZXMsIGEgZGV2RGVwZW5kZW5jeSB3aWxsIGFsc28gYmUgYWRkZWQgb24gdGhlXG4gICAqIHBpbm5lZCB2ZXJzaW9uIG9mIHRoZSBkZWNsYXJlZCBwZWVyLiBUaGlzIHdpbGwgZW5zdXJlIHRoYXQgeW91IGFyZSB0ZXN0aW5nXG4gICAqIHlvdXIgY29kZSBhZ2FpbnN0IHRoZSBtaW5pbXVtIHZlcnNpb24gcmVxdWlyZWQgZnJvbSB5b3VyIGNvbnN1bWVycy5cbiAgICpcbiAgICogQHBhcmFtIGRlcHMgTmFtZXMgbW9kdWxlcyB0byBpbnN0YWxsLiBCeSBkZWZhdWx0LCB0aGUgdGhlIGRlcGVuZGVuY3kgd2lsbFxuICAgKiBiZSBpbnN0YWxsZWQgaW4gdGhlIG5leHQgYHBucG0gcHJvamVuYCBydW4gYW5kIHRoZSB2ZXJzaW9uIHdpbGwgYmUgcmVjb3JkZWRcbiAgICogaW4geW91ciBgcGFja2FnZS5qc29uYCBmaWxlLiBZb3UgY2FuIHVwZ3JhZGUgbWFudWFsbHkgb3IgdXNpbmcgYHBucG1cbiAgICogYWRkL3VwZGF0ZWAuIElmIHlvdSB3aXNoIHRvIHNwZWNpZnkgYSB2ZXJzaW9uIHJhbmdlIHVzZSB0aGlzIHN5bnRheDpcbiAgICogYG1vZHVsZUBeN2AuXG4gICAqL1xuICBwdWJsaWMgYWRkUGVlckRlcHMoLi4uZGVwczogc3RyaW5nW10pIHtcbiAgICBpZiAoT2JqZWN0LmtleXMoZGVwcykubGVuZ3RoICYmICF0aGlzLmFsbG93TGlicmFyeURlcGVuZGVuY2llcykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgY2Fubm90IGFkZCBwZWVyIGRlcGVuZGVuY2llcyB0byBhbiBBUFAgcHJvamVjdDogJHtPYmplY3Qua2V5cyhcbiAgICAgICAgICBkZXBzLFxuICAgICAgICApLmpvaW4oXCIsXCIpfWAsXG4gICAgICApO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgZGVwIG9mIGRlcHMpIHtcbiAgICAgIHRoaXMucHJvamVjdC5kZXBzLmFkZERlcGVuZGVuY3koZGVwLCBEZXBlbmRlbmN5VHlwZS5QRUVSKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRGVmaW5lcyBidW5kbGVkIGRlcGVuZGVuY2llcy5cbiAgICpcbiAgICogQnVuZGxlZCBkZXBlbmRlbmNpZXMgd2lsbCBiZSBhZGRlZCBhcyBub3JtYWwgZGVwZW5kZW5jaWVzIGFzIHdlbGwgYXMgdG8gdGhlXG4gICAqIGBidW5kbGVkRGVwZW5kZW5jaWVzYCBzZWN0aW9uIG9mIHlvdXIgYHBhY2thZ2UuanNvbmAuXG4gICAqXG4gICAqIEBwYXJhbSBkZXBzIE5hbWVzIG1vZHVsZXMgdG8gaW5zdGFsbC4gQnkgZGVmYXVsdCwgdGhlIHRoZSBkZXBlbmRlbmN5IHdpbGxcbiAgICogYmUgaW5zdGFsbGVkIGluIHRoZSBuZXh0IGBwbnBtIHByb2plbmAgcnVuIGFuZCB0aGUgdmVyc2lvbiB3aWxsIGJlIHJlY29yZGVkXG4gICAqIGluIHlvdXIgYHBhY2thZ2UuanNvbmAgZmlsZS4gWW91IGNhbiB1cGdyYWRlIG1hbnVhbGx5IG9yIHVzaW5nIGBwbnBtXG4gICAqIGFkZC91cGRhdGVgLiBJZiB5b3Ugd2lzaCB0byBzcGVjaWZ5IGEgdmVyc2lvbiByYW5nZSB1c2UgdGhpcyBzeW50YXg6XG4gICAqIGBtb2R1bGVAXjdgLlxuICAgKi9cbiAgcHVibGljIGFkZEJ1bmRsZWREZXBzKC4uLmRlcHM6IHN0cmluZ1tdKSB7XG4gICAgaWYgKGRlcHMubGVuZ3RoICYmICF0aGlzLmFsbG93TGlicmFyeURlcGVuZGVuY2llcykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgY2Fubm90IGFkZCBidW5kbGVkIGRlcGVuZGVuY2llcyB0byBhbiBBUFAgcHJvamVjdDogJHtkZXBzLmpvaW4oXCIsXCIpfWAsXG4gICAgICApO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgZGVwIG9mIGRlcHMpIHtcbiAgICAgIHRoaXMucHJvamVjdC5kZXBzLmFkZERlcGVuZGVuY3koZGVwLCBEZXBlbmRlbmN5VHlwZS5CVU5ETEVEKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhbiBgZW5naW5lc2AgcmVxdWlyZW1lbnQgdG8geW91ciBwYWNrYWdlLlxuICAgKiBAcGFyYW0gZW5naW5lIFRoZSBlbmdpbmUgKGUuZy4gYG5vZGVgKVxuICAgKiBAcGFyYW0gdmVyc2lvbiBUaGUgc2VtYW50aWMgdmVyc2lvbiByZXF1aXJlbWVudCAoZS5nLiBgXjEwYClcbiAgICovXG4gIHB1YmxpYyBhZGRFbmdpbmUoZW5naW5lOiBzdHJpbmcsIHZlcnNpb246IHN0cmluZykge1xuICAgIHRoaXMuZW5naW5lc1tlbmdpbmVdID0gdmVyc2lvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGtleXdvcmRzIHRvIHBhY2thZ2UuanNvbiAoZGVkdXBsaWNhdGVkKVxuICAgKiBAcGFyYW0ga2V5d29yZHMgVGhlIGtleXdvcmRzIHRvIGFkZFxuICAgKi9cbiAgcHVibGljIGFkZEtleXdvcmRzKC4uLmtleXdvcmRzOiBzdHJpbmdbXSkge1xuICAgIGZvciAoY29uc3QgayBvZiBrZXl3b3Jkcykge1xuICAgICAgdGhpcy5rZXl3b3Jkcy5hZGQoayk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFsbG93cyB0aGUgZ2l2ZW4gZGVwZW5kZW5jeSAocGFja2FnZSkgbmFtZXMgdG8gcnVuIGxpZmVjeWNsZSBpbnN0YWxsXG4gICAqIHNjcmlwdHMgKGBwcmVpbnN0YWxsYCwgYGluc3RhbGxgLCBgcG9zdGluc3RhbGxgLCBgcHJlcGFyZWApLCBpbiBhZGRpdGlvblxuICAgKiB0byBhbnkgYWxyZWFkeSBhbGxvd2VkIHZpYSB0aGUgYGFsbG93U2NyaXB0c2Agb3B0aW9uIG9yIHByZXZpb3VzIGNhbGxzLlxuICAgKlxuICAgKiBVc2VmdWwgZm9yIHByb2plY3QgdHlwZXMgdGhhdCB3YW50IHRvIGFsbG93bGlzdCBhIHBhY2thZ2UgYnkgZGVmYXVsdFxuICAgKiB3aGlsZSBzdGlsbCBsZXR0aW5nIGNvbnN1bWVycyBhZGQgZnVydGhlciBwYWNrYWdlcyB2aWEgYGFsbG93U2NyaXB0c2AuXG4gICAqXG4gICAqIEBwYXJhbSBwYWNrYWdlcyBUaGUgZGVwZW5kZW5jeSAocGFja2FnZSkgbmFtZXMgdG8gYWxsb3cuXG4gICAqIEBzZWUgTm9kZVBhY2thZ2VPcHRpb25zLmFsbG93U2NyaXB0c1xuICAgKi9cbiAgcHVibGljIGFkZEFsbG93ZWRTY3JpcHRzKC4uLnBhY2thZ2VzOiBzdHJpbmdbXSkge1xuICAgIGZvciAoY29uc3QgcGtnIG9mIHBhY2thZ2VzKSB7XG4gICAgICB0aGlzLmFsbG93ZWRTY3JpcHRzLmFkZChwa2cpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIHRoZSBnaXZlbiBkZXBlbmRlbmN5IChwYWNrYWdlKSBuYW1lcyBmcm9tIHRoZSBgYWxsb3dTY3JpcHRzYFxuICAgKiBhbGxvd2xpc3QsIHdoZXRoZXIgdGhleSB3ZXJlIGFkZGVkIHZpYSB0aGUgYGFsbG93U2NyaXB0c2Agb3B0aW9uLCBhXG4gICAqIHByb2plY3QgdHlwZSBkZWZhdWx0LCBvciBhIHByZXZpb3VzIGNhbGwgdG8gYGFkZEFsbG93ZWRTY3JpcHRzYC5cbiAgICpcbiAgICogQHBhcmFtIHBhY2thZ2VzIFRoZSBkZXBlbmRlbmN5IChwYWNrYWdlKSBuYW1lcyB0byByZW1vdmUuXG4gICAqIEBzZWUgTm9kZVBhY2thZ2VPcHRpb25zLmFsbG93U2NyaXB0c1xuICAgKi9cbiAgcHVibGljIHJlbW92ZUFsbG93ZWRTY3JpcHRzKC4uLnBhY2thZ2VzOiBzdHJpbmdbXSkge1xuICAgIGZvciAoY29uc3QgcGtnIG9mIHBhY2thZ2VzKSB7XG4gICAgICB0aGlzLmFsbG93ZWRTY3JpcHRzLmRlbGV0ZShwa2cpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBhZGRCaW4oYmluczogUmVjb3JkPHN0cmluZywgc3RyaW5nPikge1xuICAgIGZvciAoY29uc3QgW2ssIHZdIG9mIE9iamVjdC5lbnRyaWVzKGJpbnMpKSB7XG4gICAgICB0aGlzLmJpbltrXSA9IHY7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIG5wbSBwYWNrYWdlLmpzb24gc2NyaXB0LlxuICAgKlxuICAgKiBAcGFyYW0gbmFtZSBUaGUgc2NyaXB0IG5hbWVcbiAgICogQHBhcmFtIGNvbW1hbmQgVGhlIGNvbW1hbmQgdG8gZXhlY3V0ZVxuICAgKi9cbiAgcHVibGljIHNldFNjcmlwdChuYW1lOiBzdHJpbmcsIGNvbW1hbmQ6IHN0cmluZykge1xuICAgIHRoaXMuc2NyaXB0c1tuYW1lXSA9IGNvbW1hbmQ7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyBhbiBucG0gc2NyaXB0IChhbHdheXMgc3VjY2Vzc2Z1bCkuXG4gICAqXG4gICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBzY3JpcHQuXG4gICAqL1xuICBwdWJsaWMgcmVtb3ZlU2NyaXB0KG5hbWU6IHN0cmluZykge1xuICAgIC8vIG5lZWQgdG8ga2VlcCB0cmFjayBpbiBjYXNlIHRoZXJlJ3MgYSB0YXNrIG9mIHRoZSBzYW1lIG5hbWVcbiAgICB0aGlzLnNjcmlwdHNUb0JlUmVtb3ZlZC5hZGQobmFtZSk7XG4gICAgZGVsZXRlIHRoaXMuc2NyaXB0c1tuYW1lXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXJlY3RseSBzZXQgZmllbGRzIGluIGBwYWNrYWdlLmpzb25gLlxuICAgKiBAZXNjYXBlXG4gICAqIEBwYXJhbSBuYW1lIGZpZWxkIG5hbWVcbiAgICogQHBhcmFtIHZhbHVlIGZpZWxkIHZhbHVlXG4gICAqL1xuICBwdWJsaWMgYWRkRmllbGQobmFtZTogc3RyaW5nLCB2YWx1ZTogYW55KSB7XG4gICAgdGhpcy5tYW5pZmVzdFtuYW1lXSA9IHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIHBhY2thZ2UgdmVyc2lvbi5cbiAgICogQHBhcmFtIHZlcnNpb24gUGFja2FnZSB2ZXJzaW9uLlxuICAgKi9cbiAgcHVibGljIGFkZFZlcnNpb24odmVyc2lvbjogc3RyaW5nKSB7XG4gICAgdGhpcy5tYW5pZmVzdC52ZXJzaW9uID0gdmVyc2lvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWZpbmVzIHJlc29sdXRpb25zIGZvciBkZXBlbmRlbmNpZXMgdG8gY2hhbmdlIHRoZSBub3JtYWxseSByZXNvbHZlZFxuICAgKiB2ZXJzaW9uIG9mIGEgZGVwZW5kZW5jeSB0byBzb21ldGhpbmcgZWxzZS5cbiAgICpcbiAgICogQHBhcmFtIHJlc29sdXRpb25zIE5hbWVzIHJlc29sdXRpb25zIHRvIGJlIGFkZGVkLiBTcGVjaWZ5IGEgdmVyc2lvbiBvclxuICAgKiByYW5nZSB3aXRoIHRoaXMgc3ludGF4OlxuICAgKiBgbW9kdWxlQF43YFxuICAgKi9cbiAgcHVibGljIGFkZFBhY2thZ2VSZXNvbHV0aW9ucyguLi5yZXNvbHV0aW9uczogc3RyaW5nW10pIHtcbiAgICBmb3IgKGNvbnN0IHJlc29sdXRpb24gb2YgcmVzb2x1dGlvbnMpIHtcbiAgICAgIHRoaXMucHJvamVjdC5kZXBzLmFkZERlcGVuZGVuY3kocmVzb2x1dGlvbiwgRGVwZW5kZW5jeVR5cGUuT1ZFUlJJREUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBwYWNrYWdlIG1hbmFnZXIncyBpbW11dGFibGUgaW5zdGFsbCBjb21tYW5kIHdpdGggYSBmcm96ZW4gbG9ja2ZpbGUsIGUuZy4gYG5wbSBjaWAgb3IgYHBucG0gY2lgLlxuICAgKlxuICAgKiBQcmVmZXIgdXNpbmcgYE5vZGVQYWNrYWdlLmluc3RhbGxDaVRhc2tgLiBUaGUgcmF3IGNvbW1hbmQgc3RyaW5nIGlzIGludGVuZGVkIGZvciBib290c3RyYXBwaW5nLlxuICAgKi9cbiAgcHVibGljIGdldCBpbnN0YWxsQ29tbWFuZCgpIHtcbiAgICByZXR1cm4gdGhpcy5yZW5kZXJJbnN0YWxsQ29tbWFuZCh0cnVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBwYWNrYWdlIG1hbmFnZXIncyBtdXRhYmxlIGluc3RhbGwgY29tbWFuZCB3aXRoIGxvY2tmaWxlIHVwZGF0ZSwgZS5nLiBgbnBtIGluc3RhbGxgIG9yIGBwbnBtIGluc3RhbGxgLlxuICAgKlxuICAgKiBQcmVmZXIgdXNpbmcgYE5vZGVQYWNrYWdlLmluc3RhbGxUYXNrYC4gVGhlIHJhdyBjb21tYW5kIHN0cmluZyBpcyBpbnRlbmRlZCBmb3IgYm9vdHN0cmFwcGluZy5cbiAgICovXG4gIHB1YmxpYyBnZXQgaW5zdGFsbEFuZFVwZGF0ZUxvY2tmaWxlQ29tbWFuZCgpIHtcbiAgICByZXR1cm4gdGhpcy5yZW5kZXJJbnN0YWxsQ29tbWFuZChmYWxzZSk7XG4gIH1cblxuICAvKipcbiAgICogQXR0ZW1wdCB0byByZXNvbHZlIHRoZSBjdXJyZW50bHkgaW5zdGFsbGVkIHZlcnNpb24gZm9yIGEgZ2l2ZW4gZGVwZW5kZW5jeS5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogVGhpcyBtZXRob2Qgd2lsbCBmaXJzdCBsb29rIHRocm91Z2ggdGhlIGN1cnJlbnQgcHJvamVjdCdzIGRlcGVuZGVuY2llcy5cbiAgICogSWYgZm91bmQgYW5kIHNlbWFudGljYWxseSB2YWxpZCAobm90ICcqJyksIHRoYXQgd2lsbCBiZSB1c2VkLlxuICAgKiBPdGhlcndpc2UsIGl0IHdpbGwgZmFsbCBiYWNrIHRvIGxvY2F0aW5nIGEgYHBhY2thZ2UuanNvbmAgbWFuaWZlc3QgZm9yIHRoZSBkZXBlbmRlbmN5XG4gICAqIHRocm91Z2ggbm9kZSdzIGludGVybmFsIHJlc29sdXRpb24gcmVhZGluZyB0aGUgdmVyc2lvbiBmcm9tIHRoZXJlLlxuICAgKlxuICAgKiBAcGFyYW0gZGVwZW5kZW5jeU5hbWUgRGVwZW5kZW5jeSB0byByZXNvbHZlIGZvci5cbiAgICovXG4gIHB1YmxpYyB0cnlSZXNvbHZlRGVwZW5kZW5jeVZlcnNpb24oXG4gICAgZGVwZW5kZW5jeU5hbWU6IHN0cmluZyxcbiAgKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZnJvbURlcHMgPSB0aGlzLnByb2plY3QuZGVwcy50cnlHZXREZXBlbmRlbmN5KGRlcGVuZGVuY3lOYW1lKTtcbiAgICAgIGNvbnN0IHZlcnNpb24gPSBzZW12ZXIuY29lcmNlKGZyb21EZXBzPy52ZXJzaW9uLCB7IGxvb3NlOiB0cnVlIH0pO1xuICAgICAgaWYgKHZlcnNpb24pIHtcbiAgICAgICAgcmV0dXJuIHZlcnNpb24uZm9ybWF0KCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCB7fVxuICAgIHJldHVybiB0cnlSZXNvbHZlRGVwZW5kZW5jeVZlcnNpb24oZGVwZW5kZW5jeU5hbWUsIHtcbiAgICAgIHBhdGhzOiBbdGhpcy5wcm9qZWN0Lm91dGRpcl0sXG4gICAgfSk7XG4gIH1cblxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgcHVibGljIHN5bnRoZXNpemUoKSB7XG4gICAgdGhpcy5fcmVuZGVyZWREZXBzID0gdGhpcy5yZW5kZXJEZXBlbmRlbmNpZXMoKTtcbiAgICBzdXBlci5zeW50aGVzaXplKCk7XG4gIH1cblxuICBwdWJsaWMgcG9zdFN5bnRoZXNpemUoKSB7XG4gICAgc3VwZXIucG9zdFN5bnRoZXNpemUoKTtcblxuICAgIC8vIFBoYXNlIDE6IGluc3RhbGwgaWYgcGFja2FnZS5qc29uIGNoYW5nZWQgb3Igbm9kZV9tb2R1bGVzIGlzIG1pc3NpbmdcbiAgICBjb25zdCBpbml0aWFsVHJpZ2dlciA9IHRoaXMuZGV0ZXJtaW5lSW5pdGlhbEluc3RhbGxUcmlnZ2VyKCk7XG4gICAgaWYgKGluaXRpYWxUcmlnZ2VyKSB7XG4gICAgICB0aGlzLmxvZ0luc3RhbGxUcmlnZ2VyKGluaXRpYWxUcmlnZ2VyKTtcbiAgICAgIHRoaXMuaW5zdGFsbERlcGVuZGVuY2llcyhpbml0aWFsVHJpZ2dlcik7XG4gICAgfVxuXG4gICAgLy8gUGhhc2UgMjogcmVzb2x2ZSBcIipcIiBkZXBzIGFuZCBpbnN0YWxsIGFnYWluIGlmIHZlcnNpb25zIGNoYW5nZWRcbiAgICBjb25zdCByZXNvbHV0aW9ucyA9IHRoaXMucmVzb2x2ZURlcHNBbmRXcml0ZVBhY2thZ2VKc29uKCk7XG4gICAgaWYgKHJlc29sdXRpb25zPy5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IHRyaWdnZXI6IEluc3RhbGxUcmlnZ2VyID0ge1xuICAgICAgICByZWFzb246IEluc3RhbGxSZWFzb24uREVQU19SRVNPTFZFRCxcbiAgICAgICAgcmVzb2x1dGlvbnMsXG4gICAgICB9O1xuICAgICAgdGhpcy5sb2dJbnN0YWxsVHJpZ2dlcih0cmlnZ2VyKTtcbiAgICAgIHRoaXMuaW5zdGFsbERlcGVuZGVuY2llcyh0cmlnZ2VyKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIHdoZXRoZXIgZGVwZW5kZW5jaWVzIG5lZWQgdG8gYmUgaW5zdGFsbGVkIGJlZm9yZSBkZXBlbmRlbmN5XG4gICAqIHJlc29sdXRpb24uXG4gICAqXG4gICAqIEByZXR1cm5zIGEgc3RydWN0dXJlZCB0cmlnZ2VyIGRlc2NyaWJpbmcgdGhlIHJlYXNvbiwgb3IgYHVuZGVmaW5lZGAgaWZcbiAgICogbm8gaW5zdGFsbCBpcyBuZWVkZWQuXG4gICAqL1xuICBwcml2YXRlIGRldGVybWluZUluaXRpYWxJbnN0YWxsVHJpZ2dlcigpOiBJbnN0YWxsVHJpZ2dlciB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgaGFzTm9kZU1vZHVsZXMgPSBleGlzdHNTeW5jKFxuICAgICAgam9pbih0aGlzLnByb2plY3Qub3V0ZGlyLCBcIm5vZGVfbW9kdWxlc1wiKSxcbiAgICApO1xuXG4gICAgaWYgKHRoaXMuZmlsZS5jaGFuZ2VkKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICByZWFzb246IEluc3RhbGxSZWFzb24uUEFDS0FHRV9KU09OX0NIQU5HRUQsXG4gICAgICAgIGRpZmY6IHRoaXMuZmlsZS5kaWZmKHRydWUpLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBpZiAoIWhhc05vZGVNb2R1bGVzKSB7XG4gICAgICByZXR1cm4geyByZWFzb246IEluc3RhbGxSZWFzb24uTk9fTk9ERV9NT0RVTEVTIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2dzIHVzZXItZmFjaW5nIGluZm9ybWF0aW9uIGFib3V0IHdoeSBkZXBlbmRlbmNpZXMgYXJlIGJlaW5nIGluc3RhbGxlZC5cbiAgICogRW1pdHMgYW4gaW5mby1sZXZlbCBzdW1tYXJ5IGFuZCBkZWJ1Zy1sZXZlbCBkZXRhaWxzIChyZWFzb24sIGRpZmYsIHJlc29sdXRpb25zKS5cbiAgICovXG4gIHByaXZhdGUgbG9nSW5zdGFsbFRyaWdnZXIodHJpZ2dlcjogSW5zdGFsbFRyaWdnZXIpIHtcbiAgICB0aGlzLnByb2plY3QubG9nZ2VyLmluZm8oXG4gICAgICBcIkluc3RhbGxpbmcgZGVwZW5kZW5jaWVzLi4uICh1c2UgLS1kZWJ1ZyBmb3IgZGV0YWlscylcIixcbiAgICApO1xuICAgIHRoaXMucHJvamVjdC5sb2dnZXIuZGVidWcoYEluc3RhbGwgcmVhc29uOiAke3RyaWdnZXIucmVhc29ufWApO1xuXG4gICAgaWYgKHRyaWdnZXIuZGlmZikge1xuICAgICAgdGhpcy5wcm9qZWN0LmxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgYHBhY2thZ2UuanNvbiBkaWZmOlxcbiR7dHJpZ2dlci5kaWZmLmpvaW4oXCJcXG5cIil9YCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKHRyaWdnZXIucmVzb2x1dGlvbnM/Lmxlbmd0aCkge1xuICAgICAgdGhpcy5wcm9qZWN0LmxvZ2dlci5pbmZvKFxuICAgICAgICBgUmVzb2x2ZWQgZGVwZW5kZW5jeSB2ZXJzaW9uczpcXG4ke3RyaWdnZXIucmVzb2x1dGlvbnMubWFwKChyKSA9PiBgICAke3J9YCkuam9pbihcIlxcblwiKX1gLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGhlIGNvbW1hbmQgcHJlZml4IHRvIHVzZSB3aGVuIGV4ZWN1dGluZyBiaW5hcnkgY29tbWFuZHMgZm9yIHRoaXMgcGFja2FnZVxuICAgKiBtYW5hZ2VyIChlLmcuIGBucHhgLCBgcG5wbSBleGVjYCwgYHlhcm5gLCBgYnVueGApLlxuICAgKi9cbiAgcHVibGljIGdldCBleGVjQ29tbWFuZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBleGVjQ29tbWFuZCh0aGlzLnBhY2thZ2VNYW5hZ2VyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGB0cnVlYCBpZiB3ZSBhcmUgcnVubmluZyB3aXRoaW4gYSBDSSBidWlsZC5cbiAgICovXG4gIHByaXZhdGUgZ2V0IGlzQXV0b21hdGVkQnVpbGQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGlzVHJ1dGh5KHByb2Nlc3MuZW52LkNJKTtcbiAgfVxuXG4gIHByaXZhdGUgZGV0ZXJtaW5lVmVyc2lvbihjdXJyVmVyc2lvbj86IHN0cmluZykge1xuICAgIGlmICghdGhpcy5pc1JlbGVhc2VCdWlsZCkge1xuICAgICAgcmV0dXJuIFwiMC4wLjBcIjtcbiAgICB9XG5cbiAgICByZXR1cm4gY3VyclZlcnNpb24gPz8gXCIwLjAuMFwiO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYHRydWVgIGlmIHRoaXMgaXMgYSBDSSByZWxlYXNlIGJ1aWxkLlxuICAgKi9cbiAgcHJpdmF0ZSBnZXQgaXNSZWxlYXNlQnVpbGQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGlzVHJ1dGh5KHByb2Nlc3MuZW52LlJFTEVBU0UpO1xuICB9XG5cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gIHByaXZhdGUgcGFyc2VOcG1PcHRpb25zKG9wdGlvbnM6IE5vZGVQYWNrYWdlT3B0aW9ucykge1xuICAgIGNvbnN0IG5wbVJlZ2lzdHJ5VXJsID0gb3B0aW9ucy5ucG1SZWdpc3RyeVVybDtcblxuICAgIGNvbnN0IG5wbXIgPSBuZXcgVVJMKG5wbVJlZ2lzdHJ5VXJsID8/IERFRkFVTFRfTlBNX1JFR0lTVFJZX1VSTCk7XG4gICAgaWYgKCFucG1yIHx8ICFucG1yLmhvc3RuYW1lIHx8ICFucG1yLmhyZWYpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYHVuYWJsZSB0byBkZXRlcm1pbmUgbnBtIHJlZ2lzdHJ5IGhvc3QgZnJvbSB1cmwgJHtucG1SZWdpc3RyeVVybH0uIElzIHRoaXMgcmVhbGx5IGEgVVJMP2AsXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IG5wbUFjY2VzcyA9IG9wdGlvbnMubnBtQWNjZXNzID8/IGRlZmF1bHROcG1BY2Nlc3ModGhpcy5wYWNrYWdlTmFtZSk7XG4gICAgaWYgKCFpc1Njb3BlZCh0aGlzLnBhY2thZ2VOYW1lKSAmJiBucG1BY2Nlc3MgPT09IE5wbUFjY2Vzcy5SRVNUUklDVEVEKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBcIm5wbUFjY2Vzc1wiIGNhbm5vdCBiZSBSRVNUUklDVEVEIGZvciBub24tc2NvcGVkIG5wbSBwYWNrYWdlIFwiJHt0aGlzLnBhY2thZ2VOYW1lfVwiYCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgbnBtUHJvdmVuYW5jZSA9XG4gICAgICBvcHRpb25zLm5wbVByb3ZlbmFuY2UgPz8gbnBtQWNjZXNzID09PSBOcG1BY2Nlc3MuUFVCTElDO1xuICAgIGlmIChucG1Qcm92ZW5hbmNlICYmIG5wbUFjY2VzcyAhPT0gTnBtQWNjZXNzLlBVQkxJQykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgXCJucG1Qcm92ZW5hbmNlXCIgY2FuIG9ubHkgYmUgZW5hYmxlZCBmb3IgcHVibGljIHBhY2thZ2VzYCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgaXNBd3NDb2RlQXJ0aWZhY3QgPSBpc0F3c0NvZGVBcnRpZmFjdFJlZ2lzdHJ5KG5wbVJlZ2lzdHJ5VXJsKTtcbiAgICBjb25zdCBoYXNTY29wZWRQYWNrYWdlID1cbiAgICAgIG9wdGlvbnMuc2NvcGVkUGFja2FnZXNPcHRpb25zICYmXG4gICAgICBvcHRpb25zLnNjb3BlZFBhY2thZ2VzT3B0aW9ucy5sZW5ndGggIT09IDA7XG5cbiAgICBpZiAoaXNBd3NDb2RlQXJ0aWZhY3QpIHtcbiAgICAgIGlmIChvcHRpb25zLm5wbVRva2VuU2VjcmV0KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAnXCJucG1Ub2tlblNlY3JldFwiIG11c3Qgbm90IGJlIHNwZWNpZmllZCB3aGVuIHB1Ymxpc2hpbmcgQVdTIENvZGVBcnRpZmFjdC4nLFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgb3B0aW9ucy5jb2RlQXJ0aWZhY3RPcHRpb25zPy5hdXRoUHJvdmlkZXIgPT09XG4gICAgICAgIENvZGVBcnRpZmFjdEF1dGhQcm92aWRlci5HSVRIVUJfT0lEQ1xuICAgICAgKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBvcHRpb25zLmNvZGVBcnRpZmFjdE9wdGlvbnMuYWNjZXNzS2V5SWRTZWNyZXQgfHxcbiAgICAgICAgICBvcHRpb25zLmNvZGVBcnRpZmFjdE9wdGlvbnMuc2VjcmV0QWNjZXNzS2V5U2VjcmV0XG4gICAgICAgICkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIFwiYWNjZXNzIGFuZCBzZWNyZXQga2V5IHBhaXIgc2hvdWxkIG5vdCBiZSBwcm92aWRlZCB3aGVuIHVzaW5nIEdJVEhVQl9PSURDIGF1dGggcHJvdmlkZXIgZm9yIEFXUyBDb2RlQXJ0aWZhY3RcIixcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2UgaWYgKCFvcHRpb25zLmNvZGVBcnRpZmFjdE9wdGlvbnMucm9sZVRvQXNzdW1lKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgJ1wicm9sZVRvQXNzdW1lXCIgcHJvcGVydHkgaXMgcmVxdWlyZWQgd2hlbiB1c2luZyBHSVRIVUJfT0lEQyBmb3IgQVdTIENvZGVBcnRpZmFjdCBvcHRpb25zJyxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChcbiAgICAgICAgKG9wdGlvbnMuY29kZUFydGlmYWN0T3B0aW9ucz8uYWNjZXNzS2V5SWRTZWNyZXQgfHxcbiAgICAgICAgICBvcHRpb25zLmNvZGVBcnRpZmFjdE9wdGlvbnM/LnNlY3JldEFjY2Vzc0tleVNlY3JldCB8fFxuICAgICAgICAgIG9wdGlvbnMuY29kZUFydGlmYWN0T3B0aW9ucz8ucm9sZVRvQXNzdW1lKSAmJlxuICAgICAgICAhaGFzU2NvcGVkUGFja2FnZVxuICAgICAgKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBcImNvZGVBcnRpZmFjdE9wdGlvbnMgbXVzdCBvbmx5IGJlIHNwZWNpZmllZCB3aGVuIHB1Ymxpc2hpbmcgQVdTIENvZGVBcnRpZmFjdCBvciB1c2VkIGluIHNjb3BlZCBwYWNrYWdlcy5cIixcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBhcHBseSBkZWZhdWx0cyBmb3IgQVdTIENvZGVBcnRpZmFjdFxuICAgIGxldCBjb2RlQXJ0aWZhY3RPcHRpb25zOiBDb2RlQXJ0aWZhY3RPcHRpb25zIHwgdW5kZWZpbmVkO1xuICAgIGlmIChpc0F3c0NvZGVBcnRpZmFjdCB8fCBoYXNTY29wZWRQYWNrYWdlKSB7XG4gICAgICBjb25zdCBhdXRoUHJvdmlkZXIgPVxuICAgICAgICBvcHRpb25zLmNvZGVBcnRpZmFjdE9wdGlvbnM/LmF1dGhQcm92aWRlciA/P1xuICAgICAgICBDb2RlQXJ0aWZhY3RBdXRoUHJvdmlkZXIuQUNDRVNTX0FORF9TRUNSRVRfS0VZX1BBSVI7XG4gICAgICBjb25zdCBpc0FjY2Vzc1NlY3JldEtleVBhaXJBdXRoID1cbiAgICAgICAgYXV0aFByb3ZpZGVyID09PSBDb2RlQXJ0aWZhY3RBdXRoUHJvdmlkZXIuQUNDRVNTX0FORF9TRUNSRVRfS0VZX1BBSVI7XG4gICAgICBjb2RlQXJ0aWZhY3RPcHRpb25zID0ge1xuICAgICAgICBhdXRoUHJvdmlkZXIsXG4gICAgICAgIGFjY2Vzc0tleUlkU2VjcmV0OlxuICAgICAgICAgIG9wdGlvbnMuY29kZUFydGlmYWN0T3B0aW9ucz8uYWNjZXNzS2V5SWRTZWNyZXQgPz9cbiAgICAgICAgICAoaXNBY2Nlc3NTZWNyZXRLZXlQYWlyQXV0aCA/IFwiQVdTX0FDQ0VTU19LRVlfSURcIiA6IHVuZGVmaW5lZCksXG4gICAgICAgIHNlY3JldEFjY2Vzc0tleVNlY3JldDpcbiAgICAgICAgICBvcHRpb25zLmNvZGVBcnRpZmFjdE9wdGlvbnM/LnNlY3JldEFjY2Vzc0tleVNlY3JldCA/P1xuICAgICAgICAgIChpc0FjY2Vzc1NlY3JldEtleVBhaXJBdXRoID8gXCJBV1NfU0VDUkVUX0FDQ0VTU19LRVlcIiA6IHVuZGVmaW5lZCksXG4gICAgICAgIHJvbGVUb0Fzc3VtZTogb3B0aW9ucy5jb2RlQXJ0aWZhY3RPcHRpb25zPy5yb2xlVG9Bc3N1bWUsXG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBucG1BY2Nlc3MsXG4gICAgICBucG1SZWdpc3RyeTogbnBtci5ob3N0bmFtZSArIHRoaXMucmVuZGVyTnBtUmVnaXN0cnlQYXRoKG5wbXIucGF0aG5hbWUhKSxcbiAgICAgIG5wbVJlZ2lzdHJ5VXJsOiBucG1yLmhyZWYsXG4gICAgICBucG1Ub2tlblNlY3JldDogb3B0aW9ucy5ucG1UcnVzdGVkUHVibGlzaGluZ1xuICAgICAgICA/IHVuZGVmaW5lZFxuICAgICAgICA6IGRlZmF1bHROcG1Ub2tlbihvcHRpb25zLm5wbVRva2VuU2VjcmV0LCBucG1yLmhvc3RuYW1lKSxcbiAgICAgIGNvZGVBcnRpZmFjdE9wdGlvbnMsXG4gICAgICBzY29wZWRQYWNrYWdlc09wdGlvbnM6IHRoaXMucGFyc2VTY29wZWRQYWNrYWdlc09wdGlvbnMoXG4gICAgICAgIG9wdGlvbnMuc2NvcGVkUGFja2FnZXNPcHRpb25zLFxuICAgICAgKSxcbiAgICAgIG5wbVByb3ZlbmFuY2UsXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgcGFyc2VTY29wZWRQYWNrYWdlc09wdGlvbnMoXG4gICAgc2NvcGVkUGFja2FnZXNPcHRpb25zPzogU2NvcGVkUGFja2FnZXNPcHRpb25zW10sXG4gICk6IFNjb3BlZFBhY2thZ2VzT3B0aW9uc1tdIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIXNjb3BlZFBhY2thZ2VzT3B0aW9ucykge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICByZXR1cm4gc2NvcGVkUGFja2FnZXNPcHRpb25zLm1hcCgob3B0aW9uKTogU2NvcGVkUGFja2FnZXNPcHRpb25zID0+IHtcbiAgICAgIGlmICghaXNTY29wZWQob3B0aW9uLnNjb3BlKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYFNjb3BlIG11c3Qgc3RhcnQgd2l0aCBcIkBcIiBpbiBvcHRpb25zLCBmb3VuZCAke29wdGlvbi5zY29wZX1gLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWlzQXdzQ29kZUFydGlmYWN0UmVnaXN0cnkob3B0aW9uLnJlZ2lzdHJ5VXJsKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYE9ubHkgQVdTIENvZGUgYXJ0aWZhY3Qgc2NvcGVkIHJlZ2lzdHJ5IGlzIHN1cHBvcnRlZCBmb3Igbm93LCBmb3VuZCAke29wdGlvbi5yZWdpc3RyeVVybH1gLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCByZXN1bHQ6IFNjb3BlZFBhY2thZ2VzT3B0aW9ucyA9IHtcbiAgICAgICAgcmVnaXN0cnlVcmw6IG9wdGlvbi5yZWdpc3RyeVVybCxcbiAgICAgICAgc2NvcGU6IG9wdGlvbi5zY29wZSxcbiAgICAgIH07XG5cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFkZENvZGVBcnRpZmFjdExvZ2luU2NyaXB0KCkge1xuICAgIGlmIChcbiAgICAgICF0aGlzLnNjb3BlZFBhY2thZ2VzT3B0aW9ucyB8fFxuICAgICAgdGhpcy5zY29wZWRQYWNrYWdlc09wdGlvbnMubGVuZ3RoID09PSAwXG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5wcm9qZWN0LmFkZFRhc2soXCJjYTpsb2dpblwiLCB7XG4gICAgICBzdGVwczogW1xuICAgICAgICB7IGV4ZWM6IFwid2hpY2ggYXdzXCIgfSwgLy8gY2hlY2sgdGhhdCBBV1MgQ0xJIGlzIGluc3RhbGxlZFxuICAgICAgICAuLi50aGlzLnNjb3BlZFBhY2thZ2VzT3B0aW9ucy5tYXAoKHNjb3BlZFBhY2thZ2VzT3B0aW9uKSA9PiB7XG4gICAgICAgICAgY29uc3QgeyByZWdpc3RyeVVybCwgc2NvcGUgfSA9IHNjb3BlZFBhY2thZ2VzT3B0aW9uO1xuICAgICAgICAgIGNvbnN0IHsgZG9tYWluLCByZWdpb24sIGFjY291bnRJZCwgcmVnaXN0cnkgfSA9XG4gICAgICAgICAgICBleHRyYWN0Q29kZUFydGlmYWN0RGV0YWlscyhyZWdpc3RyeVVybCk7XG4gICAgICAgICAgLy8gcmVmZXJlbmNlOiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vY29kZWFydGlmYWN0L2xhdGVzdC91Zy9ucG0tYXV0aC5odG1sXG4gICAgICAgICAgY29uc3QgY29tbWFuZHMgPSBbXG4gICAgICAgICAgICBgbnBtIGNvbmZpZyBzZXQgJHtzY29wZX06cmVnaXN0cnkgJHtyZWdpc3RyeVVybH1gLFxuICAgICAgICAgICAgYG5wbSBjb25maWcgc2V0IC8vJHtyZWdpc3RyeX06X2F1dGhUb2tlbj0kQ09ERUFSVElGQUNUX0FVVEhfVE9LRU5gLFxuICAgICAgICAgIF07XG4gICAgICAgICAgaWYgKCF0aGlzLm1pbk5vZGVWZXJzaW9uIHx8IHNlbXZlci5tYWpvcih0aGlzLm1pbk5vZGVWZXJzaW9uKSA8PSAxNikge1xuICAgICAgICAgICAgY29tbWFuZHMucHVzaChgbnBtIGNvbmZpZyBzZXQgLy8ke3JlZ2lzdHJ5fTphbHdheXMtYXV0aD10cnVlYCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBlbnY6IHtcbiAgICAgICAgICAgICAgQ09ERUFSVElGQUNUX0FVVEhfVE9LRU46IGAkKGF3cyBjb2RlYXJ0aWZhY3QgZ2V0LWF1dGhvcml6YXRpb24tdG9rZW4gLS1kb21haW4gJHtkb21haW59IC0tcmVnaW9uICR7cmVnaW9ufSAtLWRvbWFpbi1vd25lciAke2FjY291bnRJZH0gLS1xdWVyeSBhdXRob3JpemF0aW9uVG9rZW4gLS1vdXRwdXQgdGV4dClgLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGV4ZWM6IGNvbW1hbmRzLmpvaW4oXCI7IFwiKSxcbiAgICAgICAgICB9O1xuICAgICAgICB9KSxcbiAgICAgIF0sXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFkZE5vZGVFbmdpbmUoKSB7XG4gICAgaWYgKCF0aGlzLm1pbk5vZGVWZXJzaW9uICYmICF0aGlzLm1heE5vZGVWZXJzaW9uKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IG5vZGVWZXJzaW9uID0gXCJcIjtcbiAgICBpZiAodGhpcy5taW5Ob2RlVmVyc2lvbikge1xuICAgICAgbm9kZVZlcnNpb24gKz0gYD49ICR7dGhpcy5taW5Ob2RlVmVyc2lvbn1gO1xuICAgIH1cbiAgICBpZiAodGhpcy5tYXhOb2RlVmVyc2lvbikge1xuICAgICAgbm9kZVZlcnNpb24gKz0gYCA8PSAke3RoaXMubWF4Tm9kZVZlcnNpb259YDtcbiAgICB9XG4gICAgdGhpcy5hZGRFbmdpbmUoXCJub2RlXCIsIG5vZGVWZXJzaW9uKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVuZGVyTnBtUmVnaXN0cnlQYXRoKHBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHN0cmluZyB7XG4gICAgaWYgKCFwYXRoIHx8IHBhdGggPT0gXCIvXCIpIHtcbiAgICAgIHJldHVybiBcIlwiO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gcGF0aDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHJlbmRlckluc3RhbGxDb21tYW5kKGZyb3plbjogYm9vbGVhbikge1xuICAgIHN3aXRjaCAodGhpcy5wYWNrYWdlTWFuYWdlcikge1xuICAgICAgY2FzZSBOb2RlUGFja2FnZU1hbmFnZXIuWUFSTjpcbiAgICAgIGNhc2UgTm9kZVBhY2thZ2VNYW5hZ2VyLllBUk5fQ0xBU1NJQzpcbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICBcInlhcm4gaW5zdGFsbFwiLFxuICAgICAgICAgIFwiLS1jaGVjay1maWxlc1wiLCAvLyBlbnN1cmUgYWxsIG1vZHVsZXMgZXhpc3QgKGVzcGVjaWFsbHkgcHJvamVuIHdoaWNoIHdhcyBqdXN0IHJlbW92ZWQpLlxuICAgICAgICAgIC4uLihmcm96ZW4gPyBbXCItLWZyb3plbi1sb2NrZmlsZVwiXSA6IFtdKSxcbiAgICAgICAgXS5qb2luKFwiIFwiKTtcbiAgICAgIGNhc2UgTm9kZVBhY2thZ2VNYW5hZ2VyLllBUk4yOlxuICAgICAgY2FzZSBOb2RlUGFja2FnZU1hbmFnZXIuWUFSTl9CRVJSWTpcbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICBcInlhcm4gaW5zdGFsbFwiLFxuICAgICAgICAgIC4uLihmcm96ZW4gPyBbXCItLWltbXV0YWJsZVwiXSA6IFtcIi0tbm8taW1tdXRhYmxlXCJdKSxcbiAgICAgICAgXS5qb2luKFwiIFwiKTtcbiAgICAgIGNhc2UgTm9kZVBhY2thZ2VNYW5hZ2VyLk5QTTpcbiAgICAgICAgcmV0dXJuIGZyb3plbiA/IFwibnBtIGNpXCIgOiBcIm5wbSBpbnN0YWxsXCI7XG4gICAgICBjYXNlIE5vZGVQYWNrYWdlTWFuYWdlci5QTlBNOlxuICAgICAgICByZXR1cm4gZnJvemVuXG4gICAgICAgICAgPyBcInBucG0gaSAtLWZyb3plbi1sb2NrZmlsZVwiXG4gICAgICAgICAgOiBcInBucG0gaSAtLW5vLWZyb3plbi1sb2NrZmlsZVwiO1xuICAgICAgY2FzZSBOb2RlUGFja2FnZU1hbmFnZXIuQlVOOlxuICAgICAgICByZXR1cm4gW1wiYnVuIGluc3RhbGxcIiwgLi4uKGZyb3plbiA/IFtcIi0tZnJvemVuLWxvY2tmaWxlXCJdIDogW10pXS5qb2luKFxuICAgICAgICAgIFwiIFwiLFxuICAgICAgICApO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHVuZXhwZWN0ZWQgcGFja2FnZSBtYW5hZ2VyICR7dGhpcy5wYWNrYWdlTWFuYWdlcn1gKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHByb2Nlc3NEZXBzKG9wdGlvbnM6IE5vZGVQYWNrYWdlT3B0aW9ucykge1xuICAgIHRoaXMuYWRkRGVwcyguLi4ob3B0aW9ucy5kZXBzID8/IFtdKSk7XG4gICAgdGhpcy5hZGREZXZEZXBzKC4uLihvcHRpb25zLmRldkRlcHMgPz8gW10pKTtcbiAgICB0aGlzLmFkZFBlZXJEZXBzKC4uLihvcHRpb25zLnBlZXJEZXBzID8/IFtdKSk7XG4gICAgdGhpcy5hZGRCdW5kbGVkRGVwcyguLi4ob3B0aW9ucy5idW5kbGVkRGVwcyA/PyBbXSkpO1xuICB9XG5cbiAgcHJpdmF0ZSByZW5kZXJEZXBlbmRlbmNpZXMoKTogTnBtRGVwZW5kZW5jaWVzIHtcbiAgICBjb25zdCBkZXZEZXBlbmRlbmNpZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgICBjb25zdCBwZWVyRGVwZW5kZW5jaWVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gICAgY29uc3QgZGVwZW5kZW5jaWVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gICAgY29uc3QgYnVuZGxlZERlcGVuZGVuY2llcyA9IG5ldyBBcnJheTxzdHJpbmc+KCk7XG5cbiAgICAvLyBzeW50aGV0aWMgZGVwZW5kZW5jaWVzOiBhZGQgYSBwaW5uZWQgYnVpbGQgZGVwZW5kZW5jeSB0byBlbnN1cmUgd2UgYXJlXG4gICAgLy8gdGVzdGluZyBhZ2FpbnN0IHRoZSBtaW5pbXVtIHJlcXVpcmVtZW50IG9mIHRoZSBwZWVyLlxuICAgIGlmICh0aGlzLnBlZXJEZXBlbmRlbmN5T3B0aW9ucy5waW5uZWREZXZEZXBlbmRlbmN5KSB7XG4gICAgICBmb3IgKGNvbnN0IGRlcCBvZiB0aGlzLnByb2plY3QuZGVwcy5hbGwuZmlsdGVyKFxuICAgICAgICAoZCkgPT4gZC50eXBlID09PSBEZXBlbmRlbmN5VHlwZS5QRUVSLFxuICAgICAgKSkge1xuICAgICAgICBsZXQgcmVxID0gZGVwLm5hbWU7XG5cbiAgICAgICAgLy8gU2tpcCBpZiB3ZSBhbHJlYWR5IGhhdmUgYSBydW50aW1lIGRlcGVuZGVuY3kgb24gdGhpcyBwZWVyIGFuZCBubyBidWlsZCBkZXBlbmRlbmN5IHlldC5cbiAgICAgICAgLy8gSWYgdGhlcmUgaXMgYSBidWlsZCBkZXAgYWxyZWFkeSwgd2UgbmVlZCB0byBvdmVycmlkZSBpdHMgdmVyc2lvbi5cbiAgICAgICAgaWYgKFxuICAgICAgICAgIHRoaXMucHJvamVjdC5kZXBzLnRyeUdldERlcGVuZGVuY3koXG4gICAgICAgICAgICBkZXAubmFtZSxcbiAgICAgICAgICAgIERlcGVuZGVuY3lUeXBlLlJVTlRJTUUsXG4gICAgICAgICAgKSAmJlxuICAgICAgICAgICF0aGlzLnByb2plY3QuZGVwcy50cnlHZXREZXBlbmRlbmN5KGRlcC5uYW1lLCBEZXBlbmRlbmN5VHlwZS5CVUlMRClcbiAgICAgICAgKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZGVwLnZlcnNpb24pIHtcbiAgICAgICAgICBjb25zdCB2ZXIgPSBtaW5WZXJzaW9uKGRlcC52ZXJzaW9uKTtcbiAgICAgICAgICBpZiAoIXZlcikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICBgdW5hYmxlIHRvIGRldGVybWluZSBtaW5pbXVtIHNlbXZlciBmb3IgcGVlciBkZXBlbmRlbmN5ICR7ZGVwLm5hbWV9QCR7ZGVwLnZlcnNpb259YCxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmVxICs9IFwiQFwiICsgdmVyO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYWRkRGV2RGVwcyhyZXEpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoY29uc3QgZGVwIG9mIHRoaXMucHJvamVjdC5kZXBzLmFsbCkge1xuICAgICAgbGV0IHZlcnNpb24gPSBkZXAudmVyc2lvbiA/PyBcIipcIjtcbiAgICAgIGxldCBuYW1lID0gZGVwLm5hbWU7XG5cbiAgICAgIGlmIChuYW1lLnN0YXJ0c1dpdGgoXCJmaWxlOlwiKSkge1xuICAgICAgICBjb25zdCBsb2NhbERlcGVuZGVuY3lQYXRoID0gbmFtZS5zdWJzdHJpbmcoNSk7XG4gICAgICAgIGNvbnN0IGRlcFBhY2thZ2VKc29uID0gcmVzb2x2ZShcbiAgICAgICAgICB0aGlzLnByb2plY3Qub3V0ZGlyLFxuICAgICAgICAgIGxvY2FsRGVwZW5kZW5jeVBhdGgsXG4gICAgICAgICAgXCJwYWNrYWdlLmpzb25cIixcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgcGtnRmlsZSA9IHJlYWRGaWxlU3luYyhkZXBQYWNrYWdlSnNvbiwgXCJ1dGY4XCIpO1xuICAgICAgICBjb25zdCBwa2cgPSBKU09OLnBhcnNlKHBrZ0ZpbGUpO1xuICAgICAgICB2ZXJzaW9uID0gbG9jYWxEZXBlbmRlbmN5UGF0aDtcbiAgICAgICAgbmFtZSA9IHBrZy5uYW1lO1xuICAgICAgfVxuXG4gICAgICBzd2l0Y2ggKGRlcC50eXBlKSB7XG4gICAgICAgIGNhc2UgRGVwZW5kZW5jeVR5cGUuQlVORExFRDpcbiAgICAgICAgICBidW5kbGVkRGVwZW5kZW5jaWVzLnB1c2gobmFtZSk7XG5cbiAgICAgICAgICBjb25zdCBkZXBEZWNscyA9IHRoaXMucHJvamVjdC5kZXBzLmFsbC5maWx0ZXIoKGQpID0+IGQubmFtZSA9PT0gbmFtZSk7XG4gICAgICAgICAgaWYgKGRlcERlY2xzLnNvbWUoKGQpID0+IGQudHlwZSA9PT0gRGVwZW5kZW5jeVR5cGUuUEVFUikpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgYHVuYWJsZSB0byBidW5kbGUgXCIke25hbWV9XCI6IGl0IGNhbm5vdCBhcHBlYXIgYXMgYSBwZWVyIGRlcGVuZGVuY3kgKGJ1bmRsZWQgd291bGQgYWx3YXlzIHRha2UgcHJlY2VkZW5jZSBvdmVyIHBlZXIpYCxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gSSd2ZSBvYnNlcnZlZCB0aGF0IGF0IGxlYXN0IG5wbSAxMC44LjIgd2lsbCBzaWxlbnRseSBmYWlsIHRvIGJ1bmRsZVxuICAgICAgICAgIC8vIGEgZGVwZW5kZW5jeSBpZiBpdCBpcyBbYWxzb10gcGFydCBvZiBgZGV2RGVwZW5kZW5jaWVzYC4gSXQgbXVzdCBleGlzdCBpblxuICAgICAgICAgIC8vIGBkZXBlbmRlbmNpZXNgIGFuZCBgZGVwZW5kZW5jaWVzYCBvbmx5LlxuICAgICAgICAgIGlmIChkZXBEZWNscy5zb21lKChkKSA9PiBkLnR5cGUgPT09IERlcGVuZGVuY3lUeXBlLkJVSUxEKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICBgdW5hYmxlIHRvIGJ1bmRsZSBcIiR7bmFtZX1cIjogaXQgY2Fubm90IGFwcGVhciBhcyBhIGRldkRlcGVuZGVuY3kgKG9ubHkgcHJvZCBkZXBlbmRlbmNpZXMgYXJlIGJ1bmRsZWQsIGFuZCBhbnkgZGVwZW5kZW5jeSBhcHBlYXJpbmcgYXMgYSBkZXZEZXBlbmRlbmN5IGlzIGNvbnNpZGVyZWQgdG8gYmUgbm90IGEgcHJvZCBkZXBlbmRlbmN5KWAsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIGFsc28gYWRkIGFzIGEgcnVudGltZSBkZXBlbmRlbmN5XG4gICAgICAgICAgZGVwZW5kZW5jaWVzW25hbWVdID0gdmVyc2lvbjtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIERlcGVuZGVuY3lUeXBlLlBFRVI6XG4gICAgICAgICAgcGVlckRlcGVuZGVuY2llc1tuYW1lXSA9IHZlcnNpb247XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSBEZXBlbmRlbmN5VHlwZS5SVU5USU1FOlxuICAgICAgICAgIGRlcGVuZGVuY2llc1tuYW1lXSA9IHZlcnNpb247XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSBEZXBlbmRlbmN5VHlwZS5URVNUOlxuICAgICAgICBjYXNlIERlcGVuZGVuY3lUeXBlLkRFVkVOVjpcbiAgICAgICAgY2FzZSBEZXBlbmRlbmN5VHlwZS5CVUlMRDpcbiAgICAgICAgICBkZXZEZXBlbmRlbmNpZXNbbmFtZV0gPSB2ZXJzaW9uO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIHJldHVybnMgYSBsYXp5IHZhbHVlIHRvIG5vcm1hbGl6ZSBkdXJpbmcgc3ludGhlc2lzXG4gICAgY29uc3Qgbm9ybWFsaXplID0gKG9iajogYW55KSA9PiAoKSA9PiBzb3J0ZWQob2JqKTtcblxuICAgIC8vIHVwZGF0ZSB0aGUgbWFuaWZlc3Qgd2UgYXJlIGFib3V0IHRvIHNhdmUgaW50byBgcGFja2FnZS5qc29uYFxuICAgIHRoaXMubWFuaWZlc3QuZGV2RGVwZW5kZW5jaWVzID0gbm9ybWFsaXplKGRldkRlcGVuZGVuY2llcyk7XG4gICAgdGhpcy5tYW5pZmVzdC5wZWVyRGVwZW5kZW5jaWVzID0gbm9ybWFsaXplKHBlZXJEZXBlbmRlbmNpZXMpO1xuICAgIHRoaXMubWFuaWZlc3QuZGVwZW5kZW5jaWVzID0gbm9ybWFsaXplKGRlcGVuZGVuY2llcyk7XG4gICAgdGhpcy5tYW5pZmVzdC5idW5kbGVkRGVwZW5kZW5jaWVzID0gc29ydGVkKGJ1bmRsZWREZXBlbmRlbmNpZXMpO1xuXG4gICAgLy8gbm90aGluZyBmdXJ0aGVyIHRvIGRvIGlmIHBhY2thZ2UuanNvbiBmaWxlIGRvZXMgbm90IGV4aXN0XG4gICAgaWYgKCF0aGlzLl9wcmV2KSB7XG4gICAgICByZXR1cm4geyBkZXZEZXBlbmRlbmNpZXMsIHBlZXJEZXBlbmRlbmNpZXMsIGRlcGVuZGVuY2llcyB9O1xuICAgIH1cblxuICAgIGNvbnN0IHJlYWREZXBzID0gKFxuICAgICAgdXNlcjogUmVjb3JkPHN0cmluZywgc3RyaW5nPixcbiAgICAgIGN1cnJlbnQ6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fSxcbiAgICApID0+IHtcbiAgICAgIGZvciAoY29uc3QgW25hbWUsIHVzZXJWZXJzaW9uXSBvZiBPYmplY3QuZW50cmllcyh1c2VyKSkge1xuICAgICAgICBjb25zdCBjdXJyZW50VmVyc2lvbiA9IGN1cnJlbnRbbmFtZV07XG5cbiAgICAgICAgLy8gcmVzcGVjdCB1c2VyIHZlcnNpb24gaWYgaXQncyBub3QgJyonIG9yIGlmIGN1cnJlbnQgdmVyc2lvbiBpcyB1bmRlZmluZWRcbiAgICAgICAgaWYgKHVzZXJWZXJzaW9uICE9PSBcIipcIiB8fCAhY3VycmVudFZlcnNpb24gfHwgY3VycmVudFZlcnNpb24gPT09IFwiKlwiKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBtZW1vaXplIGN1cnJlbnQgdmVyc2lvbiBpbiBtZW1vcnkgc28gaXQgaXMgcHJlc2VydmVkIHdoZW4gc2F2aW5nXG4gICAgICAgIHVzZXJbbmFtZV0gPSBjdXJyZW50VmVyc2lvbjtcbiAgICAgIH1cblxuICAgICAgLy8gcmVwb3J0IHJlbW92YWxzXG4gICAgICBmb3IgKGNvbnN0IG5hbWUgb2YgT2JqZWN0LmtleXMoY3VycmVudCA/PyB7fSkpIHtcbiAgICAgICAgaWYgKCF1c2VyW25hbWVdKSB7XG4gICAgICAgICAgdGhpcy5wcm9qZWN0LmxvZ2dlci52ZXJib3NlKGAke25hbWV9OiByZW1vdmVkYCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgcmVhZERlcHMoZGV2RGVwZW5kZW5jaWVzLCB0aGlzLl9wcmV2LmRldkRlcGVuZGVuY2llcyk7XG4gICAgcmVhZERlcHMoZGVwZW5kZW5jaWVzLCB0aGlzLl9wcmV2LmRlcGVuZGVuY2llcyk7XG4gICAgcmVhZERlcHMocGVlckRlcGVuZGVuY2llcywgdGhpcy5fcHJldi5wZWVyRGVwZW5kZW5jaWVzKTtcblxuICAgIHJldHVybiB7IGRldkRlcGVuZGVuY2llcywgZGVwZW5kZW5jaWVzLCBwZWVyRGVwZW5kZW5jaWVzIH07XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZXMgYW55IGRlcHMgdGhhdCBkbyBub3QgaGF2ZSBhIHNwZWNpZmllZCB2ZXJzaW9uIChlLmcuIGAqYCkgYW5kXG4gICAqIHVwZGF0ZXMgYHBhY2thZ2UuanNvbmAgaWYgbmVlZGVkLiBEb2VzIG5vdCBsb2cgb3IgaW5zdGFsbCDigJQgdGhlIGNhbGxlclxuICAgKiBpcyByZXNwb25zaWJsZSBmb3IgYWN0aW5nIG9uIHRoZSByZXR1cm5lZCBjaGFuZ2VzLlxuICAgKlxuICAgKiBAcmV0dXJucyBsaXN0IG9mIGh1bWFuLXJlYWRhYmxlIHJlc29sdXRpb24gY2hhbmdlcywgb3IgYHVuZGVmaW5lZGAgaWZcbiAgICogYHBhY2thZ2UuanNvbmAgZG9lcyBub3QgZXhpc3QuIEFuIGVtcHR5IGFycmF5IG1lYW5zIG5vIGNoYW5nZXMgd2VyZSBtYWRlLlxuICAgKi9cbiAgcHJpdmF0ZSByZXNvbHZlRGVwc0FuZFdyaXRlUGFja2FnZUpzb24oKTogc3RyaW5nW10gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IG91dGRpciA9IHRoaXMucHJvamVjdC5vdXRkaXI7XG4gICAgY29uc3Qgcm9vdFBhY2thZ2VKc29uID0gam9pbihvdXRkaXIsIFwicGFja2FnZS5qc29uXCIpO1xuXG4gICAgY29uc3Qgb3JpZ2luYWwgPSByZWFkRmlsZVN5bmMocm9vdFBhY2thZ2VKc29uLCBcInV0ZjhcIik7XG4gICAgY29uc3QgcGtnID0gSlNPTi5wYXJzZShvcmlnaW5hbCk7XG4gICAgY29uc3QgY2hhbmdlczogc3RyaW5nW10gPSBbXTtcblxuICAgIGNvbnN0IHJlc29sdmVEZXBzID0gKFxuICAgICAgY3VycmVudDogeyBbbmFtZTogc3RyaW5nXTogc3RyaW5nIH0sXG4gICAgICB1c2VyOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LFxuICAgICkgPT4ge1xuICAgICAgY29uc3QgcmVzdWx0OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gICAgICBjdXJyZW50ID0gY3VycmVudCA/PyB7fTtcbiAgICAgIHVzZXIgPSB1c2VyID8/IHt9O1xuXG4gICAgICBmb3IgKGNvbnN0IFtuYW1lLCBjdXJyZW50RGVmaW5pdGlvbl0gb2YgT2JqZWN0LmVudHJpZXModXNlcikpIHtcbiAgICAgICAgLy8gZmluZCBhY3R1YWwgdmVyc2lvbiBmcm9tIG5vZGVfbW9kdWxlc1xuICAgICAgICBsZXQgZGVzaXJlZFZlcnNpb24gPSBjdXJyZW50RGVmaW5pdGlvbjtcblxuICAgICAgICBpZiAoY3VycmVudERlZmluaXRpb24gPT09IFwiKlwiKSB7XG4gICAgICAgICAgLy8gd2UgYWxyZWFkeSBrbm93IHdlIGRvbid0IGhhdmUgdGhlIHZlcnNpb24gaW4gcHJvamVjdCBgZGVwc2AsXG4gICAgICAgICAgLy8gc28gc2tpcCBzdHJhaWdodCB0byBjaGVja2luZyBtYW5pZmVzdC5cbiAgICAgICAgICBjb25zdCByZXNvbHZlZFZlcnNpb24gPSB0cnlSZXNvbHZlRGVwZW5kZW5jeVZlcnNpb24obmFtZSwge1xuICAgICAgICAgICAgcGF0aHM6IFt0aGlzLnByb2plY3Qub3V0ZGlyXSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBpZiAoIXJlc29sdmVkVmVyc2lvbikge1xuICAgICAgICAgICAgdGhpcy5wcm9qZWN0LmxvZ2dlci53YXJuKFxuICAgICAgICAgICAgICBgdW5hYmxlIHRvIHJlc29sdmUgdmVyc2lvbiBmb3IgJHtuYW1lfSBmcm9tIGluc3RhbGxlZCBtb2R1bGVzYCxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZGVzaXJlZFZlcnNpb24gPSBgXiR7cmVzb2x2ZWRWZXJzaW9ufWA7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY3VycmVudERlZmluaXRpb24gIT09IGRlc2lyZWRWZXJzaW9uKSB7XG4gICAgICAgICAgY2hhbmdlcy5wdXNoKGAke25hbWV9OiAke2N1cnJlbnREZWZpbml0aW9ufSA9PiAke2Rlc2lyZWRWZXJzaW9ufWApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmVzdWx0W25hbWVdID0gZGVzaXJlZFZlcnNpb247XG4gICAgICB9XG5cbiAgICAgIC8vIGNvbGxlY3QgcmVtb3ZlZCBwYWNrYWdlc1xuICAgICAgZm9yIChjb25zdCBuYW1lIG9mIE9iamVjdC5rZXlzKGN1cnJlbnQpKSB7XG4gICAgICAgIGlmICghcmVzdWx0W25hbWVdKSB7XG4gICAgICAgICAgY2hhbmdlcy5wdXNoKGAke25hbWV9OiByZW1vdmVkYCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuXG4gICAgY29uc3QgcmVuZGVyZWQgPSB0aGlzLl9yZW5kZXJlZERlcHM7XG4gICAgaWYgKCFyZW5kZXJlZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiYXNzZXJ0aW9uIGZhaWxlZFwiKTtcbiAgICB9XG5cbiAgICBjb25zdCBkZXBzID0gcmVzb2x2ZURlcHMocGtnLmRlcGVuZGVuY2llcywgcmVuZGVyZWQuZGVwZW5kZW5jaWVzKTtcbiAgICBjb25zdCBkZXZEZXBzID0gcmVzb2x2ZURlcHMocGtnLmRldkRlcGVuZGVuY2llcywgcmVuZGVyZWQuZGV2RGVwZW5kZW5jaWVzKTtcbiAgICBjb25zdCBwZWVyRGVwcyA9IHJlc29sdmVEZXBzKFxuICAgICAgcGtnLnBlZXJEZXBlbmRlbmNpZXMsXG4gICAgICByZW5kZXJlZC5wZWVyRGVwZW5kZW5jaWVzLFxuICAgICk7XG5cbiAgICBpZiAodGhpcy5wZWVyRGVwZW5kZW5jeU9wdGlvbnMucGlubmVkRGV2RGVwZW5kZW5jeSkge1xuICAgICAgZm9yIChjb25zdCBbbmFtZSwgdmVyc2lvbl0gb2YgT2JqZWN0LmVudHJpZXMocGVlckRlcHMpKSB7XG4gICAgICAgIC8vIFNraXAgaWYgd2UgYWxyZWFkeSBoYXZlIGEgcnVudGltZSBkZXBlbmRlbmN5IG9uIHRoaXMgcGVlclxuICAgICAgICAvLyBvciBpZiBkZXZEZXBlbmRlbmN5IHZlcnNpb24gaXMgYWxyZWFkeSBzZXQuXG4gICAgICAgIC8vIFJlbGllcyBvbiB0aGUgXCIqXCIgZGV2RGVwZW5kZW5jeSBhZGRlZCBpbiB0aGUgcHJlc3ludGggc3RlcFxuICAgICAgICBpZiAoZGVwc1tuYW1lXSB8fCByZW5kZXJlZC5kZXZEZXBlbmRlbmNpZXNbbmFtZV0gIT09IFwiKlwiKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUYWtlIHZlcnNpb24gYW5kIHBpbiBhcyBkZXYgZGVwZW5kZW5jeVxuICAgICAgICBjb25zdCB2ZXIgPSBtaW5WZXJzaW9uKHZlcnNpb24pO1xuICAgICAgICBpZiAoIXZlcikge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGB1bmFibGUgdG8gZGV0ZXJtaW5lIG1pbmltdW0gc2VtdmVyIGZvciBwZWVyIGRlcGVuZGVuY3kgJHtuYW1lfUAke3ZlcnNpb259YCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgZGV2RGVwc1tuYW1lXSA9IHZlcjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBwa2cuZGVwZW5kZW5jaWVzID0gc29ydGVkKGRlcHMpO1xuICAgIHBrZy5kZXZEZXBlbmRlbmNpZXMgPSBzb3J0ZWQoZGV2RGVwcyk7XG4gICAgcGtnLnBlZXJEZXBlbmRlbmNpZXMgPSBzb3J0ZWQocGVlckRlcHMpO1xuXG4gICAgY29uc3QgdXBkYXRlZCA9IEpTT04uc3RyaW5naWZ5KHBrZywgdW5kZWZpbmVkLCAyKSArIFwiXFxuXCI7XG5cbiAgICBpZiAob3JpZ2luYWwgPT09IHVwZGF0ZWQpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICB3cml0ZUZpbGUocm9vdFBhY2thZ2VKc29uLCB1cGRhdGVkKTtcbiAgICByZXR1cm4gY2hhbmdlcztcbiAgfVxuXG4gIHByaXZhdGUgcmVuZGVyUGFja2FnZVJlc29sdXRpb25zKCkge1xuICAgIGNvbnN0IHJlbmRlciA9ICgpID0+IHtcbiAgICAgIGNvbnN0IG92ZXJyaWRpbmdEZXBlbmRlbmNpZXMgPSB0aGlzLnByb2plY3QuZGVwcy5hbGwuZmlsdGVyKFxuICAgICAgICAoZGVwKSA9PiBkZXAudHlwZSA9PT0gRGVwZW5kZW5jeVR5cGUuT1ZFUlJJREUsXG4gICAgICApO1xuICAgICAgaWYgKCFvdmVycmlkaW5nRGVwZW5kZW5jaWVzLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgICBvdmVycmlkaW5nRGVwZW5kZW5jaWVzLm1hcCgoeyBuYW1lLCB2ZXJzaW9uID0gXCIqXCIgfSkgPT4gW1xuICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgdmVyc2lvbixcbiAgICAgICAgXSksXG4gICAgICApO1xuICAgIH07XG5cbiAgICBzd2l0Y2ggKHRoaXMucGFja2FnZU1hbmFnZXIpIHtcbiAgICAgIGNhc2UgTm9kZVBhY2thZ2VNYW5hZ2VyLk5QTTpcbiAgICAgIGNhc2UgTm9kZVBhY2thZ2VNYW5hZ2VyLkJVTjpcbiAgICAgICAgcmV0dXJuIHsgb3ZlcnJpZGVzOiByZW5kZXIgfTtcbiAgICAgIGNhc2UgTm9kZVBhY2thZ2VNYW5hZ2VyLlBOUE06XG4gICAgICAgIHJldHVybiB0aGlzLnByb2plY3QucGFyZW50XG4gICAgICAgICAgPyB1bmRlZmluZWRcbiAgICAgICAgICA6IHsgcG5wbTogeyBvdmVycmlkZXM6IHJlbmRlciB9IH07XG4gICAgICBjYXNlIE5vZGVQYWNrYWdlTWFuYWdlci5ZQVJOOlxuICAgICAgY2FzZSBOb2RlUGFja2FnZU1hbmFnZXIuWUFSTjI6XG4gICAgICBjYXNlIE5vZGVQYWNrYWdlTWFuYWdlci5ZQVJOX0NMQVNTSUM6XG4gICAgICBjYXNlIE5vZGVQYWNrYWdlTWFuYWdlci5ZQVJOX0JFUlJZOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIHsgcmVzb2x1dGlvbnM6IHJlbmRlciB9O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXJzIHRoZSBuYXRpdmUgbnBtIGBhbGxvd1NjcmlwdHNgIGZpZWxkIChgeyBcInBrZ1wiOiB0cnVlIH1gKSBmcm9tIHRoZVxuICAgKiBgYWxsb3dTY3JpcHRzYCBhbGxvd2xpc3QuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLm5wbWpzLmNvbS9jbGkvdjExL2NvbW1hbmRzL25wbS1hcHByb3ZlLXNjcmlwdHNcbiAgICovXG4gIHByaXZhdGUgcmVuZGVyTnBtQWxsb3dTY3JpcHRzKCkge1xuICAgIGlmICh0aGlzLmFsbG93ZWRTY3JpcHRzLnNpemUgPT09IDApIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgIFsuLi50aGlzLmFsbG93ZWRTY3JpcHRzXS5zb3J0KCkubWFwKChwa2cpID0+IFtwa2csIHRydWVdKSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbmRlcnMgdGhlIG5hdGl2ZSBidW4gYHRydXN0ZWREZXBlbmRlbmNpZXNgIGZpZWxkIGZyb20gdGhlXG4gICAqIGBhbGxvd1NjcmlwdHNgIGFsbG93bGlzdC5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2J1bi5jb20vZG9jcy9wbS9saWZlY3ljbGVcbiAgICovXG4gIHByaXZhdGUgcmVuZGVyQnVuVHJ1c3RlZERlcGVuZGVuY2llcygpIHtcbiAgICBpZiAodGhpcy5hbGxvd2VkU2NyaXB0cy5zaXplID09PSAwKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIHJldHVybiBbLi4udGhpcy5hbGxvd2VkU2NyaXB0c10uc29ydCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbmRlcnMgdGhlIG5hdGl2ZSB5YXJuIGJlcnJ5IHBlci1wYWNrYWdlIHNjcmlwdCBhbGxvd2xpc3QgdmlhXG4gICAqIGBkZXBlbmRlbmNpZXNNZXRhLjxwa2c+LmJ1aWx0ID0gdHJ1ZWAuIENvbWJpbmVkIHdpdGggdGhlIGdsb2JhbFxuICAgKiBgZW5hYmxlU2NyaXB0czogZmFsc2VgIHlhcm5yYyBzZXR0aW5nIChzZXQgaW4gYGNvbmZpZ3VyZVlhcm5CZXJyeWApLFxuICAgKiB0aGlzIGFsbG93cyBpbnN0YWxsIHNjcmlwdHMgdG8gcnVuIG9ubHkgZm9yIHRoZSBsaXN0ZWQgcGFja2FnZXMuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly95YXJucGtnLmNvbS9jb25maWd1cmF0aW9uL21hbmlmZXN0I2RlcGVuZGVuY2llc01ldGEuYnVpbHRcbiAgICogQHNlZSBodHRwczovL3lhcm5wa2cuY29tL2ZlYXR1cmVzL3NlY3VyaXR5I3Bvc3RpbnN0YWxsc1xuICAgKi9cbiAgcHJpdmF0ZSByZW5kZXJZYXJuQmVycnlEZXBlbmRlbmNpZXNNZXRhKCkge1xuICAgIGlmICh0aGlzLmFsbG93ZWRTY3JpcHRzLnNpemUgPT09IDApIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgIFsuLi50aGlzLmFsbG93ZWRTY3JpcHRzXS5zb3J0KCkubWFwKChwa2cpID0+IFtwa2csIHsgYnVpbHQ6IHRydWUgfV0pLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIGFuZCBjb25maWd1cmVzIHRoZSBgYWxsb3dTY3JpcHRzYCBhbGxvd2xpc3QgZm9yIHRoZSByZXNvbHZlZFxuICAgKiBwYWNrYWdlIG1hbmFnZXIsIHRocm93aW5nIGEgZGVzY3JpcHRpdmUgZXJyb3IgZm9yIHBhY2thZ2UgbWFuYWdlcnMgdGhhdFxuICAgKiBoYXZlIG5vIG5hdGl2ZSB3YXkgdG8gYWxsb3dsaXN0IGluc3RhbGwgc2NyaXB0cyBwZXItZGVwZW5kZW5jeS5cbiAgICovXG4gIHByaXZhdGUgY29uZmlndXJlQWxsb3dTY3JpcHRzKCkge1xuICAgIGlmICh0aGlzLmFsbG93ZWRTY3JpcHRzLnNpemUgPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKHRoaXMucGFja2FnZU1hbmFnZXIpIHtcbiAgICAgIGNhc2UgTm9kZVBhY2thZ2VNYW5hZ2VyLk5QTTpcbiAgICAgIGNhc2UgTm9kZVBhY2thZ2VNYW5hZ2VyLkJVTjpcbiAgICAgICAgLy8gaGFuZGxlZCB2aWEgdGhlIGBhbGxvd1NjcmlwdHNgIC8gYHRydXN0ZWREZXBlbmRlbmNpZXNgIG1hbmlmZXN0IGZpZWxkc1xuICAgICAgICByZXR1cm47XG5cbiAgICAgIGNhc2UgTm9kZVBhY2thZ2VNYW5hZ2VyLllBUk4yOlxuICAgICAgY2FzZSBOb2RlUGFja2FnZU1hbmFnZXIuWUFSTl9CRVJSWTpcbiAgICAgICAgLy8gaGFuZGxlZCB2aWEgYGRlcGVuZGVuY2llc01ldGEuPHBrZz4uYnVpbHRgICsgYGVuYWJsZVNjcmlwdHM6IGZhbHNlYFxuICAgICAgICAvLyBpbiBgcmVuZGVyWWFybkJlcnJ5RGVwZW5kZW5jaWVzTWV0YWAgYW5kIGBjb25maWd1cmVZYXJuQmVycnlgXG4gICAgICAgIHJldHVybjtcblxuICAgICAgY2FzZSBOb2RlUGFja2FnZU1hbmFnZXIuUE5QTTpcbiAgICAgICAgLy8gaGFuZGxlZCB2aWEgYGNvbmZpZ3VyZVBucG1gXG4gICAgICAgIHJldHVybjtcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBcImFsbG93U2NyaXB0c1wiIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIHBhY2thZ2VNYW5hZ2VyIFwiJHt0aGlzLnBhY2thZ2VNYW5hZ2VyfVwiLiBgICtcbiAgICAgICAgICAgIFwiU3dpdGNoIHRvIGEgbW9kZXJuIHBhY2thZ2UgbWFuYWdlciB0aGF0IHN1cHBvcnRzIHRoaXMgb3B0aW9uLlwiLFxuICAgICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDb25maWd1cmVzIHRoZSBgUG5wbVdvcmtzcGFjZVlhbWxgIGNvbXBvbmVudCwgbWVyZ2luZyBgb25seUJ1aWx0RGVwZW5kZW5jaWVzYFxuICAgKiBmcm9tIGBhbGxvd1NjcmlwdHNgIGFuZCBhbnkgZXhwbGljaXQgYHBucG1PcHRpb25zLndvcmtzcGFjZVlhbWxPcHRpb25zYC5cbiAgICogVGhlIG1lcmdlIGlzIHJlc29sdmVkIGxhemlseSAoYXQgc3ludGhlc2lzIHRpbWUpLCBzbyBjYWxscyB0b1xuICAgKiBgYWRkQWxsb3dlZFNjcmlwdHNgL2ByZW1vdmVBbGxvd2VkU2NyaXB0c2AgbWFkZSBhZnRlciB0aGlzIHJ1bnMgYXJlXG4gICAqIHN0aWxsIHJlZmxlY3RlZC4gVGhlIGZpbGUgaXMgb25seSB3cml0dGVuIGlmIGl0IGVuZHMgdXAgd2l0aCBhY3R1YWxcbiAgICogY29udGVudCAoc2VlIGBvbWl0RW1wdHlgKSwgc28gdGhpcyBpcyBzYWZlIHRvIGNhbGwgdW5jb25kaXRpb25hbGx5IGZvclxuICAgKiBldmVyeSBwbnBtIHByb2plY3QuXG4gICAqL1xuICBwcml2YXRlIGNvbmZpZ3VyZVBucG0ocHJvamVjdDogUHJvamVjdCwgb3B0aW9uczogTm9kZVBhY2thZ2VPcHRpb25zKSB7XG4gICAgY29uc3QgeyB3b3Jrc3BhY2VZYW1sT3B0aW9ucyA9IHt9IH0gPSBvcHRpb25zLnBucG1PcHRpb25zID8/IHt9O1xuXG4gICAgY29uc3QgcmVuZGVyT25seUJ1aWx0RGVwZW5kZW5jaWVzID0gKCkgPT4ge1xuICAgICAgY29uc3QgbWVyZ2VkID0gbmV3IFNldChbXG4gICAgICAgIC4uLnRoaXMuYWxsb3dlZFNjcmlwdHMsXG4gICAgICAgIC4uLih3b3Jrc3BhY2VZYW1sT3B0aW9ucy5vbmx5QnVpbHREZXBlbmRlbmNpZXMgPz8gW10pLFxuICAgICAgXSk7XG4gICAgICByZXR1cm4gbWVyZ2VkLnNpemUgPiAwID8gWy4uLm1lcmdlZF0uc29ydCgpIDogdW5kZWZpbmVkO1xuICAgIH07XG5cbiAgICBuZXcgUG5wbVdvcmtzcGFjZVlhbWwocHJvamVjdCwge1xuICAgICAgLi4ud29ya3NwYWNlWWFtbE9wdGlvbnMsXG4gICAgICAvLyBgb25seUJ1aWx0RGVwZW5kZW5jaWVzYCBpcyB0eXBlZCBhcyBgc3RyaW5nW11gLCBidXQgZGVmaW5pbmcgaXQgYXMgYVxuICAgICAgLy8gZ2V0dGVyIGxldHMgdXMgcmVzb2x2ZSB0aGUgbWVyZ2VkIGFsbG93bGlzdCBsYXppbHkgKGF0IHN5bnRoZXNpc1xuICAgICAgLy8gdGltZSksIHNvIGBhZGRBbGxvd2VkU2NyaXB0c2AvYHJlbW92ZUFsbG93ZWRTY3JpcHRzYCBjYWxscyBtYWRlXG4gICAgICAvLyBhZnRlciB0aGlzIHJ1bnMgYXJlIHN0aWxsIHJlZmxlY3RlZC5cbiAgICAgIGdldCBvbmx5QnVpbHREZXBlbmRlbmNpZXMoKTogc3RyaW5nW10gfCB1bmRlZmluZWQge1xuICAgICAgICByZXR1cm4gcmVuZGVyT25seUJ1aWx0RGVwZW5kZW5jaWVzKCk7XG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSByZW5kZXJQdWJsaXNoQ29uZmlnKCkge1xuICAgIC8vIFdoZW4gbnBtIHByb3ZlbmFuY2UgaXMgZW5hYmxlZCwgd2UgbmVlZCB0byBhbHdheXMgcmVuZGVyIHRoZSBwdWJsaWMgYWNjZXNzXG4gICAgLy8gQnV0IHdoZW4gbnBtQWNjZXNzIGlzIHRoZSBzZXQgdG8gdGhlIGRlZmF1bHQsIHdlIHByZWZlciB0byBvbWl0IGl0XG4gICAgY29uc3Qgc2hvdWxkT21pdEFjY2VzcyA9XG4gICAgICAhdGhpcy5ucG1Qcm92ZW5hbmNlICYmXG4gICAgICB0aGlzLm5wbUFjY2VzcyA9PT0gZGVmYXVsdE5wbUFjY2Vzcyh0aGlzLnBhY2thZ2VOYW1lKTtcblxuICAgIC8vIG9taXQgdmFsdWVzIGlmIHRoZXkgYXJlIHRoZSBzYW1lIGFzIHRoZSBucG0gZGVmYXVsdHNcbiAgICByZXR1cm4gcmVzb2x2ZUpzb24oXG4gICAgICB7XG4gICAgICAgIHJlZ2lzdHJ5OlxuICAgICAgICAgIHRoaXMubnBtUmVnaXN0cnlVcmwgIT09IERFRkFVTFRfTlBNX1JFR0lTVFJZX1VSTFxuICAgICAgICAgICAgPyB0aGlzLm5wbVJlZ2lzdHJ5VXJsXG4gICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgYWNjZXNzOiBzaG91bGRPbWl0QWNjZXNzID8gdW5kZWZpbmVkIDogdGhpcy5ucG1BY2Nlc3MsXG4gICAgICB9LFxuICAgICAgeyBvbWl0RW1wdHk6IHRydWUgfSxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSByZW5kZXJLZXl3b3JkcygpIHtcbiAgICBjb25zdCBrd2RzID0gQXJyYXkuZnJvbSh0aGlzLmtleXdvcmRzKTtcbiAgICByZXR1cm4gc29ydGVkKGt3ZHMuc29ydCgpKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVuZGVyRW5naW5lcygpIHtcbiAgICByZXR1cm4gc29ydGVkKHRoaXMuZW5naW5lcyk7XG4gIH1cblxuICBwcml2YXRlIHJlbmRlckRldkVuZ2luZXMoKTogRGV2RW5naW5lcyB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgYXV0b0FkZCA9XG4gICAgICB0aGlzLl9vcHRpb25zLmFkZFBhY2thZ2VNYW5hZ2VyVG9EZXZFbmdpbmVzICE9PSBmYWxzZSAmJlxuICAgICAgdGhpcy5fcGFja2FnZU1hbmFnZXJFeHBsaWNpdDtcblxuICAgIGNvbnN0IGJhc2U6IERldkVuZ2luZXMgPSBhdXRvQWRkXG4gICAgICA/IHsgcGFja2FnZU1hbmFnZXI6IHRoaXMucGFja2FnZU1hbmFnZXJUb0RldkVuZ2luZSgpIH1cbiAgICAgIDoge307XG5cbiAgICBjb25zdCBtZXJnZWQgPSB7IC4uLmJhc2UsIC4uLnRoaXMuX29wdGlvbnMuZGV2RW5naW5lcyB9O1xuICAgIHJldHVybiBPYmplY3Qua2V5cyhtZXJnZWQpLmxlbmd0aCA+IDAgPyBtZXJnZWQgOiB1bmRlZmluZWQ7XG4gIH1cblxuICBwcml2YXRlIGRlbGV0ZU9ycGhhbmVkTG9ja0ZpbGVzKCkge1xuICAgIGNvbnN0IG93bkxvY2tGaWxlID0gam9pbih0aGlzLnByb2plY3Qub3V0ZGlyLCB0aGlzLmxvY2tGaWxlKTtcbiAgICBpZiAoIWV4aXN0c1N5bmMob3duTG9ja0ZpbGUpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgYWxsTG9ja0ZpbGVzID0gW1xuICAgICAgXCJ5YXJuLmxvY2tcIixcbiAgICAgIFwicGFja2FnZS1sb2NrLmpzb25cIixcbiAgICAgIFwicG5wbS1sb2NrLnlhbWxcIixcbiAgICAgIFwiYnVuLmxvY2tiXCIsXG4gICAgXTtcbiAgICBmb3IgKGNvbnN0IGxmIG9mIGFsbExvY2tGaWxlcykge1xuICAgICAgaWYgKGxmID09PSB0aGlzLmxvY2tGaWxlKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY29uc3QgcGF0aCA9IGpvaW4odGhpcy5wcm9qZWN0Lm91dGRpciwgbGYpO1xuICAgICAgaWYgKGV4aXN0c1N5bmMocGF0aCkpIHtcbiAgICAgICAgdGhpcy5wcm9qZWN0LmxvZ2dlci5pbmZvKGBEZWxldGluZyBvcnBoYW5lZCBsb2NrZmlsZTogJHtsZn1gKTtcbiAgICAgICAgdW5saW5rU3luYyhwYXRoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGF1dG9EaXNjb3ZlckJpbmFyaWVzKCkge1xuICAgIGNvbnN0IGJpbnJlbCA9IFwiYmluXCI7XG4gICAgY29uc3QgYmluZGlyID0gam9pbih0aGlzLnByb2plY3Qub3V0ZGlyLCBiaW5yZWwpO1xuICAgIGlmIChleGlzdHNTeW5jKGJpbmRpcikpIHtcbiAgICAgIGZvciAoY29uc3QgZmlsZSBvZiByZWFkZGlyU3luYyhiaW5kaXIpKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYWNjZXNzU3luYyhqb2luKGJpbmRpciwgZmlsZSksIGNvbnN0YW50cy5YX09LKTtcblxuICAgICAgICAgIGNvbnN0IGJpblBhdGggPSBqb2luKGJpbnJlbCwgZmlsZSk7XG4gICAgICAgICAgY29uc3Qgbm9ybWFsaXplZFBhdGggPSBub3JtYWxpemVQZXJzaXN0ZWRQYXRoKGJpblBhdGgpO1xuXG4gICAgICAgICAgdGhpcy5iaW5bZmlsZV0gPSBub3JtYWxpemVkUGF0aDtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIC8vIG5vdCBleGVjdXRhYmxlLCBza2lwXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHJlbmRlckF1dGhvcihvcHRpb25zOiBOb2RlUGFja2FnZU9wdGlvbnMpIHtcbiAgICBsZXQgYXV0aG9yO1xuICAgIGlmIChvcHRpb25zLmF1dGhvck5hbWUpIHtcbiAgICAgIGF1dGhvciA9IHtcbiAgICAgICAgbmFtZTogb3B0aW9ucy5hdXRob3JOYW1lLFxuICAgICAgICBlbWFpbDogb3B0aW9ucy5hdXRob3JFbWFpbCxcbiAgICAgICAgdXJsOiBvcHRpb25zLmF1dGhvclVybCxcbiAgICAgICAgb3JnYW5pemF0aW9uOiBvcHRpb25zLmF1dGhvck9yZ2FuaXphdGlvbiA/PyBmYWxzZSxcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChcbiAgICAgICAgb3B0aW9ucy5hdXRob3JFbWFpbCB8fFxuICAgICAgICBvcHRpb25zLmF1dGhvclVybCB8fFxuICAgICAgICBvcHRpb25zLmF1dGhvck9yZ2FuaXphdGlvbiAhPT0gdW5kZWZpbmVkXG4gICAgICApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICdcImF1dGhvck5hbWVcIiBpcyByZXF1aXJlZCBpZiBzcGVjaWZ5aW5nIFwiYXV0aG9yRW1haWxcIiBvciBcImF1dGhvclVybFwiJyxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGF1dGhvcjtcbiAgfVxuXG4gIHByaXZhdGUgcmVuZGVyQmluKCkge1xuICAgIGNvbnN0IGVudHJpZXMgPSBPYmplY3QuZW50cmllcyh0aGlzLmJpbik7XG5cbiAgICAvLyBZYXJuIEJlcnJ5IHJld3JpdGVzIGBcImJpblwiOiB7XCJuYW1lXCI6IFwiLi9wYXRoXCJ9YCB0byBgXCJiaW5cIjogXCIuL3BhdGhcImBcbiAgICAvLyB3aGVuIHRoZSBrZXkgbWF0Y2hlcyB0aGUgcGFja2FnZSBuYW1lLCBjYXVzaW5nIGFudGktdGFtcGVyIGZhaWx1cmVzLlxuICAgIC8vIFJlbmRlciB0aGUgc3RyaW5nIGZvcm0gZGlyZWN0bHkgdG8gYXZvaWQgdGhpcy5cbiAgICAvLyBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS95YXJucGtnL2JlcnJ5L2lzc3Vlcy82MTg0XG4gICAgY29uc3QgeyBuYW1lOiBiaW5OYW1lIH0gPSBwYXJzZVBhY2thZ2VOYW1lKHRoaXMucGFja2FnZU5hbWUpO1xuICAgIGlmIChpc1lhcm5CZXJyeSh0aGlzLnBhY2thZ2VNYW5hZ2VyKSAmJiBlbnRyaWVzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgY29uc3QgW2tleSwgdmFsdWVdID0gZW50cmllc1swXTtcbiAgICAgIGlmIChrZXkgPT09IGJpbk5hbWUpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBzb3J0ZWQodGhpcy5iaW4pO1xuICB9XG5cbiAgcHJpdmF0ZSByZW5kZXJTY3JpcHRzKCkge1xuICAgIC8vIFZhbGlkYXRlIHRoZSBgYWxsb3dTY3JpcHRzYCBhbGxvd2xpc3QgbGF6aWx5IChhdCBzeW50aGVzaXMgdGltZSwgc2luY2VcbiAgICAvLyBgc2NyaXB0c2AgaXMgYWx3YXlzIHJlc29sdmVkIHJlZ2FyZGxlc3Mgb2YgcGFja2FnZSBtYW5hZ2VyKSwgc29cbiAgICAvLyBgYWRkQWxsb3dlZFNjcmlwdHNgIGNhbGxzIG1hZGUgYWZ0ZXIgY29uc3RydWN0aW9uIGFyZSBhbHNvIGNoZWNrZWQuXG4gICAgdGhpcy5jb25maWd1cmVBbGxvd1NjcmlwdHMoKTtcblxuICAgIGNvbnN0IHJlc3VsdDogYW55ID0ge307XG4gICAgY29uc3QgdGFza3MgPSB0aGlzLnByb2plY3QudGFza3MuYWxsXG4gICAgICAuZmlsdGVyKFxuICAgICAgICAodCkgPT5cbiAgICAgICAgICAvLyBNdXN0IHJlbW92ZSB0byBwcmV2ZW50IG92ZXJyaWRpbmcgYnVpbHQtaW4gbnBtIGNvbW1hbmQgKHdoaWNoIHdvdWxkIGxvb3ApXG4gICAgICAgICAgdC5uYW1lICE9PSB0aGlzLmluc3RhbGxUYXNrLm5hbWUgJiZcbiAgICAgICAgICB0Lm5hbWUgIT09IHRoaXMuaW5zdGFsbENpVGFzay5uYW1lLFxuICAgICAgKVxuICAgICAgLnNvcnQoKHgsIHkpID0+IHgubmFtZS5sb2NhbGVDb21wYXJlKHkubmFtZSkpO1xuXG4gICAgY29uc3Qgc2NyaXB0Q29tbWFuZCA9IHRoaXMucmVzb2x2ZVNjcmlwdENvbW1hbmQoKTtcbiAgICBmb3IgKGNvbnN0IHRhc2sgb2YgdGFza3MpIHtcbiAgICAgIGlmICh0aGlzLnNjcmlwdHNUb0JlUmVtb3ZlZC5oYXModGFzay5uYW1lKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHJlc3VsdFt0YXNrLm5hbWVdID0gYCR7c2NyaXB0Q29tbWFuZH0gJHt0YXNrLm5hbWV9YDtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4ucmVzdWx0LFxuICAgICAgLi4udGhpcy5zY3JpcHRzLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyB0aGUgY29tbWFuZCB0byB1c2UgZm9yIHByb2plbiBpbiBwYWNrYWdlLmpzb24gc2NyaXB0cy5cbiAgICpcbiAgICogU2luY2UgYG5vZGVfbW9kdWxlcy8uYmluYCBpcyBhbHdheXMgb24gUEFUSCBpbiBucG0gc2NyaXB0cywgd2UgY2FuIHVzZVxuICAgKiBiYXJlIGBwcm9qZW5gIHVubGVzcyB0aGUgdXNlciBoYXMgc2V0IGEgY3VzdG9tIGBwcm9qZW5Db21tYW5kYC5cbiAgICovXG4gIHByaXZhdGUgcmVzb2x2ZVNjcmlwdENvbW1hbmQoKTogc3RyaW5nIHtcbiAgICBjb25zdCBjbWQgPSB0aGlzLnByb2plY3QucHJvamVuQ29tbWFuZDtcbiAgICBjb25zdCBpc0RlZmF1bHQgPSBbXG4gICAgICAvLyBOb2RlUHJvamVjdCBzZXRzIHByb2plbkNvbW1hbmQgYmFzZWQgb24gdGhlIHBhY2thZ2UgbWFuYWdlclxuICAgICAgZXhlY0NvbW1hbmQodGhpcy5wYWNrYWdlTWFuYWdlciwgXCJwcm9qZW5cIiksXG4gICAgICAvLyBQbGFpbiBQcm9qZWN0IGFsd2F5cyBkZWZhdWx0cyB0byBcIm5weCBwcm9qZW5cIiByZWdhcmRsZXNzIG9mIHBhY2thZ2UgbWFuYWdlclxuICAgICAgXCJucHggcHJvamVuXCIsXG4gICAgXS5pbmNsdWRlcyhjbWQpO1xuICAgIHJldHVybiBpc0RlZmF1bHQgPyBcInByb2plblwiIDogY21kO1xuICB9XG5cbiAgcHJpdmF0ZSByZWFkUGFja2FnZUpzb24oKSB7XG4gICAgY29uc3QgZmlsZSA9IGpvaW4odGhpcy5wcm9qZWN0Lm91dGRpciwgXCJwYWNrYWdlLmpzb25cIik7XG4gICAgaWYgKCFleGlzdHNTeW5jKGZpbGUpKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIHJldHVybiBKU09OLnBhcnNlKHJlYWRGaWxlU3luYyhmaWxlLCBcInV0Zi04XCIpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHRoZSBpbnN0YWxsIG9yIGluc3RhbGw6Y2kgdGFzay4gRG9lcyBub3QgbG9nIOKAlCB0aGUgY2FsbGVyIGlzXG4gICAqIHJlc3BvbnNpYmxlIGZvciBpbmZvcm1pbmcgdGhlIHVzZXIgYmVmb3JlIGNhbGxpbmcgdGhpcyBtZXRob2QuXG4gICAqXG4gICAqIEBwYXJhbSBfdHJpZ2dlciB0aGUgcmVhc29uIGZvciB0aGUgaW5zdGFsbCwgYXZhaWxhYmxlIGZvciBzdWJjbGFzc2VzIHRvIGFjdCBvbi5cbiAgICovXG4gIHByb3RlY3RlZCBpbnN0YWxsRGVwZW5kZW5jaWVzKF90cmlnZ2VyOiBJbnN0YWxsVHJpZ2dlcikge1xuICAgIGNvbnN0IHRhc2tUb1J1biA9IHRoaXMuaXNBdXRvbWF0ZWRCdWlsZFxuICAgICAgPyB0aGlzLmluc3RhbGxDaVRhc2tcbiAgICAgIDogdGhpcy5pbnN0YWxsVGFzaztcbiAgICB0aGlzLnByb2plY3QudGFza3MucnVuVGFzayh0YXNrVG9SdW4ubmFtZSk7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgYHBhY2thZ2VNYW5hZ2VyYCBmaWVsZCBpbiBgcGFja2FnZS5qc29uYCBmb3IgY29yZXBhY2stbWFuYWdlZFxuICAgKiBwYWNrYWdlIG1hbmFnZXJzICh5YXJuIGJlcnJ5IGFuZCBwbnBtKS5cbiAgICovXG4gIHByaXZhdGUgY29uZmlndXJlQ29yZXBhY2soKSB7XG4gICAgaWYgKGlzWWFybkJlcnJ5KHRoaXMucGFja2FnZU1hbmFnZXIpKSB7XG4gICAgICB0aGlzLmFkZEZpZWxkKFwicGFja2FnZU1hbmFnZXJcIiwgYHlhcm5AJHt0aGlzLl95YXJuQmVycnlWZXJzaW9ufWApO1xuICAgIH0gZWxzZSBpZiAodGhpcy5wYWNrYWdlTWFuYWdlciA9PT0gTm9kZVBhY2thZ2VNYW5hZ2VyLlBOUE0pIHtcbiAgICAgIHRoaXMuYWRkRmllbGQoXCJwYWNrYWdlTWFuYWdlclwiLCBgcG5wbUAke3RoaXMuX3BucG1WZXJzaW9ufWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBNYXBzIHRoZSBjdXJyZW50IHBhY2thZ2UgbWFuYWdlciB0byBhIGBEZXZFbmdpbmVEZXBlbmRlbmN5YC5cbiAgICovXG4gIHByaXZhdGUgcGFja2FnZU1hbmFnZXJUb0RldkVuZ2luZSgpOiBEZXZFbmdpbmVEZXBlbmRlbmN5IHtcbiAgICBjb25zdCBvbkZhaWwgPSBcImlnbm9yZVwiO1xuICAgIHN3aXRjaCAodGhpcy5wYWNrYWdlTWFuYWdlcikge1xuICAgICAgY2FzZSBOb2RlUGFja2FnZU1hbmFnZXIuWUFSTjpcbiAgICAgIGNhc2UgTm9kZVBhY2thZ2VNYW5hZ2VyLllBUk5fQ0xBU1NJQzpcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBuYW1lOiBcInlhcm5cIixcbiAgICAgICAgICB2ZXJzaW9uOiBERUZBVUxUX1lBUk5fQ0xBU1NJQ19WRVJTSU9OLFxuICAgICAgICAgIG9uRmFpbCxcbiAgICAgICAgfTtcbiAgICAgIGNhc2UgTm9kZVBhY2thZ2VNYW5hZ2VyLllBUk4yOlxuICAgICAgY2FzZSBOb2RlUGFja2FnZU1hbmFnZXIuWUFSTl9CRVJSWTpcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBuYW1lOiBcInlhcm5cIixcbiAgICAgICAgICB2ZXJzaW9uOlxuICAgICAgICAgICAgdGhpcy5fb3B0aW9ucy55YXJuQmVycnlPcHRpb25zPy52ZXJzaW9uID8/XG4gICAgICAgICAgICBgPj0ke3NlbXZlci5tYWpvcih0aGlzLl95YXJuQmVycnlWZXJzaW9uKX1gLFxuICAgICAgICAgIG9uRmFpbCxcbiAgICAgICAgfTtcbiAgICAgIGNhc2UgTm9kZVBhY2thZ2VNYW5hZ2VyLk5QTTpcbiAgICAgICAgcmV0dXJuIHsgbmFtZTogXCJucG1cIiwgb25GYWlsIH07XG4gICAgICBjYXNlIE5vZGVQYWNrYWdlTWFuYWdlci5QTlBNOlxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIG5hbWU6IFwicG5wbVwiLFxuICAgICAgICAgIHZlcnNpb246XG4gICAgICAgICAgICB0aGlzLl9vcHRpb25zLnBucG1WZXJzaW9uID8/IGA+PSR7c2VtdmVyLm1ham9yKHRoaXMuX3BucG1WZXJzaW9uKX1gLFxuICAgICAgICAgIG9uRmFpbCxcbiAgICAgICAgfTtcbiAgICAgIGNhc2UgTm9kZVBhY2thZ2VNYW5hZ2VyLkJVTjpcbiAgICAgICAgcmV0dXJuIHsgbmFtZTogXCJidW5cIiwgb25GYWlsIH07XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjb25maWd1cmVZYXJuQmVycnkocHJvamVjdDogUHJvamVjdCwgb3B0aW9uczogTm9kZVBhY2thZ2VPcHRpb25zKSB7XG4gICAgY29uc3QgeyB5YXJuUmNPcHRpb25zID0ge30sIHplcm9JbnN0YWxscyA9IGZhbHNlIH0gPVxuICAgICAgb3B0aW9ucy55YXJuQmVycnlPcHRpb25zIHx8IHt9O1xuICAgIHRoaXMuY2hlY2tGb3JDb25mbGljdGluZ1lhcm5PcHRpb25zKHlhcm5SY09wdGlvbnMpO1xuXG4gICAgdGhpcy5jb25maWd1cmVZYXJuQmVycnlHaXRpZ25vcmUoemVyb0luc3RhbGxzKTtcblxuICAgIC8vIFdoZW4gYW4gYWxsb3dsaXN0IGlzIHByb3ZpZGVkLCBkaXNhYmxlIHNjcmlwdHMgZ2xvYmFsbHkgc28gdGhhdCBvbmx5XG4gICAgLy8gdGhlIHBhY2thZ2VzIGV4cGxpY2l0bHkgbWFya2VkIHZpYSBgZGVwZW5kZW5jaWVzTWV0YS48cGtnPi5idWlsdGAgYXJlXG4gICAgLy8gYWxsb3dlZCB0byBydW4gdGhlaXIgaW5zdGFsbCBzY3JpcHRzLiBSZXNvbHZlZCBsYXppbHkgKGF0IHN5bnRoZXNpc1xuICAgIC8vIHRpbWUsIHZpYSBhIGdldHRlcikgc28gdGhhdCBsYXRlciBjYWxscyB0b1xuICAgIC8vIGBhZGRBbGxvd2VkU2NyaXB0c2AvYHJlbW92ZUFsbG93ZWRTY3JpcHRzYCBhcmUgcmVmbGVjdGVkLiBIYXMgbm9cbiAgICAvLyBlZmZlY3QgaWYgdGhlIHVzZXIgc2V0IGBlbmFibGVTY3JpcHRzYCBleHBsaWNpdGx5LlxuICAgIGNvbnN0IG5vZGVQYWNrYWdlID0gdGhpcztcbiAgICBuZXcgWWFybnJjKHByb2plY3QsIHtcbiAgICAgIGdldCBlbmFibGVTY3JpcHRzKCk6IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuICAgICAgICByZXR1cm4gbm9kZVBhY2thZ2UuYWxsb3dlZFNjcmlwdHMuc2l6ZSA+IDAgPyBmYWxzZSA6IHVuZGVmaW5lZDtcbiAgICAgIH0sXG4gICAgICAuLi55YXJuUmNPcHRpb25zLFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBjaGVja0ZvckNvbmZsaWN0aW5nWWFybk9wdGlvbnMoeWFyblJjT3B0aW9uczogWWFybnJjT3B0aW9ucykge1xuICAgIGlmIChcbiAgICAgIHRoaXMubnBtQWNjZXNzICYmXG4gICAgICB5YXJuUmNPcHRpb25zLm5wbVB1Ymxpc2hBY2Nlc3MgJiZcbiAgICAgIHRoaXMubnBtQWNjZXNzLnRvU3RyaW5nKCkgIT09IHlhcm5SY09wdGlvbnMubnBtUHVibGlzaEFjY2Vzcy50b1N0cmluZygpXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBDYW5ub3Qgc2V0IG5wbUFjY2VzcyAoJHt0aGlzLm5wbUFjY2Vzc30pIGFuZCB5YXJuUmNPcHRpb25zLm5wbVB1Ymxpc2hBY2Nlc3MgKCR7eWFyblJjT3B0aW9ucy5ucG1QdWJsaXNoQWNjZXNzfSkgdG8gZGlmZmVyZW50IHZhbHVlcy5gLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICB0aGlzLm5wbVJlZ2lzdHJ5VXJsICYmXG4gICAgICB5YXJuUmNPcHRpb25zLm5wbVJlZ2lzdHJ5U2VydmVyICYmXG4gICAgICB0aGlzLm5wbVJlZ2lzdHJ5VXJsICE9PSB5YXJuUmNPcHRpb25zLm5wbVJlZ2lzdHJ5U2VydmVyXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBDYW5ub3Qgc2V0IG5wbVJlZ2lzdHJ5VXJsICgke3RoaXMubnBtUmVnaXN0cnlVcmx9KSBhbmQgeWFyblJjT3B0aW9ucy5ucG1SZWdpc3RyeVNlcnZlciAoJHt5YXJuUmNPcHRpb25zLm5wbVJlZ2lzdHJ5U2VydmVyfSkgdG8gZGlmZmVyZW50IHZhbHVlcy5gLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKiogU2VlIGh0dHBzOi8veWFybnBrZy5jb20vZ2V0dGluZy1zdGFydGVkL3FhI3doaWNoLWZpbGVzLXNob3VsZC1iZS1naXRpZ25vcmVkICovXG4gIHByaXZhdGUgY29uZmlndXJlWWFybkJlcnJ5R2l0aWdub3JlKHplcm9JbnN0YWxsczogYm9vbGVhbikge1xuICAgIGNvbnN0IHsgZ2l0aWdub3JlIH0gPSB0aGlzLnByb2plY3Q7XG5cbiAgICAvLyBUaGVzZSBwYXR0ZXJucyBhcmUgdGhlIHNhbWUgd2hldGhlciBvciBub3QgeW91J3JlIHVzaW5nIHplcm8taW5zdGFsbHNcbiAgICBnaXRpZ25vcmUuZXhjbHVkZShcIi55YXJuLypcIik7XG4gICAgZ2l0aWdub3JlLmluY2x1ZGUoXG4gICAgICBcIi55YXJuL3BhdGNoZXNcIixcbiAgICAgIFwiLnlhcm4vcGx1Z2luc1wiLFxuICAgICAgXCIueWFybi9yZWxlYXNlc1wiLFxuICAgICAgXCIueWFybi9zZGtzXCIsXG4gICAgICBcIi55YXJuL3ZlcnNpb25zXCIsXG4gICAgKTtcblxuICAgIGlmICh6ZXJvSW5zdGFsbHMpIHtcbiAgICAgIGdpdGlnbm9yZS5pbmNsdWRlKFwiIS55YXJuL2NhY2hlXCIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBnaXRpZ25vcmUuZXhjbHVkZShcIi5wbnAuKlwiKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBQZWVyRGVwZW5kZW5jeU9wdGlvbnMge1xuICAvKipcbiAgICogQXV0b21hdGljYWxseSBhZGQgYSBwaW5uZWQgZGV2IGRlcGVuZGVuY3kuXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIHJlYWRvbmx5IHBpbm5lZERldkRlcGVuZGVuY3k/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIFRoZSBub2RlIHBhY2thZ2UgbWFuYWdlciB0byB1c2UuXG4gKi9cbmV4cG9ydCBlbnVtIE5vZGVQYWNrYWdlTWFuYWdlciB7XG4gIC8qKlxuICAgKiBVc2UgYHlhcm5gIGFzIHRoZSBwYWNrYWdlIG1hbmFnZXIuXG4gICAqXG4gICAqIEBkZXByZWNhdGVkIEZvciBgeWFybmAgMS54IHVzZSBgWUFSTl9DTEFTU0lDYCBmb3IgYHlhcm5gID49IDIgdXNlIGBZQVJOX0JFUlJZYC4gQ3VycmVudGx5LCBgTm9kZVBhY2thZ2VNYW5hZ2VyLllBUk5gIG1lYW5zIGBZQVJOX0NMQVNTSUNgLiBJbiB0aGUgZnV0dXJlLCB3ZSBtaWdodCByZXB1cnBvc2UgaXQgdG8gbWVhbiBgWUFSTl9CRVJSWWAuXG4gICAqL1xuICBZQVJOID0gXCJ5YXJuXCIsXG5cbiAgLyoqXG4gICAqIFVzZSBgeWFybmAgdmVyc2lvbnMgPj0gMiBhcyB0aGUgcGFja2FnZSBtYW5hZ2VyLlxuICAgKlxuICAgKiBAZGVwcmVjYXRlZCB1c2UgWUFSTl9CRVJSWSBpbnN0ZWFkXG4gICAqL1xuICBZQVJOMiA9IFwieWFybjJcIixcblxuICAvKipcbiAgICogVXNlIGB5YXJuYCAxLnggYXMgdGhlIHBhY2thZ2UgbWFuYWdlci5cbiAgICovXG4gIFlBUk5fQ0xBU1NJQyA9IFwieWFybl9jbGFzc2ljXCIsXG5cbiAgLyoqXG4gICAqIFVzZSBgeWFybmAgdmVyc2lvbnMgPj0gMiBhcyB0aGUgcGFja2FnZSBtYW5hZ2VyLlxuICAgKi9cbiAgWUFSTl9CRVJSWSA9IFwieWFybl9iZXJyeVwiLFxuXG4gIC8qKlxuICAgKiBVc2UgYG5wbWAgYXMgdGhlIHBhY2thZ2UgbWFuYWdlci5cbiAgICovXG4gIE5QTSA9IFwibnBtXCIsXG5cbiAgLyoqXG4gICAqIFVzZSBgcG5wbWAgYXMgdGhlIHBhY2thZ2UgbWFuYWdlci5cbiAgICovXG4gIFBOUE0gPSBcInBucG1cIixcblxuICAvKipcbiAgICogVXNlIGBidW5gIGFzIHRoZSBwYWNrYWdlIG1hbmFnZXJcbiAgICovXG4gIEJVTiA9IFwiYnVuXCIsXG59XG5cbi8qKlxuICogTnBtIHBhY2thZ2UgYWNjZXNzIGxldmVsXG4gKi9cbmV4cG9ydCBlbnVtIE5wbUFjY2VzcyB7XG4gIC8qKlxuICAgKiBQYWNrYWdlIGlzIHB1YmxpYy5cbiAgICovXG4gIFBVQkxJQyA9IFwicHVibGljXCIsXG5cbiAgLyoqXG4gICAqIFBhY2thZ2UgY2FuIG9ubHkgYmUgYWNjZXNzZWQgd2l0aCBjcmVkZW50aWFscy5cbiAgICovXG4gIFJFU1RSSUNURUQgPSBcInJlc3RyaWN0ZWRcIixcbn1cblxuLyoqXG4gKiBDb25maWd1cmUgWWFybiBCZXJyeVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFlhcm5CZXJyeU9wdGlvbnMge1xuICAvKipcbiAgICogQSBmdWxseSBzcGVjaWZpZWQgdmVyc2lvbiB0byB1c2UgZm9yIHlhcm4gKGUuZy4sIHgueC54KVxuICAgKlxuICAgKiBAZGVmYXVsdCAtIDQuMTMuMFxuICAgKi9cbiAgcmVhZG9ubHkgdmVyc2lvbj86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHlhcm5yYyBjb25maWd1cmF0aW9uLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGEgYmxhbmsgWWFybiBSQyBmaWxlXG4gICAqL1xuICByZWFkb25seSB5YXJuUmNPcHRpb25zPzogWWFybnJjT3B0aW9ucztcblxuICAvKipcbiAgICogU2hvdWxkIHplcm8taW5zdGFsbHMgYmUgZW5hYmxlZD9cbiAgICogTGVhcm4gbW9yZSBhdDogaHR0cHM6Ly95YXJucGtnLmNvbS9mZWF0dXJlcy9jYWNoaW5nI3plcm8taW5zdGFsbHNcbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IHplcm9JbnN0YWxscz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFBhY2thZ2VzIHRvIGRlZHVwbGljYXRlIHdoZW4gdGhlIGBkZWR1cGVgIHRhc2sgcnVucy5cbiAgICpcbiAgICogVGhpcyB3aWxsIHByZXZlbnQgbXVsdGlwbGUgdmVyc2lvbnMgb2YgdGhlIHNhbWUgcGFja2FnZSBmcm9tIGJlaW5nXG4gICAqIGluc3RhbGxlZCBpbiB0aGUgbG9jayBmaWxlLCBpZiBhIHNpbmdsZSB2ZXJzaW9uIGNvdWxkIHNhdGlzZnkgYWxsIHJlcXVlc3RlZFxuICAgKiB2ZXJzaW9uIHJhbmdlcy4gVGhpcyB3aWxsIHByZXZlbnQgdmVyc2lvbiBwcm9saWZlcmF0aW9uIGFuZCByZWR1Y2UgdGhlIHNpemVcbiAgICogb2YgdGhlIGRlcGVuZGVuY3kgdHJlZS5cbiAgICpcbiAgICogU2V0dGluZyB0aGlzIGltcGxpZXMgYGRlZHVwZURlcHM6IHRydWVgIG9uIHRoZSBwcm9qZWN0LCB3aGljaCB3aWxsIHJ1blxuICAgKiBgeWFybiBkZWR1cGVgIGFmdGVyIGV2ZXJ5IG11dGF0aW5nIGluc3RhbGwuIFNldCBgZGVkdXBlRGVwczogZmFsc2VgXG4gICAqIGV4cGxpY2l0bHkgdG8gZGlzYWJsZSB0aGUgdGFzay5cbiAgICpcbiAgICogU3VwcG9ydHMgZ2xvYiBwYXR0ZXJucywgZS5nLiBgQGF3cy1zZGsvKmAuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gYWxsIHBhY2thZ2VzIGFyZSBkZWR1cGxpY2F0ZWRcbiAgICovXG4gIHJlYWRvbmx5IGRlZHVwZVBhY2thZ2VzPzogc3RyaW5nW107XG59XG5cbi8qKlxuICogQ29uZmlndXJlIHBucG1cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQbnBtT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgYHBucG0td29ya3NwYWNlLnlhbWxgIGNvbmZpZ3VyYXRpb24uXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gYSBibGFuayBwbnBtLXdvcmtzcGFjZS55YW1sIGZpbGVcbiAgICovXG4gIHJlYWRvbmx5IHdvcmtzcGFjZVlhbWxPcHRpb25zPzogUG5wbVdvcmtzcGFjZVlhbWxPcHRpb25zO1xufVxuXG5pbnRlcmZhY2UgTnBtRGVwZW5kZW5jaWVzIHtcbiAgcmVhZG9ubHkgZGVwZW5kZW5jaWVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICByZWFkb25seSBkZXZEZXBlbmRlbmNpZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIHJlYWRvbmx5IHBlZXJEZXBlbmRlbmNpZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG59XG5cbi8qKlxuICogV2h5IGEgZGVwZW5kZW5jeSBpbnN0YWxsIHdhcyB0cmlnZ2VyZWQgZHVyaW5nIHN5bnRoZXNpcy5cbiAqL1xuZXhwb3J0IGVudW0gSW5zdGFsbFJlYXNvbiB7XG4gIC8qKiBUaGUgbm9kZV9tb2R1bGVzIGRpcmVjdG9yeSBkb2VzIG5vdCBleGlzdC4gKi9cbiAgTk9fTk9ERV9NT0RVTEVTID0gXCJub2RlX21vZHVsZXMgaXMgbWlzc2luZ1wiLFxuICAvKiogVGhlIHBhY2thZ2UuanNvbiBmaWxlIHdhcyBtb2RpZmllZCBkdXJpbmcgc3ludGhlc2lzLiAqL1xuICBQQUNLQUdFX0pTT05fQ0hBTkdFRCA9IFwicGFja2FnZS5qc29uIGhhcyBjaGFuZ2VkXCIsXG4gIC8qKiBXaWxkY2FyZCBkZXBlbmRlbmN5IHZlcnNpb25zIHdlcmUgcmVzb2x2ZWQgdG8gY29uY3JldGUgcmFuZ2VzLiAqL1xuICBERVBTX1JFU09MVkVEID0gXCJyZXNvbHZlZCBkZXBlbmRlbmN5IHZlcnNpb25zIGNoYW5nZWRcIixcbn1cblxuLyoqXG4gKiBEZXNjcmliZXMgd2h5IGRlcGVuZGVuY2llcyBuZWVkIHRvIGJlIGluc3RhbGxlZC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnN0YWxsVHJpZ2dlciB7XG4gIC8qKiBUaGUgcmVhc29uIGZvciB0aGUgaW5zdGFsbC4gKi9cbiAgcmVhZG9ubHkgcmVhc29uOiBJbnN0YWxsUmVhc29uO1xuXG4gIC8qKlxuICAgKiBBIHVuaWZpZWQgZGlmZiBvZiB0aGUgcGFja2FnZS5qc29uIGNoYW5nZXMuXG4gICAqIE9ubHkgcHJlc2VudCB3aGVuIHJlYXNvbiBpcyBgUEFDS0FHRV9KU09OX0NIQU5HRURgLlxuICAgKi9cbiAgcmVhZG9ubHkgZGlmZj86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBIdW1hbi1yZWFkYWJsZSBkZXNjcmlwdGlvbnMgb2YgcmVzb2x2ZWQgZGVwZW5kZW5jeSB2ZXJzaW9uIGNoYW5nZXMuXG4gICAqIE9ubHkgcHJlc2VudCB3aGVuIHJlYXNvbiBpcyBgREVQU19SRVNPTFZFRGAuXG4gICAqL1xuICByZWFkb25seSByZXNvbHV0aW9ucz86IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIERldGVybWluZXMgaWYgYW4gbnBtIHBhY2thZ2UgaXMgXCJzY29wZWRcIiAoaS5lLiBpdCBzdGFydHMgd2l0aCBcInh4eEBcIikuXG4gKi9cbmZ1bmN0aW9uIGlzU2NvcGVkKHBhY2thZ2VOYW1lOiBzdHJpbmcpIHtcbiAgcmV0dXJuIHBhY2thZ2VOYW1lLnN0YXJ0c1dpdGgoXCJAXCIpO1xufVxuXG5mdW5jdGlvbiBwYXJzZVBhY2thZ2VOYW1lKHBhY2thZ2VOYW1lOiBzdHJpbmcpOiB7XG4gIHNjb3BlPzogc3RyaW5nO1xuICBuYW1lOiBzdHJpbmc7XG59IHtcbiAgaWYgKGlzU2NvcGVkKHBhY2thZ2VOYW1lKSkge1xuICAgIGNvbnN0IFtzY29wZSwgbmFtZV0gPSBwYWNrYWdlTmFtZS5zcGxpdChcIi9cIik7XG4gICAgcmV0dXJuIHsgc2NvcGUsIG5hbWUgfTtcbiAgfVxuICByZXR1cm4geyBuYW1lOiBwYWNrYWdlTmFtZSB9O1xufVxuXG5mdW5jdGlvbiBkZWZhdWx0TnBtQWNjZXNzKHBhY2thZ2VOYW1lOiBzdHJpbmcpIHtcbiAgcmV0dXJuIGlzU2NvcGVkKHBhY2thZ2VOYW1lKSA/IE5wbUFjY2Vzcy5SRVNUUklDVEVEIDogTnBtQWNjZXNzLlBVQkxJQztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRlZmF1bHROcG1Ub2tlbihcbiAgbnBtVG9rZW46IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgcmVnaXN0cnk6IHN0cmluZyB8IHVuZGVmaW5lZCxcbikge1xuICAvLyBpZiB3ZSBhcmUgcHVibGlzaGluZyB0byBBV1MgQ29kZUFydGlmYWN0LCBubyBOUE1fVE9LRU4gdXNlZCAod2lsbCBiZSByZXF1ZXN0ZWQgdXNpbmcgQVdTIENMSSBsYXRlcikuXG4gIGlmIChpc0F3c0NvZGVBcnRpZmFjdFJlZ2lzdHJ5KHJlZ2lzdHJ5KSkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICAvLyBpZiB3ZSBhcmUgcHVibGlzaGluZyB0byBHaXRIdWIgUGFja2FnZXMsIGRlZmF1bHQgdG8gR0lUSFVCX1RPS0VOLlxuICBjb25zdCBpc0dpdEh1YlBhY2thZ2VzID0gcmVnaXN0cnkgPT09IEdJVEhVQl9QQUNLQUdFU19SRUdJU1RSWTtcbiAgcmV0dXJuIChcbiAgICBucG1Ub2tlbiA/P1xuICAgIChpc0dpdEh1YlBhY2thZ2VzID8gREVGQVVMVF9HSVRIVUJfVE9LRU5fU0VDUkVUIDogREVGQVVMVF9OUE1fVE9LRU5fU0VDUkVUKVxuICApO1xufVxuXG5mdW5jdGlvbiBkZXRlcm1pbmVMb2NrZmlsZShwYWNrYWdlTWFuYWdlcjogTm9kZVBhY2thZ2VNYW5hZ2VyKSB7XG4gIHN3aXRjaCAocGFja2FnZU1hbmFnZXIpIHtcbiAgICBjYXNlIE5vZGVQYWNrYWdlTWFuYWdlci5ZQVJOOlxuICAgIGNhc2UgTm9kZVBhY2thZ2VNYW5hZ2VyLllBUk5fQ0xBU1NJQzpcbiAgICBjYXNlIE5vZGVQYWNrYWdlTWFuYWdlci5ZQVJOMjpcbiAgICBjYXNlIE5vZGVQYWNrYWdlTWFuYWdlci5ZQVJOX0JFUlJZOlxuICAgICAgcmV0dXJuIFwieWFybi5sb2NrXCI7XG4gICAgY2FzZSBOb2RlUGFja2FnZU1hbmFnZXIuTlBNOlxuICAgICAgcmV0dXJuIFwicGFja2FnZS1sb2NrLmpzb25cIjtcbiAgICBjYXNlIE5vZGVQYWNrYWdlTWFuYWdlci5QTlBNOlxuICAgICAgcmV0dXJuIFwicG5wbS1sb2NrLnlhbWxcIjtcbiAgICBjYXNlIE5vZGVQYWNrYWdlTWFuYWdlci5CVU46XG4gICAgICByZXR1cm4gXCJidW4ubG9ja2JcIjtcbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IEVycm9yKGB1bnN1cHBvcnRlZCBwYWNrYWdlIG1hbmFnZXIgJHtwYWNrYWdlTWFuYWdlcn1gKTtcbiAgfVxufVxuXG4vKipcbiAqIE1hcHMgYSBwYWNrYWdlIG1hbmFnZXIgbmFtZSAoYXMgdXNlZCBpbiBwYWNrYWdlLmpzb24gYHBhY2thZ2VNYW5hZ2VyYCBhbmRcbiAqIGBkZXZFbmdpbmVzLnBhY2thZ2VNYW5hZ2VyYCBmaWVsZHMpIHRvIGEgYE5vZGVQYWNrYWdlTWFuYWdlcmAgZW51bSB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gcGFja2FnZU1hbmFnZXJOYW1lVG9FbnVtKFxuICBuYW1lOiBzdHJpbmcsXG4gIG1ham9yVmVyc2lvbj86IG51bWJlcixcbik6IE5vZGVQYWNrYWdlTWFuYWdlciB8IHVuZGVmaW5lZCB7XG4gIHN3aXRjaCAobmFtZSkge1xuICAgIGNhc2UgXCJucG1cIjpcbiAgICAgIHJldHVybiBOb2RlUGFja2FnZU1hbmFnZXIuTlBNO1xuICAgIGNhc2UgXCJwbnBtXCI6XG4gICAgICByZXR1cm4gTm9kZVBhY2thZ2VNYW5hZ2VyLlBOUE07XG4gICAgY2FzZSBcImJ1blwiOlxuICAgICAgcmV0dXJuIE5vZGVQYWNrYWdlTWFuYWdlci5CVU47XG4gICAgY2FzZSBcInlhcm5cIjpcbiAgICAgIGlmIChtYWpvclZlcnNpb24gIT09IHVuZGVmaW5lZCAmJiBtYWpvclZlcnNpb24gPj0gMikge1xuICAgICAgICByZXR1cm4gTm9kZVBhY2thZ2VNYW5hZ2VyLllBUk5fQkVSUlk7XG4gICAgICB9XG4gICAgICByZXR1cm4gTm9kZVBhY2thZ2VNYW5hZ2VyLllBUk5fQ0xBU1NJQztcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG4vKipcbiAqIEluZmVycyB0aGUgYE5vZGVQYWNrYWdlTWFuYWdlcmAgZnJvbSBhbiBleGlzdGluZyBgcGFja2FnZS5qc29uYC5cbiAqXG4gKiBDaGVja3MgaW4gb3JkZXI6XG4gKiAxLiBgcGFja2FnZU1hbmFnZXJgIGZpZWxkIChjb3JlcGFjaywgZS5nLiBgXCJ5YXJuQDQuMS4wXCJgKVxuICogMi4gYGRldkVuZ2luZXMucGFja2FnZU1hbmFnZXJgIGZpZWxkIChzaW5nbGUgZW50cnkgb25seTsgYXJyYXlzIGFyZVxuICogICAgYW1iaWd1b3VzIGFuZCBza2lwcGVkIHVubGVzcyBhIGxvY2tmaWxlIGRpc2FtYmlndWF0ZXMpXG4gKlxuICogQHJldHVybnMgdGhlIGluZmVycmVkIHBhY2thZ2UgbWFuYWdlciwgb3IgYHVuZGVmaW5lZGBcbiAqL1xuZnVuY3Rpb24gaW5mZXJQYWNrYWdlTWFuYWdlckZyb21Qa2dKc29uKFxuICBwcmV2OiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkLFxuICBvdXRkaXI6IHN0cmluZyxcbik6IE5vZGVQYWNrYWdlTWFuYWdlciB8IHVuZGVmaW5lZCB7XG4gIGlmICghcHJldikge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICAvLyAxLiBDb3JlcGFjayBwYWNrYWdlTWFuYWdlciBmaWVsZDogXCJ5YXJuQDQuMS4wXCJcbiAgY29uc3QgY29yZXBhY2s6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHByZXYucGFja2FnZU1hbmFnZXI7XG4gIGlmIChjb3JlcGFjaykge1xuICAgIGNvbnN0IG1hdGNoID0gY29yZXBhY2subWF0Y2goL14oXFx3KylAKFxcZCspLyk7XG4gICAgaWYgKG1hdGNoKSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBwYWNrYWdlTWFuYWdlck5hbWVUb0VudW0obWF0Y2hbMV0sIE51bWJlcihtYXRjaFsyXSkpO1xuICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIDIuIGRldkVuZ2luZXMucGFja2FnZU1hbmFnZXJcbiAgY29uc3QgZGV2RW5naW5lc1BtID0gcHJldi5kZXZFbmdpbmVzPy5wYWNrYWdlTWFuYWdlcjtcbiAgaWYgKGRldkVuZ2luZXNQbSkge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShkZXZFbmdpbmVzUG0pKSB7XG4gICAgICAvLyBTaW5nbGUgZW50cnlcbiAgICAgIHJldHVybiBwYWNrYWdlTWFuYWdlck5hbWVUb0VudW0oZGV2RW5naW5lc1BtLm5hbWUpO1xuICAgIH1cbiAgICBpZiAoZGV2RW5naW5lc1BtLmxlbmd0aCA9PT0gMSkge1xuICAgICAgcmV0dXJuIHBhY2thZ2VNYW5hZ2VyTmFtZVRvRW51bShkZXZFbmdpbmVzUG1bMF0ubmFtZSk7XG4gICAgfVxuICAgIC8vIE11bHRpcGxlIGVudHJpZXMg4oCUIHRyeSB0byBkaXNhbWJpZ3VhdGUgd2l0aCBsb2NrZmlsZVxuICAgIGlmIChkZXZFbmdpbmVzUG0ubGVuZ3RoID4gMSkge1xuICAgICAgY29uc3QgZnJvbUxvY2tmaWxlID0gaW5mZXJQYWNrYWdlTWFuYWdlckZyb21Mb2NrZmlsZShvdXRkaXIpO1xuICAgICAgaWYgKGZyb21Mb2NrZmlsZSkge1xuICAgICAgICByZXR1cm4gZnJvbUxvY2tmaWxlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogSW5mZXJzIHRoZSBgTm9kZVBhY2thZ2VNYW5hZ2VyYCBmcm9tIHRoZSBwcmVzZW5jZSBvZiBhIGxvY2tmaWxlLlxuICovXG5mdW5jdGlvbiBpbmZlclBhY2thZ2VNYW5hZ2VyRnJvbUxvY2tmaWxlKFxuICBvdXRkaXI6IHN0cmluZyxcbik6IE5vZGVQYWNrYWdlTWFuYWdlciB8IHVuZGVmaW5lZCB7XG4gIGlmIChleGlzdHNTeW5jKGpvaW4ob3V0ZGlyLCBcInBucG0tbG9jay55YW1sXCIpKSkge1xuICAgIHJldHVybiBOb2RlUGFja2FnZU1hbmFnZXIuUE5QTTtcbiAgfVxuICBpZiAoZXhpc3RzU3luYyhqb2luKG91dGRpciwgXCJidW4ubG9ja2JcIikpKSB7XG4gICAgcmV0dXJuIE5vZGVQYWNrYWdlTWFuYWdlci5CVU47XG4gIH1cbiAgaWYgKGV4aXN0c1N5bmMoam9pbihvdXRkaXIsIFwieWFybi5sb2NrXCIpKSkge1xuICAgIHJldHVybiBOb2RlUGFja2FnZU1hbmFnZXIuWUFSTl9DTEFTU0lDO1xuICB9XG4gIGlmIChleGlzdHNTeW5jKGpvaW4ob3V0ZGlyLCBcInBhY2thZ2UtbG9jay5qc29uXCIpKSkge1xuICAgIHJldHVybiBOb2RlUGFja2FnZU1hbmFnZXIuTlBNO1xuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG4iXX0=