projen 0.101.26 → 0.101.28

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (165) hide show
  1. package/.jsii +1065 -735
  2. package/lib/ai-instructions.js +2 -2
  3. package/lib/awscdk/auto-discover.js +6 -6
  4. package/lib/awscdk/awscdk-app-java.js +1 -1
  5. package/lib/awscdk/awscdk-app-py.js +1 -1
  6. package/lib/awscdk/awscdk-app-ts.js +1 -1
  7. package/lib/awscdk/awscdk-construct.js +1 -1
  8. package/lib/awscdk/awscdk-deps-java.js +1 -1
  9. package/lib/awscdk/awscdk-deps-js.js +1 -1
  10. package/lib/awscdk/awscdk-deps-py.js +1 -1
  11. package/lib/awscdk/awscdk-deps.js +1 -1
  12. package/lib/awscdk/cdk-config.js +3 -3
  13. package/lib/awscdk/cdk-tasks.js +1 -1
  14. package/lib/awscdk/integration-test.js +1 -1
  15. package/lib/awscdk/lambda-extension.js +1 -1
  16. package/lib/awscdk/lambda-function.js +2 -2
  17. package/lib/build/build-workflow.js +1 -1
  18. package/lib/cdk/auto-discover-base.js +2 -2
  19. package/lib/cdk/construct-lib.js +1 -1
  20. package/lib/cdk/integration-test-base.js +1 -1
  21. package/lib/cdk/jsii-build.js +1 -1
  22. package/lib/cdk/jsii-docgen.js +1 -1
  23. package/lib/cdk/jsii-project.js +1 -1
  24. package/lib/cdk8s/auto-discover.js +2 -2
  25. package/lib/cdk8s/cdk8s-app-py.js +1 -1
  26. package/lib/cdk8s/cdk8s-app-ts.js +1 -1
  27. package/lib/cdk8s/cdk8s-construct.js +1 -1
  28. package/lib/cdk8s/cdk8s-deps-py.js +1 -1
  29. package/lib/cdk8s/cdk8s-deps.js +1 -1
  30. package/lib/cdk8s/integration-test.js +1 -1
  31. package/lib/cdktf/cdktf-construct.js +1 -1
  32. package/lib/circleci/circleci.js +1 -1
  33. package/lib/cli/task-runtime.js +2 -2
  34. package/lib/component.js +2 -2
  35. package/lib/dependencies.js +1 -1
  36. package/lib/dev-env.js +1 -1
  37. package/lib/docker-compose/docker-compose-service.js +1 -1
  38. package/lib/docker-compose/docker-compose.js +1 -1
  39. package/lib/file.js +1 -1
  40. package/lib/gitattributes.js +1 -1
  41. package/lib/github/actions-provider.js +1 -1
  42. package/lib/github/auto-approve.js +1 -1
  43. package/lib/github/auto-merge.js +1 -1
  44. package/lib/github/auto-queue.js +1 -1
  45. package/lib/github/dependabot.js +1 -1
  46. package/lib/github/dependency-review.js +1 -1
  47. package/lib/github/github-credentials.js +1 -1
  48. package/lib/github/github-project.js +1 -1
  49. package/lib/github/github.js +1 -1
  50. package/lib/github/merge-queue.js +1 -1
  51. package/lib/github/mergify.js +1 -1
  52. package/lib/github/pr-template.js +1 -1
  53. package/lib/github/pull-request-backport.js +1 -1
  54. package/lib/github/pull-request-lint.js +1 -1
  55. package/lib/github/stale.js +1 -1
  56. package/lib/github/task-workflow-job.js +1 -1
  57. package/lib/github/task-workflow.js +1 -1
  58. package/lib/github/workflow-actions.js +1 -1
  59. package/lib/github/workflow-jobs.js +1 -1
  60. package/lib/github/workflow-steps.js +1 -1
  61. package/lib/github/workflows.js +1 -1
  62. package/lib/gitlab/configuration.js +1 -1
  63. package/lib/gitlab/gitlab-configuration.js +1 -1
  64. package/lib/gitlab/nested-configuration.js +1 -1
  65. package/lib/gitpod.js +1 -1
  66. package/lib/ignore-file.js +1 -1
  67. package/lib/ini.js +1 -1
  68. package/lib/java/java-project.js +1 -1
  69. package/lib/java/junit.js +1 -1
  70. package/lib/java/maven-compile.js +1 -1
  71. package/lib/java/maven-packaging.js +1 -1
  72. package/lib/java/maven-sample.js +1 -1
  73. package/lib/java/pom.js +2 -2
  74. package/lib/java/projenrc.js +1 -1
  75. package/lib/javascript/biome/biome-config.d.ts +292 -322
  76. package/lib/javascript/biome/biome-config.js +5 -5
  77. package/lib/javascript/biome/biome.js +1 -1
  78. package/lib/javascript/bundler.js +1 -1
  79. package/lib/javascript/eslint.js +1 -1
  80. package/lib/javascript/jest.js +4 -4
  81. package/lib/javascript/license-checker.js +1 -1
  82. package/lib/javascript/node-package.d.ts +57 -4
  83. package/lib/javascript/node-package.js +46 -6
  84. package/lib/javascript/node-project.js +1 -1
  85. package/lib/javascript/npm-config.js +1 -1
  86. package/lib/javascript/pnpm-workspace-config.js +2 -2
  87. package/lib/javascript/pnpm-workspace.js +1 -1
  88. package/lib/javascript/prettier.js +1 -1
  89. package/lib/javascript/projenrc.js +1 -1
  90. package/lib/javascript/typescript-config.js +2 -2
  91. package/lib/javascript/upgrade-dependencies.js +7 -3
  92. package/lib/javascript/yarnrc.d.ts +51 -3
  93. package/lib/javascript/yarnrc.js +22 -4
  94. package/lib/json-patch.js +1 -1
  95. package/lib/json.js +1 -1
  96. package/lib/license.js +1 -1
  97. package/lib/logger.js +1 -1
  98. package/lib/makefile.js +1 -1
  99. package/lib/object-file.js +1 -1
  100. package/lib/project-build.js +1 -1
  101. package/lib/project-tree.js +1 -1
  102. package/lib/project.js +1 -1
  103. package/lib/projects.js +1 -1
  104. package/lib/projenrc-json.js +1 -1
  105. package/lib/projenrc.js +1 -1
  106. package/lib/python/pip.js +1 -1
  107. package/lib/python/poetry.js +2 -2
  108. package/lib/python/projenrc.js +1 -1
  109. package/lib/python/pyproject-toml-file.js +1 -1
  110. package/lib/python/pytest-sample.js +1 -1
  111. package/lib/python/pytest.js +1 -1
  112. package/lib/python/python-project.js +1 -1
  113. package/lib/python/python-sample.js +1 -1
  114. package/lib/python/requirements-file.js +1 -1
  115. package/lib/python/setuppy.js +1 -1
  116. package/lib/python/setuptools.js +1 -1
  117. package/lib/python/uv-config.js +1 -1
  118. package/lib/python/uv.js +1 -1
  119. package/lib/python/venv.js +1 -1
  120. package/lib/readme.js +1 -1
  121. package/lib/release/publisher.js +1 -1
  122. package/lib/release/release-trigger.js +1 -1
  123. package/lib/release/release.js +1 -1
  124. package/lib/renovatebot.js +1 -1
  125. package/lib/run-task.cjs +61 -42
  126. package/lib/sample-file.js +2 -2
  127. package/lib/script-runner.js +1 -1
  128. package/lib/source-code.js +1 -1
  129. package/lib/task-shell.js +1 -1
  130. package/lib/task.js +1 -1
  131. package/lib/tasks.js +1 -1
  132. package/lib/testing.js +1 -1
  133. package/lib/textfile.js +1 -1
  134. package/lib/toml.js +1 -1
  135. package/lib/typescript/projenrc-ts.js +1 -1
  136. package/lib/typescript/projenrc.js +1 -1
  137. package/lib/typescript/typescript-runner.js +1 -1
  138. package/lib/typescript/typescript-typedoc.js +1 -1
  139. package/lib/typescript/typescript.js +5 -5
  140. package/lib/util/dax.d.ts +1 -0
  141. package/lib/util/dax.js +21 -0
  142. package/lib/util/exec.js +2 -2
  143. package/lib/util/node-compat.d.ts +23 -0
  144. package/lib/util/node-compat.js +40 -0
  145. package/lib/version.js +2 -2
  146. package/lib/vscode/devcontainer.js +1 -1
  147. package/lib/vscode/extensions.js +1 -1
  148. package/lib/vscode/launch-config.js +1 -1
  149. package/lib/vscode/settings.js +1 -1
  150. package/lib/vscode/vscode.js +1 -1
  151. package/lib/web/next.js +3 -3
  152. package/lib/web/postcss.js +1 -1
  153. package/lib/web/react.js +3 -3
  154. package/lib/web/tailwind.js +1 -1
  155. package/lib/xmlfile.js +1 -1
  156. package/lib/yaml.js +1 -1
  157. package/node_modules/js-yaml/dist/js-yaml.js +5 -2
  158. package/node_modules/js-yaml/dist/js-yaml.js.map +1 -1
  159. package/node_modules/js-yaml/dist/js-yaml.min.js +1 -1
  160. package/node_modules/js-yaml/dist/js-yaml.min.js.map +1 -1
  161. package/node_modules/js-yaml/dist/js-yaml.mjs +3 -3
  162. package/node_modules/js-yaml/dist/js-yaml.mjs.map +1 -1
  163. package/node_modules/js-yaml/lib/type/omap.js +3 -3
  164. package/node_modules/js-yaml/package.json +1 -1
  165. package/package.json +3 -2
@@ -41,9 +41,9 @@ const path_1 = require("path");
41
41
  const path = __importStar(require("path"));
42
42
  const util_1 = require("util");
43
43
  const chalk_1 = require("chalk");
44
- const dax_1 = require("dax");
45
44
  const common_1 = require("../common");
46
45
  const logging = __importStar(require("../logging"));
46
+ const dax_1 = require("../util/dax");
47
47
  const exec_1 = require("../util/exec");
48
48
  // avoids a (false positive) esbuild warning about incorrect imports.
49
49
  // `?.default ?? module` keeps this working both as a plain CommonJS require and
@@ -664,4 +664,4 @@ function systemShell(command, options) {
664
664
  error: result.error,
665
665
  };
666
666
  }
