projen 0.102.0 → 0.103.1

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 (190) hide show
  1. package/.jsii +1173 -1104
  2. package/README.md +23 -0
  3. package/lib/ai-instructions.js +2 -2
  4. package/lib/awscdk/auto-discover.js +6 -6
  5. package/lib/awscdk/awscdk-app-java.js +1 -1
  6. package/lib/awscdk/awscdk-app-py.js +1 -1
  7. package/lib/awscdk/awscdk-app-ts.js +1 -1
  8. package/lib/awscdk/awscdk-construct.js +1 -1
  9. package/lib/awscdk/awscdk-deps-java.js +1 -1
  10. package/lib/awscdk/awscdk-deps-js.js +1 -1
  11. package/lib/awscdk/awscdk-deps-py.js +1 -1
  12. package/lib/awscdk/awscdk-deps.js +1 -1
  13. package/lib/awscdk/cdk-config.d.ts +4 -0
  14. package/lib/awscdk/cdk-config.js +4 -4
  15. package/lib/awscdk/cdk-tasks.js +1 -1
  16. package/lib/awscdk/integration-test.d.ts +1 -0
  17. package/lib/awscdk/integration-test.js +38 -10
  18. package/lib/awscdk/lambda-extension.js +1 -1
  19. package/lib/awscdk/lambda-function.js +2 -2
  20. package/lib/build/build-workflow.js +4 -3
  21. package/lib/cdk/auto-discover-base.js +2 -2
  22. package/lib/cdk/construct-lib.js +1 -1
  23. package/lib/cdk/integration-test-base.js +17 -3
  24. package/lib/cdk/jsii-build.js +10 -4
  25. package/lib/cdk/jsii-docgen.js +1 -1
  26. package/lib/cdk/jsii-project.d.ts +2 -4
  27. package/lib/cdk/jsii-project.js +10 -11
  28. package/lib/cdk8s/auto-discover.js +2 -2
  29. package/lib/cdk8s/cdk8s-app-py.js +1 -1
  30. package/lib/cdk8s/cdk8s-app-ts.js +1 -1
  31. package/lib/cdk8s/cdk8s-construct.js +1 -1
  32. package/lib/cdk8s/cdk8s-deps-py.js +1 -1
  33. package/lib/cdk8s/cdk8s-deps.js +1 -1
  34. package/lib/cdk8s/integration-test.js +3 -3
  35. package/lib/cdktf/cdktf-construct.js +1 -1
  36. package/lib/cdktn/cdktn-app-ts.js +1 -1
  37. package/lib/cdktn/cdktn-config.js +1 -1
  38. package/lib/cdktn/cdktn-construct.js +1 -1
  39. package/lib/cdktn/cdktn-deps.js +1 -1
  40. package/lib/cdktn/cdktn-tasks.js +1 -1
  41. package/lib/circleci/circleci.js +1 -1
  42. package/lib/cleanup.js +6 -33
  43. package/lib/cli/task-runtime.js +30 -8
  44. package/lib/clobber.js +11 -6
  45. package/lib/component.js +2 -2
  46. package/lib/dependencies.js +1 -1
  47. package/lib/dev-env.js +1 -1
  48. package/lib/docker-compose/docker-compose-service.js +1 -1
  49. package/lib/docker-compose/docker-compose.js +1 -1
  50. package/lib/file.js +1 -1
  51. package/lib/gitattributes.js +1 -1
  52. package/lib/github/actions-provider.js +1 -1
  53. package/lib/github/auto-approve.d.ts +2 -15
  54. package/lib/github/auto-approve.js +3 -4
  55. package/lib/github/auto-merge.js +1 -1
  56. package/lib/github/auto-queue.d.ts +2 -6
  57. package/lib/github/auto-queue.js +3 -3
  58. package/lib/github/dependabot.js +1 -1
  59. package/lib/github/dependency-review.d.ts +2 -12
  60. package/lib/github/dependency-review.js +3 -4
  61. package/lib/github/github-credentials.js +1 -1
  62. package/lib/github/github-project.js +1 -1
  63. package/lib/github/github.d.ts +26 -0
  64. package/lib/github/github.js +17 -2
  65. package/lib/github/merge-queue.js +1 -1
  66. package/lib/github/mergify.js +1 -1
  67. package/lib/github/pr-template.js +1 -1
  68. package/lib/github/private/util.d.ts +0 -2
  69. package/lib/github/private/util.js +1 -13
  70. package/lib/github/pull-request-backport.d.ts +2 -1
  71. package/lib/github/pull-request-backport.js +3 -3
  72. package/lib/github/pull-request-lint.d.ts +2 -15
  73. package/lib/github/pull-request-lint.js +4 -5
  74. package/lib/github/stale.d.ts +2 -15
  75. package/lib/github/stale.js +3 -4
  76. package/lib/github/task-workflow-job.js +4 -4
  77. package/lib/github/task-workflow.js +1 -1
  78. package/lib/github/workflow-actions.js +4 -3
  79. package/lib/github/workflow-jobs.js +1 -1
  80. package/lib/github/workflow-steps.js +1 -1
  81. package/lib/github/workflows.js +1 -1
  82. package/lib/gitlab/configuration.js +1 -1
  83. package/lib/gitlab/gitlab-configuration.js +1 -1
  84. package/lib/gitlab/nested-configuration.js +1 -1
  85. package/lib/gitpod.d.ts +6 -0
  86. package/lib/gitpod.js +2 -2
  87. package/lib/ignore-file.js +1 -1
  88. package/lib/ini.js +1 -1
  89. package/lib/java/java-project.js +1 -1
  90. package/lib/java/junit.js +1 -1
  91. package/lib/java/maven-compile.js +1 -1
  92. package/lib/java/maven-packaging.js +8 -3
  93. package/lib/java/maven-sample.js +1 -1
  94. package/lib/java/pom.js +2 -2
  95. package/lib/java/projenrc.js +13 -4
  96. package/lib/javascript/biome/biome.js +9 -4
  97. package/lib/javascript/bundler.d.ts +8 -0
  98. package/lib/javascript/bundler.js +13 -13
  99. package/lib/javascript/eslint.d.ts +7 -0
  100. package/lib/javascript/eslint.js +14 -11
  101. package/lib/javascript/jest.d.ts +8 -0
  102. package/lib/javascript/jest.js +17 -11
  103. package/lib/javascript/license-checker.js +1 -1
  104. package/lib/javascript/node-package.d.ts +1 -1
  105. package/lib/javascript/node-package.js +32 -15
  106. package/lib/javascript/node-project.js +38 -25
  107. package/lib/javascript/npm-config.js +1 -1
  108. package/lib/javascript/pnpm-workspace-config.js +2 -2
  109. package/lib/javascript/pnpm-workspace.js +1 -1
  110. package/lib/javascript/prettier.js +1 -1
  111. package/lib/javascript/projenrc.js +1 -1
  112. package/lib/javascript/typescript-config.js +2 -2
  113. package/lib/javascript/upgrade-dependencies.js +9 -6
  114. package/lib/javascript/yarnrc.js +1 -1
  115. package/lib/json-patch.js +1 -1
  116. package/lib/json.js +1 -1
  117. package/lib/license.js +1 -1
  118. package/lib/logger.js +1 -1
  119. package/lib/makefile.d.ts +2 -0
  120. package/lib/makefile.js +2 -2
  121. package/lib/object-file.js +1 -1
  122. package/lib/project-build.js +1 -1
  123. package/lib/project-tree.js +1 -1
  124. package/lib/project.d.ts +4 -0
  125. package/lib/project.js +2 -2
  126. package/lib/projects.js +1 -1
  127. package/lib/projenrc-json.js +1 -1
  128. package/lib/projenrc.js +1 -1
  129. package/lib/python/pip.js +1 -1
  130. package/lib/python/poetry.js +7 -4
  131. package/lib/python/projenrc.js +1 -1
  132. package/lib/python/pyproject-toml-file.js +1 -1
  133. package/lib/python/pytest-sample.js +1 -1
  134. package/lib/python/pytest.d.ts +5 -2
  135. package/lib/python/pytest.js +9 -8
  136. package/lib/python/python-project.js +1 -1
  137. package/lib/python/python-sample.js +1 -1
  138. package/lib/python/requirements-file.js +1 -1
  139. package/lib/python/setuppy.js +1 -1
  140. package/lib/python/setuptools.js +10 -4
  141. package/lib/python/uv-config.js +1 -1
  142. package/lib/python/uv.js +3 -3
  143. package/lib/python/venv.js +1 -1
  144. package/lib/readme.js +1 -1
  145. package/lib/release/publisher.d.ts +5 -0
  146. package/lib/release/publisher.js +90 -37
  147. package/lib/release/release-trigger.d.ts +10 -0
  148. package/lib/release/release-trigger.js +7 -2
  149. package/lib/release/release.d.ts +17 -2
  150. package/lib/release/release.js +16 -10
  151. package/lib/renovatebot.js +1 -1
  152. package/lib/run-task.cjs +13 -4
  153. package/lib/runner-options.d.ts +34 -0
  154. package/lib/runner-options.js +1 -1
  155. package/lib/sample-file.js +2 -2
  156. package/lib/script-runner.js +1 -1
  157. package/lib/source-code.js +1 -1
  158. package/lib/task-model.d.ts +3 -3
  159. package/lib/task-model.js +1 -1
  160. package/lib/task-shell.d.ts +3 -0
  161. package/lib/task-shell.js +5 -2
  162. package/lib/task.d.ts +4 -0
  163. package/lib/task.js +2 -2
  164. package/lib/tasks.js +1 -1
  165. package/lib/testing.js +1 -1
  166. package/lib/textfile.js +1 -1
  167. package/lib/toml.js +1 -1
  168. package/lib/typescript/projenrc-ts.js +1 -1
  169. package/lib/typescript/projenrc.js +1 -1
  170. package/lib/typescript/typescript-runner.js +1 -1
  171. package/lib/typescript/typescript-typedoc.js +1 -1
  172. package/lib/typescript/typescript.js +5 -5
  173. package/lib/util/dax.d.ts +12 -1
  174. package/lib/util/dax.js +17 -4
  175. package/lib/util/path.d.ts +39 -0
  176. package/lib/util/path.js +90 -1
  177. package/lib/version.js +2 -2
  178. package/lib/vscode/devcontainer.js +1 -1
  179. package/lib/vscode/extensions.js +1 -1
  180. package/lib/vscode/launch-config.js +1 -1
  181. package/lib/vscode/settings.js +1 -1
  182. package/lib/vscode/vscode.js +1 -1
  183. package/lib/web/next.js +3 -3
  184. package/lib/web/postcss.js +1 -1
  185. package/lib/web/react.js +3 -3
  186. package/lib/web/tailwind.js +1 -1
  187. package/lib/xmlfile.js +1 -1
  188. package/lib/yaml.js +1 -1
  189. package/package.json +1 -1
  190. package/BREAKING_CHANGES.md +0 -855
@@ -57,11 +57,32 @@ const ENV_TRIM_LEN = 20;
57
57
  const ARGS_MARKER = "$@";
58
58
  const QUOTED_ARGS_MARKER = `"${ARGS_MARKER}"`;
59
59
  /**
60
- * Double-quotes a single argument so it is passed through verbatim, escaping the
61
- * characters that stay special inside double quotes. (Double quotes, not single:
62
- * dax's shell lacks the POSIX `'\''` escape.)
60
+ * Renders args for splicing into a string command, escaped for whichever shell
61
+ * will parse that command.
62
+ *
63
+ * Everything except `cmd.exe` gets POSIX single-quoting, which survives dax's
64
+ * built-in shell and any POSIX shell losslessly. `cmd.exe` has no single-quote
65
+ * syntax, so it keeps the double-quoted form.
66
+ */
67
+ function escapeArgsFor(shell, args) {
68
+ return isCmdExe(shell)
69
+ ? args.map(quoteArgCmd).join(" ")
70
+ : (0, dax_1.escapeCommand)(args);
71
+ }
72
+ /**
73
+ * Whether a resolved shell means the host's `cmd.exe`: the only target that
74
+ * cannot parse POSIX quoting.
75
+ */
76
+ function isCmdExe(shell) {
77
+ return shell === "system" && process.platform === "win32";
78
+ }
79
+ /**
80
+ * Double-quotes a single argument for `cmd.exe`, escaping the characters that
81
+ * stay special inside double quotes. Note that `cmd.exe` itself has no in-quote
82
+ * escape - `\"` is understood by the receiving program's argv parser, not by the
83
+ * shell - and `%VAR%` still expands, so not every value can be passed verbatim.
63
84
  */