667
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFzay1ydW50aW1lLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NsaS90YXNrLXJ1bnRpbWUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBK3lCQSxrQ0FpQ0M7QUFoMUJELDZEQUErQztBQUMvQywyQkFBd0Q7QUFDeEQsK0JBQThDO0FBQzlDLDJDQUE2QjtBQUM3QiwrQkFBOEI7QUFDOUIsaUNBQXdDO0FBQ3hDLDZCQUF3QjtBQUN4QixzQ0FBK0Q7QUFDL0Qsb0RBQXNDO0FBRXRDLHVDQUFnRDtBQUVoRCxxRUFBcUU7QUFDckUsZ0ZBQWdGO0FBQ2hGLGdGQUFnRjtBQUNoRiwyRUFBMkU7QUFDM0UsbUVBQW1FO0FBQ25FLGlFQUFpRTtBQUNqRSxNQUFNLHVCQUF1QixHQUFHLE9BQU8sQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO0FBQy9ELE1BQU0saUJBQWlCLEdBQ3JCLHVCQUF1QixFQUFFLE9BQU8sSUFBSSx1QkFBdUIsQ0FBQztBQUU5RCxNQUFNLFlBQVksR0FBRyxFQUFFLENBQUM7QUFDeEIsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDO0FBQ3pCLE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxXQUFXLEdBQUcsQ0FBQztBQUU5Qzs7OztHQUlHO0FBQ0gsU0FBUyxRQUFRLENBQUMsR0FBVztJQUMzQixPQUFPLEdBQUcsR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRSxNQUFNLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDdkQsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsU0FBUyx1QkFBdUIsQ0FDOUIsS0FBYyxFQUNkLE9BQTBCO0lBRTFCLE1BQU0sT0FBTyxHQUFHLEtBQUssWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN2RSxJQUFJLENBQUMsa0JBQWtC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QztJQUNsRCxNQUFNLE1BQU0sR0FBRyxhQUFhLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRTtRQUM5QyxHQUFHLEVBQUUsT0FBTyxDQUFDLEdBQUc7UUFDaEIsS0FBSyxFQUFFLElBQUk7UUFDWCxTQUFTLEVBQUUsaUJBQVU7UUFDckIsR0FBRyxFQUFFLE9BQU8sQ0FBQyxHQUFHO1FBQ2hCLG9FQUFvRTtRQUNwRSwyRUFBMkU7UUFDM0Usc0RBQXNEO1FBQ3RELEtBQUssRUFBRSxPQUFPLENBQUMsT0FBTztZQUNwQixDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU07Z0JBQ2QsQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUFFLE1BQU0sRUFBRSxTQUFTLENBQUM7Z0JBQ2hDLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxNQUFNLEVBQUUsTUFBTSxDQUFDO1lBQy9CLENBQUMsQ0FBQyxTQUFTO0tBQ2QsQ0FBQyxDQUFDO0lBQ0gsSUFBSSxPQUFPLENBQUMsT0FBTyxJQUFJLE9BQU8sQ0FBQyxNQUFNLElBQUksTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ3ZELE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBQ0QsT0FBTztRQUNMLE1BQU0sRUFBRSxNQUFNLENBQUMsTUFBTTtRQUNyQixNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU0sSUFBSSxJQUFJO1FBQzdCLE1BQU0sRUFBRSxNQUFNLENBQUMsTUFBTSxJQUFJLElBQUk7UUFDN0IsS0FBSyxFQUFFLE1BQU0sQ0FBQyxLQUFLO0tBQ3BCLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgY2hpbGRfcHJvY2VzcyBmcm9tIFwiY2hpbGRfcHJvY2Vzc1wiO1xuaW1wb3J0IHsgZXhpc3RzU3luYywgcmVhZEZpbGVTeW5jLCBzdGF0U3luYyB9IGZyb20gXCJmc1wiO1xuaW1wb3J0IHsgZGlybmFtZSwgam9pbiwgcmVzb2x2ZSB9IGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgeyBmb3JtYXQgfSBmcm9tIFwidXRpbFwiO1xuaW1wb3J0IHsgZ3JheSwgdW5kZXJsaW5lIH0gZnJvbSBcImNoYWxrXCI7XG5pbXBvcnQgeyAkIH0gZnJvbSBcImRheFwiO1xuaW1wb3J0IHsgUFJPSkVOX0RJUiwgVEFTS1NfTUFOSUZFU1RfVkVSU0lPTiB9IGZyb20gXCIuLi9jb21tb25cIjtcbmltcG9ydCAqIGFzIGxvZ2dpbmcgZnJvbSBcIi4uL2xvZ2dpbmdcIjtcbmltcG9ydCB0eXBlIHsgVGFza3NNYW5pZmVzdCwgVGFza1NwZWMsIFRhc2tTdGVwIH0gZnJvbSBcIi4uL3Rhc2stbW9kZWxcIjtcbmltcG9ydCB7IE1BWF9CVUZGRVIsIHRvb2wgfSBmcm9tIFwiLi4vdXRpbC9leGVjXCI7XG5cbi8vIGF2b2lkcyBhIChmYWxzZSBwb3NpdGl2ZSkgZXNidWlsZCB3YXJuaW5nIGFib3V0IGluY29ycmVjdCBpbXBvcnRzLlxuLy8gYD8uZGVmYXVsdCA/PyBtb2R1bGVgIGtlZXBzIHRoaXMgd29ya2luZyBib3RoIGFzIGEgcGxhaW4gQ29tbW9uSlMgcmVxdWlyZSBhbmRcbi8vIHdoZW4gdGhlIGRlcGVuZGVuY3kgaXMgaW50ZXJvcC13cmFwcGVkIGluc2lkZSB0aGUgYnVuZGxlZCBydW4tdGFzay5janMgKHdoZXJlXG4vLyBgcmVxdWlyZSguLi4pYCBtYXkgeWllbGQgYHsgZGVmYXVsdDogZm4gfWAgaW5zdGVhZCBvZiB0aGUgZnVuY3Rpb24pLiBTZWVcbi8vIHByb2plbiM0NDA3IChcInBhcnNlQ29uZmxpY3RKU09OIGlzIG5vdCBhIGZ1bmN0aW9uXCIgYWZ0ZXIgZWplY3QpLlxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1yZXF1aXJlLWltcG9ydHNcbmNvbnN0IHBhcnNlQ29uZmxpY3RKU09OTW9kdWxlID0gcmVxdWlyZShcInBhcnNlLWNvbmZsaWN0LWpzb25cIik7XG5jb25zdCBwYXJzZUNvbmZsaWN0SlNPTiA9XG4gIHBhcnNlQ29uZmxpY3RKU09OTW9kdWxlPy5kZWZhdWx0ID8/IHBhcnNlQ29uZmxpY3RKU09OTW9kdWxlO1xuXG5jb25zdCBFTlZfVFJJTV9MRU4gPSAyMDtcbmNvbnN0IEFSR1NfTUFSS0VSID0gXCIkQFwiO1xuY29uc3QgUVVPVEVEX0FSR1NfTUFSS0VSID0gYFwiJHtBUkdTX01BUktFUn1cImA7XG5cbi8qKlxuICogRG91YmxlLXF1b3RlcyBhIHNpbmdsZSBhcmd1bWVudCBzbyBpdCBpcyBwYXNzZWQgdGhyb3VnaCB2ZXJiYXRpbSwgZXNjYXBpbmcgdGhlXG4gKiBjaGFyYWN0ZXJzIHRoYXQgc3RheSBzcGVjaWFsIGluc2lkZSBkb3VibGUgcXVvdGVzLiAoRG91YmxlIHF1b3Rlcywgbm90IHNpbmdsZTpcbiAqIGRheCdzIHNoZWxsIGxhY2tzIHRoZSBQT1NJWCBgJ1xcJydgIGVzY2FwZS4pXG4gKi9cbmZ1bmN0aW9uIHF1b3RlQXJnKGFyZzogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuICdcIicgKyBhcmcucmVwbGFjZSgvKFtcIiRgXFxcXF0pL2csIFwiXFxcXCQxXCIpICsgJ1wiJztcbn1cblxuLyoqXG4gKiBkYXgncyBidWlsdC1pbiBjcm9zcy1wbGF0Zm9ybSBzaGVsbCBvbmx5IGltcGxlbWVudHMgYSBzdWJzZXQgb2YgUE9TSVggc2hlbGxcbiAqIHN5bnRheCBhbmQgdGhyb3dzIGEgdGVyc2UgYE5vdCBpbXBsZW1lbnRlZDogLi4uYCBmb3IgdGhlIHJlc3QuIFJld3JpdGUgdGhvc2VcbiAqIGludG8gYSBzaG9ydCwgYWN0aW9uYWJsZSBlcnJvciB0aGF0IHBvaW50cyBhdCB0aGUgc3lzdGVtLXNoZWxsIGVzY2FwZSBoYXRjaDtcbiAqIHBhc3MgZXZlcnkgb3RoZXIgZXJyb3IgdGhyb3VnaCB1bmNoYW5nZWQuXG4gKi9cbmZ1bmN0aW9uIGVucmljaEJ1aWx0aW5TaGVsbEVycm9yKFxuICBlcnJvcjogdW5rbm93bixcbiAgY29tbWFuZDogc3RyaW5nIHwgc3RyaW5nW10sXG4pOiB1bmtub3duIHtcbiAgY29uc3QgbWVzc2FnZSA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKTtcbiAgaWYgKCEvTm90IGltcGxlbWVudGVkOi8udGVzdChtZXNzYWdlKSkge1xuICAgIC8qIHY4IGlnbm9yZSBuZXh0ICovXG4gICAgcmV0dXJuIGVycm9yO1xuICB9XG5cbiAgY29uc3QgY29tbWFuZExpbmUgPSBBcnJheS5pc0FycmF5KGNvbW1hbmQpID8gY29tbWFuZC5qb2luKFwiIFwiKSA6IGNvbW1hbmQ7XG4gIHJldHVybiBuZXcgRXJyb3IoXG4gICAgXCJwcm9qZW4ncyBidWlsdC1pbiBzaGVsbCBjYW4ndCBydW4gdGhpcyBjb21tYW5kOlxcblwiICtcbiAgICAgIGAgICR7Y29tbWFuZExpbmV9XFxuYCArXG4gICAgICBcIlRvIHVzZSB5b3VyIHN5c3RlbSdzIHNoZWxsIGluc3RlYWQsIHNldCB0aGlzIHRhc2sgdG8gVGFza1NoZWxsLnN5c3RlbSgpLlwiLFxuICApO1xufVxuXG4vKipcbiAqIE5vcm1hbGl6ZWQgcmVzdWx0IG9mIGBzaGVsbCgpYCAoYSBzdWJzZXQgb2Ygbm9kZSdzIGBTcGF3blN5bmNSZXR1cm5zYCkuXG4gKi9cbmludGVyZmFjZSBTaGVsbFJlc3VsdCB7XG4gIC8qKlxuICAgKiBUaGUgZXhpdCBjb2RlIG9mIHRoZSBjb21tYW5kLCBvciBgbnVsbGAgaWYgdGhlIHByb2Nlc3Mgd2FzIHRlcm1pbmF0ZWQgYnkgYVxuICAgKiBzaWduYWwgb3IgbmV2ZXIgc3Bhd25lZC5cbiAgICovXG4gIHJlYWRvbmx5IHN0YXR1czogbnVtYmVyIHwgbnVsbDtcblxuICAvKipcbiAgICogQ2FwdHVyZWQgc3Rkb3V0LiBPbmx5IHBvcHVsYXRlZCB3aGVuIHN0ZG91dCBpcyBwaXBlZCAoZS5nLiB3aGVuIGV2YWx1YXRpbmdcbiAgICogZW52aXJvbm1lbnQgdmFyaWFibGVzKTsgYG51bGxgL2B1bmRlZmluZWRgIHdoZW4gc3RkaW8gaXMgaW5oZXJpdGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgc3Rkb3V0PzogQnVmZmVyIHwgbnVsbDtcblxuICAvKipcbiAgICogQ2FwdHVyZWQgc3RkZXJyLiBTZWUgYHN0ZG91dGAuXG4gICAqL1xuICByZWFkb25seSBzdGRlcnI/OiBCdWZmZXIgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBBbiBlcnJvciByYWlzZWQgd2hpbGUgYXR0ZW1wdGluZyB0byBzcGF3biB0aGUgY29tbWFuZCAobm90IGEgbm9uLXplcm8gZXhpdFxuICAgKiBjb2RlLCB3aGljaCBpcyByZXBvcnRlZCB2aWEgYHN0YXR1c2ApLlxuICAgKi9cbiAgcmVhZG9ubHkgZXJyb3I/OiBFcnJvcjtcbn1cblxuLyoqXG4gKiBUaGUgcnVudGltZSBjb21wb25lbnQgb2YgdGhlIHRhc2tzIGVuZ2luZS5cbiAqL1xuZXhwb3J0IGNsYXNzIFRhc2tSdW50aW1lIHtcbiAgLyoqXG4gICAqIFRoZSBwcm9qZWN0LXJlbGF0aXZlIHBhdGggb2YgdGhlIHRhc2tzIG1hbmlmZXN0IGZpbGUuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IE1BTklGRVNUX0ZJTEUgPSBwYXRoLnBvc2l4LmpvaW4oXG4gICAgUFJPSkVOX0RJUixcbiAgICBcInRhc2tzLmpzb25cIixcbiAgKTtcblxuICAvKipcbiAgICogT25lLXNob3QgZW50cnlwb2ludCBmb3IgdGhlIHN0YW5kYWxvbmUgdGFzayBydW5uZXIuXG4gICAqXG4gICAqIENyZWF0ZXMgYSBydW50aW1lIHJvb3RlZCBhdCB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSwgcnVucyB0aGUgbmFtZWRcbiAgICogdGFzaywgYW5kIGNvbnZlcnRzIGFueSBmYWlsdXJlIGludG8gYSBub24temVybyBwcm9jZXNzIGV4aXQgY29kZS4gVGhpcyBpc1xuICAgKiB0aGUgc2luZ2xlIGxpbmUgaW52b2tlZCBieSB0aGUgYnVuZGxlZCBgc2NyaXB0cy9ydW4tdGFzay5janNgIHRoYXRcbiAgICogXCJwcm9qZW4gZWplY3RcIiBlbWl0cywgd2hpY2gga2VlcHMgdGhlIGdlbmVyYXRlZCBidW5kbGUgZm9vdGVyIHRyaXZpYWwuXG4gICAqXG4gICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSB0YXNrIHRvIHJ1bi4gRGVmYXVsdHMgdG8gYHByb2Nlc3MuYXJndlsyXWAuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGFzeW5jIG1haW4obmFtZTogc3RyaW5nID0gcHJvY2Vzcy5hcmd2WzJdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IG5ldyBUYXNrUnVudGltZShcIi5cIikucnVuVGFzayhuYW1lKTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZT8uc3RhY2sgPz8gU3RyaW5nKGUpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGhlIGNvbnRlbnRzIG9mIHRhc2tzLmpzb25cbiAgICovXG4gIHByaXZhdGUgX21hbmlmZXN0OiBUYXNrc01hbmlmZXN0ID0geyB0YXNrczoge30gfTtcblxuICAvKipcbiAgICogVGhlIHJhdyBjb250ZW50cyBvZiB0aGUgY3VycmVudGx5IGxvYWRlZCBtYW5pZmVzdCwgdXNlZCB0byBkZXRlY3QgY2hhbmdlc1xuICAgKiBvbiBkaXNrIHNvIHRoZSBydW50aW1lIGNhbiByZWxvYWQgYSByZWdlbmVyYXRlZCBtYW5pZmVzdCBtaWQtcnVuLlxuICAgKi9cbiAgcHJpdmF0ZSBfaWRlbnRpdHk/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSByb290IGRpcmVjdG9yeSBvZiB0aGUgcHJvamVjdCBhbmQgdGhlIGN3ZCBmb3IgZXhlY3V0aW5nIHRhc2tzLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHdvcmtkaXI6IHN0cmluZztcblxuICBjb25zdHJ1Y3Rvcih3b3JrZGlyOiBzdHJpbmcpIHtcbiAgICB0aGlzLndvcmtkaXIgPSByZXNvbHZlKHdvcmtkaXIpO1xuICAgIC8vIFBlcmZvcm0gdGhlIGluaXRpYWwgbG9hZC4gVGhpcyBhbHNvIHZlcmlmaWVzIHRoZSBtYW5pZmVzdCdzIHNjaGVtYVxuICAgIC8vIHZlcnNpb24uXG4gICAgdGhpcy5yZWxvYWRNYW5pZmVzdElmQ2hhbmdlZCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBjb250ZW50cyBvZiB0YXNrcy5qc29uXG4gICAqL1xuICBwdWJsaWMgZ2V0IG1hbmlmZXN0KCk6IFRhc2tzTWFuaWZlc3Qge1xuICAgIHJldHVybiB0aGlzLl9tYW5pZmVzdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgYWJzb2x1dGUgcGF0aCBvZiB0aGUgdGFza3MgbWFuaWZlc3QgZmlsZS5cbiAgICovXG4gIHByaXZhdGUgZ2V0IG1hbmlmZXN0UGF0aCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBqb2luKHRoaXMud29ya2RpciwgVGFza1J1bnRpbWUuTUFOSUZFU1RfRklMRSk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHRhc2tzIGluIHRoaXMgcHJvamVjdC5cbiAgICovXG4gIHB1YmxpYyBnZXQgdGFza3MoKTogVGFza1NwZWNbXSB7XG4gICAgcmV0dXJuIE9iamVjdC52YWx1ZXModGhpcy5tYW5pZmVzdC50YXNrcyA/PyB7fSk7XG4gIH1cblxuICAvKipcbiAgICogRmluZCBhIHRhc2sgYnkgbmFtZSwgb3IgYHVuZGVmaW5lZGAgaWYgbm90IGZvdW5kLlxuICAgKi9cbiAgcHVibGljIHRyeUZpbmRUYXNrKG5hbWU6IHN0cmluZyk6IFRhc2tTcGVjIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIXRoaXMubWFuaWZlc3QudGFza3MpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLm1hbmlmZXN0LnRhc2tzW25hbWVdO1xuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgdGhlIHRhc2suXG4gICAqIEBwYXJhbSBuYW1lIFRoZSB0YXNrIG5hbWUuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcnVuVGFzayhcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgcGFyZW50czogc3RyaW5nW10gPSBbXSxcbiAgICBhcmdzOiBBcnJheTxzdHJpbmcgfCBudW1iZXI+ID0gW10sXG4gICAgZW52OiB7IFtuYW1lOiBzdHJpbmddOiBzdHJpbmcgfSA9IHt9LFxuICAgIG9wdGlvbnM6IHsgY2FwdHVyZU91dHB1dD86IGJvb2xlYW4gfSA9IHt9LFxuICApOiBQcm9taXNlPHN0cmluZyB8IHZvaWQ+IHtcbiAgICAvLyBBIHByZXZpb3VzbHkgZXhlY3V0ZWQgdGFzayAobW9zdCBpbXBvcnRhbnRseSB0aGUgXCJkZWZhdWx0XCIvc3ludGggdGFzayxcbiAgICAvLyB3aGljaCBgYnVpbGRgIHNwYXducyBmaXJzdCkgbWF5IGhhdmUgcmVnZW5lcmF0ZWQgYC5wcm9qZW4vdGFza3MuanNvbmAuXG4gICAgLy8gUGljayB1cCBhbnkgc3VjaCBjaGFuZ2VzIGJlZm9yZSByZXNvbHZpbmcgYW5kIHJ1bm5pbmcgdGhpcyB0YXNrIHNvIHdlXG4gICAgLy8gbmV2ZXIgZXhlY3V0ZSBhIHN0YWxlLCBpbi1tZW1vcnkgZGVmaW5pdGlvbi5cbiAgICB0aGlzLnJlbG9hZE1hbmlmZXN0SWZDaGFuZ2VkKCk7XG5cbiAgICBjb25zdCB0YXNrID0gdGhpcy50cnlGaW5kVGFzayhuYW1lKTtcbiAgICBpZiAoIXRhc2spIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgY2Fubm90IGZpbmQgY29tbWFuZCAke25hbWV9YCk7XG4gICAgfVxuXG4gICAgY29uc3QgcnVubmVyID0gbmV3IFJ1blRhc2sodGhpcywgdGFzaywgcGFyZW50cywgYXJncywgZW52KTtcbiAgICByZXR1cm4gb3B0aW9ucy5jYXB0dXJlT3V0cHV0ID8gcnVubmVyLnJ1bkNhcHR1cmluZ091dHB1dCgpIDogcnVubmVyLnJ1bigpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlLXJlYWRzIHRoZSB0YXNrcyBtYW5pZmVzdCBmcm9tIGRpc2sgaWYgaXRzIGNvbnRlbnRzIGNoYW5nZWQgc2luY2UgaXQgd2FzXG4gICAqIGxhc3QgbG9hZGVkLCB2ZXJpZnlpbmcgaXRzIHNjaGVtYSB2ZXJzaW9uIGFsb25nIHRoZSB3YXkuXG4gICAqXG4gICAqIENoYW5nZSBkZXRlY3Rpb24gY29tcGFyZXMgdGhlIHJhdyBmaWxlIGNvbnRlbnRzLCBzbyBhbiB1bmNoYW5nZWQgbWFuaWZlc3RcbiAgICogaXMgbm90IHJlLXZlcmlmaWVkIG9yIHJlLWFkb3B0ZWQuXG4gICAqL1xuICBwcml2YXRlIHJlbG9hZE1hbmlmZXN0SWZDaGFuZ2VkKCk6IHZvaWQge1xuICAgIGlmICghZXhpc3RzU3luYyh0aGlzLm1hbmlmZXN0UGF0aCkpIHtcbiAgICAgIC8vIE5vIG1hbmlmZXN0IG9uIGRpc2s6IHRyZWF0IGFzIGFuIGVtcHR5IHByb2plY3QgKGxlZ2FjeSBiZWhhdmlvcikuXG4gICAgICB0aGlzLl9tYW5pZmVzdCA9IHsgdGFza3M6IHt9IH07XG4gICAgICB0aGlzLl9pZGVudGl0eSA9IHVuZGVmaW5lZDtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCByYXcgPSByZWFkRmlsZVN5bmModGhpcy5tYW5pZmVzdFBhdGgsIFwidXRmLThcIik7XG4gICAgaWYgKHJhdyA9PT0gdGhpcy5faWRlbnRpdHkpIHtcbiAgICAgIHJldHVybjsgLy8gdW5jaGFuZ2VkIHNpbmNlIHRoZSBsYXN0IGxvYWRcbiAgICB9XG5cbiAgICBjb25zdCBtYW5pZmVzdDogVGFza3NNYW5pZmVzdCA9IHBhcnNlQ29uZmxpY3RKU09OKHJhdywgdW5kZWZpbmVkLCBcInRoZWlyc1wiKTtcblxuICAgIC8vIEEgcHJldmlvdXNseSBsb2FkZWQgbWFuaWZlc3QgbWVhbnMgdGhpcyBpcyBhICpyZWxvYWQqIChlLmcuIHRoZVxuICAgIC8vIFwiZGVmYXVsdFwiL3N5bnRoIHRhc2sgcmVnZW5lcmF0ZWQgdGhlIGZpbGUgbWlkLXJ1biksIGFzIG9wcG9zZWQgdG8gdGhlXG4gICAgLy8gaW5pdGlhbCBsb2FkIHBlcmZvcm1lZCBieSB0aGUgY29uc3RydWN0b3IuXG4gICAgY29uc3QgaXNSZWxvYWQgPSB0aGlzLl9pZGVudGl0eSAhPT0gdW5kZWZpbmVkO1xuXG4gICAgdGhpcy52ZXJpZnlNYW5pZmVzdChtYW5pZmVzdCk7XG4gICAgdGhpcy5fbWFuaWZlc3QgPSBtYW5pZmVzdDtcbiAgICB0aGlzLl9pZGVudGl0eSA9IHJhdztcblxuICAgIGlmIChpc1JlbG9hZCkge1xuICAgICAgbG9nZ2luZy5kZWJ1ZyhcbiAgICAgICAgYCR7VGFza1J1bnRpbWUuTUFOSUZFU1RfRklMRX0gY2hhbmdlZCBvbiBkaXNrOyBzdWNjZXNzZnVsbHkgbG9hZGVkIHRoZSBuZXcgdGFza3MgbWFuaWZlc3QuYCxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyBhIGZyZXNobHkgcmVhZCBtYW5pZmVzdDpcbiAgICpcbiAgICogLSBMZWdhY3kgbWFuaWZlc3RzIChubyBgbWFuaWZlc3RWZXJzaW9uYCkgYXJlIGFjY2VwdGVkIGFzLWlzIGZvciBiYWNrd2FyZHNcbiAgICogICBjb21wYXRpYmlsaXR5LlxuICAgKiAtIE1hbmlmZXN0cyBmcm9tIGEgbmV3ZXIgcHJvamVuIChhIGhpZ2hlciBgbWFuaWZlc3RWZXJzaW9uYCkgYXJlIGFjY2VwdGVkXG4gICAqICAgd2l0aCBhIHdhcm5pbmcsIHNpbmNlIHRoaXMgcnVudGltZSBtYXkgbm90IHVuZGVyc3RhbmQgdGhlIHNjaGVtYS5cbiAgICovXG4gIHByaXZhdGUgdmVyaWZ5TWFuaWZlc3QobWFuaWZlc3Q6IFRhc2tzTWFuaWZlc3QpOiB2b2lkIHtcbiAgICAvLyBCYWNrd2FyZHMgY29tcGF0aWJpbGl0eTogbWFuaWZlc3RzIGdlbmVyYXRlZCBiZWZvcmUgdmVyc2lvbmluZyBjYXJyeSBub1xuICAgIC8vIHZlcnNpb24uXG4gICAgaWYgKG1hbmlmZXN0Lm1hbmlmZXN0VmVyc2lvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKG1hbmlmZXN0Lm1hbmlmZXN0VmVyc2lvbiA+IFRBU0tTX01BTklGRVNUX1ZFUlNJT04pIHtcbiAgICAgIGxvZ2dpbmcud2FybihcbiAgICAgICAgYCR7VGFza1J1bnRpbWUuTUFOSUZFU1RfRklMRX0gd2FzIGdlbmVyYXRlZCBieSBhIG5ld2VyIHZlcnNpb24gb2YgcHJvamVuIGAgK1xuICAgICAgICAgIGAobWFuaWZlc3QgdmVyc2lvbiAke21hbmlmZXN0Lm1hbmlmZXN0VmVyc2lvbn0sIHRoaXMgcHJvamVuIHN1cHBvcnRzIHVwIHRvICR7VEFTS1NfTUFOSUZFU1RfVkVSU0lPTn0pLiBgICtcbiAgICAgICAgICBgU29tZSB0YXNrcyBtYXkgbm90IGJlaGF2ZSBhcyBleHBlY3RlZDsgY29uc2lkZXIgdXBncmFkaW5nIHByb2plbi5gLFxuICAgICAgKTtcbiAgICB9XG4gIH1cbn1cblxuY2xhc3MgUnVuVGFzayB7XG4gIHByaXZhdGUgZW52OiB7IFtuYW1lOiBzdHJpbmddOiBzdHJpbmcgfCB1bmRlZmluZWQgfSA9IHt9O1xuICBwcml2YXRlIHJlYWRvbmx5IHBhcmVudHM6IHN0cmluZ1tdO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgd29ya2Rpcjogc3RyaW5nO1xuXG4gIC8vIFdoZW4gc2V0LCBldmVyeSBzdGVwJ3Mgc3Rkb3V0IGlzIGNhcHR1cmVkIGFuZCBhY2N1bXVsYXRlZCAoZm9yIGEgc3Bhd25lZFxuICAvLyB0YXNrIHdob3NlIGFnZ3JlZ2F0ZSBvdXRwdXQgdGhlIGNhbGxlciB3YW50cykuXG4gIHByaXZhdGUgY2FwdHVyZUFsbCA9IGZhbHNlO1xuICBwcml2YXRlIHJlYWRvbmx5IGNhcHR1cmVkOiBzdHJpbmdbXSA9IFtdO1xuXG4gIC8vIGBvdXRwdXRFbnZgIGNhcHR1cmVzLCBwcm9wYWdhdGVkIHRvIHNwYXduZWQgc3VidGFza3MgKGV4ZWMvYnVpbHRpbiBzdGVwc1xuICAvLyBzZWUgdGhlbSB2aWEgYHRoaXMuZW52YCkuXG4gIHByaXZhdGUgcmVhZG9ubHkgY2FwdHVyZWRFbnY6IHsgW25hbWU6IHN0cmluZ106IHN0cmluZyB9ID0ge307XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBydW50aW1lOiBUYXNrUnVudGltZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHRhc2s6IFRhc2tTcGVjLFxuICAgIHBhcmVudHM6IHN0cmluZ1tdID0gW10sXG4gICAgcHJpdmF0ZSByZWFkb25seSBhcmdzOiBBcnJheTxzdHJpbmcgfCBudW1iZXI+ID0gW10sXG4gICAgcHJpdmF0ZSByZWFkb25seSBlbnZQYXJhbTogeyBbbmFtZTogc3RyaW5nXTogc3RyaW5nIH0gPSB7fSxcbiAgKSB7XG4gICAgdGhpcy53b3JrZGlyID0gdGFzay5jd2QgPz8gdGhpcy5ydW50aW1lLndvcmtkaXI7XG4gICAgdGhpcy5wYXJlbnRzID0gcGFyZW50cztcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHRoZSB0YXNrLCBjYXB0dXJpbmcgYW5kIHJldHVybmluZyB0aGUgdHJpbW1lZCwgbmV3bGluZS1qb2luZWQgc3Rkb3V0XG4gICAqIG9mIGFsbCBpdHMgc3RlcHMgKGFuZCBhbnkgbmVzdGVkIHNwYXduZWQgdGFza3MpIGluIGV4ZWN1dGlvbiBvcmRlci5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBydW5DYXB0dXJpbmdPdXRwdXQoKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICB0aGlzLmNhcHR1cmVBbGwgPSB0cnVlO1xuICAgIGF3YWl0IHRoaXMucnVuKCk7XG4gICAgcmV0dXJuIHRoaXMuY2FwdHVyZWQuam9pbihcIlxcblwiKS50cmltKCk7XG4gIH1cblxuICAvKipcbiAgICogUmVjb3JkcyBhIHN0ZXAncyBjYXB0dXJlZCAodHJpbW1lZCkgc3Rkb3V0OiBpbnRvIGBvdXRwdXRFbnZgIGZvciBsYXRlclxuICAgKiBzdGVwcyAoYW5kIHByb3BhZ2F0ZWQgdG8gc3Bhd25lZCBzdWJ0YXNrcyksIGFuZCBpbnRvIHRoZSBydW4ncyBhZ2dyZWdhdGVcbiAgICogb3V0cHV0IHdoZW4gY2FwdHVyaW5nIGV2ZXJ5dGhpbmcuXG4gICAqL1xuICBwcml2YXRlIHJlY29yZENhcHR1cmUob3V0cHV0RW52OiBzdHJpbmcgfCB1bmRlZmluZWQsIHZhbHVlOiBzdHJpbmcpIHtcbiAgICBpZiAob3V0cHV0RW52KSB7XG4gICAgICB0aGlzLmVudltvdXRwdXRFbnZdID0gdmFsdWU7XG4gICAgICB0aGlzLmNhcHR1cmVkRW52W291dHB1dEVudl0gPSB2YWx1ZTtcbiAgICB9XG4gICAgaWYgKHRoaXMuY2FwdHVyZUFsbCkge1xuICAgICAgdGhpcy5jYXB0dXJlZC5wdXNoKHZhbHVlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRXhlY3V0ZXMgdGhlIHRhc2suIFRoaXMgd2FzIHByZXZpb3VzbHkgZG9uZSBpbiB0aGUgY29uc3RydWN0b3IsIGJ1dCBpcyBub3dcbiAgICogYW4gYXN5bmMgbWV0aG9kIHNpbmNlIHNoZWxsIGV4ZWN1dGlvbiBpcyBhc3luY2hyb25vdXMgKGUuZy4gZGF4IG9uXG4gICAqIFdpbmRvd3MpLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHJ1bigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB7IHRhc2ssIGFyZ3MsIHBhcmVudHMgfSA9IHRoaXM7XG5cbiAgICBpZiAoIXRhc2suc3RlcHMgfHwgdGFzay5zdGVwcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMubG9nRGVidWcoZ3JheShcIk5vIGFjdGlvbnMgaGF2ZSBiZWVuIHNwZWNpZmllZCBmb3IgdGhpcyB0YXNrLlwiKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5lbnYgPSBhd2FpdCB0aGlzLnJlc29sdmVFbnZpcm9ubWVudChcbiAgICAgIHRoaXMuZW52UGFyYW0sXG4gICAgICBwYXJlbnRzLFxuICAgICAgdGhpcy5yZXNvbHZlU2hlbGwoKSxcbiAgICApO1xuXG4gICAgY29uc3QgZW52bG9ncyA9IFtdO1xuICAgIGZvciAoY29uc3QgW2ssIHZdIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMuZW52KSkge1xuICAgICAgY29uc3QgdnYgPSB2ID8/IFwiXCI7XG4gICAgICBjb25zdCB0cmltbWVkID1cbiAgICAgICAgdnYubGVuZ3RoID4gRU5WX1RSSU1fTEVOID8gdnYuc3Vic3RyaW5nKDAsIEVOVl9UUklNX0xFTikgKyBcIi4uLlwiIDogdnY7XG4gICAgICBlbnZsb2dzLnB1c2goYCR7a309JHt0cmltbWVkfWApO1xuICAgIH1cblxuICAgIGlmIChlbnZsb2dzLmxlbmd0aCkge1xuICAgICAgdGhpcy5sb2dEZWJ1ZyhncmF5KGAke3VuZGVybGluZShcImVudlwiKX06ICR7ZW52bG9ncy5qb2luKFwiIFwiKX1gKSk7XG4gICAgfVxuXG4gICAgLy8gZXZhbHVhdGUgY29uZGl0aW9uXG4gICAgaWYgKCEoYXdhaXQgdGhpcy5ldmFsQ29uZGl0aW9uKHRhc2ssIHRoaXMucmVzb2x2ZVNoZWxsKCkpKSkge1xuICAgICAgdGhpcy5sb2coXCJjb25kaXRpb24gZXhpdGVkIHdpdGggbm9uLXplcm8gLSBza2lwcGluZ1wiKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyB2ZXJpZnkgd2UgcmVxdWlyZWQgZW52aXJvbm1lbnQgdmFyaWFibGVzIGFyZSBkZWZpbmVkXG4gICAgY29uc3QgbWVyZ2VkID0geyAuLi5wcm9jZXNzLmVudiwgLi4udGhpcy5lbnYgfTtcbiAgICBjb25zdCBtaXNzaW5nID0gbmV3IEFycmF5PHN0cmluZz4oKTtcbiAgICBmb3IgKGNvbnN0IG5hbWUgb2YgdGFzay5yZXF1aXJlZEVudiA/PyBbXSkge1xuICAgICAgaWYgKCEobmFtZSBpbiBtZXJnZWQpKSB7XG4gICAgICAgIG1pc3NpbmcucHVzaChuYW1lKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobWlzc2luZy5sZW5ndGggPiAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBtaXNzaW5nIHJlcXVpcmVkIGVudmlyb25tZW50IHZhcmlhYmxlczogJHttaXNzaW5nLmpvaW4oXCIsXCIpfWAsXG4gICAgICApO1xuICAgIH1cblxuICAgIGZvciAoY29uc3Qgc3RlcCBvZiB0YXNrLnN0ZXBzKSB7XG4gICAgICBjb25zdCBzdGVwU2hlbGwgPSB0aGlzLnJlc29sdmVTaGVsbChzdGVwKTtcblxuICAgICAgLy8gZXZhbHVhdGUgc3RlcCBjb25kaXRpb25cbiAgICAgIGlmICghKGF3YWl0IHRoaXMuZXZhbENvbmRpdGlvbihzdGVwLCBzdGVwU2hlbGwpKSkge1xuICAgICAgICB0aGlzLmxvZyhcImNvbmRpdGlvbiBleGl0ZWQgd2l0aCBub24temVybyAtIHNraXBwaW5nXCIpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgYXJnc0xpc3Q6IHN0cmluZ1tdID0gW1xuICAgICAgICAuLi4oc3RlcC5hcmdzIHx8IFtdKSxcbiAgICAgICAgLi4uKHN0ZXAucmVjZWl2ZUFyZ3MgPyBhcmdzIDogW10pLFxuICAgICAgXS5tYXAoKGEpID0+IGEudG9TdHJpbmcoKSk7XG5cbiAgICAgIGlmIChzdGVwLnNheSkge1xuICAgICAgICBsb2dnaW5nLmluZm8odGhpcy5mbXRMb2coc3RlcC5zYXkpKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHN0ZXAuc3Bhd24pIHtcbiAgICAgICAgY29uc3QgY2FwdHVyZSA9IHRoaXMuY2FwdHVyZUFsbCB8fCAhIXN0ZXAub3V0cHV0RW52O1xuICAgICAgICBjb25zdCBvdXRwdXQgPSBhd2FpdCB0aGlzLnJ1bnRpbWUucnVuVGFzayhcbiAgICAgICAgICBzdGVwLnNwYXduLFxuICAgICAgICAgIFsuLi50aGlzLnBhcmVudHMsIHRoaXMudGFzay5uYW1lXSxcbiAgICAgICAgICBhcmdzTGlzdCxcbiAgICAgICAgICB7IC4uLnRoaXMuY2FwdHVyZWRFbnYsIC4uLnN0ZXAuZW52IH0sXG4gICAgICAgICAgeyBjYXB0dXJlT3V0cHV0OiBjYXB0dXJlIH0sXG4gICAgICAgICk7XG4gICAgICAgIGlmICh0eXBlb2Ygb3V0cHV0ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgdGhpcy5yZWNvcmRDYXB0dXJlKHN0ZXAub3V0cHV0RW52LCBvdXRwdXQpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGV4ZWNzOiBBcnJheTxzdHJpbmcgfCBzdHJpbmdbXT4gPSBzdGVwLmV4ZWMgPyBbc3RlcC5leGVjXSA6IFtdO1xuXG4gICAgICAvLyBQYXJzZSBzdGVwLXNwZWNpZmljIGVudmlyb25tZW50IHZhcmlhYmxlc1xuICAgICAgY29uc3QgZW52ID0gYXdhaXQgdGhpcy5ldmFsRW52aXJvbm1lbnQoc3RlcC5lbnYgPz8ge30sIHN0ZXBTaGVsbCk7XG5cbiAgICAgIGlmIChzdGVwLmJ1aWx0aW4pIHtcbiAgICAgICAgZXhlY3MucHVzaCh0aGlzLnJlbmRlckJ1aWx0aW4oc3RlcC5idWlsdGluKSk7XG4gICAgICB9XG5cbiAgICAgIC8vIGBleGVjQXJnc2AgaXMgYW4gZXhwbGljaXQgYXJndiAodGhlIHByb2dyYW0gZm9sbG93ZWQgYnkgaXRzIGFyZ3VtZW50cykuXG4gICAgICAvLyBJdCBpcyBoYW5kZWQgdG8gYHNoZWxsKClgIGFzIGFuIGFycmF5IHJhdGhlciB0aGFuIGEgcmVuZGVyZWQgc3RyaW5nLCBzb1xuICAgICAgLy8gaXQgcnVucyB3aXRob3V0IGEgc2hlbGwgYW5kIGV2ZXJ5IGVsZW1lbnQgaXMgcGFzc2VkIHRocm91Z2ggdmVyYmF0aW0gLVxuICAgICAgLy8gd2hpY2ggaXMgd2hhdCBsZXRzIGNhbGxlcnMgYXZvaWQgdGhpbmtpbmcgYWJvdXQgcXVvdGluZy4gRml4ZWQvcmVjZWl2ZWRcbiAgICAgIC8vIGFyZ3MgYXJlIHNwbGljZWQgaW4gd2hlcmV2ZXIgYSBgJEBgIG1hcmtlciBlbGVtZW50IGFwcGVhcnMgKG1pcnJvcmluZ1xuICAgICAgLy8gdGhlIHN0cmluZyBgZXhlY2AgYmVoYXZpb3IpLCBvciBhcHBlbmRlZCBhdCB0aGUgZW5kIGlmIHRoZXJlIGlzIG5vbmUuXG4gICAgICBpZiAoc3RlcC5leGVjQXJncykge1xuICAgICAgICBjb25zdCBhcmd2OiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICBsZXQgcGxhY2VkID0gZmFsc2U7XG4gICAgICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiBzdGVwLmV4ZWNBcmdzKSB7XG4gICAgICAgICAgaWYgKGVsZW1lbnQgPT09IEFSR1NfTUFSS0VSKSB7XG4gICAgICAgICAgICBhcmd2LnB1c2goLi4uYXJnc0xpc3QpO1xuICAgICAgICAgICAgcGxhY2VkID0gdHJ1ZTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYXJndi5wdXNoKGVsZW1lbnQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoIXBsYWNlZCkge1xuICAgICAgICAgIGFyZ3YucHVzaCguLi5hcmdzTGlzdCk7XG4gICAgICAgIH1cbiAgICAgICAgZXhlY3MucHVzaChhcmd2KTtcbiAgICAgIH1cblxuICAgICAgZm9yIChjb25zdCBleGVjIG9mIGV4ZWNzKSB7XG4gICAgICAgIGxldCBjb21tYW5kID0gZXhlYztcblxuICAgICAgICAvLyBBIHN0cmluZyBjb21tYW5kIGlzIGEgc2hlbGwgbGluZTogc3BsaWNlIHRhc2sgYXJncyBpbiBwZXIgdGhlIGAkQGBcbiAgICAgICAgLy8gbWFya2VyIHJ1bGVzLiBBbiBgZXhlY0FyZ3NgIGFyZ3YgYWxyZWFkeSBjYXJyaWVzIGl0cyBhcmdzLCB1bnRvdWNoZWQuXG4gICAgICAgIGlmICh0eXBlb2YgY29tbWFuZCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgIGlmIChjb21tYW5kLmluY2x1ZGVzKFFVT1RFRF9BUkdTX01BUktFUikpIHtcbiAgICAgICAgICAgIC8vIGBcIiRAXCJgOiBzcGxpY2UgZWFjaCBhcmcgaW4gYXMgYSBzZXBhcmF0ZSB2ZXJiYXRpbSB3b3JkIChsaWtlXG4gICAgICAgICAgICAvLyBiYXNoJ3MgcXVvdGVkIGBcIiRAXCJgKSwgc28gd2hpdGVzcGFjZSBhbmQgbWV0YWNoYXJhY3RlcnMgc3Vydml2ZS5cbiAgICAgICAgICAgIGNvbW1hbmQgPSBjb21tYW5kLnJlcGxhY2UoXG4gICAgICAgICAgICAgIFFVT1RFRF9BUkdTX01BUktFUixcbiAgICAgICAgICAgICAgYXJnc0xpc3QubWFwKHF1b3RlQXJnKS5qb2luKFwiIFwiKSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSBlbHNlIGlmIChjb21tYW5kLmluY2x1ZGVzKEFSR1NfTUFSS0VSKSkge1xuICAgICAgICAgICAgY29tbWFuZCA9IGNvbW1hbmQucmVwbGFjZShBUkdTX01BUktFUiwgYXJnc0xpc3Quam9pbihcIiBcIikpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb21tYW5kID0gW2NvbW1hbmQsIC4uLmFyZ3NMaXN0XS5qb2luKFwiIFwiKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjd2QgPSBzdGVwLmN3ZDtcbiAgICAgICAgY29uc3QgY2FwdHVyZSA9IHRoaXMuY2FwdHVyZUFsbCB8fCAhIXN0ZXAub3V0cHV0RW52O1xuICAgICAgICAvLyBBIHRocm93biBlcnJvciAoZS5nLiBzcGF3biBmYWlsdXJlKSBwcm9wYWdhdGVzOyBhIG5vbi16ZXJvIGV4aXQgaXNcbiAgICAgICAgLy8gcmVwb3J0ZWQgdmlhIGByZXN1bHQuc3RhdHVzYC5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5zaGVsbCh7XG4gICAgICAgICAgY29tbWFuZCxcbiAgICAgICAgICBjd2QsXG4gICAgICAgICAgZXh0cmFFbnY6IGVudixcbiAgICAgICAgICBzaGVsbDogc3RlcFNoZWxsLFxuICAgICAgICAgIGNhcHR1cmVPdXRwdXQ6IGNhcHR1cmUsXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAocmVzdWx0LnN0YXR1cyAhPT0gMCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBUYXNrIFwiJHt0aGlzLmZ1bGxuYW1lfVwiIGZhaWxlZCB3aGVuIGV4ZWN1dGluZyBcIiR7XG4gICAgICAgICAgICAgIEFycmF5LmlzQXJyYXkoY29tbWFuZCkgPyBjb21tYW5kLmpvaW4oXCIgXCIpIDogY29tbWFuZFxuICAgICAgICAgICAgfVwiIChjd2Q6ICR7cmVzb2x2ZShjd2QgPz8gdGhpcy53b3JrZGlyKX0pYCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjYXB0dXJlKSB7XG4gICAgICAgICAgY29uc3Qgc3Rkb3V0ID0gcmVzdWx0LnN0ZG91dD8udG9TdHJpbmcoXCJ1dGYtOFwiKS50cmltKCkgPz8gXCJcIjtcbiAgICAgICAgICB0aGlzLnJlY29yZENhcHR1cmUoc3RlcC5vdXRwdXRFbnYsIHN0ZG91dCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyBpZiBhIHRhc2sgc2hvdWxkIGJlIGV4ZWN1dGVkIGJhc2VkIG9uIFwiY29uZGl0aW9uXCIuXG4gICAqXG4gICAqIEByZXR1cm5zIHRydWUgaWYgdGhlIHRhc2sgc2hvdWxkIGJlIGV4ZWN1dGVkIG9yIGZhbHNlIGlmIHRoZSBjb25kaXRpb25cbiAgICogZXZhbHVhdGVzIHRvIGZhbHNlIChleGl0cyB3aXRoIG5vbi16ZXJvKSwgaW5kaWNhdGluZyB0aGF0IHRoZSB0YXNrIHNob3VsZFxuICAgKiBiZSBza2lwcGVkLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBldmFsQ29uZGl0aW9uKFxuICAgIHRhc2tPclN0ZXA6IFRhc2tTcGVjIHwgVGFza1N0ZXAsXG4gICAgc2hlbGw6IHN0cmluZyB8IHN0cmluZ1tdLFxuICApIHtcbiAgICAvLyBubyBjb25kaXRpb24sIGNhcnJ5IG9uXG4gICAgaWYgKCF0YXNrT3JTdGVwLmNvbmRpdGlvbikge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgdGhpcy5sb2coZ3JheShgJHt1bmRlcmxpbmUoXCJjb25kaXRpb25cIil9OiAke3Rhc2tPclN0ZXAuY29uZGl0aW9ufWApKTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnNoZWxsKHtcbiAgICAgIGNvbW1hbmQ6IHRhc2tPclN0ZXAuY29uZGl0aW9uLFxuICAgICAgcXVpZXQ6IHRydWUsXG4gICAgICBzaGVsbCxcbiAgICB9KTtcbiAgICBpZiAocmVzdWx0LnN0YXR1cyA9PT0gMCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRXZhbHVhdGVzIGVudmlyb25tZW50IHZhcmlhYmxlcyBmcm9tIHNoZWxsIGNvbW1hbmRzIChlLmcuIGAkKHh4KWApXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGV2YWxFbnZpcm9ubWVudChcbiAgICBlbnY6IHsgW25hbWU6IHN0cmluZ106IHN0cmluZyB9LFxuICAgIHNoZWxsOiBzdHJpbmcgfCBzdHJpbmdbXSxcbiAgKSB7XG4gICAgY29uc3Qgb3V0cHV0OiB7IFtuYW1lOiBzdHJpbmddOiBzdHJpbmcgfCB1bmRlZmluZWQgfSA9IHt9O1xuXG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZW52ID8/IHt9KSkge1xuICAgICAgaWYgKFN0cmluZyh2YWx1ZSkuc3RhcnRzV2l0aChcIiQoXCIpICYmIFN0cmluZyh2YWx1ZSkuZW5kc1dpdGgoXCIpXCIpKSB7XG4gICAgICAgIGNvbnN0IHF1ZXJ5ID0gdmFsdWUuc3Vic3RyaW5nKDIsIHZhbHVlLmxlbmd0aCAtIDEpO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnNoZWxsKHtcbiAgICAgICAgICBjb21tYW5kOiBxdWVyeSxcbiAgICAgICAgICBxdWlldDogdHJ1ZSxcbiAgICAgICAgICBjYXB0dXJlT3V0cHV0OiB0cnVlLFxuICAgICAgICAgIHNoZWxsLFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHJlc3VsdC5zdGF0dXMgIT09IDApIHtcbiAgICAgICAgICBjb25zdCBlcnJvciA9IHJlc3VsdC5lcnJvclxuICAgICAgICAgICAgPyByZXN1bHQuZXJyb3Iuc3RhY2tcbiAgICAgICAgICAgIDogcmVzdWx0LnN0ZGVycj8udG9TdHJpbmcoKS50cmltKCkgfHxcbiAgICAgICAgICAgICAgcmVzdWx0LnN0ZG91dD8udG9TdHJpbmcoKS50cmltKCkgfHxcbiAgICAgICAgICAgICAgYGNvbW1hbmQgZXhpdGVkIHdpdGggY29kZSAke3Jlc3VsdC5zdGF0dXN9YDtcblxuICAgICAgICAgIGxvZ2dpbmcud2FybihcbiAgICAgICAgICAgIHRoaXMuZm10TG9nKFxuICAgICAgICAgICAgICBgJHt1bmRlcmxpbmUoa2V5KX06IHVuYWJsZSB0byBldmFsdWF0ZSBcIiR7cXVlcnl9XCIuIEVudmlyb25tZW50IHZhcmlhYmxlIHdpbGwgYmUgc2tpcHBlZC4gQ2hlY2sgdGhhdCB0aGUgY29tbWFuZCBleGlzdHMgYW5kIHJ1bnMgc3VjY2Vzc2Z1bGx5LmAsXG4gICAgICAgICAgICApLFxuICAgICAgICAgICk7XG4gICAgICAgICAgbG9nZ2luZy53YXJuKHRoaXMuZm10TG9nKGAke3VuZGVybGluZShrZXkpfTogJHtlcnJvcn1gKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgb3V0cHV0W2tleV0gPSByZXN1bHQuc3Rkb3V0Py50b1N0cmluZyhcInV0Zi04XCIpLnRyaW0oKSA/PyBcIlwiO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvdXRwdXRba2V5XSA9IHZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gb3V0cHV0O1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbmRlcnMgdGhlIHJ1bnRpbWUgZW52aXJvbm1lbnQgZm9yIGEgdGFzay4gTmFtZWx5LCBpdCBzdXBwb3J0cyB0aGlzIHN5bnRheFxuICAgKiBgJCh4eClgIGZvciBhbGxvd2luZyBlbnZpcm9ubWVudCB0byBiZSBldmFsdWF0ZWQgYnkgZXhlY3V0aW5nIGEgc2hlbGxcbiAgICogY29tbWFuZCBhbmQgb2J0YWluaW5nIGl0cyByZXN1bHQuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHJlc29sdmVFbnZpcm9ubWVudChcbiAgICBlbnZQYXJhbTogeyBbbmFtZTogc3RyaW5nXTogc3RyaW5nIH0sXG4gICAgcGFyZW50czogc3RyaW5nW10sXG4gICAgc2hlbGw6IHN0cmluZyB8IHN0cmluZ1tdLFxuICApIHtcbiAgICBsZXQgZW52ID0gdGhpcy5ydW50aW1lLm1hbmlmZXN0LmVudiA/PyB7fTtcblxuICAgIC8vIGFkZCBlbnYgZnJvbSBhbGwgcGFyZW50IHRhc2tzIG9uZSBieSBvbmVcbiAgICBmb3IgKGNvbnN0IHBhcmVudCBvZiBwYXJlbnRzKSB7XG4gICAgICBlbnYgPSB7XG4gICAgICAgIC4uLmVudixcbiAgICAgICAgLi4uKHRoaXMucnVudGltZS50cnlGaW5kVGFzayhwYXJlbnQpPy5lbnYgPz8ge30pLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBhcHBseSB0YXNrIGVudmlyb25tZW50LCB0aGVuIHRoZSBzcGVjaWZpYyBlbnYgbGFzdFxuICAgIGVudiA9IHtcbiAgICAgIC4uLmVudixcbiAgICAgIC4uLih0aGlzLnRhc2suZW52ID8/IHt9KSxcbiAgICAgIC4uLmVudlBhcmFtLFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5ldmFsRW52aXJvbm1lbnQoZW52LCBzaGVsbCk7XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZXMgdGhlIHNoZWxsIGZvciBhIHN0ZXAncyBjb21tYW5kIChvciB0aGUgdGFzaydzLCB3aGVuIG5vIHN0ZXAgaXNcbiAgICogZ2l2ZW4pOiBzdGVwLCB0aGVuIHRhc2ssIHRoZW4gcHJvamVjdCBkZWZhdWx0LCB0aGVuIFwicHJvamVuXCIuXG4gICAqL1xuICBwcml2YXRlIHJlc29sdmVTaGVsbChzdGVwPzogVGFza1N0ZXApOiBzdHJpbmcgfCBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIChcbiAgICAgIHN0ZXA/LnNoZWxsID8/IHRoaXMudGFzay5zaGVsbCA/PyB0aGlzLnJ1bnRpbWUubWFuaWZlc3Quc2hlbGwgPz8gXCJwcm9qZW5cIlxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgXCJmdWxsIG5hbWVcIiBvZiB0aGUgdGFzayB3aGljaCBpbmNsdWRlcyBhbGwgaXQncyBwYXJlbnQgdGFzayBuYW1lcyBjb25jYXRlbmF0ZWQgYnkgY2hldnJvbnMuXG4gICAqL1xuICBwcml2YXRlIGdldCBmdWxsbmFtZSgpIHtcbiAgICByZXR1cm4gWy4uLnRoaXMucGFyZW50cywgdGhpcy50YXNrLm5hbWVdLmpvaW4oXCIgwrsgXCIpO1xuICB9XG5cbiAgcHJpdmF0ZSBsb2coLi4uYXJnczogYW55W10pIHtcbiAgICBsb2dnaW5nLnZlcmJvc2UodGhpcy5mbXRMb2coLi4uYXJncykpO1xuICB9XG5cbiAgcHJpdmF0ZSBsb2dEZWJ1ZyguLi5hcmdzOiBhbnlbXSkge1xuICAgIGxvZ2dpbmcuZGVidWcodGhpcy5mbXRMb2coLi4uYXJncykpO1xuICB9XG5cbiAgcHJpdmF0ZSBmbXRMb2coLi4uYXJnczogYW55W10pIHtcbiAgICByZXR1cm4gZm9ybWF0KGAke3VuZGVybGluZSh0aGlzLmZ1bGxuYW1lKX0gfGAsIC4uLmFyZ3MpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBzaGVsbChvcHRpb25zOiBTaGVsbE9wdGlvbnMpOiBQcm9taXNlPFNoZWxsUmVzdWx0PiB7XG4gICAgY29uc3QgcXVpZXQgPSBvcHRpb25zLnF1aWV0ID8/IGZhbHNlO1xuICAgIGlmICghcXVpZXQpIHtcbiAgICAgIGNvbnN0IGxvZyA9IG5ldyBBcnJheTxzdHJpbmc+KCk7XG5cbiAgICAgIGxvZy5wdXNoKFxuICAgICAgICBBcnJheS5pc0FycmF5KG9wdGlvbnMuY29tbWFuZClcbiAgICAgICAgICA/IG9wdGlvbnMuY29tbWFuZC5qb2luKFwiIFwiKVxuICAgICAgICAgIDogb3B0aW9ucy5jb21tYW5kLFxuICAgICAgKTtcblxuICAgICAgaWYgKG9wdGlvbnMuY3dkKSB7XG4gICAgICAgIGxvZy5wdXNoKGAoY3dkOiAke29wdGlvbnMuY3dkfSlgKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5sb2cobG9nLmpvaW4oXCIgXCIpKTtcbiAgICB9XG5cbiAgICBjb25zdCBjd2QgPSBvcHRpb25zLmN3ZCA/PyB0aGlzLndvcmtkaXI7XG4gICAgaWYgKCFleGlzdHNTeW5jKGN3ZCkgfHwgIXN0YXRTeW5jKGN3ZCkuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgaW52YWxpZCB3b3JrZGlyIChjd2QpOiAke2N3ZH0gbXVzdCBiZSBhbiBleGlzdGluZyBkaXJlY3RvcnlgLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBUaGUgcmVzb2x2ZWQgc2hlbGwgaXMgb25lIG9mOlxuICAgIC8vIC0gXCJwcm9qZW5cIiAoZGVmYXVsdCk6IGRheCdzIGluLXByb2Nlc3MgY3Jvc3MtcGxhdGZvcm0gc2hlbGwsIHNvIFBPU0lYLXN0eWxlXG4gICAgLy8gICB0YXNrIHN5bnRheCAoYG1rZGlyIC1wYCwgYCYmYCwgYCRWQVJgLCAuLi4pIHdvcmtzIHRoZSBzYW1lIGV2ZXJ5d2hlcmUuXG4gICAgLy8gLSBcInN5c3RlbVwiOiB0aGUgaG9zdCdzIG5hdGl2ZSBzaGVsbCAoYC9iaW4vc2hgLCBvciBgY21kLmV4ZWAgb24gV2luZG93cykuXG4gICAgLy8gLSBhbiBhcmd2LCBlLmcuIFtcImJhc2hcIixcIi1jXCJdOiBhIHNoZWxsIGludm9jYXRpb24gd2l0aCB0aGUgY29tbWFuZCBhcHBlbmRlZFxuICAgIC8vICAgYXMgaXRzIGZpbmFsIGFyZ3VtZW50LlxuICAgIGNvbnN0IHNoZWxsID0gb3B0aW9ucy5zaGVsbCA/PyBcInByb2plblwiO1xuICAgIGlmICh0eXBlb2Ygc2hlbGwgPT09IFwic3RyaW5nXCIgJiYgc2hlbGwgIT09IFwicHJvamVuXCIgJiYgc2hlbGwgIT09IFwic3lzdGVtXCIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYHVua25vd24gYnVpbHQtaW4gc2hlbGwgJHtKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICBzaGVsbCxcbiAgICAgICAgKX07IHVzZSB0aGUgYnVpbHQtaW4gXCJwcm9qZW5cIiBvciBcInN5c3RlbVwiIHNoZWxscywgb3IgYSBUYXNrU2hlbGwuY29tbWFuZChbLi4uXSkgaW52b2NhdGlvbmAsXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IGNhcHR1cmUgPSBvcHRpb25zLmNhcHR1cmVPdXRwdXQgPz8gZmFsc2U7XG4gICAgLy8gUXVpZXQgY2FwdHVyZXMgKGAkKC4uLilgLCBjb25kaXRpb25zKSBzdGF5IHNpbGVudDsgdmlzaWJsZSBjYXB0dXJlc1xuICAgIC8vIChgb3V0cHV0RW52YCkgc3RyZWFtIGxpdmUgd2hpbGUgc3RpbGwgYnVmZmVyaW5nLlxuICAgIGNvbnN0IHN0cmVhbSA9IGNhcHR1cmUgJiYgIXF1aWV0O1xuXG4gICAgY29uc3QgY29tbWFuZCA9IG9wdGlvbnMuY29tbWFuZDtcbiAgICBjb25zdCBlbnYgPSB7XG4gICAgICAuLi5wcm9jZXNzLmVudixcbiAgICAgIC4uLnRoaXMuZW52LFxuICAgICAgLi4ub3B0aW9ucy5leHRyYUVudixcbiAgICB9O1xuXG4gICAgLy8gXCJzeXN0ZW1cIjogdGhlIGhvc3QtbmF0aXZlIGVuZ2luZS4gQSBzdHJpbmcgY29tbWFuZCBydW5zIHRocm91Z2ggdGhlIE9TXG4gICAgLy8gc2hlbGw7IGFuIGBleGVjQXJnc2AgYXJndiBpcyBzcGF3bmVkIGRpcmVjdGx5IChzaGVsbC1mcmVlKSwgc28gdGhlIHJlYWxcbiAgICAvLyBiaW5hcnkgcnVucyB3aXRoIG5vIGRheCBidWlsdC1pbnMuIChPbmx5IGAkKC4uLilgL2NvbmRpdGlvbiBldmFsIGNhcHR1cmVzLFxuICAgIC8vIGFuZCB0aG9zZSBhbHdheXMgcGFzcyBhIHN0cmluZywgc28gYW4gYXJyYXkgY29tbWFuZCBuZXZlciBuZWVkcyBjYXB0dXJlLilcbiAgICBpZiAoc2hlbGwgPT09IFwic3lzdGVtXCIpIHtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGNvbW1hbmQpKSB7XG4gICAgICAgIGNvbnN0IFtwcm9ncmFtLCAuLi5hcmdzXSA9IGNvbW1hbmQ7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdG9vbChwcm9ncmFtKS5ydW4oYXJncywgeyBjd2QsIGVudiwgaW5oZXJpdFN0ZGlvOiB0cnVlIH0pO1xuICAgICAgICAgIHJldHVybiB7IHN0YXR1czogMCB9O1xuICAgICAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgICAgICBpZiAodHlwZW9mIGU/LnN0YXR1cyA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICAgICAgcmV0dXJuIHsgc3RhdHVzOiBlLnN0YXR1cyB9O1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gc3lzdGVtU2hlbGwoY29tbWFuZCwgeyBjd2QsIGVudiwgY2FwdHVyZSwgc3RyZWFtIH0pO1xuICAgIH1cblxuICAgIC8vIE90aGVyd2lzZSBydW4gdGhyb3VnaCBkYXg6IHRoZSBcInByb2plblwiIHNoZWxsIG9yIGFuIGV4cGxpY2l0IGludm9jYXRpb24uXG4gICAgY29uc3QgYnVpbGRlciA9IHRoaXMuYnVpbGREYXhDb21tYW5kKGNvbW1hbmQsIHNoZWxsKTtcblxuICAgIC8vIGBpbmhlcml0UGlwZWRgIHN0cmVhbXMgYW5kIGJ1ZmZlcnM7IGBwaXBlZGAgYnVmZmVycyBxdWlldGx5LiBzdGRlcnIgaXNcbiAgICAvLyBidWZmZXJlZCBvbmx5IGZvciBxdWlldCBjYXB0dXJlcywgc28gaXQgY2FuIHN1cmZhY2UgaW4gZXJyb3JzLlxuICAgIGNvbnN0IHN0ZG91dE1vZGUgPSBjYXB0dXJlXG4gICAgICA/IHN0cmVhbVxuICAgICAgICA/IFwiaW5oZXJpdFBpcGVkXCJcbiAgICAgICAgOiBcInBpcGVkXCJcbiAgICAgIDogXCJpbmhlcml0XCI7XG4gICAgY29uc3Qgc3RkZXJyTW9kZSA9IGNhcHR1cmUgJiYgIXN0cmVhbSA/IFwicGlwZWRcIiA6IFwiaW5oZXJpdFwiO1xuXG4gICAgbGV0IHJlc3VsdDtcbiAgICB0cnkge1xuICAgICAgcmVzdWx0ID0gYXdhaXQgYnVpbGRlclxuICAgICAgICAuY3dkKGN3ZClcbiAgICAgICAgLmVudihlbnYpXG4gICAgICAgIC5zdGRvdXQoc3Rkb3V0TW9kZSlcbiAgICAgICAgLnN0ZGVycihzdGRlcnJNb2RlKVxuICAgICAgICAubm9UaHJvdygpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIGRheCdzIGluLXByb2Nlc3Mgc2hlbGwgdGhyb3dzIGEgdGVyc2UgYE5vdCBpbXBsZW1lbnRlZDogLi4uYCBmb3Igc2hlbGxcbiAgICAgIC8vIHN5bnRheCBpdCBkb2VzIG5vdCBzdXBwb3J0IChlLmcuIGAkKC4uLilgIGNvbW1hbmQgc3Vic3RpdHV0aW9uKTsgdHVyblxuICAgICAgLy8gdGhhdCBpbnRvIGFuIGFjdGlvbmFibGUgZXJyb3IgdGhhdCBwb2ludHMgYXQgdGhlIHN5c3RlbS1zaGVsbCBlc2NhcGVcbiAgICAgIC8vIGhhdGNoLiBPdGhlciBlcnJvcnMgcGFzcyB0aHJvdWdoIHVuY2hhbmdlZC5cbiAgICAgIHRocm93IGVucmljaEJ1aWx0aW5TaGVsbEVycm9yKGUsIGNvbW1hbmQpO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBzdGF0dXM6IHJlc3VsdC5jb2RlLFxuICAgICAgc3Rkb3V0OiBjYXB0dXJlID8gQnVmZmVyLmZyb20ocmVzdWx0LnN0ZG91dEJ5dGVzKSA6IG51bGwsXG4gICAgICBzdGRlcnI6IGNhcHR1cmUgJiYgIXN0cmVhbSA/IEJ1ZmZlci5mcm9tKHJlc3VsdC5zdGRlcnJCeXRlcykgOiBudWxsLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzIHRoZSBkYXggY29tbWFuZCBmb3IgdGhlIFwicHJvamVuXCIgc2hlbGwgb3IgYW4gZXhwbGljaXQgaW52b2NhdGlvbi5cbiAgICogKFRoZSBcInN5c3RlbVwiIHNoZWxsIGlzIGhhbmRsZWQgaG9zdC1zaWRlLCBub3QgaGVyZS4pIGBjb21tYW5kYCBpcyBhIHNoZWxsXG4gICAqIGxpbmUgKHN0cmluZykgb3IgYW4gYGV4ZWNBcmdzYCBhcmd2IChzdHJpbmdbXSk7IGBzaGVsbGAgaXMgYFwicHJvamVuXCJgIG9yIGFuXG4gICAqIGludm9jYXRpb24gYXJndiBzdWNoIGFzIGBbXCJiYXNoXCIsIFwiLWNcIl1gLlxuICAgKi9cbiAgcHJpdmF0ZSBidWlsZERheENvbW1hbmQoXG4gICAgY29tbWFuZDogc3RyaW5nIHwgc3RyaW5nW10sXG4gICAgc2hlbGw6IHN0cmluZyB8IHN0cmluZ1tdLFxuICApIHtcbiAgICAvLyBBbiBpbnZvY2F0aW9uIChlLmcuIFtcImJhc2hcIixcIi1jXCJdLCBbXCJucHhcIixcIi0tbm9cIixcIi1jXCJdKTogYXBwZW5kIHRoZVxuICAgIC8vIGNvbW1hbmQgYXMgaXRzIGZpbmFsIGFyZ3VtZW50LiBBIHN0cmluZyBpcyBhcHBlbmRlZCBhcy1pczsgYW4gYGV4ZWNBcmdzYFxuICAgIC8vIGFyZ3YgaXMgcmVuZGVyZWQgdG8gYSBxdW90ZWQgY29tbWFuZCBsaW5lIHNvIHRoZSBzaGVsbCByZS1wYXJzZXMgdGhlIHNhbWVcbiAgICAvLyBhcmd2LlxuICAgIGlmIChBcnJheS5pc0FycmF5KHNoZWxsKSkge1xuICAgICAgY29uc3QgW3Byb2dyYW0sIC4uLmZsYWdzXSA9IHNoZWxsO1xuICAgICAgY29uc3QgY29tbWFuZExpbmUgPSBBcnJheS5pc0FycmF5KGNvbW1hbmQpXG4gICAgICAgID8gY29tbWFuZC5tYXAocXVvdGVBcmcpLmpvaW4oXCIgXCIpXG4gICAgICAgIDogY29tbWFuZDtcbiAgICAgIHJldHVybiAkYCR7cHJvZ3JhbX0gJHtbLi4uZmxhZ3MsIGNvbW1hbmRMaW5lXX1gO1xuICAgIH1cblxuICAgIC8vIFRoZSBidWlsdC1pbiBcInByb2plblwiIHNoZWxsIChkYXgpLlxuICAgIHJldHVybiBBcnJheS5pc0FycmF5KGNvbW1hbmQpXG4gICAgICA/IC8vIGV4ZWNBcmdzOiBzaGVsbC1mcmVlIGFyZ3YgKGVhY2ggZWxlbWVudCBlc2NhcGVkOyBgLmNtZGAgc2hpbXMgcmVzb2x2ZWQpLlxuICAgICAgICAkYCR7Y29tbWFuZFswXX0gJHtjb21tYW5kLnNsaWNlKDEpfWBcbiAgICAgIDogLy8gc3RyaW5nIGNvbW1hbmQsIHBhcnNlZCBpbi1wcm9jZXNzIGJ5IGRheCdzIGNyb3NzLXBsYXRmb3JtIHNoZWxsLlxuICAgICAgICAkLnJhd2Ake2NvbW1hbmR9YDtcbiAgfVxuXG4gIHByaXZhdGUgcmVuZGVyQnVpbHRpbihidWlsdGluOiBzdHJpbmcpIHtcbiAgICAvLyBMb2NhdGUgcHJvamVuJ3MgcGFja2FnZSByb290IGJ5IHdhbGtpbmcgdXAgZnJvbSB0aGlzIG1vZHVsZSdzIGRpcmVjdG9yeVxuICAgIC8vIHVudGlsIHdlIGZpbmQgYSBwYWNrYWdlLmpzb24uIFRoaXMgd29ya3Mgd2hldGhlciB0aGUgY29kZSBydW5zIGZyb20gdGhlXG4gICAgLy8gY29tcGlsZWQgZmlsZSAobGliL2NsaS90YXNrLXJ1bnRpbWUuanMpIG9yIGZyb20gdGhlIGJ1bmRsZWQgcnVuLXRhc2suY2pzXG4gICAgLy8gKGxpYi9ydW4tdGFzay5janMpLCB3aGljaCBsaXZlIGF0IGRpZmZlcmVudCBkZXB0aHMgLSBzbyBhIGhhcmQtY29kZWRcbiAgICAvLyByZWxhdGl2ZSBwYXRoIHRvIHBhY2thZ2UuanNvbiB3b3VsZCBiZSB3cm9uZyBpbiBvbmUgb2YgdGhlIHR3byBjYXNlcy5cbiAgICBsZXQgbW9kdWxlUm9vdCA9IF9fZGlybmFtZTtcbiAgICB3aGlsZSAoIWV4aXN0c1N5bmMoam9pbihtb2R1bGVSb290LCBcInBhY2thZ2UuanNvblwiKSkpIHtcbiAgICAgIGNvbnN0IHBhcmVudCA9IGRpcm5hbWUobW9kdWxlUm9vdCk7XG4gICAgICBpZiAocGFyZW50ID09PSBtb2R1bGVSb290KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcInVuYWJsZSB0byBsb2NhdGUgdGhlIHByb2plbiBwYWNrYWdlIHJvb3RcIik7XG4gICAgICB9XG4gICAgICBtb2R1bGVSb290ID0gcGFyZW50O1xuICAgIH1cbiAgICBjb25zdCBwcm9ncmFtID0gcmVxdWlyZS5yZXNvbHZlKFxuICAgICAgam9pbihtb2R1bGVSb290LCBcImxpYlwiLCBgJHtidWlsdGlufS50YXNrLmpzYCksXG4gICAgKTtcbiAgICByZXR1cm4gYFwiJHtwcm9jZXNzLmV4ZWNQYXRofVwiIFwiJHtwcm9ncmFtfVwiYDtcbiAgfVxufVxuXG5pbnRlcmZhY2UgU2hlbGxPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSBjb21tYW5kIHRvIHJ1bi4gQSBzdHJpbmcgaXMgZXhlY3V0ZWQgYXMgYSBzaGVsbCBjb21tYW5kIGxpbmU7IGFcbiAgICogc3RyaW5nIGFycmF5IGlzIGFuIGV4cGxpY2l0IGFyZ3YgKHByb2dyYW0gKyBhcmd1bWVudHMpIGV4ZWN1dGVkIHdpdGhvdXQgYVxuICAgKiBzaGVsbC5cbiAgICovXG4gIHJlYWRvbmx5IGNvbW1hbmQ6IHN0cmluZyB8IHN0cmluZ1tdO1xuICAvKipcbiAgICogQGRlZmF1bHQgLSBwcm9qZWN0IGRpclxuICAgKi9cbiAgcmVhZG9ubHkgY3dkPzogc3RyaW5nO1xuICAvKipcbiAgICogQ2FwdHVyZSBzdGRvdXQvc3RkZXJyIChzbyB0aGUgY2FsbGVyIGNhbiByZWFkIHRoZW0gZnJvbSB0aGUgcmVzdWx0KVxuICAgKiBpbnN0ZWFkIG9mIGluaGVyaXRpbmcgdGhlIHBhcmVudCdzIHN0cmVhbXMuXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBjYXB0dXJlT3V0cHV0PzogYm9vbGVhbjtcbiAgLyoqIEBkZWZhdWx0IGZhbHNlICovXG4gIHJlYWRvbmx5IHF1aWV0PzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgZXh0cmFFbnY/OiB7IFtuYW1lOiBzdHJpbmddOiBzdHJpbmcgfCB1bmRlZmluZWQgfTtcbiAgLyoqXG4gICAqIFRoZSByZXNvbHZlZCBzaGVsbCB0byBpbnRlcnByZXQgdGhlIGNvbW1hbmQgKGUuZy4gXCJwcm9qZW5cIiwgXCJiYXNoIC1jXCIpLlxuICAgKiBAZGVmYXVsdCBcInByb2plblwiXG4gICAqL1xuICByZWFkb25seSBzaGVsbD86IHN0cmluZyB8IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIE5vcm1hbGl6ZWQgcmVzdWx0IG9mIHJ1bm5pbmcgYSBjb21tYW5kIHRocm91Z2ggdGhlIHN5c3RlbSBzaGVsbCAoYSBzdWJzZXQgb2ZcbiAqIG5vZGUncyBgU3Bhd25TeW5jUmV0dXJuc2ApLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN5c3RlbVNoZWxsUmVzdWx0IHtcbiAgLyoqIEV4aXQgY29kZSwgb3IgYG51bGxgIGlmIHRlcm1pbmF0ZWQgYnkgYSBzaWduYWwgb3IgbmV2ZXIgc3Bhd25lZC4gKi9cbiAgcmVhZG9ubHkgc3RhdHVzOiBudW1iZXIgfCBudWxsO1xuICAvKiogQ2FwdHVyZWQgc3Rkb3V0LCBvciBgbnVsbGAgd2hlbiBzdGRvdXQgd2FzIGluaGVyaXRlZC4gKi9cbiAgcmVhZG9ubHkgc3Rkb3V0OiBCdWZmZXIgfCBudWxsO1xuICAvKiogQ2FwdHVyZWQgc3RkZXJyLCBvciBgbnVsbGAgd2hlbiBzdGRlcnIgd2FzIGluaGVyaXRlZC4gKi9cbiAgcmVhZG9ubHkgc3RkZXJyOiBCdWZmZXIgfCBudWxsO1xuICAvKiogQW4gZXJyb3IgcmFpc2VkIHdoaWxlIGF0dGVtcHRpbmcgdG8gc3Bhd24gKG5vdCBhIG5vbi16ZXJvIGV4aXQpLiAqL1xuICByZWFkb25seSBlcnJvcj86IEVycm9yO1xufVxuXG4vKipcbiAqIFJ1bnMgYSBjb21tYW5kIGxpbmUgdGhyb3VnaCB0aGUgb3BlcmF0aW5nIHN5c3RlbSdzIG5hdGl2ZSBzaGVsbC5cbiAqXG4gKiBDYWxscyB0aGUgT1Mgc2hlbGwgdmlhIGBjaGlsZF9wcm9jZXNzYCB3aXRoIGBzaGVsbDogdHJ1ZWAuXG4gKiBUaGlzIGJhY2tzIHRoZSBgc3lzdGVtYCB0YXNrIHNoZWxsLCB3aGljaCBsZXRzIGEgdXNlciBvcHQgb3V0IG9mIHRoZSBidWlsdC1pblxuICogY3Jvc3MtcGxhdGZvcm0gc2hlbGwgYW5kIHVzZSB0aGUgaG9zdCdzIG5hdGl2ZSBzaGVsbCBpbnN0ZWFkOlxuICogYC9iaW4vc2hgb24gUE9TSVggYW5kIGBjbWQuZXhlYCBvbiBXaW5kb3dzLlxuICpcbiAqIE5ldmVyIHRocm93cyBmb3IgYSBub24temVybyBleGl0ICh0aGF0IGlzIHJlcG9ydGVkIHZpYSBgc3RhdHVzYCk7XG4gKiBhIHNwYXduIGZhaWx1cmUgaXMgcmVwb3J0ZWQgdmlhIGBlcnJvcmAuIFRoZSBjYWxsZXIgc3VwcGxpZXMgdGhlIGZ1bGwgYGVudmAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzeXN0ZW1TaGVsbChcbiAgY29tbWFuZDogc3RyaW5nLFxuICBvcHRpb25zOiB7XG4gICAgY3dkOiBzdHJpbmc7XG4gICAgZW52PzogTm9kZUpTLlByb2Nlc3NFbnY7XG4gICAgY2FwdHVyZT86IGJvb2xlYW47XG4gICAgc3RyZWFtPzogYm9vbGVhbjtcbiAgfSxcbik6IFN5c3RlbVNoZWxsUmVzdWx0IHtcbiAgbG9nZ2luZy5kZWJ1ZyhgJHtjb21tYW5kfSAoY3dkOiAke29wdGlvbnMuY3dkfSlgKTtcbiAgY29uc3QgcmVzdWx0ID0gY2hpbGRfcHJvY2Vzcy5zcGF3blN5bmMoY29tbWFuZCwge1xuICAgIGN3ZDogb3B0aW9ucy5jd2QsXG4gICAgc2hlbGw6IHRydWUsXG4gICAgbWF4QnVmZmVyOiBNQVhfQlVGRkVSLFxuICAgIGVudjogb3B0aW9ucy5lbnYsXG4gICAgLy8gUXVpZXQgY2FwdHVyZSBidWZmZXJzIHN0ZGVyciBmb3IgZXJyb3IgbWVzc2FnZXMuIFN0cmVhbWVkIGNhcHR1cmVcbiAgICAvLyBpbmhlcml0cyBzdGRlcnIgYW5kIHJlLWVtaXRzIGJ1ZmZlcmVkIHN0ZG91dCBhZnRlcndhcmRzLCBzaW5jZSBzcGF3blN5bmNcbiAgICAvLyBjYW4ndCBib3RoIHNob3cgYW5kIGJ1ZmZlciB0aGUgc2FtZSBzdHJlYW0gYXQgb25jZS5cbiAgICBzdGRpbzogb3B0aW9ucy5jYXB0dXJlXG4gICAgICA/IG9wdGlvbnMuc3RyZWFtXG4gICAgICAgID8gW1wiaW5oZXJpdFwiLCBcInBpcGVcIiwgXCJpbmhlcml0XCJdXG4gICAgICAgIDogW1wiaW5oZXJpdFwiLCBcInBpcGVcIiwgXCJwaXBlXCJdXG4gICAgICA6IFwiaW5oZXJpdFwiLFxuICB9KTtcbiAgaWYgKG9wdGlvbnMuY2FwdHVyZSAmJiBvcHRpb25zLnN0cmVhbSAmJiByZXN1bHQuc3Rkb3V0KSB7XG4gICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUocmVzdWx0LnN0ZG91dCk7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBzdGF0dXM6IHJlc3VsdC5zdGF0dXMsXG4gICAgc3Rkb3V0OiByZXN1bHQuc3Rkb3V0ID8/IG51bGwsXG4gICAgc3RkZXJyOiByZXN1bHQuc3RkZXJyID8/IG51bGwsXG4gICAgZXJyb3I6IHJlc3VsdC5lcnJvcixcbiAgfTtcbn1cbiJdfQ==
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
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.101.26" };
19
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.Component", version: "0.101.28" };
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.101.26" };
178
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.FutureComponent", version: "0.101.28" };
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.101.26" };
54
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.Dependencies", version: "0.101.28" };
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.101.26" };
9
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.DevEnvironmentDockerImage", version: "0.101.28" };
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.101.26" };
10
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.DockerComposeService", version: "0.101.28" };
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.101.26" };
14
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.DockerCompose", version: "0.101.28" };
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.101.26" };
48
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.FileBase", version: "0.101.28" };
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.101.26" };
35
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.GitAttributesFile", version: "0.101.28" };
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.101.26" };
9
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.github.GitHubActionsProvider", version: "0.101.28" };
10
10
  actions = new Map();