64
- function quoteArg(arg) {
85
+ function quoteArgCmd(arg) {
65
86
  return '"' + arg.replace(/(["$`\\])/g, "\\$1") + '"';
66
87
  }
67
88
  /**
@@ -364,7 +385,7 @@ class RunTask {
364
385
  if (command.includes(QUOTED_ARGS_MARKER)) {
365
386
  // `"$@"`: splice each arg in as a separate verbatim word (like
366
387
  // bash's quoted `"$@"`), so whitespace and metacharacters survive.
367
- command = command.replace(QUOTED_ARGS_MARKER, argsList.map(quoteArg).join(" "));
388
+ command = command.replace(QUOTED_ARGS_MARKER, escapeArgsFor(stepShell, argsList));
368
389
  }
369
390
  else if (command.includes(ARGS_MARKER)) {
370
391
  command = command.replace(ARGS_MARKER, argsList.join(" "));
@@ -594,11 +615,12 @@ class RunTask {
594
615
  // An invocation (e.g. ["bash","-c"], ["npx","--no","-c"]): append the
595
616
  // command as its final argument. A string is appended as-is; an `execArgs`
596
617
  // argv is rendered to a quoted command line so the shell re-parses the same
597
- // argv.
618
+ // argv. That rendering assumes a POSIX-style shell, which is what such an
619
+ // invocation is (`bash -c`, `sh -c`, `npx -c`, ...).
598
620
  if (Array.isArray(shell)) {
599
621
  const [program, ...flags] = shell;
600
622
  const commandLine = Array.isArray(command)
601
- ? command.map(quoteArg).join(" ")
623
+ ? (0, dax_1.escapeCommand)(command)
602
624
  : command;
603
625
  return (0, dax_1.$) `${program} ${[...flags, commandLine]}`;
604
626
  }
@@ -664,4 +686,4 @@ function systemShell(command, options) {
664
686
  error: result.error,
665
687
  };
666
688
  }
667
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFzay1ydW50aW1lLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NsaS90YXNrLXJ1bnRpbWUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBK3lCQSxrQ0FpQ0M7QUFoMUJELDZEQUErQztBQUMvQywyQkFBd0Q7QUFDeEQsK0JBQThDO0FBQzlDLDJDQUE2QjtBQUM3QiwrQkFBOEI7QUFDOUIsaUNBQXdDO0FBQ3hDLHNDQUErRDtBQUMvRCxvREFBc0M7QUFFdEMscUNBQWdDO0FBQ2hDLHVDQUFnRDtBQUVoRCxxRUFBcUU7QUFDckUsZ0ZBQWdGO0FBQ2hGLGdGQUFnRjtBQUNoRiwyRUFBMkU7QUFDM0UsbUVBQW1FO0FBQ25FLGlFQUFpRTtBQUNqRSxNQUFNLHVCQUF1QixHQUFHLE9BQU8sQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO0FBQy9ELE1BQU0saUJBQWlCLEdBQ3JCLHVCQUF1QixFQUFFLE9BQU8sSUFBSSx1QkFBdUIsQ0FBQztBQUU5RCxNQUFNLFlBQVksR0FBRyxFQUFFLENBQUM7QUFDeEIsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDO0FBQ3pCLE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxXQUFXLEdBQUcsQ0FBQztBQUU5Qzs7OztHQUlHO0FBQ0gsU0FBUyxRQUFRLENBQUMsR0FBVztJQUMzQixPQUFPLEdBQUcsR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRSxNQUFNLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDdkQsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsU0FBUyx1QkFBdUIsQ0FDOUIsS0FBYyxFQUNkLE9BQTBCO0lBRTFCLE1BQU0sT0FBTyxHQUFHLEtBQUssWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN2RSxJQUFJLENBQUMsa0JBQWtC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QztJQUNsRCxNQUFNLE1BQU0sR0FBRyxhQUFhLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRTtRQUM5QyxHQUFHLEVBQUUsT0FBTyxDQUFDLEdBQUc7UUFDaEIsS0FBSyxFQUFFLElBQUk7UUFDWCxTQUFTLEVBQUUsaUJBQVU7UUFDckIsR0FBRyxFQUFFLE9BQU8sQ0FBQyxHQUFHO1FBQ2hCLG9FQUFvRTtRQUNwRSwyRUFBMkU7UUFDM0Usc0RBQXNEO1FBQ3RELEtBQUssRUFBRSxPQUFPLENBQUMsT0FBTztZQUNwQixDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU07Z0JBQ2QsQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUFFLE1BQU0sRUFBRSxTQUFTLENBQUM7Z0JBQ2hDLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxNQUFNLEVBQUUsTUFBTSxDQUFDO1lBQy9CLENBQUMsQ0FBQyxTQUFTO0tBQ2QsQ0FBQyxDQUFDO0lBQ0gsSUFBSSxPQUFPLENBQUMsT0FBTyxJQUFJLE9BQU8sQ0FBQyxNQUFNLElBQUksTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ3ZELE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBQ0QsT0FBTztRQUNMLE1BQU0sRUFBRSxNQUFNLENBQUMsTUFBTTtRQUNyQixNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU0sSUFBSSxJQUFJO1FBQzdCLE1BQU0sRUFBRSxNQUFNLENBQUMsTUFBTSxJQUFJLElBQUk7UUFDN0IsS0FBSyxFQUFFLE1BQU0sQ0FBQyxLQUFLO0tBQ3BCLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgY2hpbGRfcHJvY2VzcyBmcm9tIFwiY2hpbGRfcHJvY2Vzc1wiO1xuaW1wb3J0IHsgZXhpc3RzU3luYywgcmVhZEZpbGVTeW5jLCBzdGF0U3luYyB9IGZyb20gXCJmc1wiO1xuaW1wb3J0IHsgZGlybmFtZSwgam9pbiwgcmVzb2x2ZSB9IGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgeyBmb3JtYXQgfSBmcm9tIFwidXRpbFwiO1xuaW1wb3J0IHsgZ3JheSwgdW5kZXJsaW5lIH0gZnJvbSBcImNoYWxrXCI7XG5pbXBvcnQgeyBQUk9KRU5fRElSLCBUQVNLU19NQU5JRkVTVF9WRVJTSU9OIH0gZnJvbSBcIi4uL2NvbW1vblwiO1xuaW1wb3J0ICogYXMgbG9nZ2luZyBmcm9tIFwiLi4vbG9nZ2luZ1wiO1xuaW1wb3J0IHR5cGUgeyBUYXNrc01hbmlmZXN0LCBUYXNrU3BlYywgVGFza1N0ZXAgfSBmcm9tIFwiLi4vdGFzay1tb2RlbFwiO1xuaW1wb3J0IHsgJCB9IGZyb20gXCIuLi91dGlsL2RheFwiO1xuaW1wb3J0IHsgTUFYX0JVRkZFUiwgdG9vbCB9IGZyb20gXCIuLi91dGlsL2V4ZWNcIjtcblxuLy8gYXZvaWRzIGEgKGZhbHNlIHBvc2l0aXZlKSBlc2J1aWxkIHdhcm5pbmcgYWJvdXQgaW5jb3JyZWN0IGltcG9ydHMuXG4vLyBgPy5kZWZhdWx0ID8/IG1vZHVsZWAga2VlcHMgdGhpcyB3b3JraW5nIGJvdGggYXMgYSBwbGFpbiBDb21tb25KUyByZXF1aXJlIGFuZFxuLy8gd2hlbiB0aGUgZGVwZW5kZW5jeSBpcyBpbnRlcm9wLXdyYXBwZWQgaW5zaWRlIHRoZSBidW5kbGVkIHJ1bi10YXNrLmNqcyAod2hlcmVcbi8vIGByZXF1aXJlKC4uLilgIG1heSB5aWVsZCBgeyBkZWZhdWx0OiBmbiB9YCBpbnN0ZWFkIG9mIHRoZSBmdW5jdGlvbikuIFNlZVxuLy8gcHJvamVuIzQ0MDcgKFwicGFyc2VDb25mbGljdEpTT04gaXMgbm90IGEgZnVuY3Rpb25cIiBhZnRlciBlamVjdCkuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXJlcXVpcmUtaW1wb3J0c1xuY29uc3QgcGFyc2VDb25mbGljdEpTT05Nb2R1bGUgPSByZXF1aXJlKFwicGFyc2UtY29uZmxpY3QtanNvblwiKTtcbmNvbnN0IHBhcnNlQ29uZmxpY3RKU09OID1cbiAgcGFyc2VDb25mbGljdEpTT05Nb2R1bGU/LmRlZmF1bHQgPz8gcGFyc2VDb25mbGljdEpTT05Nb2R1bGU7XG5cbmNvbnN0IEVOVl9UUklNX0xFTiA9IDIwO1xuY29uc3QgQVJHU19NQVJLRVIgPSBcIiRAXCI7XG5jb25zdCBRVU9URURfQVJHU19NQVJLRVIgPSBgXCIke0FSR1NfTUFSS0VSfVwiYDtcblxuLyoqXG4gKiBEb3VibGUtcXVvdGVzIGEgc2luZ2xlIGFyZ3VtZW50IHNvIGl0IGlzIHBhc3NlZCB0aHJvdWdoIHZlcmJhdGltLCBlc2NhcGluZyB0aGVcbiAqIGNoYXJhY3RlcnMgdGhhdCBzdGF5IHNwZWNpYWwgaW5zaWRlIGRvdWJsZSBxdW90ZXMuIChEb3VibGUgcXVvdGVzLCBub3Qgc2luZ2xlOlxuICogZGF4J3Mgc2hlbGwgbGFja3MgdGhlIFBPU0lYIGAnXFwnJ2AgZXNjYXBlLilcbiAqL1xuZnVuY3Rpb24gcXVvdGVBcmcoYXJnOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gJ1wiJyArIGFyZy5yZXBsYWNlKC8oW1wiJGBcXFxcXSkvZywgXCJcXFxcJDFcIikgKyAnXCInO1xufVxuXG4vKipcbiAqIGRheCdzIGJ1aWx0LWluIGNyb3NzLXBsYXRmb3JtIHNoZWxsIG9ubHkgaW1wbGVtZW50cyBhIHN1YnNldCBvZiBQT1NJWCBzaGVsbFxuICogc3ludGF4IGFuZCB0aHJvd3MgYSB0ZXJzZSBgTm90IGltcGxlbWVudGVkOiAuLi5gIGZvciB0aGUgcmVzdC4gUmV3cml0ZSB0aG9zZVxuICogaW50byBhIHNob3J0LCBhY3Rpb25hYmxlIGVycm9yIHRoYXQgcG9pbnRzIGF0IHRoZSBzeXN0ZW0tc2hlbGwgZXNjYXBlIGhhdGNoO1xuICogcGFzcyBldmVyeSBvdGhlciBlcnJvciB0aHJvdWdoIHVuY2hhbmdlZC5cbiAqL1xuZnVuY3Rpb24gZW5yaWNoQnVpbHRpblNoZWxsRXJyb3IoXG4gIGVycm9yOiB1bmtub3duLFxuICBjb21tYW5kOiBzdHJpbmcgfCBzdHJpbmdbXSxcbik6IHVua25vd24ge1xuICBjb25zdCBtZXNzYWdlID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpO1xuICBpZiAoIS9Ob3QgaW1wbGVtZW50ZWQ6Ly50ZXN0KG1lc3NhZ2UpKSB7XG4gICAgLyogdjggaWdub3JlIG5leHQgKi9cbiAgICByZXR1cm4gZXJyb3I7XG4gIH1cblxuICBjb25zdCBjb21tYW5kTGluZSA9IEFycmF5LmlzQXJyYXkoY29tbWFuZCkgPyBjb21tYW5kLmpvaW4oXCIgXCIpIDogY29tbWFuZDtcbiAgcmV0dXJuIG5ldyBFcnJvcihcbiAgICBcInByb2plbidzIGJ1aWx0LWluIHNoZWxsIGNhbid0IHJ1biB0aGlzIGNvbW1hbmQ6XFxuXCIgK1xuICAgICAgYCAgJHtjb21tYW5kTGluZX1cXG5gICtcbiAgICAgIFwiVG8gdXNlIHlvdXIgc3lzdGVtJ3Mgc2hlbGwgaW5zdGVhZCwgc2V0IHRoaXMgdGFzayB0byBUYXNrU2hlbGwuc3lzdGVtKCkuXCIsXG4gICk7XG59XG5cbi8qKlxuICogTm9ybWFsaXplZCByZXN1bHQgb2YgYHNoZWxsKClgIChhIHN1YnNldCBvZiBub2RlJ3MgYFNwYXduU3luY1JldHVybnNgKS5cbiAqL1xuaW50ZXJmYWNlIFNoZWxsUmVzdWx0IHtcbiAgLyoqXG4gICAqIFRoZSBleGl0IGNvZGUgb2YgdGhlIGNvbW1hbmQsIG9yIGBudWxsYCBpZiB0aGUgcHJvY2VzcyB3YXMgdGVybWluYXRlZCBieSBhXG4gICAqIHNpZ25hbCBvciBuZXZlciBzcGF3bmVkLlxuICAgKi9cbiAgcmVhZG9ubHkgc3RhdHVzOiBudW1iZXIgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBDYXB0dXJlZCBzdGRvdXQuIE9ubHkgcG9wdWxhdGVkIHdoZW4gc3Rkb3V0IGlzIHBpcGVkIChlLmcuIHdoZW4gZXZhbHVhdGluZ1xuICAgKiBlbnZpcm9ubWVudCB2YXJpYWJsZXMpOyBgbnVsbGAvYHVuZGVmaW5lZGAgd2hlbiBzdGRpbyBpcyBpbmhlcml0ZWQuXG4gICAqL1xuICByZWFkb25seSBzdGRvdXQ/OiBCdWZmZXIgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBDYXB0dXJlZCBzdGRlcnIuIFNlZSBgc3Rkb3V0YC5cbiAgICovXG4gIHJlYWRvbmx5IHN0ZGVycj86IEJ1ZmZlciB8IG51bGw7XG5cbiAgLyoqXG4gICAqIEFuIGVycm9yIHJhaXNlZCB3aGlsZSBhdHRlbXB0aW5nIHRvIHNwYXduIHRoZSBjb21tYW5kIChub3QgYSBub24temVybyBleGl0XG4gICAqIGNvZGUsIHdoaWNoIGlzIHJlcG9ydGVkIHZpYSBgc3RhdHVzYCkuXG4gICAqL1xuICByZWFkb25seSBlcnJvcj86IEVycm9yO1xufVxuXG4vKipcbiAqIFRoZSBydW50aW1lIGNvbXBvbmVudCBvZiB0aGUgdGFza3MgZW5naW5lLlxuICovXG5leHBvcnQgY2xhc3MgVGFza1J1bnRpbWUge1xuICAvKipcbiAgICogVGhlIHByb2plY3QtcmVsYXRpdmUgcGF0aCBvZiB0aGUgdGFza3MgbWFuaWZlc3QgZmlsZS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgTUFOSUZFU1RfRklMRSA9IHBhdGgucG9zaXguam9pbihcbiAgICBQUk9KRU5fRElSLFxuICAgIFwidGFza3MuanNvblwiLFxuICApO1xuXG4gIC8qKlxuICAgKiBPbmUtc2hvdCBlbnRyeXBvaW50IGZvciB0aGUgc3RhbmRhbG9uZSB0YXNrIHJ1bm5lci5cbiAgICpcbiAgICogQ3JlYXRlcyBhIHJ1bnRpbWUgcm9vdGVkIGF0IHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LCBydW5zIHRoZSBuYW1lZFxuICAgKiB0YXNrLCBhbmQgY29udmVydHMgYW55IGZhaWx1cmUgaW50byBhIG5vbi16ZXJvIHByb2Nlc3MgZXhpdCBjb2RlLiBUaGlzIGlzXG4gICAqIHRoZSBzaW5nbGUgbGluZSBpbnZva2VkIGJ5IHRoZSBidW5kbGVkIGBzY3JpcHRzL3J1bi10YXNrLmNqc2AgdGhhdFxuICAgKiBcInByb2plbiBlamVjdFwiIGVtaXRzLCB3aGljaCBrZWVwcyB0aGUgZ2VuZXJhdGVkIGJ1bmRsZSBmb290ZXIgdHJpdmlhbC5cbiAgICpcbiAgICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIHRhc2sgdG8gcnVuLiBEZWZhdWx0cyB0byBgcHJvY2Vzcy5hcmd2WzJdYC5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgYXN5bmMgbWFpbihuYW1lOiBzdHJpbmcgPSBwcm9jZXNzLmFyZ3ZbMl0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgbmV3IFRhc2tSdW50aW1lKFwiLlwiKS5ydW5UYXNrKG5hbWUpO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgY29uc29sZS5lcnJvcihlPy5zdGFjayA/PyBTdHJpbmcoZSkpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgY29udGVudHMgb2YgdGFza3MuanNvblxuICAgKi9cbiAgcHJpdmF0ZSBfbWFuaWZlc3Q6IFRhc2tzTWFuaWZlc3QgPSB7IHRhc2tzOiB7fSB9O1xuXG4gIC8qKlxuICAgKiBUaGUgcmF3IGNvbnRlbnRzIG9mIHRoZSBjdXJyZW50bHkgbG9hZGVkIG1hbmlmZXN0LCB1c2VkIHRvIGRldGVjdCBjaGFuZ2VzXG4gICAqIG9uIGRpc2sgc28gdGhlIHJ1bnRpbWUgY2FuIHJlbG9hZCBhIHJlZ2VuZXJhdGVkIG1hbmlmZXN0IG1pZC1ydW4uXG4gICAqL1xuICBwcml2YXRlIF9pZGVudGl0eT86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoZSBwcm9qZWN0IGFuZCB0aGUgY3dkIGZvciBleGVjdXRpbmcgdGFza3MuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgd29ya2Rpcjogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKHdvcmtkaXI6IHN0cmluZykge1xuICAgIHRoaXMud29ya2RpciA9IHJlc29sdmUod29ya2Rpcik7XG4gICAgLy8gUGVyZm9ybSB0aGUgaW5pdGlhbCBsb2FkLiBUaGlzIGFsc28gdmVyaWZpZXMgdGhlIG1hbmlmZXN0J3Mgc2NoZW1hXG4gICAgLy8gdmVyc2lvbi5cbiAgICB0aGlzLnJlbG9hZE1hbmlmZXN0SWZDaGFuZ2VkKCk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGNvbnRlbnRzIG9mIHRhc2tzLmpzb25cbiAgICovXG4gIHB1YmxpYyBnZXQgbWFuaWZlc3QoKTogVGFza3NNYW5pZmVzdCB7XG4gICAgcmV0dXJuIHRoaXMuX21hbmlmZXN0O1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBhYnNvbHV0ZSBwYXRoIG9mIHRoZSB0YXNrcyBtYW5pZmVzdCBmaWxlLlxuICAgKi9cbiAgcHJpdmF0ZSBnZXQgbWFuaWZlc3RQYXRoKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGpvaW4odGhpcy53b3JrZGlyLCBUYXNrUnVudGltZS5NQU5JRkVTVF9GSUxFKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgdGFza3MgaW4gdGhpcyBwcm9qZWN0LlxuICAgKi9cbiAgcHVibGljIGdldCB0YXNrcygpOiBUYXNrU3BlY1tdIHtcbiAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyh0aGlzLm1hbmlmZXN0LnRhc2tzID8/IHt9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kIGEgdGFzayBieSBuYW1lLCBvciBgdW5kZWZpbmVkYCBpZiBub3QgZm91bmQuXG4gICAqL1xuICBwdWJsaWMgdHJ5RmluZFRhc2sobmFtZTogc3RyaW5nKTogVGFza1NwZWMgfCB1bmRlZmluZWQge1xuICAgIGlmICghdGhpcy5tYW5pZmVzdC50YXNrcykge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMubWFuaWZlc3QudGFza3NbbmFtZV07XG4gIH1cblxuICAvKipcbiAgICogUnVucyB0aGUgdGFzay5cbiAgICogQHBhcmFtIG5hbWUgVGhlIHRhc2sgbmFtZS5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBydW5UYXNrKFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBwYXJlbnRzOiBzdHJpbmdbXSA9IFtdLFxuICAgIGFyZ3M6IEFycmF5PHN0cmluZyB8IG51bWJlcj4gPSBbXSxcbiAgICBlbnY6IHsgW25hbWU6IHN0cmluZ106IHN0cmluZyB9ID0ge30sXG4gICAgb3B0aW9uczogeyBjYXB0dXJlT3V0cHV0PzogYm9vbGVhbiB9ID0ge30sXG4gICk6IFByb21pc2U8c3RyaW5nIHwgdm9pZD4ge1xuICAgIC8vIEEgcHJldmlvdXNseSBleGVjdXRlZCB0YXNrIChtb3N0IGltcG9ydGFudGx5IHRoZSBcImRlZmF1bHRcIi9zeW50aCB0YXNrLFxuICAgIC8vIHdoaWNoIGBidWlsZGAgc3Bhd25zIGZpcnN0KSBtYXkgaGF2ZSByZWdlbmVyYXRlZCBgLnByb2plbi90YXNrcy5qc29uYC5cbiAgICAvLyBQaWNrIHVwIGFueSBzdWNoIGNoYW5nZXMgYmVmb3JlIHJlc29sdmluZyBhbmQgcnVubmluZyB0aGlzIHRhc2sgc28gd2VcbiAgICAvLyBuZXZlciBleGVjdXRlIGEgc3RhbGUsIGluLW1lbW9yeSBkZWZpbml0aW9uLlxuICAgIHRoaXMucmVsb2FkTWFuaWZlc3RJZkNoYW5nZWQoKTtcblxuICAgIGNvbnN0IHRhc2sgPSB0aGlzLnRyeUZpbmRUYXNrKG5hbWUpO1xuICAgIGlmICghdGFzaykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBjYW5ub3QgZmluZCBjb21tYW5kICR7bmFtZX1gKTtcbiAgICB9XG5cbiAgICBjb25zdCBydW5uZXIgPSBuZXcgUnVuVGFzayh0aGlzLCB0YXNrLCBwYXJlbnRzLCBhcmdzLCBlbnYpO1xuICAgIHJldHVybiBvcHRpb25zLmNhcHR1cmVPdXRwdXQgPyBydW5uZXIucnVuQ2FwdHVyaW5nT3V0cHV0KCkgOiBydW5uZXIucnVuKCk7XG4gIH1cblxuICAvKipcbiAgICogUmUtcmVhZHMgdGhlIHRhc2tzIG1hbmlmZXN0IGZyb20gZGlzayBpZiBpdHMgY29udGVudHMgY2hhbmdlZCBzaW5jZSBpdCB3YXNcbiAgICogbGFzdCBsb2FkZWQsIHZlcmlmeWluZyBpdHMgc2NoZW1hIHZlcnNpb24gYWxvbmcgdGhlIHdheS5cbiAgICpcbiAgICogQ2hhbmdlIGRldGVjdGlvbiBjb21wYXJlcyB0aGUgcmF3IGZpbGUgY29udGVudHMsIHNvIGFuIHVuY2hhbmdlZCBtYW5pZmVzdFxuICAgKiBpcyBub3QgcmUtdmVyaWZpZWQgb3IgcmUtYWRvcHRlZC5cbiAgICovXG4gIHByaXZhdGUgcmVsb2FkTWFuaWZlc3RJZkNoYW5nZWQoKTogdm9pZCB7XG4gICAgaWYgKCFleGlzdHNTeW5jKHRoaXMubWFuaWZlc3RQYXRoKSkge1xuICAgICAgLy8gTm8gbWFuaWZlc3Qgb24gZGlzazogdHJlYXQgYXMgYW4gZW1wdHkgcHJvamVjdCAobGVnYWN5IGJlaGF2aW9yKS5cbiAgICAgIHRoaXMuX21hbmlmZXN0ID0geyB0YXNrczoge30gfTtcbiAgICAgIHRoaXMuX2lkZW50aXR5ID0gdW5kZWZpbmVkO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHJhdyA9IHJlYWRGaWxlU3luYyh0aGlzLm1hbmlmZXN0UGF0aCwgXCJ1dGYtOFwiKTtcbiAgICBpZiAocmF3ID09PSB0aGlzLl9pZGVudGl0eSkge1xuICAgICAgcmV0dXJuOyAvLyB1bmNoYW5nZWQgc2luY2UgdGhlIGxhc3QgbG9hZFxuICAgIH1cblxuICAgIGNvbnN0IG1hbmlmZXN0OiBUYXNrc01hbmlmZXN0ID0gcGFyc2VDb25mbGljdEpTT04ocmF3LCB1bmRlZmluZWQsIFwidGhlaXJzXCIpO1xuXG4gICAgLy8gQSBwcmV2aW91c2x5IGxvYWRlZCBtYW5pZmVzdCBtZWFucyB0aGlzIGlzIGEgKnJlbG9hZCogKGUuZy4gdGhlXG4gICAgLy8gXCJkZWZhdWx0XCIvc3ludGggdGFzayByZWdlbmVyYXRlZCB0aGUgZmlsZSBtaWQtcnVuKSwgYXMgb3Bwb3NlZCB0byB0aGVcbiAgICAvLyBpbml0aWFsIGxvYWQgcGVyZm9ybWVkIGJ5IHRoZSBjb25zdHJ1Y3Rvci5cbiAgICBjb25zdCBpc1JlbG9hZCA9IHRoaXMuX2lkZW50aXR5ICE9PSB1bmRlZmluZWQ7XG5cbiAgICB0aGlzLnZlcmlmeU1hbmlmZXN0KG1hbmlmZXN0KTtcbiAgICB0aGlzLl9tYW5pZmVzdCA9IG1hbmlmZXN0O1xuICAgIHRoaXMuX2lkZW50aXR5ID0gcmF3O1xuXG4gICAgaWYgKGlzUmVsb2FkKSB7XG4gICAgICBsb2dnaW5nLmRlYnVnKFxuICAgICAgICBgJHtUYXNrUnVudGltZS5NQU5JRkVTVF9GSUxFfSBjaGFuZ2VkIG9uIGRpc2s7IHN1Y2Nlc3NmdWxseSBsb2FkZWQgdGhlIG5ldyB0YXNrcyBtYW5pZmVzdC5gLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIGEgZnJlc2hseSByZWFkIG1hbmlmZXN0OlxuICAgKlxuICAgKiAtIExlZ2FjeSBtYW5pZmVzdHMgKG5vIGBtYW5pZmVzdFZlcnNpb25gKSBhcmUgYWNjZXB0ZWQgYXMtaXMgZm9yIGJhY2t3YXJkc1xuICAgKiAgIGNvbXBhdGliaWxpdHkuXG4gICAqIC0gTWFuaWZlc3RzIGZyb20gYSBuZXdlciBwcm9qZW4gKGEgaGlnaGVyIGBtYW5pZmVzdFZlcnNpb25gKSBhcmUgYWNjZXB0ZWRcbiAgICogICB3aXRoIGEgd2FybmluZywgc2luY2UgdGhpcyBydW50aW1lIG1heSBub3QgdW5kZXJzdGFuZCB0aGUgc2NoZW1hLlxuICAgKi9cbiAgcHJpdmF0ZSB2ZXJpZnlNYW5pZmVzdChtYW5pZmVzdDogVGFza3NNYW5pZmVzdCk6IHZvaWQge1xuICAgIC8vIEJhY2t3YXJkcyBjb21wYXRpYmlsaXR5OiBtYW5pZmVzdHMgZ2VuZXJhdGVkIGJlZm9yZSB2ZXJzaW9uaW5nIGNhcnJ5IG5vXG4gICAgLy8gdmVyc2lvbi5cbiAgICBpZiAobWFuaWZlc3QubWFuaWZlc3RWZXJzaW9uID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAobWFuaWZlc3QubWFuaWZlc3RWZXJzaW9uID4gVEFTS1NfTUFOSUZFU1RfVkVSU0lPTikge1xuICAgICAgbG9nZ2luZy53YXJuKFxuICAgICAgICBgJHtUYXNrUnVudGltZS5NQU5JRkVTVF9GSUxFfSB3YXMgZ2VuZXJhdGVkIGJ5IGEgbmV3ZXIgdmVyc2lvbiBvZiBwcm9qZW4gYCArXG4gICAgICAgICAgYChtYW5pZmVzdCB2ZXJzaW9uICR7bWFuaWZlc3QubWFuaWZlc3RWZXJzaW9ufSwgdGhpcyBwcm9qZW4gc3VwcG9ydHMgdXAgdG8gJHtUQVNLU19NQU5JRkVTVF9WRVJTSU9OfSkuIGAgK1xuICAgICAgICAgIGBTb21lIHRhc2tzIG1heSBub3QgYmVoYXZlIGFzIGV4cGVjdGVkOyBjb25zaWRlciB1cGdyYWRpbmcgcHJvamVuLmAsXG4gICAgICApO1xuICAgIH1cbiAgfVxufVxuXG5jbGFzcyBSdW5UYXNrIHtcbiAgcHJpdmF0ZSBlbnY6IHsgW25hbWU6IHN0cmluZ106IHN0cmluZyB8IHVuZGVmaW5lZCB9ID0ge307XG4gIHByaXZhdGUgcmVhZG9ubHkgcGFyZW50czogc3RyaW5nW107XG5cbiAgcHJpdmF0ZSByZWFkb25seSB3b3JrZGlyOiBzdHJpbmc7XG5cbiAgLy8gV2hlbiBzZXQsIGV2ZXJ5IHN0ZXAncyBzdGRvdXQgaXMgY2FwdHVyZWQgYW5kIGFjY3VtdWxhdGVkIChmb3IgYSBzcGF3bmVkXG4gIC8vIHRhc2sgd2hvc2UgYWdncmVnYXRlIG91dHB1dCB0aGUgY2FsbGVyIHdhbnRzKS5cbiAgcHJpdmF0ZSBjYXB0dXJlQWxsID0gZmFsc2U7XG4gIHByaXZhdGUgcmVhZG9ubHkgY2FwdHVyZWQ6IHN0cmluZ1tdID0gW107XG5cbiAgLy8gYG91dHB1dEVudmAgY2FwdHVyZXMsIHByb3BhZ2F0ZWQgdG8gc3Bhd25lZCBzdWJ0YXNrcyAoZXhlYy9idWlsdGluIHN0ZXBzXG4gIC8vIHNlZSB0aGVtIHZpYSBgdGhpcy5lbnZgKS5cbiAgcHJpdmF0ZSByZWFkb25seSBjYXB0dXJlZEVudjogeyBbbmFtZTogc3RyaW5nXTogc3RyaW5nIH0gPSB7fTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IHJ1bnRpbWU6IFRhc2tSdW50aW1lLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgdGFzazogVGFza1NwZWMsXG4gICAgcGFyZW50czogc3RyaW5nW10gPSBbXSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGFyZ3M6IEFycmF5PHN0cmluZyB8IG51bWJlcj4gPSBbXSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGVudlBhcmFtOiB7IFtuYW1lOiBzdHJpbmddOiBzdHJpbmcgfSA9IHt9LFxuICApIHtcbiAgICB0aGlzLndvcmtkaXIgPSB0YXNrLmN3ZCA/PyB0aGlzLnJ1bnRpbWUud29ya2RpcjtcbiAgICB0aGlzLnBhcmVudHMgPSBwYXJlbnRzO1xuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgdGhlIHRhc2ssIGNhcHR1cmluZyBhbmQgcmV0dXJuaW5nIHRoZSB0cmltbWVkLCBuZXdsaW5lLWpvaW5lZCBzdGRvdXRcbiAgICogb2YgYWxsIGl0cyBzdGVwcyAoYW5kIGFueSBuZXN0ZWQgc3Bhd25lZCB0YXNrcykgaW4gZXhlY3V0aW9uIG9yZGVyLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHJ1bkNhcHR1cmluZ091dHB1dCgpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHRoaXMuY2FwdHVyZUFsbCA9IHRydWU7XG4gICAgYXdhaXQgdGhpcy5ydW4oKTtcbiAgICByZXR1cm4gdGhpcy5jYXB0dXJlZC5qb2luKFwiXFxuXCIpLnRyaW0oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWNvcmRzIGEgc3RlcCdzIGNhcHR1cmVkICh0cmltbWVkKSBzdGRvdXQ6IGludG8gYG91dHB1dEVudmAgZm9yIGxhdGVyXG4gICAqIHN0ZXBzIChhbmQgcHJvcGFnYXRlZCB0byBzcGF3bmVkIHN1YnRhc2tzKSwgYW5kIGludG8gdGhlIHJ1bidzIGFnZ3JlZ2F0ZVxuICAgKiBvdXRwdXQgd2hlbiBjYXB0dXJpbmcgZXZlcnl0aGluZy5cbiAgICovXG4gIHByaXZhdGUgcmVjb3JkQ2FwdHVyZShvdXRwdXRFbnY6IHN0cmluZyB8IHVuZGVmaW5lZCwgdmFsdWU6IHN0cmluZykge1xuICAgIGlmIChvdXRwdXRFbnYpIHtcbiAgICAgIHRoaXMuZW52W291dHB1dEVudl0gPSB2YWx1ZTtcbiAgICAgIHRoaXMuY2FwdHVyZWRFbnZbb3V0cHV0RW52XSA9IHZhbHVlO1xuICAgIH1cbiAgICBpZiAodGhpcy5jYXB0dXJlQWxsKSB7XG4gICAgICB0aGlzLmNhcHR1cmVkLnB1c2godmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBFeGVjdXRlcyB0aGUgdGFzay4gVGhpcyB3YXMgcHJldmlvdXNseSBkb25lIGluIHRoZSBjb25zdHJ1Y3RvciwgYnV0IGlzIG5vd1xuICAgKiBhbiBhc3luYyBtZXRob2Qgc2luY2Ugc2hlbGwgZXhlY3V0aW9uIGlzIGFzeW5jaHJvbm91cyAoZS5nLiBkYXggb25cbiAgICogV2luZG93cykuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcnVuKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHsgdGFzaywgYXJncywgcGFyZW50cyB9ID0gdGhpcztcblxuICAgIGlmICghdGFzay5zdGVwcyB8fCB0YXNrLnN0ZXBzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy5sb2dEZWJ1ZyhncmF5KFwiTm8gYWN0aW9ucyBoYXZlIGJlZW4gc3BlY2lmaWVkIGZvciB0aGlzIHRhc2suXCIpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmVudiA9IGF3YWl0IHRoaXMucmVzb2x2ZUVudmlyb25tZW50KFxuICAgICAgdGhpcy5lbnZQYXJhbSxcbiAgICAgIHBhcmVudHMsXG4gICAgICB0aGlzLnJlc29sdmVTaGVsbCgpLFxuICAgICk7XG5cbiAgICBjb25zdCBlbnZsb2dzID0gW107XG4gICAgZm9yIChjb25zdCBbaywgdl0gb2YgT2JqZWN0LmVudHJpZXModGhpcy5lbnYpKSB7XG4gICAgICBjb25zdCB2diA9IHYgPz8gXCJcIjtcbiAgICAgIGNvbnN0IHRyaW1tZWQgPVxuICAgICAgICB2di5sZW5ndGggPiBFTlZfVFJJTV9MRU4gPyB2di5zdWJzdHJpbmcoMCwgRU5WX1RSSU1fTEVOKSArIFwiLi4uXCIgOiB2djtcbiAgICAgIGVudmxvZ3MucHVzaChgJHtrfT0ke3RyaW1tZWR9YCk7XG4gICAgfVxuXG4gICAgaWYgKGVudmxvZ3MubGVuZ3RoKSB7XG4gICAgICB0aGlzLmxvZ0RlYnVnKGdyYXkoYCR7dW5kZXJsaW5lKFwiZW52XCIpfTogJHtlbnZsb2dzLmpvaW4oXCIgXCIpfWApKTtcbiAgICB9XG5cbiAgICAvLyBldmFsdWF0ZSBjb25kaXRpb25cbiAgICBpZiAoIShhd2FpdCB0aGlzLmV2YWxDb25kaXRpb24odGFzaywgdGhpcy5yZXNvbHZlU2hlbGwoKSkpKSB7XG4gICAgICB0aGlzLmxvZyhcImNvbmRpdGlvbiBleGl0ZWQgd2l0aCBub24temVybyAtIHNraXBwaW5nXCIpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIHZlcmlmeSB3ZSByZXF1aXJlZCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYXJlIGRlZmluZWRcbiAgICBjb25zdCBtZXJnZWQgPSB7IC4uLnByb2Nlc3MuZW52LCAuLi50aGlzLmVudiB9O1xuICAgIGNvbnN0IG1pc3NpbmcgPSBuZXcgQXJyYXk8c3RyaW5nPigpO1xuICAgIGZvciAoY29uc3QgbmFtZSBvZiB0YXNrLnJlcXVpcmVkRW52ID8/IFtdKSB7XG4gICAgICBpZiAoIShuYW1lIGluIG1lcmdlZCkpIHtcbiAgICAgICAgbWlzc2luZy5wdXNoKG5hbWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChtaXNzaW5nLmxlbmd0aCA+IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYG1pc3NpbmcgcmVxdWlyZWQgZW52aXJvbm1lbnQgdmFyaWFibGVzOiAke21pc3Npbmcuam9pbihcIixcIil9YCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBzdGVwIG9mIHRhc2suc3RlcHMpIHtcbiAgICAgIGNvbnN0IHN0ZXBTaGVsbCA9IHRoaXMucmVzb2x2ZVNoZWxsKHN0ZXApO1xuXG4gICAgICAvLyBldmFsdWF0ZSBzdGVwIGNvbmRpdGlvblxuICAgICAgaWYgKCEoYXdhaXQgdGhpcy5ldmFsQ29uZGl0aW9uKHN0ZXAsIHN0ZXBTaGVsbCkpKSB7XG4gICAgICAgIHRoaXMubG9nKFwiY29uZGl0aW9uIGV4aXRlZCB3aXRoIG5vbi16ZXJvIC0gc2tpcHBpbmdcIik7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBhcmdzTGlzdDogc3RyaW5nW10gPSBbXG4gICAgICAgIC4uLihzdGVwLmFyZ3MgfHwgW10pLFxuICAgICAgICAuLi4oc3RlcC5yZWNlaXZlQXJncyA/IGFyZ3MgOiBbXSksXG4gICAgICBdLm1hcCgoYSkgPT4gYS50b1N0cmluZygpKTtcblxuICAgICAgaWYgKHN0ZXAuc2F5KSB7XG4gICAgICAgIGxvZ2dpbmcuaW5mbyh0aGlzLmZtdExvZyhzdGVwLnNheSkpO1xuICAgICAgfVxuXG4gICAgICBpZiAoc3RlcC5zcGF3bikge1xuICAgICAgICBjb25zdCBjYXB0dXJlID0gdGhpcy5jYXB0dXJlQWxsIHx8ICEhc3RlcC5vdXRwdXRFbnY7XG4gICAgICAgIGNvbnN0IG91dHB1dCA9IGF3YWl0IHRoaXMucnVudGltZS5ydW5UYXNrKFxuICAgICAgICAgIHN0ZXAuc3Bhd24sXG4gICAgICAgICAgWy4uLnRoaXMucGFyZW50cywgdGhpcy50YXNrLm5hbWVdLFxuICAgICAgICAgIGFyZ3NMaXN0LFxuICAgICAgICAgIHsgLi4udGhpcy5jYXB0dXJlZEVudiwgLi4uc3RlcC5lbnYgfSxcbiAgICAgICAgICB7IGNhcHR1cmVPdXRwdXQ6IGNhcHR1cmUgfSxcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKHR5cGVvZiBvdXRwdXQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICB0aGlzLnJlY29yZENhcHR1cmUoc3RlcC5vdXRwdXRFbnYsIG91dHB1dCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgZXhlY3M6IEFycmF5PHN0cmluZyB8IHN0cmluZ1tdPiA9IHN0ZXAuZXhlYyA/IFtzdGVwLmV4ZWNdIDogW107XG5cbiAgICAgIC8vIFBhcnNlIHN0ZXAtc3BlY2lmaWMgZW52aXJvbm1lbnQgdmFyaWFibGVzXG4gICAgICBjb25zdCBlbnYgPSBhd2FpdCB0aGlzLmV2YWxFbnZpcm9ubWVudChzdGVwLmVudiA/PyB7fSwgc3RlcFNoZWxsKTtcblxuICAgICAgaWYgKHN0ZXAuYnVpbHRpbikge1xuICAgICAgICBleGVjcy5wdXNoKHRoaXMucmVuZGVyQnVpbHRpbihzdGVwLmJ1aWx0aW4pKTtcbiAgICAgIH1cblxuICAgICAgLy8gYGV4ZWNBcmdzYCBpcyBhbiBleHBsaWNpdCBhcmd2ICh0aGUgcHJvZ3JhbSBmb2xsb3dlZCBieSBpdHMgYXJndW1lbnRzKS5cbiAgICAgIC8vIEl0IGlzIGhhbmRlZCB0byBgc2hlbGwoKWAgYXMgYW4gYXJyYXkgcmF0aGVyIHRoYW4gYSByZW5kZXJlZCBzdHJpbmcsIHNvXG4gICAgICAvLyBpdCBydW5zIHdpdGhvdXQgYSBzaGVsbCBhbmQgZXZlcnkgZWxlbWVudCBpcyBwYXNzZWQgdGhyb3VnaCB2ZXJiYXRpbSAtXG4gICAgICAvLyB3aGljaCBpcyB3aGF0IGxldHMgY2FsbGVycyBhdm9pZCB0aGlua2luZyBhYm91dCBxdW90aW5nLiBGaXhlZC9yZWNlaXZlZFxuICAgICAgLy8gYXJncyBhcmUgc3BsaWNlZCBpbiB3aGVyZXZlciBhIGAkQGAgbWFya2VyIGVsZW1lbnQgYXBwZWFycyAobWlycm9yaW5nXG4gICAgICAvLyB0aGUgc3RyaW5nIGBleGVjYCBiZWhhdmlvciksIG9yIGFwcGVuZGVkIGF0IHRoZSBlbmQgaWYgdGhlcmUgaXMgbm9uZS5cbiAgICAgIGlmIChzdGVwLmV4ZWNBcmdzKSB7XG4gICAgICAgIGNvbnN0IGFyZ3Y6IHN0cmluZ1tdID0gW107XG4gICAgICAgIGxldCBwbGFjZWQgPSBmYWxzZTtcbiAgICAgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIHN0ZXAuZXhlY0FyZ3MpIHtcbiAgICAgICAgICBpZiAoZWxlbWVudCA9PT0gQVJHU19NQVJLRVIpIHtcbiAgICAgICAgICAgIGFyZ3YucHVzaCguLi5hcmdzTGlzdCk7XG4gICAgICAgICAgICBwbGFjZWQgPSB0cnVlO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhcmd2LnB1c2goZWxlbWVudCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICghcGxhY2VkKSB7XG4gICAgICAgICAgYXJndi5wdXNoKC4uLmFyZ3NMaXN0KTtcbiAgICAgICAgfVxuICAgICAgICBleGVjcy5wdXNoKGFyZ3YpO1xuICAgICAgfVxuXG4gICAgICBmb3IgKGNvbnN0IGV4ZWMgb2YgZXhlY3MpIHtcbiAgICAgICAgbGV0IGNvbW1hbmQgPSBleGVjO1xuXG4gICAgICAgIC8vIEEgc3RyaW5nIGNvbW1hbmQgaXMgYSBzaGVsbCBsaW5lOiBzcGxpY2UgdGFzayBhcmdzIGluIHBlciB0aGUgYCRAYFxuICAgICAgICAvLyBtYXJrZXIgcnVsZXMuIEFuIGBleGVjQXJnc2AgYXJndiBhbHJlYWR5IGNhcnJpZXMgaXRzIGFyZ3MsIHVudG91Y2hlZC5cbiAgICAgICAgaWYgKHR5cGVvZiBjb21tYW5kID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgaWYgKGNvbW1hbmQuaW5jbHVkZXMoUVVPVEVEX0FSR1NfTUFSS0VSKSkge1xuICAgICAgICAgICAgLy8gYFwiJEBcImA6IHNwbGljZSBlYWNoIGFyZyBpbiBhcyBhIHNlcGFyYXRlIHZlcmJhdGltIHdvcmQgKGxpa2VcbiAgICAgICAgICAgIC8vIGJhc2gncyBxdW90ZWQgYFwiJEBcImApLCBzbyB3aGl0ZXNwYWNlIGFuZCBtZXRhY2hhcmFjdGVycyBzdXJ2aXZlLlxuICAgICAgICAgICAgY29tbWFuZCA9IGNvbW1hbmQucmVwbGFjZShcbiAgICAgICAgICAgICAgUVVPVEVEX0FSR1NfTUFSS0VSLFxuICAgICAgICAgICAgICBhcmdzTGlzdC5tYXAocXVvdGVBcmcpLmpvaW4oXCIgXCIpLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGNvbW1hbmQuaW5jbHVkZXMoQVJHU19NQVJLRVIpKSB7XG4gICAgICAgICAgICBjb21tYW5kID0gY29tbWFuZC5yZXBsYWNlKEFSR1NfTUFSS0VSLCBhcmdzTGlzdC5qb2luKFwiIFwiKSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbW1hbmQgPSBbY29tbWFuZCwgLi4uYXJnc0xpc3RdLmpvaW4oXCIgXCIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGN3ZCA9IHN0ZXAuY3dkO1xuICAgICAgICBjb25zdCBjYXB0dXJlID0gdGhpcy5jYXB0dXJlQWxsIHx8ICEhc3RlcC5vdXRwdXRFbnY7XG4gICAgICAgIC8vIEEgdGhyb3duIGVycm9yIChlLmcuIHNwYXduIGZhaWx1cmUpIHByb3BhZ2F0ZXM7IGEgbm9uLXplcm8gZXhpdCBpc1xuICAgICAgICAvLyByZXBvcnRlZCB2aWEgYHJlc3VsdC5zdGF0dXNgLlxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnNoZWxsKHtcbiAgICAgICAgICBjb21tYW5kLFxuICAgICAgICAgIGN3ZCxcbiAgICAgICAgICBleHRyYUVudjogZW52LFxuICAgICAgICAgIHNoZWxsOiBzdGVwU2hlbGwsXG4gICAgICAgICAgY2FwdHVyZU91dHB1dDogY2FwdHVyZSxcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChyZXN1bHQuc3RhdHVzICE9PSAwKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYFRhc2sgXCIke3RoaXMuZnVsbG5hbWV9XCIgZmFpbGVkIHdoZW4gZXhlY3V0aW5nIFwiJHtcbiAgICAgICAgICAgICAgQXJyYXkuaXNBcnJheShjb21tYW5kKSA/IGNvbW1hbmQuam9pbihcIiBcIikgOiBjb21tYW5kXG4gICAgICAgICAgICB9XCIgKGN3ZDogJHtyZXNvbHZlKGN3ZCA/PyB0aGlzLndvcmtkaXIpfSlgLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNhcHR1cmUpIHtcbiAgICAgICAgICBjb25zdCBzdGRvdXQgPSByZXN1bHQuc3Rkb3V0Py50b1N0cmluZyhcInV0Zi04XCIpLnRyaW0oKSA/PyBcIlwiO1xuICAgICAgICAgIHRoaXMucmVjb3JkQ2FwdHVyZShzdGVwLm91dHB1dEVudiwgc3Rkb3V0KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIGlmIGEgdGFzayBzaG91bGQgYmUgZXhlY3V0ZWQgYmFzZWQgb24gXCJjb25kaXRpb25cIi5cbiAgICpcbiAgICogQHJldHVybnMgdHJ1ZSBpZiB0aGUgdGFzayBzaG91bGQgYmUgZXhlY3V0ZWQgb3IgZmFsc2UgaWYgdGhlIGNvbmRpdGlvblxuICAgKiBldmFsdWF0ZXMgdG8gZmFsc2UgKGV4aXRzIHdpdGggbm9uLXplcm8pLCBpbmRpY2F0aW5nIHRoYXQgdGhlIHRhc2sgc2hvdWxkXG4gICAqIGJlIHNraXBwZWQuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGV2YWxDb25kaXRpb24oXG4gICAgdGFza09yU3RlcDogVGFza1NwZWMgfCBUYXNrU3RlcCxcbiAgICBzaGVsbDogc3RyaW5nIHwgc3RyaW5nW10sXG4gICkge1xuICAgIC8vIG5vIGNvbmRpdGlvbiwgY2Fycnkgb25cbiAgICBpZiAoIXRhc2tPclN0ZXAuY29uZGl0aW9uKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICB0aGlzLmxvZyhncmF5KGAke3VuZGVybGluZShcImNvbmRpdGlvblwiKX06ICR7dGFza09yU3RlcC5jb25kaXRpb259YCkpO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuc2hlbGwoe1xuICAgICAgY29tbWFuZDogdGFza09yU3RlcC5jb25kaXRpb24sXG4gICAgICBxdWlldDogdHJ1ZSxcbiAgICAgIHNoZWxsLFxuICAgIH0pO1xuICAgIGlmIChyZXN1bHQuc3RhdHVzID09PSAwKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBFdmFsdWF0ZXMgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZyb20gc2hlbGwgY29tbWFuZHMgKGUuZy4gYCQoeHgpYClcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZXZhbEVudmlyb25tZW50KFxuICAgIGVudjogeyBbbmFtZTogc3RyaW5nXTogc3RyaW5nIH0sXG4gICAgc2hlbGw6IHN0cmluZyB8IHN0cmluZ1tdLFxuICApIHtcbiAgICBjb25zdCBvdXRwdXQ6IHsgW25hbWU6IHN0cmluZ106IHN0cmluZyB8IHVuZGVmaW5lZCB9ID0ge307XG5cbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhlbnYgPz8ge30pKSB7XG4gICAgICBpZiAoU3RyaW5nKHZhbHVlKS5zdGFydHNXaXRoKFwiJChcIikgJiYgU3RyaW5nKHZhbHVlKS5lbmRzV2l0aChcIilcIikpIHtcbiAgICAgICAgY29uc3QgcXVlcnkgPSB2YWx1ZS5zdWJzdHJpbmcoMiwgdmFsdWUubGVuZ3RoIC0gMSk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuc2hlbGwoe1xuICAgICAgICAgIGNvbW1hbmQ6IHF1ZXJ5LFxuICAgICAgICAgIHF1aWV0OiB0cnVlLFxuICAgICAgICAgIGNhcHR1cmVPdXRwdXQ6IHRydWUsXG4gICAgICAgICAgc2hlbGwsXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAocmVzdWx0LnN0YXR1cyAhPT0gMCkge1xuICAgICAgICAgIGNvbnN0IGVycm9yID0gcmVzdWx0LmVycm9yXG4gICAgICAgICAgICA/IHJlc3VsdC5lcnJvci5zdGFja1xuICAgICAgICAgICAgOiByZXN1bHQuc3RkZXJyPy50b1N0cmluZygpLnRyaW0oKSB8fFxuICAgICAgICAgICAgICByZXN1bHQuc3Rkb3V0Py50b1N0cmluZygpLnRyaW0oKSB8fFxuICAgICAgICAgICAgICBgY29tbWFuZCBleGl0ZWQgd2l0aCBjb2RlICR7cmVzdWx0LnN0YXR1c31gO1xuXG4gICAgICAgICAgbG9nZ2luZy53YXJuKFxuICAgICAgICAgICAgdGhpcy5mbXRMb2coXG4gICAgICAgICAgICAgIGAke3VuZGVybGluZShrZXkpfTogdW5hYmxlIHRvIGV2YWx1YXRlIFwiJHtxdWVyeX1cIi4gRW52aXJvbm1lbnQgdmFyaWFibGUgd2lsbCBiZSBza2lwcGVkLiBDaGVjayB0aGF0IHRoZSBjb21tYW5kIGV4aXN0cyBhbmQgcnVucyBzdWNjZXNzZnVsbHkuYCxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgKTtcbiAgICAgICAgICBsb2dnaW5nLndhcm4odGhpcy5mbXRMb2coYCR7dW5kZXJsaW5lKGtleSl9OiAke2Vycm9yfWApKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBvdXRwdXRba2V5XSA9IHJlc3VsdC5zdGRvdXQ/LnRvU3RyaW5nKFwidXRmLThcIikudHJpbSgpID8/IFwiXCI7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG91dHB1dFtrZXldID0gdmFsdWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBvdXRwdXQ7XG4gIH1cblxuICAvKipcbiAgICogUmVuZGVycyB0aGUgcnVudGltZSBlbnZpcm9ubWVudCBmb3IgYSB0YXNrLiBOYW1lbHksIGl0IHN1cHBvcnRzIHRoaXMgc3ludGF4XG4gICAqIGAkKHh4KWAgZm9yIGFsbG93aW5nIGVudmlyb25tZW50IHRvIGJlIGV2YWx1YXRlZCBieSBleGVjdXRpbmcgYSBzaGVsbFxuICAgKiBjb21tYW5kIGFuZCBvYnRhaW5pbmcgaXRzIHJlc3VsdC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcmVzb2x2ZUVudmlyb25tZW50KFxuICAgIGVudlBhcmFtOiB7IFtuYW1lOiBzdHJpbmddOiBzdHJpbmcgfSxcbiAgICBwYXJlbnRzOiBzdHJpbmdbXSxcbiAgICBzaGVsbDogc3RyaW5nIHwgc3RyaW5nW10sXG4gICkge1xuICAgIGxldCBlbnYgPSB0aGlzLnJ1bnRpbWUubWFuaWZlc3QuZW52ID8/IHt9O1xuXG4gICAgLy8gYWRkIGVudiBmcm9tIGFsbCBwYXJlbnQgdGFza3Mgb25lIGJ5IG9uZVxuICAgIGZvciAoY29uc3QgcGFyZW50IG9mIHBhcmVudHMpIHtcbiAgICAgIGVudiA9IHtcbiAgICAgICAgLi4uZW52LFxuICAgICAgICAuLi4odGhpcy5ydW50aW1lLnRyeUZpbmRUYXNrKHBhcmVudCk/LmVudiA/PyB7fSksXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIGFwcGx5IHRhc2sgZW52aXJvbm1lbnQsIHRoZW4gdGhlIHNwZWNpZmljIGVudiBsYXN0XG4gICAgZW52ID0ge1xuICAgICAgLi4uZW52LFxuICAgICAgLi4uKHRoaXMudGFzay5lbnYgPz8ge30pLFxuICAgICAgLi4uZW52UGFyYW0sXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmV2YWxFbnZpcm9ubWVudChlbnYsIHNoZWxsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyB0aGUgc2hlbGwgZm9yIGEgc3RlcCdzIGNvbW1hbmQgKG9yIHRoZSB0YXNrJ3MsIHdoZW4gbm8gc3RlcCBpc1xuICAgKiBnaXZlbik6IHN0ZXAsIHRoZW4gdGFzaywgdGhlbiBwcm9qZWN0IGRlZmF1bHQsIHRoZW4gXCJwcm9qZW5cIi5cbiAgICovXG4gIHByaXZhdGUgcmVzb2x2ZVNoZWxsKHN0ZXA/OiBUYXNrU3RlcCk6IHN0cmluZyB8IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gKFxuICAgICAgc3RlcD8uc2hlbGwgPz8gdGhpcy50YXNrLnNoZWxsID8/IHRoaXMucnVudGltZS5tYW5pZmVzdC5zaGVsbCA/PyBcInByb2plblwiXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBcImZ1bGwgbmFtZVwiIG9mIHRoZSB0YXNrIHdoaWNoIGluY2x1ZGVzIGFsbCBpdCdzIHBhcmVudCB0YXNrIG5hbWVzIGNvbmNhdGVuYXRlZCBieSBjaGV2cm9ucy5cbiAgICovXG4gIHByaXZhdGUgZ2V0IGZ1bGxuYW1lKCkge1xuICAgIHJldHVybiBbLi4udGhpcy5wYXJlbnRzLCB0aGlzLnRhc2submFtZV0uam9pbihcIiDCuyBcIik7XG4gIH1cblxuICBwcml2YXRlIGxvZyguLi5hcmdzOiBhbnlbXSkge1xuICAgIGxvZ2dpbmcudmVyYm9zZSh0aGlzLmZtdExvZyguLi5hcmdzKSk7XG4gIH1cblxuICBwcml2YXRlIGxvZ0RlYnVnKC4uLmFyZ3M6IGFueVtdKSB7XG4gICAgbG9nZ2luZy5kZWJ1Zyh0aGlzLmZtdExvZyguLi5hcmdzKSk7XG4gIH1cblxuICBwcml2YXRlIGZtdExvZyguLi5hcmdzOiBhbnlbXSkge1xuICAgIHJldHVybiBmb3JtYXQoYCR7dW5kZXJsaW5lKHRoaXMuZnVsbG5hbWUpfSB8YCwgLi4uYXJncyk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHNoZWxsKG9wdGlvbnM6IFNoZWxsT3B0aW9ucyk6IFByb21pc2U8U2hlbGxSZXN1bHQ+IHtcbiAgICBjb25zdCBxdWlldCA9IG9wdGlvbnMucXVpZXQgPz8gZmFsc2U7XG4gICAgaWYgKCFxdWlldCkge1xuICAgICAgY29uc3QgbG9nID0gbmV3IEFycmF5PHN0cmluZz4oKTtcblxuICAgICAgbG9nLnB1c2goXG4gICAgICAgIEFycmF5LmlzQXJyYXkob3B0aW9ucy5jb21tYW5kKVxuICAgICAgICAgID8gb3B0aW9ucy5jb21tYW5kLmpvaW4oXCIgXCIpXG4gICAgICAgICAgOiBvcHRpb25zLmNvbW1hbmQsXG4gICAgICApO1xuXG4gICAgICBpZiAob3B0aW9ucy5jd2QpIHtcbiAgICAgICAgbG9nLnB1c2goYChjd2Q6ICR7b3B0aW9ucy5jd2R9KWApO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmxvZyhsb2cuam9pbihcIiBcIikpO1xuICAgIH1cblxuICAgIGNvbnN0IGN3ZCA9IG9wdGlvbnMuY3dkID8/IHRoaXMud29ya2RpcjtcbiAgICBpZiAoIWV4aXN0c1N5bmMoY3dkKSB8fCAhc3RhdFN5bmMoY3dkKS5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBpbnZhbGlkIHdvcmtkaXIgKGN3ZCk6ICR7Y3dkfSBtdXN0IGJlIGFuIGV4aXN0aW5nIGRpcmVjdG9yeWAsXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIFRoZSByZXNvbHZlZCBzaGVsbCBpcyBvbmUgb2Y6XG4gICAgLy8gLSBcInByb2plblwiIChkZWZhdWx0KTogZGF4J3MgaW4tcHJvY2VzcyBjcm9zcy1wbGF0Zm9ybSBzaGVsbCwgc28gUE9TSVgtc3R5bGVcbiAgICAvLyAgIHRhc2sgc3ludGF4IChgbWtkaXIgLXBgLCBgJiZgLCBgJFZBUmAsIC4uLikgd29ya3MgdGhlIHNhbWUgZXZlcnl3aGVyZS5cbiAgICAvLyAtIFwic3lzdGVtXCI6IHRoZSBob3N0J3MgbmF0aXZlIHNoZWxsIChgL2Jpbi9zaGAsIG9yIGBjbWQuZXhlYCBvbiBXaW5kb3dzKS5cbiAgICAvLyAtIGFuIGFyZ3YsIGUuZy4gW1wiYmFzaFwiLFwiLWNcIl06IGEgc2hlbGwgaW52b2NhdGlvbiB3aXRoIHRoZSBjb21tYW5kIGFwcGVuZGVkXG4gICAgLy8gICBhcyBpdHMgZmluYWwgYXJndW1lbnQuXG4gICAgY29uc3Qgc2hlbGwgPSBvcHRpb25zLnNoZWxsID8/IFwicHJvamVuXCI7XG4gICAgaWYgKHR5cGVvZiBzaGVsbCA9PT0gXCJzdHJpbmdcIiAmJiBzaGVsbCAhPT0gXCJwcm9qZW5cIiAmJiBzaGVsbCAhPT0gXCJzeXN0ZW1cIikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgdW5rbm93biBidWlsdC1pbiBzaGVsbCAke0pTT04uc3RyaW5naWZ5KFxuICAgICAgICAgIHNoZWxsLFxuICAgICAgICApfTsgdXNlIHRoZSBidWlsdC1pbiBcInByb2plblwiIG9yIFwic3lzdGVtXCIgc2hlbGxzLCBvciBhIFRhc2tTaGVsbC5jb21tYW5kKFsuLi5dKSBpbnZvY2F0aW9uYCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgY2FwdHVyZSA9IG9wdGlvbnMuY2FwdHVyZU91dHB1dCA/PyBmYWxzZTtcbiAgICAvLyBRdWlldCBjYXB0dXJlcyAoYCQoLi4uKWAsIGNvbmRpdGlvbnMpIHN0YXkgc2lsZW50OyB2aXNpYmxlIGNhcHR1cmVzXG4gICAgLy8gKGBvdXRwdXRFbnZgKSBzdHJlYW0gbGl2ZSB3aGlsZSBzdGlsbCBidWZmZXJpbmcuXG4gICAgY29uc3Qgc3RyZWFtID0gY2FwdHVyZSAmJiAhcXVpZXQ7XG5cbiAgICBjb25zdCBjb21tYW5kID0gb3B0aW9ucy5jb21tYW5kO1xuICAgIGNvbnN0IGVudiA9IHtcbiAgICAgIC4uLnByb2Nlc3MuZW52LFxuICAgICAgLi4udGhpcy5lbnYsXG4gICAgICAuLi5vcHRpb25zLmV4dHJhRW52LFxuICAgIH07XG5cbiAgICAvLyBcInN5c3RlbVwiOiB0aGUgaG9zdC1uYXRpdmUgZW5naW5lLiBBIHN0cmluZyBjb21tYW5kIHJ1bnMgdGhyb3VnaCB0aGUgT1NcbiAgICAvLyBzaGVsbDsgYW4gYGV4ZWNBcmdzYCBhcmd2IGlzIHNwYXduZWQgZGlyZWN0bHkgKHNoZWxsLWZyZWUpLCBzbyB0aGUgcmVhbFxuICAgIC8vIGJpbmFyeSBydW5zIHdpdGggbm8gZGF4IGJ1aWx0LWlucy4gKE9ubHkgYCQoLi4uKWAvY29uZGl0aW9uIGV2YWwgY2FwdHVyZXMsXG4gICAgLy8gYW5kIHRob3NlIGFsd2F5cyBwYXNzIGEgc3RyaW5nLCBzbyBhbiBhcnJheSBjb21tYW5kIG5ldmVyIG5lZWRzIGNhcHR1cmUuKVxuICAgIGlmIChzaGVsbCA9PT0gXCJzeXN0ZW1cIikge1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY29tbWFuZCkpIHtcbiAgICAgICAgY29uc3QgW3Byb2dyYW0sIC4uLmFyZ3NdID0gY29tbWFuZDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB0b29sKHByb2dyYW0pLnJ1bihhcmdzLCB7IGN3ZCwgZW52LCBpbmhlcml0U3RkaW86IHRydWUgfSk7XG4gICAgICAgICAgcmV0dXJuIHsgc3RhdHVzOiAwIH07XG4gICAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgICAgIGlmICh0eXBlb2YgZT8uc3RhdHVzID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgICByZXR1cm4geyBzdGF0dXM6IGUuc3RhdHVzIH07XG4gICAgICAgICAgfVxuICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBzeXN0ZW1TaGVsbChjb21tYW5kLCB7IGN3ZCwgZW52LCBjYXB0dXJlLCBzdHJlYW0gfSk7XG4gICAgfVxuXG4gICAgLy8gT3RoZXJ3aXNlIHJ1biB0aHJvdWdoIGRheDogdGhlIFwicHJvamVuXCIgc2hlbGwgb3IgYW4gZXhwbGljaXQgaW52b2NhdGlvbi5cbiAgICBjb25zdCBidWlsZGVyID0gdGhpcy5idWlsZERheENvbW1hbmQoY29tbWFuZCwgc2hlbGwpO1xuXG4gICAgLy8gYGluaGVyaXRQaXBlZGAgc3RyZWFtcyBhbmQgYnVmZmVyczsgYHBpcGVkYCBidWZmZXJzIHF1aWV0bHkuIHN0ZGVyciBpc1xuICAgIC8vIGJ1ZmZlcmVkIG9ubHkgZm9yIHF1aWV0IGNhcHR1cmVzLCBzbyBpdCBjYW4gc3VyZmFjZSBpbiBlcnJvcnMuXG4gICAgY29uc3Qgc3Rkb3V0TW9kZSA9IGNhcHR1cmVcbiAgICAgID8gc3RyZWFtXG4gICAgICAgID8gXCJpbmhlcml0UGlwZWRcIlxuICAgICAgICA6IFwicGlwZWRcIlxuICAgICAgOiBcImluaGVyaXRcIjtcbiAgICBjb25zdCBzdGRlcnJNb2RlID0gY2FwdHVyZSAmJiAhc3RyZWFtID8gXCJwaXBlZFwiIDogXCJpbmhlcml0XCI7XG5cbiAgICBsZXQgcmVzdWx0O1xuICAgIHRyeSB7XG4gICAgICByZXN1bHQgPSBhd2FpdCBidWlsZGVyXG4gICAgICAgIC5jd2QoY3dkKVxuICAgICAgICAuZW52KGVudilcbiAgICAgICAgLnN0ZG91dChzdGRvdXRNb2RlKVxuICAgICAgICAuc3RkZXJyKHN0ZGVyck1vZGUpXG4gICAgICAgIC5ub1Rocm93KCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gZGF4J3MgaW4tcHJvY2VzcyBzaGVsbCB0aHJvd3MgYSB0ZXJzZSBgTm90IGltcGxlbWVudGVkOiAuLi5gIGZvciBzaGVsbFxuICAgICAgLy8gc3ludGF4IGl0IGRvZXMgbm90IHN1cHBvcnQgKGUuZy4gYCQoLi4uKWAgY29tbWFuZCBzdWJzdGl0dXRpb24pOyB0dXJuXG4gICAgICAvLyB0aGF0IGludG8gYW4gYWN0aW9uYWJsZSBlcnJvciB0aGF0IHBvaW50cyBhdCB0aGUgc3lzdGVtLXNoZWxsIGVzY2FwZVxuICAgICAgLy8gaGF0Y2guIE90aGVyIGVycm9ycyBwYXNzIHRocm91Z2ggdW5jaGFuZ2VkLlxuICAgICAgdGhyb3cgZW5yaWNoQnVpbHRpblNoZWxsRXJyb3IoZSwgY29tbWFuZCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHN0YXR1czogcmVzdWx0LmNvZGUsXG4gICAgICBzdGRvdXQ6IGNhcHR1cmUgPyBCdWZmZXIuZnJvbShyZXN1bHQuc3Rkb3V0Qnl0ZXMpIDogbnVsbCxcbiAgICAgIHN0ZGVycjogY2FwdHVyZSAmJiAhc3RyZWFtID8gQnVmZmVyLmZyb20ocmVzdWx0LnN0ZGVyckJ5dGVzKSA6IG51bGwsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgdGhlIGRheCBjb21tYW5kIGZvciB0aGUgXCJwcm9qZW5cIiBzaGVsbCBvciBhbiBleHBsaWNpdCBpbnZvY2F0aW9uLlxuICAgKiAoVGhlIFwic3lzdGVtXCIgc2hlbGwgaXMgaGFuZGxlZCBob3N0LXNpZGUsIG5vdCBoZXJlLikgYGNvbW1hbmRgIGlzIGEgc2hlbGxcbiAgICogbGluZSAoc3RyaW5nKSBvciBhbiBgZXhlY0FyZ3NgIGFyZ3YgKHN0cmluZ1tdKTsgYHNoZWxsYCBpcyBgXCJwcm9qZW5cImAgb3IgYW5cbiAgICogaW52b2NhdGlvbiBhcmd2IHN1Y2ggYXMgYFtcImJhc2hcIiwgXCItY1wiXWAuXG4gICAqL1xuICBwcml2YXRlIGJ1aWxkRGF4Q29tbWFuZChcbiAgICBjb21tYW5kOiBzdHJpbmcgfCBzdHJpbmdbXSxcbiAgICBzaGVsbDogc3RyaW5nIHwgc3RyaW5nW10sXG4gICkge1xuICAgIC8vIEFuIGludm9jYXRpb24gKGUuZy4gW1wiYmFzaFwiLFwiLWNcIl0sIFtcIm5weFwiLFwiLS1ub1wiLFwiLWNcIl0pOiBhcHBlbmQgdGhlXG4gICAgLy8gY29tbWFuZCBhcyBpdHMgZmluYWwgYXJndW1lbnQuIEEgc3RyaW5nIGlzIGFwcGVuZGVkIGFzLWlzOyBhbiBgZXhlY0FyZ3NgXG4gICAgLy8gYXJndiBpcyByZW5kZXJlZCB0byBhIHF1b3RlZCBjb21tYW5kIGxpbmUgc28gdGhlIHNoZWxsIHJlLXBhcnNlcyB0aGUgc2FtZVxuICAgIC8vIGFyZ3YuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoc2hlbGwpKSB7XG4gICAgICBjb25zdCBbcHJvZ3JhbSwgLi4uZmxhZ3NdID0gc2hlbGw7XG4gICAgICBjb25zdCBjb21tYW5kTGluZSA9IEFycmF5LmlzQXJyYXkoY29tbWFuZClcbiAgICAgICAgPyBjb21tYW5kLm1hcChxdW90ZUFyZykuam9pbihcIiBcIilcbiAgICAgICAgOiBjb21tYW5kO1xuICAgICAgcmV0dXJuICRgJHtwcm9ncmFtfSAke1suLi5mbGFncywgY29tbWFuZExpbmVdfWA7XG4gICAgfVxuXG4gICAgLy8gVGhlIGJ1aWx0LWluIFwicHJvamVuXCIgc2hlbGwgKGRheCkuXG4gICAgcmV0dXJuIEFycmF5LmlzQXJyYXkoY29tbWFuZClcbiAgICAgID8gLy8gZXhlY0FyZ3M6IHNoZWxsLWZyZWUgYXJndiAoZWFjaCBlbGVtZW50IGVzY2FwZWQ7IGAuY21kYCBzaGltcyByZXNvbHZlZCkuXG4gICAgICAgICRgJHtjb21tYW5kWzBdfSAke2NvbW1hbmQuc2xpY2UoMSl9YFxuICAgICAgOiAvLyBzdHJpbmcgY29tbWFuZCwgcGFyc2VkIGluLXByb2Nlc3MgYnkgZGF4J3MgY3Jvc3MtcGxhdGZvcm0gc2hlbGwuXG4gICAgICAgICQucmF3YCR7Y29tbWFuZH1gO1xuICB9XG5cbiAgcHJpdmF0ZSByZW5kZXJCdWlsdGluKGJ1aWx0aW46IHN0cmluZykge1xuICAgIC8vIExvY2F0ZSBwcm9qZW4ncyBwYWNrYWdlIHJvb3QgYnkgd2Fsa2luZyB1cCBmcm9tIHRoaXMgbW9kdWxlJ3MgZGlyZWN0b3J5XG4gICAgLy8gdW50aWwgd2UgZmluZCBhIHBhY2thZ2UuanNvbi4gVGhpcyB3b3JrcyB3aGV0aGVyIHRoZSBjb2RlIHJ1bnMgZnJvbSB0aGVcbiAgICAvLyBjb21waWxlZCBmaWxlIChsaWIvY2xpL3Rhc2stcnVudGltZS5qcykgb3IgZnJvbSB0aGUgYnVuZGxlZCBydW4tdGFzay5janNcbiAgICAvLyAobGliL3J1bi10YXNrLmNqcyksIHdoaWNoIGxpdmUgYXQgZGlmZmVyZW50IGRlcHRocyAtIHNvIGEgaGFyZC1jb2RlZFxuICAgIC8vIHJlbGF0aXZlIHBhdGggdG8gcGFja2FnZS5qc29uIHdvdWxkIGJlIHdyb25nIGluIG9uZSBvZiB0aGUgdHdvIGNhc2VzLlxuICAgIGxldCBtb2R1bGVSb290ID0gX19kaXJuYW1lO1xuICAgIHdoaWxlICghZXhpc3RzU3luYyhqb2luKG1vZHVsZVJvb3QsIFwicGFja2FnZS5qc29uXCIpKSkge1xuICAgICAgY29uc3QgcGFyZW50ID0gZGlybmFtZShtb2R1bGVSb290KTtcbiAgICAgIGlmIChwYXJlbnQgPT09IG1vZHVsZVJvb3QpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwidW5hYmxlIHRvIGxvY2F0ZSB0aGUgcHJvamVuIHBhY2thZ2Ugcm9vdFwiKTtcbiAgICAgIH1cbiAgICAgIG1vZHVsZVJvb3QgPSBwYXJlbnQ7XG4gICAgfVxuICAgIGNvbnN0IHByb2dyYW0gPSByZXF1aXJlLnJlc29sdmUoXG4gICAgICBqb2luKG1vZHVsZVJvb3QsIFwibGliXCIsIGAke2J1aWx0aW59LnRhc2suanNgKSxcbiAgICApO1xuICAgIHJldHVybiBgXCIke3Byb2Nlc3MuZXhlY1BhdGh9XCIgXCIke3Byb2dyYW19XCJgO1xuICB9XG59XG5cbmludGVyZmFjZSBTaGVsbE9wdGlvbnMge1xuICAvKipcbiAgICogVGhlIGNvbW1hbmQgdG8gcnVuLiBBIHN0cmluZyBpcyBleGVjdXRlZCBhcyBhIHNoZWxsIGNvbW1hbmQgbGluZTsgYVxuICAgKiBzdHJpbmcgYXJyYXkgaXMgYW4gZXhwbGljaXQgYXJndiAocHJvZ3JhbSArIGFyZ3VtZW50cykgZXhlY3V0ZWQgd2l0aG91dCBhXG4gICAqIHNoZWxsLlxuICAgKi9cbiAgcmVhZG9ubHkgY29tbWFuZDogc3RyaW5nIHwgc3RyaW5nW107XG4gIC8qKlxuICAgKiBAZGVmYXVsdCAtIHByb2plY3QgZGlyXG4gICAqL1xuICByZWFkb25seSBjd2Q/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBDYXB0dXJlIHN0ZG91dC9zdGRlcnIgKHNvIHRoZSBjYWxsZXIgY2FuIHJlYWQgdGhlbSBmcm9tIHRoZSByZXN1bHQpXG4gICAqIGluc3RlYWQgb2YgaW5oZXJpdGluZyB0aGUgcGFyZW50J3Mgc3RyZWFtcy5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IGNhcHR1cmVPdXRwdXQ/OiBib29sZWFuO1xuICAvKiogQGRlZmF1bHQgZmFsc2UgKi9cbiAgcmVhZG9ubHkgcXVpZXQ/OiBib29sZWFuO1xuICByZWFkb25seSBleHRyYUVudj86IHsgW25hbWU6IHN0cmluZ106IHN0cmluZyB8IHVuZGVmaW5lZCB9O1xuICAvKipcbiAgICogVGhlIHJlc29sdmVkIHNoZWxsIHRvIGludGVycHJldCB0aGUgY29tbWFuZCAoZS5nLiBcInByb2plblwiLCBcImJhc2ggLWNcIikuXG4gICAqIEBkZWZhdWx0IFwicHJvamVuXCJcbiAgICovXG4gIHJlYWRvbmx5IHNoZWxsPzogc3RyaW5nIHwgc3RyaW5nW107XG59XG5cbi8qKlxuICogTm9ybWFsaXplZCByZXN1bHQgb2YgcnVubmluZyBhIGNvbW1hbmQgdGhyb3VnaCB0aGUgc3lzdGVtIHNoZWxsIChhIHN1YnNldCBvZlxuICogbm9kZSdzIGBTcGF3blN5bmNSZXR1cm5zYCkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3lzdGVtU2hlbGxSZXN1bHQge1xuICAvKiogRXhpdCBjb2RlLCBvciBgbnVsbGAgaWYgdGVybWluYXRlZCBieSBhIHNpZ25hbCBvciBuZXZlciBzcGF3bmVkLiAqL1xuICByZWFkb25seSBzdGF0dXM6IG51bWJlciB8IG51bGw7XG4gIC8qKiBDYXB0dXJlZCBzdGRvdXQsIG9yIGBudWxsYCB3aGVuIHN0ZG91dCB3YXMgaW5oZXJpdGVkLiAqL1xuICByZWFkb25seSBzdGRvdXQ6IEJ1ZmZlciB8IG51bGw7XG4gIC8qKiBDYXB0dXJlZCBzdGRlcnIsIG9yIGBudWxsYCB3aGVuIHN0ZGVyciB3YXMgaW5oZXJpdGVkLiAqL1xuICByZWFkb25seSBzdGRlcnI6IEJ1ZmZlciB8IG51bGw7XG4gIC8qKiBBbiBlcnJvciByYWlzZWQgd2hpbGUgYXR0ZW1wdGluZyB0byBzcGF3biAobm90IGEgbm9uLXplcm8gZXhpdCkuICovXG4gIHJlYWRvbmx5IGVycm9yPzogRXJyb3I7XG59XG5cbi8qKlxuICogUnVucyBhIGNvbW1hbmQgbGluZSB0aHJvdWdoIHRoZSBvcGVyYXRpbmcgc3lzdGVtJ3MgbmF0aXZlIHNoZWxsLlxuICpcbiAqIENhbGxzIHRoZSBPUyBzaGVsbCB2aWEgYGNoaWxkX3Byb2Nlc3NgIHdpdGggYHNoZWxsOiB0cnVlYC5cbiAqIFRoaXMgYmFja3MgdGhlIGBzeXN0ZW1gIHRhc2sgc2hlbGwsIHdoaWNoIGxldHMgYSB1c2VyIG9wdCBvdXQgb2YgdGhlIGJ1aWx0LWluXG4gKiBjcm9zcy1wbGF0Zm9ybSBzaGVsbCBhbmQgdXNlIHRoZSBob3N0J3MgbmF0aXZlIHNoZWxsIGluc3RlYWQ6XG4gKiBgL2Jpbi9zaGBvbiBQT1NJWCBhbmQgYGNtZC5leGVgIG9uIFdpbmRvd3MuXG4gKlxuICogTmV2ZXIgdGhyb3dzIGZvciBhIG5vbi16ZXJvIGV4aXQgKHRoYXQgaXMgcmVwb3J0ZWQgdmlhIGBzdGF0dXNgKTtcbiAqIGEgc3Bhd24gZmFpbHVyZSBpcyByZXBvcnRlZCB2aWEgYGVycm9yYC4gVGhlIGNhbGxlciBzdXBwbGllcyB0aGUgZnVsbCBgZW52YC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN5c3RlbVNoZWxsKFxuICBjb21tYW5kOiBzdHJpbmcsXG4gIG9wdGlvbnM6IHtcbiAgICBjd2Q6IHN0cmluZztcbiAgICBlbnY/OiBOb2RlSlMuUHJvY2Vzc0VudjtcbiAgICBjYXB0dXJlPzogYm9vbGVhbjtcbiAgICBzdHJlYW0/OiBib29sZWFuO1xuICB9LFxuKTogU3lzdGVtU2hlbGxSZXN1bHQge1xuICBsb2dnaW5nLmRlYnVnKGAke2NvbW1hbmR9IChjd2Q6ICR7b3B0aW9ucy5jd2R9KWApO1xuICBjb25zdCByZXN1bHQgPSBjaGlsZF9wcm9jZXNzLnNwYXduU3luYyhjb21tYW5kLCB7XG4gICAgY3dkOiBvcHRpb25zLmN3ZCxcbiAgICBzaGVsbDogdHJ1ZSxcbiAgICBtYXhCdWZmZXI6IE1BWF9CVUZGRVIsXG4gICAgZW52OiBvcHRpb25zLmVudixcbiAgICAvLyBRdWlldCBjYXB0dXJlIGJ1ZmZlcnMgc3RkZXJyIGZvciBlcnJvciBtZXNzYWdlcy4gU3RyZWFtZWQgY2FwdHVyZVxuICAgIC8vIGluaGVyaXRzIHN0ZGVyciBhbmQgcmUtZW1pdHMgYnVmZmVyZWQgc3Rkb3V0IGFmdGVyd2FyZHMsIHNpbmNlIHNwYXduU3luY1xuICAgIC8vIGNhbid0IGJvdGggc2hvdyBhbmQgYnVmZmVyIHRoZSBzYW1lIHN0cmVhbSBhdCBvbmNlLlxuICAgIHN0ZGlvOiBvcHRpb25zLmNhcHR1cmVcbiAgICAgID8gb3B0aW9ucy5zdHJlYW1cbiAgICAgICAgPyBbXCJpbmhlcml0XCIsIFwicGlwZVwiLCBcImluaGVyaXRcIl1cbiAgICAgICAgOiBbXCJpbmhlcml0XCIsIFwicGlwZVwiLCBcInBpcGVcIl1cbiAgICAgIDogXCJpbmhlcml0XCIsXG4gIH0pO1xuICBpZiAob3B0aW9ucy5jYXB0dXJlICYmIG9wdGlvbnMuc3RyZWFtICYmIHJlc3VsdC5zdGRvdXQpIHtcbiAgICBwcm9jZXNzLnN0ZG91dC53cml0ZShyZXN1bHQuc3Rkb3V0KTtcbiAgfVxuICByZXR1cm4ge1xuICAgIHN0YXR1czogcmVzdWx0LnN0YXR1cyxcbiAgICBzdGRvdXQ6IHJlc3VsdC5zdGRvdXQgPz8gbnVsbCxcbiAgICBzdGRlcnI6IHJlc3VsdC5zdGRlcnIgPz8gbnVsbCxcbiAgICBlcnJvcjogcmVzdWx0LmVycm9yLFxuICB9O1xufVxuIl19
689
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFzay1ydW50aW1lLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NsaS90YXNrLXJ1bnRpbWUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBdTBCQSxrQ0FpQ0M7QUF4MkJELDZEQUErQztBQUMvQywyQkFBd0Q7QUFDeEQsK0JBQThDO0FBQzlDLDJDQUE2QjtBQUM3QiwrQkFBOEI7QUFDOUIsaUNBQXdDO0FBQ3hDLHNDQUErRDtBQUMvRCxvREFBc0M7QUFFdEMscUNBQStDO0FBQy9DLHVDQUFnRDtBQUVoRCxxRUFBcUU7QUFDckUsZ0ZBQWdGO0FBQ2hGLGdGQUFnRjtBQUNoRiwyRUFBMkU7QUFDM0UsbUVBQW1FO0FBQ25FLGlFQUFpRTtBQUNqRSxNQUFNLHVCQUF1QixHQUFHLE9BQU8sQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO0FBQy9ELE1BQU0saUJBQWlCLEdBQ3JCLHVCQUF1QixFQUFFLE9BQU8sSUFBSSx1QkFBdUIsQ0FBQztBQUU5RCxNQUFNLFlBQVksR0FBRyxFQUFFLENBQUM7QUFDeEIsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDO0FBQ3pCLE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxXQUFXLEdBQUcsQ0FBQztBQUU5Qzs7Ozs7OztHQU9HO0FBQ0gsU0FBUyxhQUFhLENBQUMsS0FBd0IsRUFBRSxJQUFjO0lBQzdELE9BQU8sUUFBUSxDQUFDLEtBQUssQ0FBQztRQUNwQixDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDO1FBQ2pDLENBQUMsQ0FBQyxJQUFBLG1CQUFhLEVBQUMsSUFBSSxDQUFDLENBQUM7QUFDMUIsQ0FBQztBQUVEOzs7R0FHRztBQUNILFNBQVMsUUFBUSxDQUFDLEtBQXdCO0lBQ3hDLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxPQUFPLENBQUMsUUFBUSxLQUFLLE9BQU8s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SUFBSSxJQUFJO1FBQzdCLE1BQU0sRUFBRSxNQUFNLENBQUMsTUFBTSxJQUFJLElBQUk7UUFDN0IsS0FBSyxFQUFFLE1BQU0sQ0FBQyxLQUFLO0tBQ3BCLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgY2hpbGRfcHJvY2VzcyBmcm9tIFwiY2hpbGRfcHJvY2Vzc1wiO1xuaW1wb3J0IHsgZXhpc3RzU3luYywgcmVhZEZpbGVTeW5jLCBzdGF0U3luYyB9IGZyb20gXCJmc1wiO1xuaW1wb3J0IHsgZGlybmFtZSwgam9pbiwgcmVzb2x2ZSB9IGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgeyBmb3JtYXQgfSBmcm9tIFwidXRpbFwiO1xuaW1wb3J0IHsgZ3JheSwgdW5kZXJsaW5lIH0gZnJvbSBcImNoYWxrXCI7XG5pbXBvcnQgeyBQUk9KRU5fRElSLCBUQVNLU19NQU5JRkVTVF9WRVJTSU9OIH0gZnJvbSBcIi4uL2NvbW1vblwiO1xuaW1wb3J0ICogYXMgbG9nZ2luZyBmcm9tIFwiLi4vbG9nZ2luZ1wiO1xuaW1wb3J0IHR5cGUgeyBUYXNrc01hbmlmZXN0LCBUYXNrU3BlYywgVGFza1N0ZXAgfSBmcm9tIFwiLi4vdGFzay1tb2RlbFwiO1xuaW1wb3J0IHsgJCwgZXNjYXBlQ29tbWFuZCB9IGZyb20gXCIuLi91dGlsL2RheFwiO1xuaW1wb3J0IHsgTUFYX0JVRkZFUiwgdG9vbCB9IGZyb20gXCIuLi91dGlsL2V4ZWNcIjtcblxuLy8gYXZvaWRzIGEgKGZhbHNlIHBvc2l0aXZlKSBlc2J1aWxkIHdhcm5pbmcgYWJvdXQgaW5jb3JyZWN0IGltcG9ydHMuXG4vLyBgPy5kZWZhdWx0ID8/IG1vZHVsZWAga2VlcHMgdGhpcyB3b3JraW5nIGJvdGggYXMgYSBwbGFpbiBDb21tb25KUyByZXF1aXJlIGFuZFxuLy8gd2hlbiB0aGUgZGVwZW5kZW5jeSBpcyBpbnRlcm9wLXdyYXBwZWQgaW5zaWRlIHRoZSBidW5kbGVkIHJ1bi10YXNrLmNqcyAod2hlcmVcbi8vIGByZXF1aXJlKC4uLilgIG1heSB5aWVsZCBgeyBkZWZhdWx0OiBmbiB9YCBpbnN0ZWFkIG9mIHRoZSBmdW5jdGlvbikuIFNlZVxuLy8gcHJvamVuIzQ0MDcgKFwicGFyc2VDb25mbGljdEpTT04gaXMgbm90IGEgZnVuY3Rpb25cIiBhZnRlciBlamVjdCkuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXJlcXVpcmUtaW1wb3J0c1xuY29uc3QgcGFyc2VDb25mbGljdEpTT05Nb2R1bGUgPSByZXF1aXJlKFwicGFyc2UtY29uZmxpY3QtanNvblwiKTtcbmNvbnN0IHBhcnNlQ29uZmxpY3RKU09OID1cbiAgcGFyc2VDb25mbGljdEpTT05Nb2R1bGU/LmRlZmF1bHQgPz8gcGFyc2VDb25mbGljdEpTT05Nb2R1bGU7XG5cbmNvbnN0IEVOVl9UUklNX0xFTiA9IDIwO1xuY29uc3QgQVJHU19NQVJLRVIgPSBcIiRAXCI7XG5jb25zdCBRVU9URURfQVJHU19NQVJLRVIgPSBgXCIke0FSR1NfTUFSS0VSfVwiYDtcblxuLyoqXG4gKiBSZW5kZXJzIGFyZ3MgZm9yIHNwbGljaW5nIGludG8gYSBzdHJpbmcgY29tbWFuZCwgZXNjYXBlZCBmb3Igd2hpY2hldmVyIHNoZWxsXG4gKiB3aWxsIHBhcnNlIHRoYXQgY29tbWFuZC5cbiAqXG4gKiBFdmVyeXRoaW5nIGV4Y2VwdCBgY21kLmV4ZWAgZ2V0cyBQT1NJWCBzaW5nbGUtcXVvdGluZywgd2hpY2ggc3Vydml2ZXMgZGF4J3NcbiAqIGJ1aWx0LWluIHNoZWxsIGFuZCBhbnkgUE9TSVggc2hlbGwgbG9zc2xlc3NseS4gYGNtZC5leGVgIGhhcyBubyBzaW5nbGUtcXVvdGVcbiAqIHN5bnRheCwgc28gaXQga2VlcHMgdGhlIGRvdWJsZS1xdW90ZWQgZm9ybS5cbiAqL1xuZnVuY3Rpb24gZXNjYXBlQXJnc0ZvcihzaGVsbDogc3RyaW5nIHwgc3RyaW5nW10sIGFyZ3M6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgcmV0dXJuIGlzQ21kRXhlKHNoZWxsKVxuICAgID8gYXJncy5tYXAocXVvdGVBcmdDbWQpLmpvaW4oXCIgXCIpXG4gICAgOiBlc2NhcGVDb21tYW5kKGFyZ3MpO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgYSByZXNvbHZlZCBzaGVsbCBtZWFucyB0aGUgaG9zdCdzIGBjbWQuZXhlYDogdGhlIG9ubHkgdGFyZ2V0IHRoYXRcbiAqIGNhbm5vdCBwYXJzZSBQT1NJWCBxdW90aW5nLlxuICovXG5mdW5jdGlvbiBpc0NtZEV4ZShzaGVsbDogc3RyaW5nIHwgc3RyaW5nW10pOiBib29sZWFuIHtcbiAgcmV0dXJuIHNoZWxsID09PSBcInN5c3RlbVwiICYmIHByb2Nlc3MucGxhdGZvcm0gPT09IFwid2luMzJcIjtcbn1cblxuLyoqXG4gKiBEb3VibGUtcXVvdGVzIGEgc2luZ2xlIGFyZ3VtZW50IGZvciBgY21kLmV4ZWAsIGVzY2FwaW5nIHRoZSBjaGFyYWN0ZXJzIHRoYXRcbiAqIHN0YXkgc3BlY2lhbCBpbnNpZGUgZG91YmxlIHF1b3Rlcy4gTm90ZSB0aGF0IGBjbWQuZXhlYCBpdHNlbGYgaGFzIG5vIGluLXF1b3RlXG4gKiBlc2NhcGUgLSBgXFxcImAgaXMgdW5kZXJzdG9vZCBieSB0aGUgcmVjZWl2aW5nIHByb2dyYW0ncyBhcmd2IHBhcnNlciwgbm90IGJ5IHRoZVxuICogc2hlbGwgLSBhbmQgYCVWQVIlYCBzdGlsbCBleHBhbmRzLCBzbyBub3QgZXZlcnkgdmFsdWUgY2FuIGJlIHBhc3NlZCB2ZXJiYXRpbS5cbiAqL1xuZnVuY3Rpb24gcXVvdGVBcmdDbWQoYXJnOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gJ1wiJyArIGFyZy5yZXBsYWNlKC8oW1wiJGBcXFxcXSkvZywgXCJcXFxcJDFcIikgKyAnXCInO1xufVxuXG4vKipcbiAqIGRheCdzIGJ1aWx0LWluIGNyb3NzLXBsYXRmb3JtIHNoZWxsIG9ubHkgaW1wbGVtZW50cyBhIHN1YnNldCBvZiBQT1NJWCBzaGVsbFxuICogc3ludGF4IGFuZCB0aHJvd3MgYSB0ZXJzZSBgTm90IGltcGxlbWVudGVkOiAuLi5gIGZvciB0aGUgcmVzdC4gUmV3cml0ZSB0aG9zZVxuICogaW50byBhIHNob3J0LCBhY3Rpb25hYmxlIGVycm9yIHRoYXQgcG9pbnRzIGF0IHRoZSBzeXN0ZW0tc2hlbGwgZXNjYXBlIGhhdGNoO1xuICogcGFzcyBldmVyeSBvdGhlciBlcnJvciB0aHJvdWdoIHVuY2hhbmdlZC5cbiAqL1xuZnVuY3Rpb24gZW5yaWNoQnVpbHRpblNoZWxsRXJyb3IoXG4gIGVycm9yOiB1bmtub3duLFxuICBjb21tYW5kOiBzdHJpbmcgfCBzdHJpbmdbXSxcbik6IHVua25vd24ge1xuICBjb25zdCBtZXNzYWdlID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpO1xuICBpZiAoIS9Ob3QgaW1wbGVtZW50ZWQ6Ly50ZXN0KG1lc3NhZ2UpKSB7XG4gICAgLyogdjggaWdub3JlIG5leHQgKi9cbiAgICByZXR1cm4gZXJyb3I7XG4gIH1cblxuICBjb25zdCBjb21tYW5kTGluZSA9IEFycmF5LmlzQXJyYXkoY29tbWFuZCkgPyBjb21tYW5kLmpvaW4oXCIgXCIpIDogY29tbWFuZDtcbiAgcmV0dXJuIG5ldyBFcnJvcihcbiAgICBcInByb2plbidzIGJ1aWx0LWluIHNoZWxsIGNhbid0IHJ1biB0aGlzIGNvbW1hbmQ6XFxuXCIgK1xuICAgICAgYCAgJHtjb21tYW5kTGluZX1cXG5gICtcbiAgICAgIFwiVG8gdXNlIHlvdXIgc3lzdGVtJ3Mgc2hlbGwgaW5zdGVhZCwgc2V0IHRoaXMgdGFzayB0byBUYXNrU2hlbGwuc3lzdGVtKCkuXCIsXG4gICk7XG59XG5cbi8qKlxuICogTm9ybWFsaXplZCByZXN1bHQgb2YgYHNoZWxsKClgIChhIHN1YnNldCBvZiBub2RlJ3MgYFNwYXduU3luY1JldHVybnNgKS5cbiAqL1xuaW50ZXJmYWNlIFNoZWxsUmVzdWx0IHtcbiAgLyoqXG4gICAqIFRoZSBleGl0IGNvZGUgb2YgdGhlIGNvbW1hbmQsIG9yIGBudWxsYCBpZiB0aGUgcHJvY2VzcyB3YXMgdGVybWluYXRlZCBieSBhXG4gICAqIHNpZ25hbCBvciBuZXZlciBzcGF3bmVkLlxuICAgKi9cbiAgcmVhZG9ubHkgc3RhdHVzOiBudW1iZXIgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBDYXB0dXJlZCBzdGRvdXQuIE9ubHkgcG9wdWxhdGVkIHdoZW4gc3Rkb3V0IGlzIHBpcGVkIChlLmcuIHdoZW4gZXZhbHVhdGluZ1xuICAgKiBlbnZpcm9ubWVudCB2YXJpYWJsZXMpOyBgbnVsbGAvYHVuZGVmaW5lZGAgd2hlbiBzdGRpbyBpcyBpbmhlcml0ZWQuXG4gICAqL1xuICByZWFkb25seSBzdGRvdXQ/OiBCdWZmZXIgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBDYXB0dXJlZCBzdGRlcnIuIFNlZSBgc3Rkb3V0YC5cbiAgICovXG4gIHJlYWRvbmx5IHN0ZGVycj86IEJ1ZmZlciB8IG51bGw7XG5cbiAgLyoqXG4gICAqIEFuIGVycm9yIHJhaXNlZCB3aGlsZSBhdHRlbXB0aW5nIHRvIHNwYXduIHRoZSBjb21tYW5kIChub3QgYSBub24temVybyBleGl0XG4gICAqIGNvZGUsIHdoaWNoIGlzIHJlcG9ydGVkIHZpYSBgc3RhdHVzYCkuXG4gICAqL1xuICByZWFkb25seSBlcnJvcj86IEVycm9yO1xufVxuXG4vKipcbiAqIFRoZSBydW50aW1lIGNvbXBvbmVudCBvZiB0aGUgdGFza3MgZW5naW5lLlxuICovXG5leHBvcnQgY2xhc3MgVGFza1J1bnRpbWUge1xuICAvKipcbiAgICogVGhlIHByb2plY3QtcmVsYXRpdmUgcGF0aCBvZiB0aGUgdGFza3MgbWFuaWZlc3QgZmlsZS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgTUFOSUZFU1RfRklMRSA9IHBhdGgucG9zaXguam9pbihcbiAgICBQUk9KRU5fRElSLFxuICAgIFwidGFza3MuanNvblwiLFxuICApO1xuXG4gIC8qKlxuICAgKiBPbmUtc2hvdCBlbnRyeXBvaW50IGZvciB0aGUgc3RhbmRhbG9uZSB0YXNrIHJ1bm5lci5cbiAgICpcbiAgICogQ3JlYXRlcyBhIHJ1bnRpbWUgcm9vdGVkIGF0IHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LCBydW5zIHRoZSBuYW1lZFxuICAgKiB0YXNrLCBhbmQgY29udmVydHMgYW55IGZhaWx1cmUgaW50byBhIG5vbi16ZXJvIHByb2Nlc3MgZXhpdCBjb2RlLiBUaGlzIGlzXG4gICAqIHRoZSBzaW5nbGUgbGluZSBpbnZva2VkIGJ5IHRoZSBidW5kbGVkIGBzY3JpcHRzL3J1bi10YXNrLmNqc2AgdGhhdFxuICAgKiBcInByb2plbiBlamVjdFwiIGVtaXRzLCB3aGljaCBrZWVwcyB0aGUgZ2VuZXJhdGVkIGJ1bmRsZSBmb290ZXIgdHJpdmlhbC5cbiAgICpcbiAgICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIHRhc2sgdG8gcnVuLiBEZWZhdWx0cyB0byBgcHJvY2Vzcy5hcmd2WzJdYC5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgYXN5bmMgbWFpbihuYW1lOiBzdHJpbmcgPSBwcm9jZXNzLmFyZ3ZbMl0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgbmV3IFRhc2tSdW50aW1lKFwiLlwiKS5ydW5UYXNrKG5hbWUpO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgY29uc29sZS5lcnJvcihlPy5zdGFjayA/PyBTdHJpbmcoZSkpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgY29udGVudHMgb2YgdGFza3MuanNvblxuICAgKi9cbiAgcHJpdmF0ZSBfbWFuaWZlc3Q6IFRhc2tzTWFuaWZlc3QgPSB7IHRhc2tzOiB7fSB9O1xuXG4gIC8qKlxuICAgKiBUaGUgcmF3IGNvbnRlbnRzIG9mIHRoZSBjdXJyZW50bHkgbG9hZGVkIG1hbmlmZXN0LCB1c2VkIHRvIGRldGVjdCBjaGFuZ2VzXG4gICAqIG9uIGRpc2sgc28gdGhlIHJ1bnRpbWUgY2FuIHJlbG9hZCBhIHJlZ2VuZXJhdGVkIG1hbmlmZXN0IG1pZC1ydW4uXG4gICAqL1xuICBwcml2YXRlIF9pZGVudGl0eT86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoZSBwcm9qZWN0IGFuZCB0aGUgY3dkIGZvciBleGVjdXRpbmcgdGFza3MuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgd29ya2Rpcjogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKHdvcmtkaXI6IHN0cmluZykge1xuICAgIHRoaXMud29ya2RpciA9IHJlc29sdmUod29ya2Rpcik7XG4gICAgLy8gUGVyZm9ybSB0aGUgaW5pdGlhbCBsb2FkLiBUaGlzIGFsc28gdmVyaWZpZXMgdGhlIG1hbmlmZXN0J3Mgc2NoZW1hXG4gICAgLy8gdmVyc2lvbi5cbiAgICB0aGlzLnJlbG9hZE1hbmlmZXN0SWZDaGFuZ2VkKCk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGNvbnRlbnRzIG9mIHRhc2tzLmpzb25cbiAgICovXG4gIHB1YmxpYyBnZXQgbWFuaWZlc3QoKTogVGFza3NNYW5pZmVzdCB7XG4gICAgcmV0dXJuIHRoaXMuX21hbmlmZXN0O1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBhYnNvbHV0ZSBwYXRoIG9mIHRoZSB0YXNrcyBtYW5pZmVzdCBmaWxlLlxuICAgKi9cbiAgcHJpdmF0ZSBnZXQgbWFuaWZlc3RQYXRoKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGpvaW4odGhpcy53b3JrZGlyLCBUYXNrUnVudGltZS5NQU5JRkVTVF9GSUxFKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgdGFza3MgaW4gdGhpcyBwcm9qZWN0LlxuICAgKi9cbiAgcHVibGljIGdldCB0YXNrcygpOiBUYXNrU3BlY1tdIHtcbiAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyh0aGlzLm1hbmlmZXN0LnRhc2tzID8/IHt9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kIGEgdGFzayBieSBuYW1lLCBvciBgdW5kZWZpbmVkYCBpZiBub3QgZm91bmQuXG4gICAqL1xuICBwdWJsaWMgdHJ5RmluZFRhc2sobmFtZTogc3RyaW5nKTogVGFza1NwZWMgfCB1bmRlZmluZWQge1xuICAgIGlmICghdGhpcy5tYW5pZmVzdC50YXNrcykge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMubWFuaWZlc3QudGFza3NbbmFtZV07XG4gIH1cblxuICAvKipcbiAgICogUnVucyB0aGUgdGFzay5cbiAgICogQHBhcmFtIG5hbWUgVGhlIHRhc2sgbmFtZS5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBydW5UYXNrKFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBwYXJlbnRzOiBzdHJpbmdbXSA9IFtdLFxuICAgIGFyZ3M6IEFycmF5PHN0cmluZyB8IG51bWJlcj4gPSBbXSxcbiAgICBlbnY6IHsgW25hbWU6IHN0cmluZ106IHN0cmluZyB9ID0ge30sXG4gICAgb3B0aW9uczogeyBjYXB0dXJlT3V0cHV0PzogYm9vbGVhbiB9ID0ge30sXG4gICk6IFByb21pc2U8c3RyaW5nIHwgdm9pZD4ge1xuICAgIC8vIEEgcHJldmlvdXNseSBleGVjdXRlZCB0YXNrIChtb3N0IGltcG9ydGFudGx5IHRoZSBcImRlZmF1bHRcIi9zeW50aCB0YXNrLFxuICAgIC8vIHdoaWNoIGBidWlsZGAgc3Bhd25zIGZpcnN0KSBtYXkgaGF2ZSByZWdlbmVyYXRlZCBgLnByb2plbi90YXNrcy5qc29uYC5cbiAgICAvLyBQaWNrIHVwIGFueSBzdWNoIGNoYW5nZXMgYmVmb3JlIHJlc29sdmluZyBhbmQgcnVubmluZyB0aGlzIHRhc2sgc28gd2VcbiAgICAvLyBuZXZlciBleGVjdXRlIGEgc3RhbGUsIGluLW1lbW9yeSBkZWZpbml0aW9uLlxuICAgIHRoaXMucmVsb2FkTWFuaWZlc3RJZkNoYW5nZWQoKTtcblxuICAgIGNvbnN0IHRhc2sgPSB0aGlzLnRyeUZpbmRUYXNrKG5hbWUpO1xuICAgIGlmICghdGFzaykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBjYW5ub3QgZmluZCBjb21tYW5kICR7bmFtZX1gKTtcbiAgICB9XG5cbiAgICBjb25zdCBydW5uZXIgPSBuZXcgUnVuVGFzayh0aGlzLCB0YXNrLCBwYXJlbnRzLCBhcmdzLCBlbnYpO1xuICAgIHJldHVybiBvcHRpb25zLmNhcHR1cmVPdXRwdXQgPyBydW5uZXIucnVuQ2FwdHVyaW5nT3V0cHV0KCkgOiBydW5uZXIucnVuKCk7XG4gIH1cblxuICAvKipcbiAgICogUmUtcmVhZHMgdGhlIHRhc2tzIG1hbmlmZXN0IGZyb20gZGlzayBpZiBpdHMgY29udGVudHMgY2hhbmdlZCBzaW5jZSBpdCB3YXNcbiAgICogbGFzdCBsb2FkZWQsIHZlcmlmeWluZyBpdHMgc2NoZW1hIHZlcnNpb24gYWxvbmcgdGhlIHdheS5cbiAgICpcbiAgICogQ2hhbmdlIGRldGVjdGlvbiBjb21wYXJlcyB0aGUgcmF3IGZpbGUgY29udGVudHMsIHNvIGFuIHVuY2hhbmdlZCBtYW5pZmVzdFxuICAgKiBpcyBub3QgcmUtdmVyaWZpZWQgb3IgcmUtYWRvcHRlZC5cbiAgICovXG4gIHByaXZhdGUgcmVsb2FkTWFuaWZlc3RJZkNoYW5nZWQoKTogdm9pZCB7XG4gICAgaWYgKCFleGlzdHNTeW5jKHRoaXMubWFuaWZlc3RQYXRoKSkge1xuICAgICAgLy8gTm8gbWFuaWZlc3Qgb24gZGlzazogdHJlYXQgYXMgYW4gZW1wdHkgcHJvamVjdCAobGVnYWN5IGJlaGF2aW9yKS5cbiAgICAgIHRoaXMuX21hbmlmZXN0ID0geyB0YXNrczoge30gfTtcbiAgICAgIHRoaXMuX2lkZW50aXR5ID0gdW5kZWZpbmVkO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHJhdyA9IHJlYWRGaWxlU3luYyh0aGlzLm1hbmlmZXN0UGF0aCwgXCJ1dGYtOFwiKTtcbiAgICBpZiAocmF3ID09PSB0aGlzLl9pZGVudGl0eSkge1xuICAgICAgcmV0dXJuOyAvLyB1bmNoYW5nZWQgc2luY2UgdGhlIGxhc3QgbG9hZFxuICAgIH1cblxuICAgIGNvbnN0IG1hbmlmZXN0OiBUYXNrc01hbmlmZXN0ID0gcGFyc2VDb25mbGljdEpTT04ocmF3LCB1bmRlZmluZWQsIFwidGhlaXJzXCIpO1xuXG4gICAgLy8gQSBwcmV2aW91c2x5IGxvYWRlZCBtYW5pZmVzdCBtZWFucyB0aGlzIGlzIGEgKnJlbG9hZCogKGUuZy4gdGhlXG4gICAgLy8gXCJkZWZhdWx0XCIvc3ludGggdGFzayByZWdlbmVyYXRlZCB0aGUgZmlsZSBtaWQtcnVuKSwgYXMgb3Bwb3NlZCB0byB0aGVcbiAgICAvLyBpbml0aWFsIGxvYWQgcGVyZm9ybWVkIGJ5IHRoZSBjb25zdHJ1Y3Rvci5cbiAgICBjb25zdCBpc1JlbG9hZCA9IHRoaXMuX2lkZW50aXR5ICE9PSB1bmRlZmluZWQ7XG5cbiAgICB0aGlzLnZlcmlmeU1hbmlmZXN0KG1hbmlmZXN0KTtcbiAgICB0aGlzLl9tYW5pZmVzdCA9IG1hbmlmZXN0O1xuICAgIHRoaXMuX2lkZW50aXR5ID0gcmF3O1xuXG4gICAgaWYgKGlzUmVsb2FkKSB7XG4gICAgICBsb2dnaW5nLmRlYnVnKFxuICAgICAgICBgJHtUYXNrUnVudGltZS5NQU5JRkVTVF9GSUxFfSBjaGFuZ2VkIG9uIGRpc2s7IHN1Y2Nlc3NmdWxseSBsb2FkZWQgdGhlIG5ldyB0YXNrcyBtYW5pZmVzdC5gLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIGEgZnJlc2hseSByZWFkIG1hbmlmZXN0OlxuICAgKlxuICAgKiAtIExlZ2FjeSBtYW5pZmVzdHMgKG5vIGBtYW5pZmVzdFZlcnNpb25gKSBhcmUgYWNjZXB0ZWQgYXMtaXMgZm9yIGJhY2t3YXJkc1xuICAgKiAgIGNvbXBhdGliaWxpdHkuXG4gICAqIC0gTWFuaWZlc3RzIGZyb20gYSBuZXdlciBwcm9qZW4gKGEgaGlnaGVyIGBtYW5pZmVzdFZlcnNpb25gKSBhcmUgYWNjZXB0ZWRcbiAgICogICB3aXRoIGEgd2FybmluZywgc2luY2UgdGhpcyBydW50aW1lIG1heSBub3QgdW5kZXJzdGFuZCB0aGUgc2NoZW1hLlxuICAgKi9cbiAgcHJpdmF0ZSB2ZXJpZnlNYW5pZmVzdChtYW5pZmVzdDogVGFza3NNYW5pZmVzdCk6IHZvaWQge1xuICAgIC8vIEJhY2t3YXJkcyBjb21wYXRpYmlsaXR5OiBtYW5pZmVzdHMgZ2VuZXJhdGVkIGJlZm9yZSB2ZXJzaW9uaW5nIGNhcnJ5IG5vXG4gICAgLy8gdmVyc2lvbi5cbiAgICBpZiAobWFuaWZlc3QubWFuaWZlc3RWZXJzaW9uID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAobWFuaWZlc3QubWFuaWZlc3RWZXJzaW9uID4gVEFTS1NfTUFOSUZFU1RfVkVSU0lPTikge1xuICAgICAgbG9nZ2luZy53YXJuKFxuICAgICAgICBgJHtUYXNrUnVudGltZS5NQU5JRkVTVF9GSUxFfSB3YXMgZ2VuZXJhdGVkIGJ5IGEgbmV3ZXIgdmVyc2lvbiBvZiBwcm9qZW4gYCArXG4gICAgICAgICAgYChtYW5pZmVzdCB2ZXJzaW9uICR7bWFuaWZlc3QubWFuaWZlc3RWZXJzaW9ufSwgdGhpcyBwcm9qZW4gc3VwcG9ydHMgdXAgdG8gJHtUQVNLU19NQU5JRkVTVF9WRVJTSU9OfSkuIGAgK1xuICAgICAgICAgIGBTb21lIHRhc2tzIG1heSBub3QgYmVoYXZlIGFzIGV4cGVjdGVkOyBjb25zaWRlciB1cGdyYWRpbmcgcHJvamVuLmAsXG4gICAgICApO1xuICAgIH1cbiAgfVxufVxuXG5jbGFzcyBSdW5UYXNrIHtcbiAgcHJpdmF0ZSBlbnY6IHsgW25hbWU6IHN0cmluZ106IHN0cmluZyB8IHVuZGVmaW5lZCB9ID0ge307XG4gIHByaXZhdGUgcmVhZG9ubHkgcGFyZW50czogc3RyaW5nW107XG5cbiAgcHJpdmF0ZSByZWFkb25seSB3b3JrZGlyOiBzdHJpbmc7XG5cbiAgLy8gV2hlbiBzZXQsIGV2ZXJ5IHN0ZXAncyBzdGRvdXQgaXMgY2FwdHVyZWQgYW5kIGFjY3VtdWxhdGVkIChmb3IgYSBzcGF3bmVkXG4gIC8vIHRhc2sgd2hvc2UgYWdncmVnYXRlIG91dHB1dCB0aGUgY2FsbGVyIHdhbnRzKS5cbiAgcHJpdmF0ZSBjYXB0dXJlQWxsID0gZmFsc2U7XG4gIHByaXZhdGUgcmVhZG9ubHkgY2FwdHVyZWQ6IHN0cmluZ1tdID0gW107XG5cbiAgLy8gYG91dHB1dEVudmAgY2FwdHVyZXMsIHByb3BhZ2F0ZWQgdG8gc3Bhd25lZCBzdWJ0YXNrcyAoZXhlYy9idWlsdGluIHN0ZXBzXG4gIC8vIHNlZSB0aGVtIHZpYSBgdGhpcy5lbnZgKS5cbiAgcHJpdmF0ZSByZWFkb25seSBjYXB0dXJlZEVudjogeyBbbmFtZTogc3RyaW5nXTogc3RyaW5nIH0gPSB7fTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IHJ1bnRpbWU6IFRhc2tSdW50aW1lLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgdGFzazogVGFza1NwZWMsXG4gICAgcGFyZW50czogc3RyaW5nW10gPSBbXSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGFyZ3M6IEFycmF5PHN0cmluZyB8IG51bWJlcj4gPSBbXSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGVudlBhcmFtOiB7IFtuYW1lOiBzdHJpbmddOiBzdHJpbmcgfSA9IHt9LFxuICApIHtcbiAgICB0aGlzLndvcmtkaXIgPSB0YXNrLmN3ZCA/PyB0aGlzLnJ1bnRpbWUud29ya2RpcjtcbiAgICB0aGlzLnBhcmVudHMgPSBwYXJlbnRzO1xuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgdGhlIHRhc2ssIGNhcHR1cmluZyBhbmQgcmV0dXJuaW5nIHRoZSB0cmltbWVkLCBuZXdsaW5lLWpvaW5lZCBzdGRvdXRcbiAgICogb2YgYWxsIGl0cyBzdGVwcyAoYW5kIGFueSBuZXN0ZWQgc3Bhd25lZCB0YXNrcykgaW4gZXhlY3V0aW9uIG9yZGVyLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHJ1bkNhcHR1cmluZ091dHB1dCgpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHRoaXMuY2FwdHVyZUFsbCA9IHRydWU7XG4gICAgYXdhaXQgdGhpcy5ydW4oKTtcbiAgICByZXR1cm4gdGhpcy5jYXB0dXJlZC5qb2luKFwiXFxuXCIpLnRyaW0oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWNvcmRzIGEgc3RlcCdzIGNhcHR1cmVkICh0cmltbWVkKSBzdGRvdXQ6IGludG8gYG91dHB1dEVudmAgZm9yIGxhdGVyXG4gICAqIHN0ZXBzIChhbmQgcHJvcGFnYXRlZCB0byBzcGF3bmVkIHN1YnRhc2tzKSwgYW5kIGludG8gdGhlIHJ1bidzIGFnZ3JlZ2F0ZVxuICAgKiBvdXRwdXQgd2hlbiBjYXB0dXJpbmcgZXZlcnl0aGluZy5cbiAgICovXG4gIHByaXZhdGUgcmVjb3JkQ2FwdHVyZShvdXRwdXRFbnY6IHN0cmluZyB8IHVuZGVmaW5lZCwgdmFsdWU6IHN0cmluZykge1xuICAgIGlmIChvdXRwdXRFbnYpIHtcbiAgICAgIHRoaXMuZW52W291dHB1dEVudl0gPSB2YWx1ZTtcbiAgICAgIHRoaXMuY2FwdHVyZWRFbnZbb3V0cHV0RW52XSA9IHZhbHVlO1xuICAgIH1cbiAgICBpZiAodGhpcy5jYXB0dXJlQWxsKSB7XG4gICAgICB0aGlzLmNhcHR1cmVkLnB1c2godmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBFeGVjdXRlcyB0aGUgdGFzay4gVGhpcyB3YXMgcHJldmlvdXNseSBkb25lIGluIHRoZSBjb25zdHJ1Y3RvciwgYnV0IGlzIG5vd1xuICAgKiBhbiBhc3luYyBtZXRob2Qgc2luY2Ugc2hlbGwgZXhlY3V0aW9uIGlzIGFzeW5jaHJvbm91cyAoZS5nLiBkYXggb25cbiAgICogV2luZG93cykuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcnVuKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHsgdGFzaywgYXJncywgcGFyZW50cyB9ID0gdGhpcztcblxuICAgIGlmICghdGFzay5zdGVwcyB8fCB0YXNrLnN0ZXBzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy5sb2dEZWJ1ZyhncmF5KFwiTm8gYWN0aW9ucyBoYXZlIGJlZW4gc3BlY2lmaWVkIGZvciB0aGlzIHRhc2suXCIpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmVudiA9IGF3YWl0IHRoaXMucmVzb2x2ZUVudmlyb25tZW50KFxuICAgICAgdGhpcy5lbnZQYXJhbSxcbiAgICAgIHBhcmVudHMsXG4gICAgICB0aGlzLnJlc29sdmVTaGVsbCgpLFxuICAgICk7XG5cbiAgICBjb25zdCBlbnZsb2dzID0gW107XG4gICAgZm9yIChjb25zdCBbaywgdl0gb2YgT2JqZWN0LmVudHJpZXModGhpcy5lbnYpKSB7XG4gICAgICBjb25zdCB2diA9IHYgPz8gXCJcIjtcbiAgICAgIGNvbnN0IHRyaW1tZWQgPVxuICAgICAgICB2di5sZW5ndGggPiBFTlZfVFJJTV9MRU4gPyB2di5zdWJzdHJpbmcoMCwgRU5WX1RSSU1fTEVOKSArIFwiLi4uXCIgOiB2djtcbiAgICAgIGVudmxvZ3MucHVzaChgJHtrfT0ke3RyaW1tZWR9YCk7XG4gICAgfVxuXG4gICAgaWYgKGVudmxvZ3MubGVuZ3RoKSB7XG4gICAgICB0aGlzLmxvZ0RlYnVnKGdyYXkoYCR7dW5kZXJsaW5lKFwiZW52XCIpfTogJHtlbnZsb2dzLmpvaW4oXCIgXCIpfWApKTtcbiAgICB9XG5cbiAgICAvLyBldmFsdWF0ZSBjb25kaXRpb25cbiAgICBpZiAoIShhd2FpdCB0aGlzLmV2YWxDb25kaXRpb24odGFzaywgdGhpcy5yZXNvbHZlU2hlbGwoKSkpKSB7XG4gICAgICB0aGlzLmxvZyhcImNvbmRpdGlvbiBleGl0ZWQgd2l0aCBub24temVybyAtIHNraXBwaW5nXCIpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIHZlcmlmeSB3ZSByZXF1aXJlZCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYXJlIGRlZmluZWRcbiAgICBjb25zdCBtZXJnZWQgPSB7IC4uLnByb2Nlc3MuZW52LCAuLi50aGlzLmVudiB9O1xuICAgIGNvbnN0IG1pc3NpbmcgPSBuZXcgQXJyYXk8c3RyaW5nPigpO1xuICAgIGZvciAoY29uc3QgbmFtZSBvZiB0YXNrLnJlcXVpcmVkRW52ID8/IFtdKSB7XG4gICAgICBpZiAoIShuYW1lIGluIG1lcmdlZCkpIHtcbiAgICAgICAgbWlzc2luZy5wdXNoKG5hbWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChtaXNzaW5nLmxlbmd0aCA+IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYG1pc3NpbmcgcmVxdWlyZWQgZW52aXJvbm1lbnQgdmFyaWFibGVzOiAke21pc3Npbmcuam9pbihcIixcIil9YCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBzdGVwIG9mIHRhc2suc3RlcHMpIHtcbiAgICAgIGNvbnN0IHN0ZXBTaGVsbCA9IHRoaXMucmVzb2x2ZVNoZWxsKHN0ZXApO1xuXG4gICAgICAvLyBldmFsdWF0ZSBzdGVwIGNvbmRpdGlvblxuICAgICAgaWYgKCEoYXdhaXQgdGhpcy5ldmFsQ29uZGl0aW9uKHN0ZXAsIHN0ZXBTaGVsbCkpKSB7XG4gICAgICAgIHRoaXMubG9nKFwiY29uZGl0aW9uIGV4aXRlZCB3aXRoIG5vbi16ZXJvIC0gc2tpcHBpbmdcIik7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBhcmdzTGlzdDogc3RyaW5nW10gPSBbXG4gICAgICAgIC4uLihzdGVwLmFyZ3MgfHwgW10pLFxuICAgICAgICAuLi4oc3RlcC5yZWNlaXZlQXJncyA/IGFyZ3MgOiBbXSksXG4gICAgICBdLm1hcCgoYSkgPT4gYS50b1N0cmluZygpKTtcblxuICAgICAgaWYgKHN0ZXAuc2F5KSB7XG4gICAgICAgIGxvZ2dpbmcuaW5mbyh0aGlzLmZtdExvZyhzdGVwLnNheSkpO1xuICAgICAgfVxuXG4gICAgICBpZiAoc3RlcC5zcGF3bikge1xuICAgICAgICBjb25zdCBjYXB0dXJlID0gdGhpcy5jYXB0dXJlQWxsIHx8ICEhc3RlcC5vdXRwdXRFbnY7XG4gICAgICAgIGNvbnN0IG91dHB1dCA9IGF3YWl0IHRoaXMucnVudGltZS5ydW5UYXNrKFxuICAgICAgICAgIHN0ZXAuc3Bhd24sXG4gICAgICAgICAgWy4uLnRoaXMucGFyZW50cywgdGhpcy50YXNrLm5hbWVdLFxuICAgICAgICAgIGFyZ3NMaXN0LFxuICAgICAgICAgIHsgLi4udGhpcy5jYXB0dXJlZEVudiwgLi4uc3RlcC5lbnYgfSxcbiAgICAgICAgICB7IGNhcHR1cmVPdXRwdXQ6IGNhcHR1cmUgfSxcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKHR5cGVvZiBvdXRwdXQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICB0aGlzLnJlY29yZENhcHR1cmUoc3RlcC5vdXRwdXRFbnYsIG91dHB1dCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgZXhlY3M6IEFycmF5PHN0cmluZyB8IHN0cmluZ1tdPiA9IHN0ZXAuZXhlYyA/IFtzdGVwLmV4ZWNdIDogW107XG5cbiAgICAgIC8vIFBhcnNlIHN0ZXAtc3BlY2lmaWMgZW52aXJvbm1lbnQgdmFyaWFibGVzXG4gICAgICBjb25zdCBlbnYgPSBhd2FpdCB0aGlzLmV2YWxFbnZpcm9ubWVudChzdGVwLmVudiA/PyB7fSwgc3RlcFNoZWxsKTtcblxuICAgICAgaWYgKHN0ZXAuYnVpbHRpbikge1xuICAgICAgICBleGVjcy5wdXNoKHRoaXMucmVuZGVyQnVpbHRpbihzdGVwLmJ1aWx0aW4pKTtcbiAgICAgIH1cblxuICAgICAgLy8gYGV4ZWNBcmdzYCBpcyBhbiBleHBsaWNpdCBhcmd2ICh0aGUgcHJvZ3JhbSBmb2xsb3dlZCBieSBpdHMgYXJndW1lbnRzKS5cbiAgICAgIC8vIEl0IGlzIGhhbmRlZCB0byBgc2hlbGwoKWAgYXMgYW4gYXJyYXkgcmF0aGVyIHRoYW4gYSByZW5kZXJlZCBzdHJpbmcsIHNvXG4gICAgICAvLyBpdCBydW5zIHdpdGhvdXQgYSBzaGVsbCBhbmQgZXZlcnkgZWxlbWVudCBpcyBwYXNzZWQgdGhyb3VnaCB2ZXJiYXRpbSAtXG4gICAgICAvLyB3aGljaCBpcyB3aGF0IGxldHMgY2FsbGVycyBhdm9pZCB0aGlua2luZyBhYm91dCBxdW90aW5nLiBGaXhlZC9yZWNlaXZlZFxuICAgICAgLy8gYXJncyBhcmUgc3BsaWNlZCBpbiB3aGVyZXZlciBhIGAkQGAgbWFya2VyIGVsZW1lbnQgYXBwZWFycyAobWlycm9yaW5nXG4gICAgICAvLyB0aGUgc3RyaW5nIGBleGVjYCBiZWhhdmlvciksIG9yIGFwcGVuZGVkIGF0IHRoZSBlbmQgaWYgdGhlcmUgaXMgbm9uZS5cbiAgICAgIGlmIChzdGVwLmV4ZWNBcmdzKSB7XG4gICAgICAgIGNvbnN0IGFyZ3Y6IHN0cmluZ1tdID0gW107XG4gICAgICAgIGxldCBwbGFjZWQgPSBmYWxzZTtcbiAgICAgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIHN0ZXAuZXhlY0FyZ3MpIHtcbiAgICAgICAgICBpZiAoZWxlbWVudCA9PT0gQVJHU19NQVJLRVIpIHtcbiAgICAgICAgICAgIGFyZ3YucHVzaCguLi5hcmdzTGlzdCk7XG4gICAgICAgICAgICBwbGFjZWQgPSB0cnVlO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhcmd2LnB1c2goZWxlbWVudCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICghcGxhY2VkKSB7XG4gICAgICAgICAgYXJndi5wdXNoKC4uLmFyZ3NMaXN0KTtcbiAgICAgICAgfVxuICAgICAgICBleGVjcy5wdXNoKGFyZ3YpO1xuICAgICAgfVxuXG4gICAgICBmb3IgKGNvbnN0IGV4ZWMgb2YgZXhlY3MpIHtcbiAgICAgICAgbGV0IGNvbW1hbmQgPSBleGVjO1xuXG4gICAgICAgIC8vIEEgc3RyaW5nIGNvbW1hbmQgaXMgYSBzaGVsbCBsaW5lOiBzcGxpY2UgdGFzayBhcmdzIGluIHBlciB0aGUgYCRAYFxuICAgICAgICAvLyBtYXJrZXIgcnVsZXMuIEFuIGBleGVjQXJnc2AgYXJndiBhbHJlYWR5IGNhcnJpZXMgaXRzIGFyZ3MsIHVudG91Y2hlZC5cbiAgICAgICAgaWYgKHR5cGVvZiBjb21tYW5kID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgaWYgKGNvbW1hbmQuaW5jbHVkZXMoUVVPVEVEX0FSR1NfTUFSS0VSKSkge1xuICAgICAgICAgICAgLy8gYFwiJEBcImA6IHNwbGljZSBlYWNoIGFyZyBpbiBhcyBhIHNlcGFyYXRlIHZlcmJhdGltIHdvcmQgKGxpa2VcbiAgICAgICAgICAgIC8vIGJhc2gncyBxdW90ZWQgYFwiJEBcImApLCBzbyB3aGl0ZXNwYWNlIGFuZCBtZXRhY2hhcmFjdGVycyBzdXJ2aXZlLlxuICAgICAgICAgICAgY29tbWFuZCA9IGNvbW1hbmQucmVwbGFjZShcbiAgICAgICAgICAgICAgUVVPVEVEX0FSR1NfTUFSS0VSLFxuICAgICAgICAgICAgICBlc2NhcGVBcmdzRm9yKHN0ZXBTaGVsbCwgYXJnc0xpc3QpLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGNvbW1hbmQuaW5jbHVkZXMoQVJHU19NQVJLRVIpKSB7XG4gICAgICAgICAgICBjb21tYW5kID0gY29tbWFuZC5yZXBsYWNlKEFSR1NfTUFSS0VSLCBhcmdzTGlzdC5qb2luKFwiIFwiKSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbW1hbmQgPSBbY29tbWFuZCwgLi4uYXJnc0xpc3RdLmpvaW4oXCIgXCIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGN3ZCA9IHN0ZXAuY3dkO1xuICAgICAgICBjb25zdCBjYXB0dXJlID0gdGhpcy5jYXB0dXJlQWxsIHx8ICEhc3RlcC5vdXRwdXRFbnY7XG4gICAgICAgIC8vIEEgdGhyb3duIGVycm9yIChlLmcuIHNwYXduIGZhaWx1cmUpIHByb3BhZ2F0ZXM7IGEgbm9uLXplcm8gZXhpdCBpc1xuICAgICAgICAvLyByZXBvcnRlZCB2aWEgYHJlc3VsdC5zdGF0dXNgLlxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnNoZWxsKHtcbiAgICAgICAgICBjb21tYW5kLFxuICAgICAgICAgIGN3ZCxcbiAgICAgICAgICBleHRyYUVudjogZW52LFxuICAgICAgICAgIHNoZWxsOiBzdGVwU2hlbGwsXG4gICAgICAgICAgY2FwdHVyZU91dHB1dDogY2FwdHVyZSxcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChyZXN1bHQuc3RhdHVzICE9PSAwKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYFRhc2sgXCIke3RoaXMuZnVsbG5hbWV9XCIgZmFpbGVkIHdoZW4gZXhlY3V0aW5nIFwiJHtcbiAgICAgICAgICAgICAgQXJyYXkuaXNBcnJheShjb21tYW5kKSA/IGNvbW1hbmQuam9pbihcIiBcIikgOiBjb21tYW5kXG4gICAgICAgICAgICB9XCIgKGN3ZDogJHtyZXNvbHZlKGN3ZCA/PyB0aGlzLndvcmtkaXIpfSlgLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNhcHR1cmUpIHtcbiAgICAgICAgICBjb25zdCBzdGRvdXQgPSByZXN1bHQuc3Rkb3V0Py50b1N0cmluZyhcInV0Zi04XCIpLnRyaW0oKSA/PyBcIlwiO1xuICAgICAgICAgIHRoaXMucmVjb3JkQ2FwdHVyZShzdGVwLm91dHB1dEVudiwgc3Rkb3V0KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIGlmIGEgdGFzayBzaG91bGQgYmUgZXhlY3V0ZWQgYmFzZWQgb24gXCJjb25kaXRpb25cIi5cbiAgICpcbiAgICogQHJldHVybnMgdHJ1ZSBpZiB0aGUgdGFzayBzaG91bGQgYmUgZXhlY3V0ZWQgb3IgZmFsc2UgaWYgdGhlIGNvbmRpdGlvblxuICAgKiBldmFsdWF0ZXMgdG8gZmFsc2UgKGV4aXRzIHdpdGggbm9uLXplcm8pLCBpbmRpY2F0aW5nIHRoYXQgdGhlIHRhc2sgc2hvdWxkXG4gICAqIGJlIHNraXBwZWQuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGV2YWxDb25kaXRpb24oXG4gICAgdGFza09yU3RlcDogVGFza1NwZWMgfCBUYXNrU3RlcCxcbiAgICBzaGVsbDogc3RyaW5nIHwgc3RyaW5nW10sXG4gICkge1xuICAgIC8vIG5vIGNvbmRpdGlvbiwgY2Fycnkgb25cbiAgICBpZiAoIXRhc2tPclN0ZXAuY29uZGl0aW9uKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICB0aGlzLmxvZyhncmF5KGAke3VuZGVybGluZShcImNvbmRpdGlvblwiKX06ICR7dGFza09yU3RlcC5jb25kaXRpb259YCkpO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuc2hlbGwoe1xuICAgICAgY29tbWFuZDogdGFza09yU3RlcC5jb25kaXRpb24sXG4gICAgICBxdWlldDogdHJ1ZSxcbiAgICAgIHNoZWxsLFxuICAgIH0pO1xuICAgIGlmIChyZXN1bHQuc3RhdHVzID09PSAwKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBFdmFsdWF0ZXMgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZyb20gc2hlbGwgY29tbWFuZHMgKGUuZy4gYCQoeHgpYClcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZXZhbEVudmlyb25tZW50KFxuICAgIGVudjogeyBbbmFtZTogc3RyaW5nXTogc3RyaW5nIH0sXG4gICAgc2hlbGw6IHN0cmluZyB8IHN0cmluZ1tdLFxuICApIHtcbiAgICBjb25zdCBvdXRwdXQ6IHsgW25hbWU6IHN0cmluZ106IHN0cmluZyB8IHVuZGVmaW5lZCB9ID0ge307XG5cbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhlbnYgPz8ge30pKSB7XG4gICAgICBpZiAoU3RyaW5nKHZhbHVlKS5zdGFydHNXaXRoKFwiJChcIikgJiYgU3RyaW5nKHZhbHVlKS5lbmRzV2l0aChcIilcIikpIHtcbiAgICAgICAgY29uc3QgcXVlcnkgPSB2YWx1ZS5zdWJzdHJpbmcoMiwgdmFsdWUubGVuZ3RoIC0gMSk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuc2hlbGwoe1xuICAgICAgICAgIGNvbW1hbmQ6IHF1ZXJ5LFxuICAgICAgICAgIHF1aWV0OiB0cnVlLFxuICAgICAgICAgIGNhcHR1cmVPdXRwdXQ6IHRydWUsXG4gICAgICAgICAgc2hlbGwsXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAocmVzdWx0LnN0YXR1cyAhPT0gMCkge1xuICAgICAgICAgIGNvbnN0IGVycm9yID0gcmVzdWx0LmVycm9yXG4gICAgICAgICAgICA/IHJlc3VsdC5lcnJvci5zdGFja1xuICAgICAgICAgICAgOiByZXN1bHQuc3RkZXJyPy50b1N0cmluZygpLnRyaW0oKSB8fFxuICAgICAgICAgICAgICByZXN1bHQuc3Rkb3V0Py50b1N0cmluZygpLnRyaW0oKSB8fFxuICAgICAgICAgICAgICBgY29tbWFuZCBleGl0ZWQgd2l0aCBjb2RlICR7cmVzdWx0LnN0YXR1c31gO1xuXG4gICAgICAgICAgbG9nZ2luZy53YXJuKFxuICAgICAgICAgICAgdGhpcy5mbXRMb2coXG4gICAgICAgICAgICAgIGAke3VuZGVybGluZShrZXkpfTogdW5hYmxlIHRvIGV2YWx1YXRlIFwiJHtxdWVyeX1cIi4gRW52aXJvbm1lbnQgdmFyaWFibGUgd2lsbCBiZSBza2lwcGVkLiBDaGVjayB0aGF0IHRoZSBjb21tYW5kIGV4aXN0cyBhbmQgcnVucyBzdWNjZXNzZnVsbHkuYCxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgKTtcbiAgICAgICAgICBsb2dnaW5nLndhcm4odGhpcy5mbXRMb2coYCR7dW5kZXJsaW5lKGtleSl9OiAke2Vycm9yfWApKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBvdXRwdXRba2V5XSA9IHJlc3VsdC5zdGRvdXQ/LnRvU3RyaW5nKFwidXRmLThcIikudHJpbSgpID8/IFwiXCI7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG91dHB1dFtrZXldID0gdmFsdWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBvdXRwdXQ7XG4gIH1cblxuICAvKipcbiAgICogUmVuZGVycyB0aGUgcnVudGltZSBlbnZpcm9ubWVudCBmb3IgYSB0YXNrLiBOYW1lbHksIGl0IHN1cHBvcnRzIHRoaXMgc3ludGF4XG4gICAqIGAkKHh4KWAgZm9yIGFsbG93aW5nIGVudmlyb25tZW50IHRvIGJlIGV2YWx1YXRlZCBieSBleGVjdXRpbmcgYSBzaGVsbFxuICAgKiBjb21tYW5kIGFuZCBvYnRhaW5pbmcgaXRzIHJlc3VsdC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcmVzb2x2ZUVudmlyb25tZW50KFxuICAgIGVudlBhcmFtOiB7IFtuYW1lOiBzdHJpbmddOiBzdHJpbmcgfSxcbiAgICBwYXJlbnRzOiBzdHJpbmdbXSxcbiAgICBzaGVsbDogc3RyaW5nIHwgc3RyaW5nW10sXG4gICkge1xuICAgIGxldCBlbnYgPSB0aGlzLnJ1bnRpbWUubWFuaWZlc3QuZW52ID8/IHt9O1xuXG4gICAgLy8gYWRkIGVudiBmcm9tIGFsbCBwYXJlbnQgdGFza3Mgb25lIGJ5IG9uZVxuICAgIGZvciAoY29uc3QgcGFyZW50IG9mIHBhcmVudHMpIHtcbiAgICAgIGVudiA9IHtcbiAgICAgICAgLi4uZW52LFxuICAgICAgICAuLi4odGhpcy5ydW50aW1lLnRyeUZpbmRUYXNrKHBhcmVudCk/LmVudiA/PyB7fSksXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIGFwcGx5IHRhc2sgZW52aXJvbm1lbnQsIHRoZW4gdGhlIHNwZWNpZmljIGVudiBsYXN0XG4gICAgZW52ID0ge1xuICAgICAgLi4uZW52LFxuICAgICAgLi4uKHRoaXMudGFzay5lbnYgPz8ge30pLFxuICAgICAgLi4uZW52UGFyYW0sXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmV2YWxFbnZpcm9ubWVudChlbnYsIHNoZWxsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyB0aGUgc2hlbGwgZm9yIGEgc3RlcCdzIGNvbW1hbmQgKG9yIHRoZSB0YXNrJ3MsIHdoZW4gbm8gc3RlcCBpc1xuICAgKiBnaXZlbik6IHN0ZXAsIHRoZW4gdGFzaywgdGhlbiBwcm9qZWN0IGRlZmF1bHQsIHRoZW4gXCJwcm9qZW5cIi5cbiAgICovXG4gIHByaXZhdGUgcmVzb2x2ZVNoZWxsKHN0ZXA/OiBUYXNrU3RlcCk6IHN0cmluZyB8IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gKFxuICAgICAgc3RlcD8uc2hlbGwgPz8gdGhpcy50YXNrLnNoZWxsID8/IHRoaXMucnVudGltZS5tYW5pZmVzdC5zaGVsbCA/PyBcInByb2plblwiXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBcImZ1bGwgbmFtZVwiIG9mIHRoZSB0YXNrIHdoaWNoIGluY2x1ZGVzIGFsbCBpdCdzIHBhcmVudCB0YXNrIG5hbWVzIGNvbmNhdGVuYXRlZCBieSBjaGV2cm9ucy5cbiAgICovXG4gIHByaXZhdGUgZ2V0IGZ1bGxuYW1lKCkge1xuICAgIHJldHVybiBbLi4udGhpcy5wYXJlbnRzLCB0aGlzLnRhc2submFtZV0uam9pbihcIiDCuyBcIik7XG4gIH1cblxuICBwcml2YXRlIGxvZyguLi5hcmdzOiBhbnlbXSkge1xuICAgIGxvZ2dpbmcudmVyYm9zZSh0aGlzLmZtdExvZyguLi5hcmdzKSk7XG4gIH1cblxuICBwcml2YXRlIGxvZ0RlYnVnKC4uLmFyZ3M6IGFueVtdKSB7XG4gICAgbG9nZ2luZy5kZWJ1Zyh0aGlzLmZtdExvZyguLi5hcmdzKSk7XG4gIH1cblxuICBwcml2YXRlIGZtdExvZyguLi5hcmdzOiBhbnlbXSkge1xuICAgIHJldHVybiBmb3JtYXQoYCR7dW5kZXJsaW5lKHRoaXMuZnVsbG5hbWUpfSB8YCwgLi4uYXJncyk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHNoZWxsKG9wdGlvbnM6IFNoZWxsT3B0aW9ucyk6IFByb21pc2U8U2hlbGxSZXN1bHQ+IHtcbiAgICBjb25zdCBxdWlldCA9IG9wdGlvbnMucXVpZXQgPz8gZmFsc2U7XG4gICAgaWYgKCFxdWlldCkge1xuICAgICAgY29uc3QgbG9nID0gbmV3IEFycmF5PHN0cmluZz4oKTtcblxuICAgICAgbG9nLnB1c2goXG4gICAgICAgIEFycmF5LmlzQXJyYXkob3B0aW9ucy5jb21tYW5kKVxuICAgICAgICAgID8gb3B0aW9ucy5jb21tYW5kLmpvaW4oXCIgXCIpXG4gICAgICAgICAgOiBvcHRpb25zLmNvbW1hbmQsXG4gICAgICApO1xuXG4gICAgICBpZiAob3B0aW9ucy5jd2QpIHtcbiAgICAgICAgbG9nLnB1c2goYChjd2Q6ICR7b3B0aW9ucy5jd2R9KWApO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmxvZyhsb2cuam9pbihcIiBcIikpO1xuICAgIH1cblxuICAgIGNvbnN0IGN3ZCA9IG9wdGlvbnMuY3dkID8/IHRoaXMud29ya2RpcjtcbiAgICBpZiAoIWV4aXN0c1N5bmMoY3dkKSB8fCAhc3RhdFN5bmMoY3dkKS5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBpbnZhbGlkIHdvcmtkaXIgKGN3ZCk6ICR7Y3dkfSBtdXN0IGJlIGFuIGV4aXN0aW5nIGRpcmVjdG9yeWAsXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIFRoZSByZXNvbHZlZCBzaGVsbCBpcyBvbmUgb2Y6XG4gICAgLy8gLSBcInByb2plblwiIChkZWZhdWx0KTogZGF4J3MgaW4tcHJvY2VzcyBjcm9zcy1wbGF0Zm9ybSBzaGVsbCwgc28gUE9TSVgtc3R5bGVcbiAgICAvLyAgIHRhc2sgc3ludGF4IChgbWtkaXIgLXBgLCBgJiZgLCBgJFZBUmAsIC4uLikgd29ya3MgdGhlIHNhbWUgZXZlcnl3aGVyZS5cbiAgICAvLyAtIFwic3lzdGVtXCI6IHRoZSBob3N0J3MgbmF0aXZlIHNoZWxsIChgL2Jpbi9zaGAsIG9yIGBjbWQuZXhlYCBvbiBXaW5kb3dzKS5cbiAgICAvLyAtIGFuIGFyZ3YsIGUuZy4gW1wiYmFzaFwiLFwiLWNcIl06IGEgc2hlbGwgaW52b2NhdGlvbiB3aXRoIHRoZSBjb21tYW5kIGFwcGVuZGVkXG4gICAgLy8gICBhcyBpdHMgZmluYWwgYXJndW1lbnQuXG4gICAgY29uc3Qgc2hlbGwgPSBvcHRpb25zLnNoZWxsID8/IFwicHJvamVuXCI7XG4gICAgaWYgKHR5cGVvZiBzaGVsbCA9PT0gXCJzdHJpbmdcIiAmJiBzaGVsbCAhPT0gXCJwcm9qZW5cIiAmJiBzaGVsbCAhPT0gXCJzeXN0ZW1cIikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgdW5rbm93biBidWlsdC1pbiBzaGVsbCAke0pTT04uc3RyaW5naWZ5KFxuICAgICAgICAgIHNoZWxsLFxuICAgICAgICApfTsgdXNlIHRoZSBidWlsdC1pbiBcInByb2plblwiIG9yIFwic3lzdGVtXCIgc2hlbGxzLCBvciBhIFRhc2tTaGVsbC5jb21tYW5kKFsuLi5dKSBpbnZvY2F0aW9uYCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgY2FwdHVyZSA9IG9wdGlvbnMuY2FwdHVyZU91dHB1dCA/PyBmYWxzZTtcbiAgICAvLyBRdWlldCBjYXB0dXJlcyAoYCQoLi4uKWAsIGNvbmRpdGlvbnMpIHN0YXkgc2lsZW50OyB2aXNpYmxlIGNhcHR1cmVzXG4gICAgLy8gKGBvdXRwdXRFbnZgKSBzdHJlYW0gbGl2ZSB3aGlsZSBzdGlsbCBidWZmZXJpbmcuXG4gICAgY29uc3Qgc3RyZWFtID0gY2FwdHVyZSAmJiAhcXVpZXQ7XG5cbiAgICBjb25zdCBjb21tYW5kID0gb3B0aW9ucy5jb21tYW5kO1xuICAgIGNvbnN0IGVudiA9IHtcbiAgICAgIC4uLnByb2Nlc3MuZW52LFxuICAgICAgLi4udGhpcy5lbnYsXG4gICAgICAuLi5vcHRpb25zLmV4dHJhRW52LFxuICAgIH07XG5cbiAgICAvLyBcInN5c3RlbVwiOiB0aGUgaG9zdC1uYXRpdmUgZW5naW5lLiBBIHN0cmluZyBjb21tYW5kIHJ1bnMgdGhyb3VnaCB0aGUgT1NcbiAgICAvLyBzaGVsbDsgYW4gYGV4ZWNBcmdzYCBhcmd2IGlzIHNwYXduZWQgZGlyZWN0bHkgKHNoZWxsLWZyZWUpLCBzbyB0aGUgcmVhbFxuICAgIC8vIGJpbmFyeSBydW5zIHdpdGggbm8gZGF4IGJ1aWx0LWlucy4gKE9ubHkgYCQoLi4uKWAvY29uZGl0aW9uIGV2YWwgY2FwdHVyZXMsXG4gICAgLy8gYW5kIHRob3NlIGFsd2F5cyBwYXNzIGEgc3RyaW5nLCBzbyBhbiBhcnJheSBjb21tYW5kIG5ldmVyIG5lZWRzIGNhcHR1cmUuKVxuICAgIGlmIChzaGVsbCA9PT0gXCJzeXN0ZW1cIikge1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY29tbWFuZCkpIHtcbiAgICAgICAgY29uc3QgW3Byb2dyYW0sIC4uLmFyZ3NdID0gY29tbWFuZDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB0b29sKHByb2dyYW0pLnJ1bihhcmdzLCB7IGN3ZCwgZW52LCBpbmhlcml0U3RkaW86IHRydWUgfSk7XG4gICAgICAgICAgcmV0dXJuIHsgc3RhdHVzOiAwIH07XG4gICAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgICAgIGlmICh0eXBlb2YgZT8uc3RhdHVzID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgICByZXR1cm4geyBzdGF0dXM6IGUuc3RhdHVzIH07XG4gICAgICAgICAgfVxuICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBzeXN0ZW1TaGVsbChjb21tYW5kLCB7IGN3ZCwgZW52LCBjYXB0dXJlLCBzdHJlYW0gfSk7XG4gICAgfVxuXG4gICAgLy8gT3RoZXJ3aXNlIHJ1biB0aHJvdWdoIGRheDogdGhlIFwicHJvamVuXCIgc2hlbGwgb3IgYW4gZXhwbGljaXQgaW52b2NhdGlvbi5cbiAgICBjb25zdCBidWlsZGVyID0gdGhpcy5idWlsZERheENvbW1hbmQoY29tbWFuZCwgc2hlbGwpO1xuXG4gICAgLy8gYGluaGVyaXRQaXBlZGAgc3RyZWFtcyBhbmQgYnVmZmVyczsgYHBpcGVkYCBidWZmZXJzIHF1aWV0bHkuIHN0ZGVyciBpc1xuICAgIC8vIGJ1ZmZlcmVkIG9ubHkgZm9yIHF1aWV0IGNhcHR1cmVzLCBzbyBpdCBjYW4gc3VyZmFjZSBpbiBlcnJvcnMuXG4gICAgY29uc3Qgc3Rkb3V0TW9kZSA9IGNhcHR1cmVcbiAgICAgID8gc3RyZWFtXG4gICAgICAgID8gXCJpbmhlcml0UGlwZWRcIlxuICAgICAgICA6IFwicGlwZWRcIlxuICAgICAgOiBcImluaGVyaXRcIjtcbiAgICBjb25zdCBzdGRlcnJNb2RlID0gY2FwdHVyZSAmJiAhc3RyZWFtID8gXCJwaXBlZFwiIDogXCJpbmhlcml0XCI7XG5cbiAgICBsZXQgcmVzdWx0O1xuICAgIHRyeSB7XG4gICAgICByZXN1bHQgPSBhd2FpdCBidWlsZGVyXG4gICAgICAgIC5jd2QoY3dkKVxuICAgICAgICAuZW52KGVudilcbiAgICAgICAgLnN0ZG91dChzdGRvdXRNb2RlKVxuICAgICAgICAuc3RkZXJyKHN0ZGVyck1vZGUpXG4gICAgICAgIC5ub1Rocm93KCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gZGF4J3MgaW4tcHJvY2VzcyBzaGVsbCB0aHJvd3MgYSB0ZXJzZSBgTm90IGltcGxlbWVudGVkOiAuLi5gIGZvciBzaGVsbFxuICAgICAgLy8gc3ludGF4IGl0IGRvZXMgbm90IHN1cHBvcnQgKGUuZy4gYCQoLi4uKWAgY29tbWFuZCBzdWJzdGl0dXRpb24pOyB0dXJuXG4gICAgICAvLyB0aGF0IGludG8gYW4gYWN0aW9uYWJsZSBlcnJvciB0aGF0IHBvaW50cyBhdCB0aGUgc3lzdGVtLXNoZWxsIGVzY2FwZVxuICAgICAgLy8gaGF0Y2guIE90aGVyIGVycm9ycyBwYXNzIHRocm91Z2ggdW5jaGFuZ2VkLlxuICAgICAgdGhyb3cgZW5yaWNoQnVpbHRpblNoZWxsRXJyb3IoZSwgY29tbWFuZCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHN0YXR1czogcmVzdWx0LmNvZGUsXG4gICAgICBzdGRvdXQ6IGNhcHR1cmUgPyBCdWZmZXIuZnJvbShyZXN1bHQuc3Rkb3V0Qnl0ZXMpIDogbnVsbCxcbiAgICAgIHN0ZGVycjogY2FwdHVyZSAmJiAhc3RyZWFtID8gQnVmZmVyLmZyb20ocmVzdWx0LnN0ZGVyckJ5dGVzKSA6IG51bGwsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgdGhlIGRheCBjb21tYW5kIGZvciB0aGUgXCJwcm9qZW5cIiBzaGVsbCBvciBhbiBleHBsaWNpdCBpbnZvY2F0aW9uLlxuICAgKiAoVGhlIFwic3lzdGVtXCIgc2hlbGwgaXMgaGFuZGxlZCBob3N0LXNpZGUsIG5vdCBoZXJlLikgYGNvbW1hbmRgIGlzIGEgc2hlbGxcbiAgICogbGluZSAoc3RyaW5nKSBvciBhbiBgZXhlY0FyZ3NgIGFyZ3YgKHN0cmluZ1tdKTsgYHNoZWxsYCBpcyBgXCJwcm9qZW5cImAgb3IgYW5cbiAgICogaW52b2NhdGlvbiBhcmd2IHN1Y2ggYXMgYFtcImJhc2hcIiwgXCItY1wiXWAuXG4gICAqL1xuICBwcml2YXRlIGJ1aWxkRGF4Q29tbWFuZChcbiAgICBjb21tYW5kOiBzdHJpbmcgfCBzdHJpbmdbXSxcbiAgICBzaGVsbDogc3RyaW5nIHwgc3RyaW5nW10sXG4gICkge1xuICAgIC8vIEFuIGludm9jYXRpb24gKGUuZy4gW1wiYmFzaFwiLFwiLWNcIl0sIFtcIm5weFwiLFwiLS1ub1wiLFwiLWNcIl0pOiBhcHBlbmQgdGhlXG4gICAgLy8gY29tbWFuZCBhcyBpdHMgZmluYWwgYXJndW1lbnQuIEEgc3RyaW5nIGlzIGFwcGVuZGVkIGFzLWlzOyBhbiBgZXhlY0FyZ3NgXG4gICAgLy8gYXJndiBpcyByZW5kZXJlZCB0byBhIHF1b3RlZCBjb21tYW5kIGxpbmUgc28gdGhlIHNoZWxsIHJlLXBhcnNlcyB0aGUgc2FtZVxuICAgIC8vIGFyZ3YuIFRoYXQgcmVuZGVyaW5nIGFzc3VtZXMgYSBQT1NJWC1zdHlsZSBzaGVsbCwgd2hpY2ggaXMgd2hhdCBzdWNoIGFuXG4gICAgLy8gaW52b2NhdGlvbiBpcyAoYGJhc2ggLWNgLCBgc2ggLWNgLCBgbnB4IC1jYCwgLi4uKS5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShzaGVsbCkpIHtcbiAgICAgIGNvbnN0IFtwcm9ncmFtLCAuLi5mbGFnc10gPSBzaGVsbDtcbiAgICAgIGNvbnN0IGNvbW1hbmRMaW5lID0gQXJyYXkuaXNBcnJheShjb21tYW5kKVxuICAgICAgICA/IGVzY2FwZUNvbW1hbmQoY29tbWFuZClcbiAgICAgICAgOiBjb21tYW5kO1xuICAgICAgcmV0dXJuICRgJHtwcm9ncmFtfSAke1suLi5mbGFncywgY29tbWFuZExpbmVdfWA7XG4gICAgfVxuXG4gICAgLy8gVGhlIGJ1aWx0LWluIFwicHJvamVuXCIgc2hlbGwgKGRheCkuXG4gICAgcmV0dXJuIEFycmF5LmlzQXJyYXkoY29tbWFuZClcbiAgICAgID8gLy8gZXhlY0FyZ3M6IHNoZWxsLWZyZWUgYXJndiAoZWFjaCBlbGVtZW50IGVzY2FwZWQ7IGAuY21kYCBzaGltcyByZXNvbHZlZCkuXG4gICAgICAgICRgJHtjb21tYW5kWzBdfSAke2NvbW1hbmQuc2xpY2UoMSl9YFxuICAgICAgOiAvLyBzdHJpbmcgY29tbWFuZCwgcGFyc2VkIGluLXByb2Nlc3MgYnkgZGF4J3MgY3Jvc3MtcGxhdGZvcm0gc2hlbGwuXG4gICAgICAgICQucmF3YCR7Y29tbWFuZH1gO1xuICB9XG5cbiAgcHJpdmF0ZSByZW5kZXJCdWlsdGluKGJ1aWx0aW46IHN0cmluZykge1xuICAgIC8vIExvY2F0ZSBwcm9qZW4ncyBwYWNrYWdlIHJvb3QgYnkgd2Fsa2luZyB1cCBmcm9tIHRoaXMgbW9kdWxlJ3MgZGlyZWN0b3J5XG4gICAgLy8gdW50aWwgd2UgZmluZCBhIHBhY2thZ2UuanNvbi4gVGhpcyB3b3JrcyB3aGV0aGVyIHRoZSBjb2RlIHJ1bnMgZnJvbSB0aGVcbiAgICAvLyBjb21waWxlZCBmaWxlIChsaWIvY2xpL3Rhc2stcnVudGltZS5qcykgb3IgZnJvbSB0aGUgYnVuZGxlZCBydW4tdGFzay5janNcbiAgICAvLyAobGliL3J1bi10YXNrLmNqcyksIHdoaWNoIGxpdmUgYXQgZGlmZmVyZW50IGRlcHRocyAtIHNvIGEgaGFyZC1jb2RlZFxuICAgIC8vIHJlbGF0aXZlIHBhdGggdG8gcGFja2FnZS5qc29uIHdvdWxkIGJlIHdyb25nIGluIG9uZSBvZiB0aGUgdHdvIGNhc2VzLlxuICAgIGxldCBtb2R1bGVSb290ID0gX19kaXJuYW1lO1xuICAgIHdoaWxlICghZXhpc3RzU3luYyhqb2luKG1vZHVsZVJvb3QsIFwicGFja2FnZS5qc29uXCIpKSkge1xuICAgICAgY29uc3QgcGFyZW50ID0gZGlybmFtZShtb2R1bGVSb290KTtcbiAgICAgIGlmIChwYXJlbnQgPT09IG1vZHVsZVJvb3QpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwidW5hYmxlIHRvIGxvY2F0ZSB0aGUgcHJvamVuIHBhY2thZ2Ugcm9vdFwiKTtcbiAgICAgIH1cbiAgICAgIG1vZHVsZVJvb3QgPSBwYXJlbnQ7XG4gICAgfVxuICAgIGNvbnN0IHByb2dyYW0gPSByZXF1aXJlLnJlc29sdmUoXG4gICAgICBqb2luKG1vZHVsZVJvb3QsIFwibGliXCIsIGAke2J1aWx0aW59LnRhc2suanNgKSxcbiAgICApO1xuICAgIHJldHVybiBgXCIke3Byb2Nlc3MuZXhlY1BhdGh9XCIgXCIke3Byb2dyYW19XCJgO1xuICB9XG59XG5cbmludGVyZmFjZSBTaGVsbE9wdGlvbnMge1xuICAvKipcbiAgICogVGhlIGNvbW1hbmQgdG8gcnVuLiBBIHN0cmluZyBpcyBleGVjdXRlZCBhcyBhIHNoZWxsIGNvbW1hbmQgbGluZTsgYVxuICAgKiBzdHJpbmcgYXJyYXkgaXMgYW4gZXhwbGljaXQgYXJndiAocHJvZ3JhbSArIGFyZ3VtZW50cykgZXhlY3V0ZWQgd2l0aG91dCBhXG4gICAqIHNoZWxsLlxuICAgKi9cbiAgcmVhZG9ubHkgY29tbWFuZDogc3RyaW5nIHwgc3RyaW5nW107XG4gIC8qKlxuICAgKiBAZGVmYXVsdCAtIHByb2plY3QgZGlyXG4gICAqL1xuICByZWFkb25seSBjd2Q/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBDYXB0dXJlIHN0ZG91dC9zdGRlcnIgKHNvIHRoZSBjYWxsZXIgY2FuIHJlYWQgdGhlbSBmcm9tIHRoZSByZXN1bHQpXG4gICAqIGluc3RlYWQgb2YgaW5oZXJpdGluZyB0aGUgcGFyZW50J3Mgc3RyZWFtcy5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IGNhcHR1cmVPdXRwdXQ/OiBib29sZWFuO1xuICAvKiogQGRlZmF1bHQgZmFsc2UgKi9cbiAgcmVhZG9ubHkgcXVpZXQ/OiBib29sZWFuO1xuICByZWFkb25seSBleHRyYUVudj86IHsgW25hbWU6IHN0cmluZ106IHN0cmluZyB8IHVuZGVmaW5lZCB9O1xuICAvKipcbiAgICogVGhlIHJlc29sdmVkIHNoZWxsIHRvIGludGVycHJldCB0aGUgY29tbWFuZCAoZS5nLiBcInByb2plblwiLCBcImJhc2ggLWNcIikuXG4gICAqIEBkZWZhdWx0IFwicHJvamVuXCJcbiAgICovXG4gIHJlYWRvbmx5IHNoZWxsPzogc3RyaW5nIHwgc3RyaW5nW107XG59XG5cbi8qKlxuICogTm9ybWFsaXplZCByZXN1bHQgb2YgcnVubmluZyBhIGNvbW1hbmQgdGhyb3VnaCB0aGUgc3lzdGVtIHNoZWxsIChhIHN1YnNldCBvZlxuICogbm9kZSdzIGBTcGF3blN5bmNSZXR1cm5zYCkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3lzdGVtU2hlbGxSZXN1bHQge1xuICAvKiogRXhpdCBjb2RlLCBvciBgbnVsbGAgaWYgdGVybWluYXRlZCBieSBhIHNpZ25hbCBvciBuZXZlciBzcGF3bmVkLiAqL1xuICByZWFkb25seSBzdGF0dXM6IG51bWJlciB8IG51bGw7XG4gIC8qKiBDYXB0dXJlZCBzdGRvdXQsIG9yIGBudWxsYCB3aGVuIHN0ZG91dCB3YXMgaW5oZXJpdGVkLiAqL1xuICByZWFkb25seSBzdGRvdXQ6IEJ1ZmZlciB8IG51bGw7XG4gIC8qKiBDYXB0dXJlZCBzdGRlcnIsIG9yIGBudWxsYCB3aGVuIHN0ZGVyciB3YXMgaW5oZXJpdGVkLiAqL1xuICByZWFkb25seSBzdGRlcnI6IEJ1ZmZlciB8IG51bGw7XG4gIC8qKiBBbiBlcnJvciByYWlzZWQgd2hpbGUgYXR0ZW1wdGluZyB0byBzcGF3biAobm90IGEgbm9uLXplcm8gZXhpdCkuICovXG4gIHJlYWRvbmx5IGVycm9yPzogRXJyb3I7XG59XG5cbi8qKlxuICogUnVucyBhIGNvbW1hbmQgbGluZSB0aHJvdWdoIHRoZSBvcGVyYXRpbmcgc3lzdGVtJ3MgbmF0aXZlIHNoZWxsLlxuICpcbiAqIENhbGxzIHRoZSBPUyBzaGVsbCB2aWEgYGNoaWxkX3Byb2Nlc3NgIHdpdGggYHNoZWxsOiB0cnVlYC5cbiAqIFRoaXMgYmFja3MgdGhlIGBzeXN0ZW1gIHRhc2sgc2hlbGwsIHdoaWNoIGxldHMgYSB1c2VyIG9wdCBvdXQgb2YgdGhlIGJ1aWx0LWluXG4gKiBjcm9zcy1wbGF0Zm9ybSBzaGVsbCBhbmQgdXNlIHRoZSBob3N0J3MgbmF0aXZlIHNoZWxsIGluc3RlYWQ6XG4gKiBgL2Jpbi9zaGBvbiBQT1NJWCBhbmQgYGNtZC5leGVgIG9uIFdpbmRvd3MuXG4gKlxuICogTmV2ZXIgdGhyb3dzIGZvciBhIG5vbi16ZXJvIGV4aXQgKHRoYXQgaXMgcmVwb3J0ZWQgdmlhIGBzdGF0dXNgKTtcbiAqIGEgc3Bhd24gZmFpbHVyZSBpcyByZXBvcnRlZCB2aWEgYGVycm9yYC4gVGhlIGNhbGxlciBzdXBwbGllcyB0aGUgZnVsbCBgZW52YC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN5c3RlbVNoZWxsKFxuICBjb21tYW5kOiBzdHJpbmcsXG4gIG9wdGlvbnM6IHtcbiAgICBjd2Q6IHN0cmluZztcbiAgICBlbnY/OiBOb2RlSlMuUHJvY2Vzc0VudjtcbiAgICBjYXB0dXJlPzogYm9vbGVhbjtcbiAgICBzdHJlYW0/OiBib29sZWFuO1xuICB9LFxuKTogU3lzdGVtU2hlbGxSZXN1bHQge1xuICBsb2dnaW5nLmRlYnVnKGAke2NvbW1hbmR9IChjd2Q6ICR7b3B0aW9ucy5jd2R9KWApO1xuICBjb25zdCByZXN1bHQgPSBjaGlsZF9wcm9jZXNzLnNwYXduU3luYyhjb21tYW5kLCB7XG4gICAgY3dkOiBvcHRpb25zLmN3ZCxcbiAgICBzaGVsbDogdHJ1ZSxcbiAgICBtYXhCdWZmZXI6IE1BWF9CVUZGRVIsXG4gICAgZW52OiBvcHRpb25zLmVudixcbiAgICAvLyBRdWlldCBjYXB0dXJlIGJ1ZmZlcnMgc3RkZXJyIGZvciBlcnJvciBtZXNzYWdlcy4gU3RyZWFtZWQgY2FwdHVyZVxuICAgIC8vIGluaGVyaXRzIHN0ZGVyciBhbmQgcmUtZW1pdHMgYnVmZmVyZWQgc3Rkb3V0IGFmdGVyd2FyZHMsIHNpbmNlIHNwYXduU3luY1xuICAgIC8vIGNhbid0IGJvdGggc2hvdyBhbmQgYnVmZmVyIHRoZSBzYW1lIHN0cmVhbSBhdCBvbmNlLlxuICAgIHN0ZGlvOiBvcHRpb25zLmNhcHR1cmVcbiAgICAgID8gb3B0aW9ucy5zdHJlYW1cbiAgICAgICAgPyBbXCJpbmhlcml0XCIsIFwicGlwZVwiLCBcImluaGVyaXRcIl1cbiAgICAgICAgOiBbXCJpbmhlcml0XCIsIFwicGlwZVwiLCBcInBpcGVcIl1cbiAgICAgIDogXCJpbmhlcml0XCIsXG4gIH0pO1xuICBpZiAob3B0aW9ucy5jYXB0dXJlICYmIG9wdGlvbnMuc3RyZWFtICYmIHJlc3VsdC5zdGRvdXQpIHtcbiAgICBwcm9jZXNzLnN0ZG91dC53cml0ZShyZXN1bHQuc3Rkb3V0KTtcbiAgfVxuICByZXR1cm4ge1xuICAgIHN0YXR1czogcmVzdWx0LnN0YXR1cyxcbiAgICBzdGRvdXQ6IHJlc3VsdC5zdGRvdXQgPz8gbnVsbCxcbiAgICBzdGRlcnI6IHJlc3VsdC5zdGRlcnIgPz8gbnVsbCxcbiAgICBlcnJvcjogcmVzdWx0LmVycm9yLFxuICB9O1xufVxuIl19
package/lib/clobber.js CHANGED
@@ -12,17 +12,22 @@ class Clobber extends component_1.Component {
12
12
  BRANCH: "$(git branch --show-current)",
13
13
  },
14
14
  });
15
- task.exec("git checkout -b scratch", {
15
+ task.execArgs(["git", "checkout", "-b", "scratch"], {
16
16
  name: 'save current HEAD in "scratch" branch',
17
17
  });
18
- task.exec("git checkout $BRANCH");
19
- task.exec("git fetch origin", { name: "fetch latest changes from origin" });
20
- task.exec("git reset --hard origin/$BRANCH", {
18
+ // `$BRANCH` needs a shell to expand
19
+ task.exec('git checkout "$BRANCH"');
20
+ task.execArgs(["git", "fetch", "origin"], {
21
+ name: "fetch latest changes from origin",
22
+ });
23
+ task.exec('git reset --hard "origin/$BRANCH"', {
21
24
  name: "hard reset to origin commit",
22
25
  });
23
- task.exec("git clean -fdx", { name: "clean all untracked files" });
26
+ task.execArgs(["git", "clean", "-fdx"], {
27
+ name: "clean all untracked files",
28
+ });
24
29
  task.say('ready to rock! (unpushed commits are under the "scratch" branch)');
25
30
  }
26
31
  }
27
32
  exports.Clobber = Clobber;
28
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xvYmJlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9jbG9iYmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDJDQUF3QztBQUd4QyxNQUFhLE9BQVEsU0FBUSxxQkFBUztJQUNwQyxZQUFZLE9BQWdCO1FBQzFCLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUVmLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRTtZQUMzQyxXQUFXLEVBQUUseURBQXlEO1lBQ3RFLFNBQVMsRUFBRSxrQ0FBa0M7WUFDN0MsR0FBRyxFQUFFO2dCQUNILE1BQU0sRUFBRSw4QkFBOEI7YUFDdkM7U0FDRixDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsSUFBSSxDQUFDLHlCQUF5QixFQUFFO1lBQ25DLElBQUksRUFBRSx1Q0FBdUM7U0FDOUMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1FBQ2xDLElBQUksQ0FBQyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsRUFBRSxJQUFJLEVBQUUsa0NBQWtDLEVBQUUsQ0FBQyxDQUFDO1FBQzVFLElBQUksQ0FBQyxJQUFJLENBQUMsaUNBQWlDLEVBQUU7WUFDM0MsSUFBSSxFQUFFLDZCQUE2QjtTQUNwQyxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLEVBQUUsSUFBSSxFQUFFLDJCQUEyQixFQUFFLENBQUMsQ0FBQztRQUNuRSxJQUFJLENBQUMsR0FBRyxDQUNOLGtFQUFrRSxDQUNuRSxDQUFDO0lBQ0osQ0FBQztDQUNGO0FBekJELDBCQXlCQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCB9IGZyb20gXCIuL2NvbXBvbmVudFwiO1xuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSBcIi4vcHJvamVjdFwiO1xuXG5leHBvcnQgY2xhc3MgQ2xvYmJlciBleHRlbmRzIENvbXBvbmVudCB7XG4gIGNvbnN0cnVjdG9yKHByb2plY3Q6IFByb2plY3QpIHtcbiAgICBzdXBlcihwcm9qZWN0KTtcblxuICAgIGNvbnN0IHRhc2sgPSB0aGlzLnByb2plY3QuYWRkVGFzayhcImNsb2JiZXJcIiwge1xuICAgICAgZGVzY3JpcHRpb246IFwiaGFyZCByZXNldHMgdG8gSEVBRCBvZiBvcmlnaW4gYW5kIGNsZWFucyB0aGUgbG9jYWwgcmVwb1wiLFxuICAgICAgY29uZGl0aW9uOiBcImdpdCBkaWZmIC0tZXhpdC1jb2RlID4gL2Rldi9udWxsXCIsXG4gICAgICBlbnY6IHtcbiAgICAgICAgQlJBTkNIOiBcIiQoZ2l0IGJyYW5jaCAtLXNob3ctY3VycmVudClcIixcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICB0YXNrLmV4ZWMoXCJnaXQgY2hlY2tvdXQgLWIgc2NyYXRjaFwiLCB7XG4gICAgICBuYW1lOiAnc2F2ZSBjdXJyZW50IEhFQUQgaW4gXCJzY3JhdGNoXCIgYnJhbmNoJyxcbiAgICB9KTtcbiAgICB0YXNrLmV4ZWMoXCJnaXQgY2hlY2tvdXQgJEJSQU5DSFwiKTtcbiAgICB0YXNrLmV4ZWMoXCJnaXQgZmV0Y2ggb3JpZ2luXCIsIHsgbmFtZTogXCJmZXRjaCBsYXRlc3QgY2hhbmdlcyBmcm9tIG9yaWdpblwiIH0pO1xuICAgIHRhc2suZXhlYyhcImdpdCByZXNldCAtLWhhcmQgb3JpZ2luLyRCUkFOQ0hcIiwge1xuICAgICAgbmFtZTogXCJoYXJkIHJlc2V0IHRvIG9yaWdpbiBjb21taXRcIixcbiAgICB9KTtcbiAgICB0YXNrLmV4ZWMoXCJnaXQgY2xlYW4gLWZkeFwiLCB7IG5hbWU6IFwiY2xlYW4gYWxsIHVudHJhY2tlZCBmaWxlc1wiIH0pO1xuICAgIHRhc2suc2F5KFxuICAgICAgJ3JlYWR5IHRvIHJvY2shICh1bnB1c2hlZCBjb21taXRzIGFyZSB1bmRlciB0aGUgXCJzY3JhdGNoXCIgYnJhbmNoKScsXG4gICAgKTtcbiAgfVxufVxuIl19
33
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xvYmJlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9jbG9iYmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDJDQUF3QztBQUd4QyxNQUFhLE9BQVEsU0FBUSxxQkFBUztJQUNwQyxZQUFZLE9BQWdCO1FBQzFCLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUVmLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRTtZQUMzQyxXQUFXLEVBQUUseURBQXlEO1lBQ3RFLFNBQVMsRUFBRSxrQ0FBa0M7WUFDN0MsR0FBRyxFQUFFO2dCQUNILE1BQU0sRUFBRSw4QkFBOEI7YUFDdkM7U0FDRixDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsS0FBSyxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsU0FBUyxDQUFDLEVBQUU7WUFDbEQsSUFBSSxFQUFFLHVDQUF1QztTQUM5QyxDQUFDLENBQUM7UUFDSCxvQ0FBb0M7UUFDcEMsSUFBSSxDQUFDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO1FBQ3BDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLFFBQVEsQ0FBQyxFQUFFO1lBQ3hDLElBQUksRUFBRSxrQ0FBa0M7U0FDekMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLElBQUksQ0FBQyxtQ0FBbUMsRUFBRTtZQUM3QyxJQUFJLEVBQUUsNkJBQTZCO1NBQ3BDLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLE1BQU0sQ0FBQyxFQUFFO1lBQ3RDLElBQUksRUFBRSwyQkFBMkI7U0FDbEMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLEdBQUcsQ0FDTixrRUFBa0UsQ0FDbkUsQ0FBQztJQUNKLENBQUM7Q0FDRjtBQTlCRCwwQkE4QkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQgfSBmcm9tIFwiLi9jb21wb25lbnRcIjtcbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gXCIuL3Byb2plY3RcIjtcblxuZXhwb3J0IGNsYXNzIENsb2JiZXIgZXh0ZW5kcyBDb21wb25lbnQge1xuICBjb25zdHJ1Y3Rvcihwcm9qZWN0OiBQcm9qZWN0KSB7XG4gICAgc3VwZXIocHJvamVjdCk7XG5cbiAgICBjb25zdCB0YXNrID0gdGhpcy5wcm9qZWN0LmFkZFRhc2soXCJjbG9iYmVyXCIsIHtcbiAgICAgIGRlc2NyaXB0aW9uOiBcImhhcmQgcmVzZXRzIHRvIEhFQUQgb2Ygb3JpZ2luIGFuZCBjbGVhbnMgdGhlIGxvY2FsIHJlcG9cIixcbiAgICAgIGNvbmRpdGlvbjogXCJnaXQgZGlmZiAtLWV4aXQtY29kZSA+IC9kZXYvbnVsbFwiLFxuICAgICAgZW52OiB7XG4gICAgICAgIEJSQU5DSDogXCIkKGdpdCBicmFuY2ggLS1zaG93LWN1cnJlbnQpXCIsXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgdGFzay5leGVjQXJncyhbXCJnaXRcIiwgXCJjaGVja291dFwiLCBcIi1iXCIsIFwic2NyYXRjaFwiXSwge1xuICAgICAgbmFtZTogJ3NhdmUgY3VycmVudCBIRUFEIGluIFwic2NyYXRjaFwiIGJyYW5jaCcsXG4gICAgfSk7XG4gICAgLy8gYCRCUkFOQ0hgIG5lZWRzIGEgc2hlbGwgdG8gZXhwYW5kXG4gICAgdGFzay5leGVjKCdnaXQgY2hlY2tvdXQgXCIkQlJBTkNIXCInKTtcbiAgICB0YXNrLmV4ZWNBcmdzKFtcImdpdFwiLCBcImZldGNoXCIsIFwib3JpZ2luXCJdLCB7XG4gICAgICBuYW1lOiBcImZldGNoIGxhdGVzdCBjaGFuZ2VzIGZyb20gb3JpZ2luXCIsXG4gICAgfSk7XG4gICAgdGFzay5leGVjKCdnaXQgcmVzZXQgLS1oYXJkIFwib3JpZ2luLyRCUkFOQ0hcIicsIHtcbiAgICAgIG5hbWU6IFwiaGFyZCByZXNldCB0byBvcmlnaW4gY29tbWl0XCIsXG4gICAgfSk7XG4gICAgdGFzay5leGVjQXJncyhbXCJnaXRcIiwgXCJjbGVhblwiLCBcIi1mZHhcIl0sIHtcbiAgICAgIG5hbWU6IFwiY2xlYW4gYWxsIHVudHJhY2tlZCBmaWxlc1wiLFxuICAgIH0pO1xuICAgIHRhc2suc2F5KFxuICAgICAgJ3JlYWR5IHRvIHJvY2shICh1bnB1c2hlZCBjb21taXRzIGFyZSB1bmRlciB0aGUgXCJzY3JhdGNoXCIgYnJhbmNoKScsXG4gICAgKTtcbiAgfVxufVxuIl19
package/lib/component.js CHANGED
@@ -16,7 +16,7 @@ const componentId = (scope) => {
16
16
  * @param id Unique id of the component. If not provided, an unstable AutoId is generated.
17
17
  */
18
18
  class Component extends constructs_1.Construct {
19
- static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.Component", version: "0.102.0" };
19
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.Component", version: "0.103.1" };
20
20
  /**
21
21
  * Test whether the given construct is a component.
22
22
  */
@@ -175,7 +175,7 @@ function guardDetached(target) {
175
175
  * ```
176
176
  */
177
177
  class FutureComponent extends Component {
178
- static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.FutureComponent", version: "0.102.0" };
178
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.FutureComponent", version: "0.103.1" };
179
179
  newTargetName;
180
180
  attachedState = false;
181
181
  constructor() {
@@ -51,7 +51,7 @@ const json_1 = require("./json");
51
51
  * `nodeProject.addDeps()` or use the generic API of `project.deps`:
52
52
  */
53
53
  class Dependencies extends component_1.Component {
54
- static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.Dependencies", version: "0.102.0" };
54
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.Dependencies", version: "0.103.1" };
55
55
  /**
56
56
  * The project-relative path of the deps manifest file.
57
57
  */
package/lib/dev-env.js CHANGED
@@ -6,7 +6,7 @@ const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
6
6
  * Options for specifying the Docker image of the container.
7
7
  */
8
8
  class DevEnvironmentDockerImage {
9
- static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.DevEnvironmentDockerImage", version: "0.102.0" };
9
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.DevEnvironmentDockerImage", version: "0.103.1" };
10
10
  /**
11
11
  * A publicly available Docker image.
12
12
  * @example 'ubuntu:latest'
@@ -7,7 +7,7 @@ const docker_compose_1 = require("./docker-compose");
7
7
  * A docker-compose service.
8
8
  */
9
9
  class DockerComposeService {
10
- static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.DockerComposeService", version: "0.102.0" };
10
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.DockerComposeService", version: "0.103.1" };
11
11
  /**
12
12
  * Name of the service.
13
13
  */
@@ -11,7 +11,7 @@ const yaml_1 = require("../yaml");
11
11
  * Create a docker-compose YAML file.
12
12
  */
13
13
  class DockerCompose extends component_1.Component {
14
- static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.DockerCompose", version: "0.102.0" };
14
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.DockerCompose", version: "0.103.1" };
15
15
  /**
16
16
  * Depends on a service name.
17
17
  */
package/lib/file.js CHANGED
@@ -45,7 +45,7 @@ const util_1 = require("./util");
45
45
  const constructs_1 = require("./util/constructs");
46
46
  const diff_1 = require("./util/diff");
47
47
  class FileBase extends component_1.Component {
48
- static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.FileBase", version: "0.102.0" };
48
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.FileBase", version: "0.103.1" };
49
49
  /**
50
50
  * The file path, relative to the project's outdir.
51
51
  */
@@ -32,7 +32,7 @@ var EndOfLine;
32
32
  * @see https://git-scm.com/docs/gitattributes
33
33
  */
34
34
  class GitAttributesFile extends file_1.FileBase {
35
- static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.GitAttributesFile", version: "0.102.0" };
35
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.GitAttributesFile", version: "0.103.1" };
36
36
  attributes = new Map();
37
37
  /**
38
38
  * The default end of line character for text files.
@@ -6,7 +6,7 @@ const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
6
6
  * Manage the versions used for GitHub Actions used in steps
7
7
  */
8
8
  class GitHubActionsProvider {
9
- static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.github.GitHubActionsProvider", version: "0.102.0" };
9
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.github.GitHubActionsProvider", version: "0.103.1" };
10
10
  actions = new Map();
11
11
  /**
12
12
  * Define an override for a given action.
@@ -1,10 +1,10 @@
1
1
  import type { GitHub } from "./github";
2
2
  import { Component } from "../component";
3
- import type { GroupRunnerOptions } from "../runner-options";
3
+ import type { RunsOnOptions } from "../runner-options";
4
4
  /**
5
5
  * Options for 'AutoApprove'
6
6
  */
7
- export interface AutoApproveOptions {
7
+ export interface AutoApproveOptions extends RunsOnOptions {
8
8
  /**
9
9
  * Only pull requests authored by these Github usernames will be auto-approved.
10
10
  * @default ['github-bot']
@@ -30,19 +30,6 @@ export interface AutoApproveOptions {
30
30
  * @default "GITHUB_TOKEN"
31
31
  */
32
32
  readonly secret?: string;
33
- /**
34
- * Github Runner selection labels
35
- * @default ["ubuntu-latest"]
36
- * @description Defines a target Runner by labels
37
- * @throws {Error} if both `runsOn` and `runsOnGroup` are specified
38
- */
39
- readonly runsOn?: string[];
40
- /**
41
- * Github Runner Group selection options
42
- * @description Defines a target Runner Group by name and/or labels
43
- * @throws {Error} if both `runsOn` and `runsOnGroup` are specified
44
- */
45
- readonly runsOnGroup?: GroupRunnerOptions;
46
33
  }
47
34
  /**
48
35
  * Auto approve pull requests that meet a criteria
@@ -4,12 +4,11 @@ exports.AutoApprove = void 0;
4
4
  const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
5
5
  const workflows_model_1 = require("./workflows-model");
6
6
  const component_1 = require("../component");
7
- const runner_options_1 = require("../runner-options");
8
7
  /**
9
8
  * Auto approve pull requests that meet a criteria
10
9
  */
11
10
  class AutoApprove extends component_1.Component {
12
- static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.github.AutoApprove", version: "0.102.0" };
11
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.github.AutoApprove", version: "0.103.1" };
13
12
  label;
14
13
  constructor(github, options = {}) {
15
14
  super(github.project);
@@ -25,7 +24,7 @@ class AutoApprove extends component_1.Component {
25
24
  }
26
25
  const secret = options.secret ?? "GITHUB_TOKEN";
27
26
  const approveJob = {
28
- ...(0, runner_options_1.filteredRunsOnOptions)(options.runsOn, options.runsOnGroup),
27
+ ...github.runsOnConfig(options),
29
28
  permissions: {
30
29
  pullRequests: workflows_model_1.JobPermission.WRITE,
31
30
  },
@@ -67,4 +66,4 @@ class AutoApprove extends component_1.Component {
67
66
  }
68
67
  }
69
68
  exports.AutoApprove = AutoApprove;
70
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0by1hcHByb3ZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2dpdGh1Yi9hdXRvLWFwcHJvdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUVBLHVEQUFrRDtBQUNsRCw0Q0FBeUM7QUFFekMsc0RBQTBEO0FBa0QxRDs7R0FFRztBQUNILE1BQWEsV0FBWSxTQUFRLHFCQUFTOztJQUN4QixLQUFLLENBQVM7SUFFOUIsWUFBWSxNQUFjLEVBQUUsVUFBOEIsRUFBRTtRQUMxRCxLQUFLLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRXRCLElBQUksQ0FBQyxLQUFLLEdBQUcsT0FBTyxDQUFDLEtBQUssSUFBSSxjQUFjLENBQUM7UUFDN0MsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLGdCQUFnQixJQUFJLENBQUMscUJBQXFCLENBQUMsQ0FBQztRQUV0RSxJQUFJLFNBQVMsR0FBRyxzREFBc0QsSUFBSSxDQUFDLEtBQUssSUFBSSxDQUFDO1FBQ3JGLElBQUksU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUN6QixTQUFTLElBQUksT0FBTyxDQUFDO1lBQ3JCLFNBQVMsSUFBSSxTQUFTO2lCQUNuQixHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLDRDQUE0QyxDQUFDLEdBQUcsQ0FBQztpQkFDNUQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ2hCLFNBQVMsSUFBSSxHQUFHLENBQUM7UUFDbkIsQ0FBQztRQUVELE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxNQUFNLElBQUksY0FBYyxDQUFDO1FBRWhELE1BQU0sVUFBVSxHQUFRO1lBQ3RCLEdBQUcsSUFBQSxzQ0FBcUIsRUFBQyxPQUFPLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxXQUFXLENBQUM7WUFDN0QsV0FBVyxFQUFFO2dCQUNYLFlBQVksRUFBRSwrQkFBYSxDQUFDLEtBQUs7YUFDbEM7WUFDRCxFQUFFLEVBQUUsU0FBUztZQUNiLEtBQUssRUFBRTtnQkFDTDtvQkFDRSxHQUFHLEVBQUUsdURBQXVEO29CQUM1RCxHQUFHLEVBQUU7d0JBQ0gsUUFBUSxFQUFFLGdCQUFnQixNQUFNLEtBQUs7d0JBQ3JDLE9BQU8sRUFBRSwwQkFBMEI7d0JBQ25DLFNBQVMsRUFBRSx5Q0FBeUM7cUJBQ3JEO2lCQUNGO2FBQ0Y7U0FDRixDQUFDO1FBRUYsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUNwRCxRQUFRLENBQUMsRUFBRSxDQUFDO1lBQ1YsOEVBQThFO1lBQzlFLGlGQUFpRjtZQUNqRixpRkFBaUY7WUFDakYsbUZBQW1GO1lBQ25GLG1GQUFtRjtZQUNuRix3Q0FBd0M7WUFDeEMsRUFBRTtZQUNGLGtGQUFrRjtZQUNsRix3RkFBd0Y7WUFDeEYsZ0ZBQWdGO1lBQ2hGLGlCQUFpQixFQUFFO2dCQUNqQixLQUFLLEVBQUU7b0JBQ0wsU0FBUztvQkFDVCxRQUFRO29CQUNSLGFBQWE7b0JBQ2IsVUFBVTtvQkFDVixrQkFBa0I7aUJBQ25CO2FBQ0Y7U0FDRixDQUFDLENBQUM7UUFDSCxRQUFRLENBQUMsT0FBTyxDQUFDLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUM7SUFDNUMsQ0FBQzs7QUE3REgsa0NBOERDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBHaXRIdWIgfSBmcm9tIFwiLi9naXRodWJcIjtcbmltcG9ydCB0eXBlIHsgSm9iIH0gZnJvbSBcIi4vd29ya2Zsb3dzLW1vZGVsXCI7XG5pbXBvcnQgeyBKb2JQZXJtaXNzaW9uIH0gZnJvbSBcIi4vd29ya2Zsb3dzLW1vZGVsXCI7XG5pbXBvcnQgeyBDb21wb25lbnQgfSBmcm9tIFwiLi4vY29tcG9uZW50XCI7XG5pbXBvcnQgdHlwZSB7IEdyb3VwUnVubmVyT3B0aW9ucyB9IGZyb20gXCIuLi9ydW5uZXItb3B0aW9uc1wiO1xuaW1wb3J0IHsgZmlsdGVyZWRSdW5zT25PcHRpb25zIH0gZnJvbSBcIi4uL3J1bm5lci1vcHRpb25zXCI7XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgJ0F1dG9BcHByb3ZlJ1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEF1dG9BcHByb3ZlT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBPbmx5IHB1bGwgcmVxdWVzdHMgYXV0aG9yZWQgYnkgdGhlc2UgR2l0aHViIHVzZXJuYW1lcyB3aWxsIGJlIGF1dG8tYXBwcm92ZWQuXG4gICAqIEBkZWZhdWx0IFsnZ2l0aHViLWJvdCddXG4gICAqL1xuICByZWFkb25seSBhbGxvd2VkVXNlcm5hbWVzPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIE9ubHkgcHVsbCByZXF1ZXN0cyB3aXRoIHRoaXMgbGFiZWwgd2lsbCBiZSBhdXRvLWFwcHJvdmVkLlxuICAgKiBAZGVmYXVsdCAnYXV0by1hcHByb3ZlJ1xuICAgKi9cbiAgcmVhZG9ubHkgbGFiZWw/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEEgR2l0SHViIHNlY3JldCBuYW1lIHdoaWNoIGNvbnRhaW5zIGEgR2l0SHViIEFjY2VzcyBUb2tlblxuICAgKiB3aXRoIHdyaXRlIHBlcm1pc3Npb25zIGZvciB0aGUgYHB1bGxfcmVxdWVzdGAgc2NvcGUuXG4gICAqXG4gICAqIFRoaXMgdG9rZW4gaXMgdXNlZCB0byBhcHByb3ZlIHB1bGwgcmVxdWVzdHMuXG4gICAqXG4gICAqIEdpdGh1YiBmb3JiaWRzIGFuIGlkZW50aXR5IHRvIGFwcHJvdmUgaXRzIG93biBwdWxsIHJlcXVlc3QuXG4gICAqIElmIHlvdXIgcHJvamVjdCBwcm9kdWNlcyBhdXRvbWF0ZWQgcHVsbCByZXF1ZXN0cyB1c2luZyB0aGUgR2l0aHViIGRlZmF1bHQgdG9rZW4gLVxuICAgKiB7QGxpbmsgaHR0cHM6Ly9kb2NzLmdpdGh1Yi5jb20vZW4vYWN0aW9ucy9yZWZlcmVuY2UvYXV0aGVudGljYXRpb24taW4tYS13b3JrZmxvdyBgR0lUSFVCX1RPS0VOYCB9XG4gICAqIC0gdGhhdCB5b3Ugd291bGQgbGlrZSBhdXRvIGFwcHJvdmVkLCBzdWNoIGFzIHdoZW4gdXNpbmcgdGhlIGBkZXBzVXBncmFkZWAgcHJvcGVydHkgaW5cbiAgICogYE5vZGVQcm9qZWN0T3B0aW9uc2AsIHRoZW4geW91IG11c3QgdXNlIGEgZGlmZmVyZW50IHRva2VuIGhlcmUuXG4gICAqXG4gICAqIEBkZWZhdWx0IFwiR0lUSFVCX1RPS0VOXCJcbiAgICovXG4gIHJlYWRvbmx5IHNlY3JldD86IHN0cmluZztcblxuICAvKipcbiAgICogR2l0aHViIFJ1bm5lciBzZWxlY3Rpb24gbGFiZWxzXG4gICAqIEBkZWZhdWx0IFtcInVidW50dS1sYXRlc3RcIl1cbiAgICogQGRlc2NyaXB0aW9uIERlZmluZXMgYSB0YXJnZXQgUnVubmVyIGJ5IGxhYmVsc1xuICAgKiBAdGhyb3dzIHtFcnJvcn0gaWYgYm90aCBgcnVuc09uYCBhbmQgYHJ1bnNPbkdyb3VwYCBhcmUgc3BlY2lmaWVkXG4gICAqL1xuICByZWFkb25seSBydW5zT24/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogR2l0aHViIFJ1bm5lciBHcm91cCBzZWxlY3Rpb24gb3B0aW9uc1xuICAgKiBAZGVzY3JpcHRpb24gRGVmaW5lcyBhIHRhcmdldCBSdW5uZXIgR3JvdXAgYnkgbmFtZSBhbmQvb3IgbGFiZWxzXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBpZiBib3RoIGBydW5zT25gIGFuZCBgcnVuc09uR3JvdXBgIGFyZSBzcGVjaWZpZWRcbiAgICovXG4gIHJlYWRvbmx5IHJ1bnNPbkdyb3VwPzogR3JvdXBSdW5uZXJPcHRpb25zO1xufVxuXG4vKipcbiAqIEF1dG8gYXBwcm92ZSBwdWxsIHJlcXVlc3RzIHRoYXQgbWVldCBhIGNyaXRlcmlhXG4gKi9cbmV4cG9ydCBjbGFzcyBBdXRvQXBwcm92ZSBleHRlbmRzIENvbXBvbmVudCB7XG4gIHB1YmxpYyByZWFkb25seSBsYWJlbDogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKGdpdGh1YjogR2l0SHViLCBvcHRpb25zOiBBdXRvQXBwcm92ZU9wdGlvbnMgPSB7fSkge1xuICAgIHN1cGVyKGdpdGh1Yi5wcm9qZWN0KTtcblxuICAgIHRoaXMubGFiZWwgPSBvcHRpb25zLmxhYmVsID8/IFwiYXV0by1hcHByb3ZlXCI7XG4gICAgY29uc3QgdXNlcm5hbWVzID0gb3B0aW9ucy5hbGxvd2VkVXNlcm5hbWVzID8/IFtcImdpdGh1Yi1hY3Rpb25zW2JvdF1cIl07XG5cbiAgICBsZXQgY29uZGl0aW9uID0gYGNvbnRhaW5zKGdpdGh1Yi5ldmVudC5wdWxsX3JlcXVlc3QubGFiZWxzLioubmFtZSwgJyR7dGhpcy5sYWJlbH0nKWA7XG4gICAgaWYgKHVzZXJuYW1lcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25kaXRpb24gKz0gXCIgJiYgKFwiO1xuICAgICAgY29uZGl0aW9uICs9IHVzZXJuYW1lc1xuICAgICAgICAubWFwKCh1KSA9PiBgZ2l0aHViLmV2ZW50LnB1bGxfcmVxdWVzdC51c2VyLmxvZ2luID09ICcke3V9J2ApXG4gICAgICAgIC5qb2luKFwiIHx8IFwiKTtcbiAgICAgIGNvbmRpdGlvbiArPSBcIilcIjtcbiAgICB9XG5cbiAgICBjb25zdCBzZWNyZXQgPSBvcHRpb25zLnNlY3JldCA/PyBcIkdJVEhVQl9UT0tFTlwiO1xuXG4gICAgY29uc3QgYXBwcm92ZUpvYjogSm9iID0ge1xuICAgICAgLi4uZmlsdGVyZWRSdW5zT25PcHRpb25zKG9wdGlvbnMucnVuc09uLCBvcHRpb25zLnJ1bnNPbkdyb3VwKSxcbiAgICAgIHBlcm1pc3Npb25zOiB7XG4gICAgICAgIHB1bGxSZXF1ZXN0czogSm9iUGVybWlzc2lvbi5XUklURSxcbiAgICAgIH0sXG4gICAgICBpZjogY29uZGl0aW9uLFxuICAgICAgc3RlcHM6IFtcbiAgICAgICAge1xuICAgICAgICAgIHJ1bjogJ2doIHByIHJldmlldyAtLWFwcHJvdmUgXCIkUFJfTlVNQkVSXCIgLS1yZXBvIFwiJEdIX1JFUE9cIicsXG4gICAgICAgICAgZW52OiB7XG4gICAgICAgICAgICBHSF9UT0tFTjogYFxcJHt7IHNlY3JldHMuJHtzZWNyZXR9IH19YCxcbiAgICAgICAgICAgIEdIX1JFUE86IFwiJHt7IGdpdGh1Yi5yZXBvc2l0b3J5IH19XCIsXG4gICAgICAgICAgICBQUl9OVU1CRVI6IFwiJHt7IGdpdGh1Yi5ldmVudC5wdWxsX3JlcXVlc3QubnVtYmVyIH19XCIsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfTtcblxuICAgIGNvbnN0IHdvcmtmbG93ID0gZ2l0aHViLmFkZFdvcmtmbG93KFwiYXV0by1hcHByb3ZlXCIpO1xuICAgIHdvcmtmbG93Lm9uKHtcbiAgICAgIC8vIFRoZSAncHVsbCByZXF1ZXN0JyBldmVudCBnaXZlcyB0aGUgd29ya2Zsb3cgJ3JlYWQtb25seScgcGVybWlzc2lvbnMgb24gc29tZVxuICAgICAgLy8gcHVsbCByZXF1ZXN0cyAoc3VjaCBhcyB0aGUgb25lcyBmcm9tIGRlcGVuZGFib3QpIHdoZW4gdXNpbmcgdGhlIGBHSVRIVUJfVE9LRU5gXG4gICAgICAvLyBzZWN1cml0eSB0b2tlbi4gVGhpcyBwcmV2ZW50cyB0aGUgd29ya2Zsb3cgZnJvbSBhcHByb3ZpbmcgdGhlc2UgcHVsbCByZXF1ZXN0cy5cbiAgICAgIC8vIEdpdGh1YiBoYXMgcGxhY2VkIHRoaXMgZ3VhcmQgc28gYXMgdG8gcHJldmVudCBzZWN1cml0eSBhdHRhY2tzIGJ5IHNpbXBseSBvcGVuaW5nXG4gICAgICAvLyBhIHB1bGwgcmVxdWVzdCBhbmQgdHJpZ2dlcmluZyBhIHdvcmtmbG93IG9uIGEgY29tbWl0IHRoYXQgd2FzIG5vdCB2ZXR0ZWQgdG8gbWFrZVxuICAgICAgLy8gdW5pbnRlbmRlZCBjaGFuZ2VzIHRvIHRoZSByZXBvc2l0b3J5LlxuICAgICAgLy9cbiAgICAgIC8vIEluc3RlYWQgdXNlIHRoZSAncHVsbCByZXF1ZXN0IHRhcmdldCcgZXZlbnQgaGVyZSB0aGF0IGdpdmVzIHRoZSBHaXRodWIgd29ya2Zsb3dcbiAgICAgIC8vICdyZWFkLXdyaXRlJyBwZXJtaXNzaW9ucy4gVGhpcyBpcyBzYWZlIGJlY2F1c2UsIHRoaXMgZXZlbnQsIHVubGlrZSB0aGUgJ3B1bGwgcmVxdWVzdCdcbiAgICAgIC8vIGV2ZW50IHJlZmVyZW5jZXMgdGhlIEJBU0UgY29tbWl0IG9mIHRoZSBwdWxsIHJlcXVlc3QgYW5kIG5vdCB0aGUgSEVBRCBjb21taXQuXG4gICAgICBwdWxsUmVxdWVzdFRhcmdldDoge1xuICAgICAgICB0eXBlczogW1xuICAgICAgICAgIFwibGFiZWxlZFwiLFxuICAgICAgICAgIFwib3BlbmVkXCIsXG4gICAgICAgICAgXCJzeW5jaHJvbml6ZVwiLFxuICAgICAgICAgIFwicmVvcGVuZWRcIixcbiAgICAgICAgICBcInJlYWR5X2Zvcl9yZXZpZXdcIixcbiAgICAgICAgXSxcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgd29ya2Zsb3cuYWRkSm9icyh7IGFwcHJvdmU6IGFwcHJvdmVKb2IgfSk7XG4gIH1cbn1cbiJdfQ==
69
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0by1hcHByb3ZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2dpdGh1Yi9hdXRvLWFwcHJvdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUVBLHVEQUFrRDtBQUNsRCw0Q0FBeUM7QUFvQ3pDOztHQUVHO0FBQ0gsTUFBYSxXQUFZLFNBQVEscUJBQVM7O0lBQ3hCLEtBQUssQ0FBUztJQUU5QixZQUFZLE1BQWMsRUFBRSxVQUE4QixFQUFFO1FBQzFELEtBQUssQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7UUFFdEIsSUFBSSxDQUFDLEtBQUssR0FBRyxPQUFPLENBQUMsS0FBSyxJQUFJLGNBQWMsQ0FBQztRQUM3QyxNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsZ0JBQWdCLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1FBRXRFLElBQUksU0FBUyxHQUFHLHNEQUFzRCxJQUFJLENBQUMsS0FBSyxJQUFJLENBQUM7UUFDckYsSUFBSSxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3pCLFNBQVMsSUFBSSxPQUFPLENBQUM7WUFDckIsU0FBUyxJQUFJLFNBQVM7aUJBQ25CLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsNENBQTRDLENBQUMsR0FBRyxDQUFDO2lCQUM1RCxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDaEIsU0FBUyxJQUFJLEdBQUcsQ0FBQztRQUNuQixDQUFDO1FBRUQsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLE1BQU0sSUFBSSxjQUFjLENBQUM7UUFFaEQsTUFBTSxVQUFVLEdBQVE7WUFDdEIsR0FBRyxNQUFNLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQztZQUMvQixXQUFXLEVBQUU7Z0JBQ1gsWUFBWSxFQUFFLCtCQUFhLENBQUMsS0FBSzthQUNsQztZQUNELEVBQUUsRUFBRSxTQUFTO1lBQ2IsS0FBSyxFQUFFO2dCQUNMO29CQUNFLEdBQUcsRUFBRSx1REFBdUQ7b0JBQzVELEdBQUcsRUFBRTt3QkFDSCxRQUFRLEVBQUUsZ0JBQWdCLE1BQU0sS0FBSzt3QkFDckMsT0FBTyxFQUFFLDBCQUEwQjt3QkFDbkMsU0FBUyxFQUFFLHlDQUF5QztxQkFDckQ7aUJBQ0Y7YUFDRjtTQUNGLENBQUM7UUFFRixNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsV0FBVyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQ3BELFFBQVEsQ0FBQyxFQUFFLENBQUM7WUFDViw4RUFBOEU7WUFDOUUsaUZBQWlGO1lBQ2pGLGlGQUFpRjtZQUNqRixtRkFBbUY7WUFDbkYsbUZBQW1GO1lBQ25GLHdDQUF3QztZQUN4QyxFQUFFO1lBQ0Ysa0ZBQWtGO1lBQ2xGLHdGQUF3RjtZQUN4RixnRkFBZ0Y7WUFDaEYsaUJBQWlCLEVBQUU7Z0JBQ2pCLEtBQUssRUFBRTtvQkFDTCxTQUFTO29CQUNULFFBQVE7b0JBQ1IsYUFBYTtvQkFDYixVQUFVO29CQUNWLGtCQUFrQjtpQkFDbkI7YUFDRjtTQUNGLENBQUMsQ0FBQztRQUNILFFBQVEsQ0FBQyxPQUFPLENBQUMsRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQztJQUM1QyxDQUFDOztBQTdESCxrQ0E4REMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IEdpdEh1YiB9IGZyb20gXCIuL2dpdGh1YlwiO1xuaW1wb3J0IHR5cGUgeyBKb2IgfSBmcm9tIFwiLi93b3JrZmxvd3MtbW9kZWxcIjtcbmltcG9ydCB7IEpvYlBlcm1pc3Npb24gfSBmcm9tIFwiLi93b3JrZmxvd3MtbW9kZWxcIjtcbmltcG9ydCB7IENvbXBvbmVudCB9IGZyb20gXCIuLi9jb21wb25lbnRcIjtcbmltcG9ydCB0eXBlIHsgUnVuc09uT3B0aW9ucyB9IGZyb20gXCIuLi9ydW5uZXItb3B0aW9uc1wiO1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yICdBdXRvQXBwcm92ZSdcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBdXRvQXBwcm92ZU9wdGlvbnMgZXh0ZW5kcyBSdW5zT25PcHRpb25zIHtcbiAgLyoqXG4gICAqIE9ubHkgcHVsbCByZXF1ZXN0cyBhdXRob3JlZCBieSB0aGVzZSBHaXRodWIgdXNlcm5hbWVzIHdpbGwgYmUgYXV0by1hcHByb3ZlZC5cbiAgICogQGRlZmF1bHQgWydnaXRodWItYm90J11cbiAgICovXG4gIHJlYWRvbmx5IGFsbG93ZWRVc2VybmFtZXM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogT25seSBwdWxsIHJlcXVlc3RzIHdpdGggdGhpcyBsYWJlbCB3aWxsIGJlIGF1dG8tYXBwcm92ZWQuXG4gICAqIEBkZWZhdWx0ICdhdXRvLWFwcHJvdmUnXG4gICAqL1xuICByZWFkb25seSBsYWJlbD86IHN0cmluZztcblxuICAvKipcbiAgICogQSBHaXRIdWIgc2VjcmV0IG5hbWUgd2hpY2ggY29udGFpbnMgYSBHaXRIdWIgQWNjZXNzIFRva2VuXG4gICAqIHdpdGggd3JpdGUgcGVybWlzc2lvbnMgZm9yIHRoZSBgcHVsbF9yZXF1ZXN0YCBzY29wZS5cbiAgICpcbiAgICogVGhpcyB0b2tlbiBpcyB1c2VkIHRvIGFwcHJvdmUgcHVsbCByZXF1ZXN0cy5cbiAgICpcbiAgICogR2l0aHViIGZvcmJpZHMgYW4gaWRlbnRpdHkgdG8gYXBwcm92ZSBpdHMgb3duIHB1bGwgcmVxdWVzdC5cbiAgICogSWYgeW91ciBwcm9qZWN0IHByb2R1Y2VzIGF1dG9tYXRlZCBwdWxsIHJlcXVlc3RzIHVzaW5nIHRoZSBHaXRodWIgZGVmYXVsdCB0b2tlbiAtXG4gICAqIHtAbGluayBodHRwczovL2RvY3MuZ2l0aHViLmNvbS9lbi9hY3Rpb25zL3JlZmVyZW5jZS9hdXRoZW50aWNhdGlvbi1pbi1hLXdvcmtmbG93IGBHSVRIVUJfVE9LRU5gIH1cbiAgICogLSB0aGF0IHlvdSB3b3VsZCBsaWtlIGF1dG8gYXBwcm92ZWQsIHN1Y2ggYXMgd2hlbiB1c2luZyB0aGUgYGRlcHNVcGdyYWRlYCBwcm9wZXJ0eSBpblxuICAgKiBgTm9kZVByb2plY3RPcHRpb25zYCwgdGhlbiB5b3UgbXVzdCB1c2UgYSBkaWZmZXJlbnQgdG9rZW4gaGVyZS5cbiAgICpcbiAgICogQGRlZmF1bHQgXCJHSVRIVUJfVE9LRU5cIlxuICAgKi9cbiAgcmVhZG9ubHkgc2VjcmV0Pzogc3RyaW5nO1xufVxuXG4vKipcbiAqIEF1dG8gYXBwcm92ZSBwdWxsIHJlcXVlc3RzIHRoYXQgbWVldCBhIGNyaXRlcmlhXG4gKi9cbmV4cG9ydCBjbGFzcyBBdXRvQXBwcm92ZSBleHRlbmRzIENvbXBvbmVudCB7XG4gIHB1YmxpYyByZWFkb25seSBsYWJlbDogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKGdpdGh1YjogR2l0SHViLCBvcHRpb25zOiBBdXRvQXBwcm92ZU9wdGlvbnMgPSB7fSkge1xuICAgIHN1cGVyKGdpdGh1Yi5wcm9qZWN0KTtcblxuICAgIHRoaXMubGFiZWwgPSBvcHRpb25zLmxhYmVsID8/IFwiYXV0by1hcHByb3ZlXCI7XG4gICAgY29uc3QgdXNlcm5hbWVzID0gb3B0aW9ucy5hbGxvd2VkVXNlcm5hbWVzID8/IFtcImdpdGh1Yi1hY3Rpb25zW2JvdF1cIl07XG5cbiAgICBsZXQgY29uZGl0aW9uID0gYGNvbnRhaW5zKGdpdGh1Yi5ldmVudC5wdWxsX3JlcXVlc3QubGFiZWxzLioubmFtZSwgJyR7dGhpcy5sYWJlbH0nKWA7XG4gICAgaWYgKHVzZXJuYW1lcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25kaXRpb24gKz0gXCIgJiYgKFwiO1xuICAgICAgY29uZGl0aW9uICs9IHVzZXJuYW1lc1xuICAgICAgICAubWFwKCh1KSA9PiBgZ2l0aHViLmV2ZW50LnB1bGxfcmVxdWVzdC51c2VyLmxvZ2luID09ICcke3V9J2ApXG4gICAgICAgIC5qb2luKFwiIHx8IFwiKTtcbiAgICAgIGNvbmRpdGlvbiArPSBcIilcIjtcbiAgICB9XG5cbiAgICBjb25zdCBzZWNyZXQgPSBvcHRpb25zLnNlY3JldCA/PyBcIkdJVEhVQl9UT0tFTlwiO1xuXG4gICAgY29uc3QgYXBwcm92ZUpvYjogSm9iID0ge1xuICAgICAgLi4uZ2l0aHViLnJ1bnNPbkNvbmZpZyhvcHRpb25zKSxcbiAgICAgIHBlcm1pc3Npb25zOiB7XG4gICAgICAgIHB1bGxSZXF1ZXN0czogSm9iUGVybWlzc2lvbi5XUklURSxcbiAgICAgIH0sXG4gICAgICBpZjogY29uZGl0aW9uLFxuICAgICAgc3RlcHM6IFtcbiAgICAgICAge1xuICAgICAgICAgIHJ1bjogJ2doIHByIHJldmlldyAtLWFwcHJvdmUgXCIkUFJfTlVNQkVSXCIgLS1yZXBvIFwiJEdIX1JFUE9cIicsXG4gICAgICAgICAgZW52OiB7XG4gICAgICAgICAgICBHSF9UT0tFTjogYFxcJHt7IHNlY3JldHMuJHtzZWNyZXR9IH19YCxcbiAgICAgICAgICAgIEdIX1JFUE86IFwiJHt7IGdpdGh1Yi5yZXBvc2l0b3J5IH19XCIsXG4gICAgICAgICAgICBQUl9OVU1CRVI6IFwiJHt7IGdpdGh1Yi5ldmVudC5wdWxsX3JlcXVlc3QubnVtYmVyIH19XCIsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfTtcblxuICAgIGNvbnN0IHdvcmtmbG93ID0gZ2l0aHViLmFkZFdvcmtmbG93KFwiYXV0by1hcHByb3ZlXCIpO1xuICAgIHdvcmtmbG93Lm9uKHtcbiAgICAgIC8vIFRoZSAncHVsbCByZXF1ZXN0JyBldmVudCBnaXZlcyB0aGUgd29ya2Zsb3cgJ3JlYWQtb25seScgcGVybWlzc2lvbnMgb24gc29tZVxuICAgICAgLy8gcHVsbCByZXF1ZXN0cyAoc3VjaCBhcyB0aGUgb25lcyBmcm9tIGRlcGVuZGFib3QpIHdoZW4gdXNpbmcgdGhlIGBHSVRIVUJfVE9LRU5gXG4gICAgICAvLyBzZWN1cml0eSB0b2tlbi4gVGhpcyBwcmV2ZW50cyB0aGUgd29ya2Zsb3cgZnJvbSBhcHByb3ZpbmcgdGhlc2UgcHVsbCByZXF1ZXN0cy5cbiAgICAgIC8vIEdpdGh1YiBoYXMgcGxhY2VkIHRoaXMgZ3VhcmQgc28gYXMgdG8gcHJldmVudCBzZWN1cml0eSBhdHRhY2tzIGJ5IHNpbXBseSBvcGVuaW5nXG4gICAgICAvLyBhIHB1bGwgcmVxdWVzdCBhbmQgdHJpZ2dlcmluZyBhIHdvcmtmbG93IG9uIGEgY29tbWl0IHRoYXQgd2FzIG5vdCB2ZXR0ZWQgdG8gbWFrZVxuICAgICAgLy8gdW5pbnRlbmRlZCBjaGFuZ2VzIHRvIHRoZSByZXBvc2l0b3J5LlxuICAgICAgLy9cbiAgICAgIC8vIEluc3RlYWQgdXNlIHRoZSAncHVsbCByZXF1ZXN0IHRhcmdldCcgZXZlbnQgaGVyZSB0aGF0IGdpdmVzIHRoZSBHaXRodWIgd29ya2Zsb3dcbiAgICAgIC8vICdyZWFkLXdyaXRlJyBwZXJtaXNzaW9ucy4gVGhpcyBpcyBzYWZlIGJlY2F1c2UsIHRoaXMgZXZlbnQsIHVubGlrZSB0aGUgJ3B1bGwgcmVxdWVzdCdcbiAgICAgIC8vIGV2ZW50IHJlZmVyZW5jZXMgdGhlIEJBU0UgY29tbWl0IG9mIHRoZSBwdWxsIHJlcXVlc3QgYW5kIG5vdCB0aGUgSEVBRCBjb21taXQuXG4gICAgICBwdWxsUmVxdWVzdFRhcmdldDoge1xuICAgICAgICB0eXBlczogW1xuICAgICAgICAgIFwibGFiZWxlZFwiLFxuICAgICAgICAgIFwib3BlbmVkXCIsXG4gICAgICAgICAgXCJzeW5jaHJvbml6ZVwiLFxuICAgICAgICAgIFwicmVvcGVuZWRcIixcbiAgICAgICAgICBcInJlYWR5X2Zvcl9yZXZpZXdcIixcbiAgICAgICAgXSxcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgd29ya2Zsb3cuYWRkSm9icyh7IGFwcHJvdmU6IGFwcHJvdmVKb2IgfSk7XG4gIH1cbn1cbiJdfQ==
@@ -19,7 +19,7 @@ const component_1 = require("../component");
19
19
  * @see https://mergify.com/
20
20
  */
21
21
  class AutoMerge extends component_1.Component {
22
- static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.github.AutoMerge", version: "0.102.0" };
22
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.github.AutoMerge", version: "0.103.1" };
23
23
  lazyConditions = new Array();
24
24
  constructor(github, options = {}) {
25
25
  super(github.project);