11
11
  /**
12
12
  * Define an override for a given action.
@@ -9,7 +9,7 @@ const runner_options_1 = require("../runner-options");
9
9
  * Auto approve pull requests that meet a criteria
10
10
  */
11
11
  class AutoApprove extends component_1.Component {
12
- static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.github.AutoApprove", version: "0.101.26" };
12
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.github.AutoApprove", version: "0.101.28" };
13
13
  label;
14
14
  constructor(github, options = {}) {
15
15
  super(github.project);
@@ -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.101.26" };
22
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.github.AutoMerge", version: "0.101.28" };
23
23
  lazyConditions = new Array();
24
24
  constructor(github, options = {}) {
25
25
  super(github.project);
@@ -54,7 +54,7 @@ var MergeMethod;
54
54
  * PRs will be merged once they pass required checks.
55
55
  */
56
56
  class AutoQueue extends component_1.Component {
57
- static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.github.AutoQueue", version: "0.101.26" };
57
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.github.AutoQueue", version: "0.101.28" };
58
58
  constructor(scope, options = {}) {
59
59
  super(scope);
60
60
  const workflowEngine = github_1.GitHub.of(this.project);
@@ -166,7 +166,7 @@ var VersioningStrategy;
166
166
  * on the lockfile itself will be proposed.
167
167
  */
168
168
  class Dependabot extends component_1.Component {
169
- static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.github.Dependabot", version: "0.101.26" };
169
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.github.Dependabot", version: "0.101.28" };
170
170
  /**
171
171
  * The raw dependabot configuration.
172
172
  * @see https://docs.github.com/en/github/administering-a-repository/configuration-options-for-dependency-updates
@@ -15,7 +15,7 @@ const runner_options_1 = require("../runner-options");
15
15
  * @see https://github.com/actions/dependency-review-action
16
16
  */
17
17
  class DependencyReview extends component_1.Component {
18
- static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.github.DependencyReview", version: "0.101.26" };
18
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.github.DependencyReview", version: "0.101.28" };
19
19
  constructor(github, options = {}) {
20
20
  super(github.project);
21
21
  const commentSummary = options.commentSummaryInPr ?? "always";
@@ -41,7 +41,7 @@ const Case = __importStar(require("case"));
41
41
  */
42
42
  class GithubCredentials {
43
43
  options;
44
- static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.github.GithubCredentials", version: "0.101.26" };
44
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.github.GithubCredentials", version: "0.101.28" };
45
45
  /**
46
46
  * Provide API access through a GitHub personal access token.
47
47
  *
@@ -21,7 +21,7 @@ const vscode_1 = require("../vscode");
21
21
  * "engines" can be used to implement our CI/CD solutions.
22
22
  */
23
23
  class GitHubProject extends project_1.Project {
24
- static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.github.GitHubProject", version: "0.101.26" };
24
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.github.GitHubProject", version: "0.101.28" };
25
25
  /**
26
26
  * Access all github components.
27
27
  *
@@ -15,7 +15,7 @@ const workflow_steps_1 = require("./workflow-steps");
15
15
  const workflows_1 = require("./workflows");
16
16
  const component_1 = require("../component");
17
17
  class GitHub extends component_1.Component {
18
- static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.github.GitHub", version: "0.101.26" };
18
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.github.GitHub", version: "0.101.28" };
19
19
  /**
20
20
  * Returns the `GitHub` component of a project or `undefined` if the project
21
21
  * does not have a GitHub component.
@@ -10,7 +10,7 @@ const github_1 = require("./github");
10
10
  */
11
11
  class MergeQueue extends component_1.Component {
12
12
  options;
13
- static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.github.MergeQueue", version: "0.101.26" };
13
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.github.MergeQueue", version: "0.101.28" };
14
14
  constructor(scope, options = {}) {
15
15
  super(scope);
16
16
  this.options = options;
@@ -6,7 +6,7 @@ const component_1 = require("../component");
6
6
  const util_1 = require("../util");
7
7
  const yaml_1 = require("../yaml");
8
8
  class Mergify extends component_1.Component {
9
- static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.github.Mergify", version: "0.101.26" };
9
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.github.Mergify", version: "0.101.28" };
10
10
  rules = new Array();
11
11
  queues = new Array();
12
12
  // The actual YAML file will only be created if at least 1 rule is added.
@@ -7,7 +7,7 @@ const textfile_1 = require("../textfile");
7
7
  * Template for GitHub pull requests.
8
8
  */
9
9
  class PullRequestTemplate extends textfile_1.TextFile {
10
- static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.github.PullRequestTemplate", version: "0.101.26" };
10
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.github.PullRequestTemplate", version: "0.101.28" };
11
11
  /**
12
12
  * Returns the `PullRequestTemplate` instance associated with a project or `undefined` if
13
13
  * there is no PullRequestTemplate.
@@ -9,7 +9,7 @@ const component_1 = require("../component");
9
9
  const json_1 = require("../json");
10
10
  const release_1 = require("../release");
11
11
  class PullRequestBackport extends component_1.Component {
12
- static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.github.PullRequestBackport", version: "0.101.26" };
12
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.github.PullRequestBackport", version: "0.101.28" };
13
13
  file;
14
14
  workflow;
15
15
  constructor(scope, options = {}) {
@@ -13,7 +13,7 @@ const runner_options_1 = require("../runner-options");
13
13
  class PullRequestLint extends component_1.Component {
14
14
  github;
15
15
  options;
16
- static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.github.PullRequestLint", version: "0.101.26" };
16
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.github.PullRequestLint", version: "0.101.28" };
17
17
  constructor(github, options = {}) {
18
18
  super(github.project);
19
19
  this.github = github;
@@ -18,7 +18,7 @@ const runner_options_1 = require("../runner-options");
18
18
  * @see https://github.com/actions/stale
19
19
  */
20
20
  class Stale extends component_1.Component {
21
- static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.github.Stale", version: "0.101.26" };
21
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.github.Stale", version: "0.101.28" };
22
22
  constructor(github, options = {}) {
23
23
  super(github.project);
24
24
  const stale = github.addWorkflow("stale");
@@ -13,7 +13,7 @@ const util_1 = require("./private/util");
13
13
  * @implements {Job}
14
14
  */
15
15
  class TaskWorkflowJob extends component_1.Component {
16
- static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.github.TaskWorkflowJob", version: "0.101.26" };
16
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.github.TaskWorkflowJob", version: "0.101.28" };
17
17
  runsOn;
18
18
  runsOnGroup;
19
19
  steps;
@@ -9,7 +9,7 @@ const DEFAULT_JOB_ID = "build";
9
9
  * A GitHub workflow for common build tasks within a project.
10
10
  */
11
11
  class TaskWorkflow extends workflows_1.GithubWorkflow {
12
- static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.github.TaskWorkflow", version: "0.101.26" };
12
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.github.TaskWorkflow", version: "0.101.28" };
13
13
  jobId;
14
14
  artifactsDirectory;
15
15
  constructor(github, options) {
@@ -15,7 +15,7 @@ const RUNNER_TEMP = "${{ runner.temp }}";
15
15
  * A set of utility functions for creating GitHub actions in workflows.
16
16
  */
17
17
  class WorkflowActions {
18
- static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.github.WorkflowActions", version: "0.101.26" };
18
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.github.WorkflowActions", version: "0.101.28" };
19
19
  /**
20
20
  * Creates a .patch file from the current git diff and uploads it as an
21
21
  * artifact. Use `checkoutWithPatch` to download and apply in another job.
@@ -10,7 +10,7 @@ const runner_options_1 = require("../runner-options");
10
10
  * A set of utility functions for creating jobs in GitHub Workflows.
11
11
  */
12
12
  class WorkflowJobs {
13
- static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.github.WorkflowJobs", version: "0.101.26" };
13
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.github.WorkflowJobs", version: "0.101.28" };
14
14
  /**
15
15
  * Creates a pull request with the changes of a patch file.
16
16
  *
@@ -25,7 +25,7 @@ var CheckoutSubmodules;
25
25
  * A collection of very commonly used, individual, GitHub Workflow Job steps.
26
26
  */
27
27
  class WorkflowSteps {
28
- static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.github.WorkflowSteps", version: "0.101.26" };
28
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.github.WorkflowSteps", version: "0.101.28" };
29
29
  /**
30
30
  * Checks out a repository.
31
31
  *
@@ -17,7 +17,7 @@ const yaml_1 = require("../yaml");
17
17
  * @see https://docs.github.com/en/actions/reference/workflow-syntax-for-github-actions
18
18
  */
19
19
  class GithubWorkflow extends component_1.Component {
20
- static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.github.GithubWorkflow", version: "0.101.26" };
20
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.github.GithubWorkflow", version: "0.101.28" };
21
21
  /**
22
22
  * The name of the workflow. GitHub displays the names of your workflows under your repository's
23
23
  * "Actions" tab.
@@ -45,7 +45,7 @@ const yaml_1 = require("../yaml");
45
45
  * @see https://docs.gitlab.com/ee/ci/yaml/
46
46
  */
47
47
  class CiConfiguration extends component_1.Component {
48
- static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.gitlab.CiConfiguration", version: "0.101.26" };
48
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.gitlab.CiConfiguration", version: "0.101.28" };
49
49
  /**
50
50
  * The name of the configuration.
51
51
  */