projen 0.99.48 → 0.99.49

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 (142) hide show
  1. package/.jsii +142 -142
  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 +2 -2
  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 +4 -4
  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-docgen.js +1 -1
  22. package/lib/cdk/jsii-project.js +1 -1
  23. package/lib/cdk8s/auto-discover.js +2 -2
  24. package/lib/cdk8s/cdk8s-app-py.js +1 -1
  25. package/lib/cdk8s/cdk8s-app-ts.js +1 -1
  26. package/lib/cdk8s/cdk8s-construct.js +1 -1
  27. package/lib/cdk8s/cdk8s-deps-py.js +1 -1
  28. package/lib/cdk8s/cdk8s-deps.js +1 -1
  29. package/lib/cdk8s/integration-test.js +1 -1
  30. package/lib/cdktf/cdktf-construct.js +1 -1
  31. package/lib/circleci/circleci.js +1 -1
  32. package/lib/component.js +1 -1
  33. package/lib/dependencies.js +1 -1
  34. package/lib/dev-env.js +1 -1
  35. package/lib/docker-compose/docker-compose-service.js +1 -1
  36. package/lib/docker-compose/docker-compose.js +1 -1
  37. package/lib/file.js +1 -1
  38. package/lib/gitattributes.js +1 -1
  39. package/lib/github/actions-provider.js +1 -1
  40. package/lib/github/auto-approve.js +1 -1
  41. package/lib/github/auto-merge.js +1 -1
  42. package/lib/github/auto-queue.js +1 -1
  43. package/lib/github/dependabot.js +1 -1
  44. package/lib/github/github-credentials.js +1 -1
  45. package/lib/github/github-project.js +1 -1
  46. package/lib/github/github.js +1 -1
  47. package/lib/github/merge-queue.js +1 -1
  48. package/lib/github/mergify.js +1 -1
  49. package/lib/github/pr-template.js +1 -1
  50. package/lib/github/pull-request-backport.js +1 -1
  51. package/lib/github/pull-request-lint.js +1 -1
  52. package/lib/github/stale.js +1 -1
  53. package/lib/github/task-workflow-job.js +1 -1
  54. package/lib/github/task-workflow.js +1 -1
  55. package/lib/github/workflow-actions.js +1 -1
  56. package/lib/github/workflow-jobs.js +1 -1
  57. package/lib/github/workflow-steps.js +1 -1
  58. package/lib/github/workflows.js +1 -1
  59. package/lib/gitlab/configuration.js +1 -1
  60. package/lib/gitlab/gitlab-configuration.js +1 -1
  61. package/lib/gitlab/nested-configuration.js +1 -1
  62. package/lib/gitpod.js +1 -1
  63. package/lib/ignore-file.js +1 -1
  64. package/lib/ini.js +1 -1
  65. package/lib/java/java-project.js +1 -1
  66. package/lib/java/junit.js +1 -1
  67. package/lib/java/maven-compile.js +1 -1
  68. package/lib/java/maven-packaging.js +1 -1
  69. package/lib/java/maven-sample.js +1 -1
  70. package/lib/java/pom.js +2 -2
  71. package/lib/java/projenrc.js +1 -1
  72. package/lib/javascript/biome/biome.js +1 -1
  73. package/lib/javascript/bundler.js +1 -1
  74. package/lib/javascript/eslint.js +1 -1
  75. package/lib/javascript/jest.js +4 -4
  76. package/lib/javascript/license-checker.js +1 -1
  77. package/lib/javascript/node-package.js +1 -1
  78. package/lib/javascript/node-project.js +6 -5
  79. package/lib/javascript/npm-config.js +1 -1
  80. package/lib/javascript/prettier.js +1 -1
  81. package/lib/javascript/projenrc.js +1 -1
  82. package/lib/javascript/typescript-config.js +2 -2
  83. package/lib/javascript/upgrade-dependencies.js +4 -19
  84. package/lib/javascript/util.d.ts +5 -0
  85. package/lib/javascript/util.js +22 -1
  86. package/lib/javascript/yarnrc.js +1 -1
  87. package/lib/json-patch.js +1 -1
  88. package/lib/json.js +1 -1
  89. package/lib/license.js +1 -1
  90. package/lib/logger.js +1 -1
  91. package/lib/makefile.js +1 -1
  92. package/lib/object-file.js +1 -1
  93. package/lib/project-build.js +1 -1
  94. package/lib/project-tree.js +1 -1
  95. package/lib/project.js +1 -1
  96. package/lib/projects.js +1 -1
  97. package/lib/projenrc-json.js +2 -2
  98. package/lib/projenrc.js +1 -1
  99. package/lib/python/pip.js +1 -1
  100. package/lib/python/poetry.js +2 -2
  101. package/lib/python/projenrc.js +1 -1
  102. package/lib/python/pyproject-toml-file.js +1 -1
  103. package/lib/python/pytest-sample.js +1 -1
  104. package/lib/python/pytest.js +1 -1
  105. package/lib/python/python-project.js +1 -1
  106. package/lib/python/python-sample.js +1 -1
  107. package/lib/python/requirements-file.js +1 -1
  108. package/lib/python/setuppy.js +1 -1
  109. package/lib/python/setuptools.js +1 -1
  110. package/lib/python/uv.js +1 -1
  111. package/lib/python/venv.js +1 -1
  112. package/lib/readme.js +1 -1
  113. package/lib/release/publisher.js +1 -1
  114. package/lib/release/release-trigger.js +1 -1
  115. package/lib/release/release.js +1 -1
  116. package/lib/renovatebot.js +1 -1
  117. package/lib/sample-file.js +2 -2
  118. package/lib/semver.js +1 -1
  119. package/lib/source-code.js +1 -1
  120. package/lib/task-runtime.js +1 -1
  121. package/lib/task.js +1 -1
  122. package/lib/tasks.js +1 -1
  123. package/lib/testing.js +1 -1
  124. package/lib/textfile.js +1 -1
  125. package/lib/toml.js +1 -1
  126. package/lib/typescript/projenrc-ts.js +1 -1
  127. package/lib/typescript/projenrc.js +1 -1
  128. package/lib/typescript/typescript-typedoc.js +1 -1
  129. package/lib/typescript/typescript.js +6 -6
  130. package/lib/version.js +2 -2
  131. package/lib/vscode/devcontainer.js +1 -1
  132. package/lib/vscode/extensions.js +1 -1
  133. package/lib/vscode/launch-config.js +1 -1
  134. package/lib/vscode/settings.js +1 -1
  135. package/lib/vscode/vscode.js +1 -1
  136. package/lib/web/next.js +3 -3
  137. package/lib/web/postcss.js +1 -1
  138. package/lib/web/react.js +4 -4
  139. package/lib/web/tailwind.js +1 -1
  140. package/lib/xmlfile.js +1 -1
  141. package/lib/yaml.js +1 -1
  142. package/package.json +1 -1
@@ -170,7 +170,7 @@ class TypescriptConfigExtends {
170
170
  }
171
171
  exports.TypescriptConfigExtends = TypescriptConfigExtends;
172
172
  _a = JSII_RTTI_SYMBOL_1;
173
- TypescriptConfigExtends[_a] = { fqn: "projen.javascript.TypescriptConfigExtends", version: "0.99.48" };
173
+ TypescriptConfigExtends[_a] = { fqn: "projen.javascript.TypescriptConfigExtends", version: "0.99.49" };
174
174
  class TypescriptConfig extends component_1.Component {
175
175
  constructor(project, options) {
176
176
  super(project);
@@ -333,5 +333,5 @@ class TypescriptConfig extends component_1.Component {
333
333
  }
334
334
  exports.TypescriptConfig = TypescriptConfig;
335
335
  _b = JSII_RTTI_SYMBOL_1;
336
- TypescriptConfig[_b] = { fqn: "projen.javascript.TypescriptConfig", version: "0.99.48" };
336
+ TypescriptConfig[_b] = { fqn: "projen.javascript.TypescriptConfig", version: "0.99.49" };
337
337
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXNjcmlwdC1jb25maWcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvamF2YXNjcmlwdC90eXBlc2NyaXB0LWNvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLDZCQUE2QjtBQUM3QixpQ0FBaUM7QUFDakMsd0JBQWdDO0FBQ2hDLDRDQUF5QztBQUN6QyxrQ0FBbUM7QUFFbkMsa0NBQWlEO0FBdUNqRDs7OztHQUlHO0FBQ0gsSUFBWSwwQkE2Q1g7QUE3Q0QsV0FBWSwwQkFBMEI7SUFDcEM7Ozs7T0FJRztJQUNILGlEQUFtQixDQUFBO0lBRW5COzs7O09BSUc7SUFDSCwyQ0FBYSxDQUFBO0lBRWI7Ozs7Ozs7T0FPRztJQUNILCtDQUFpQixDQUFBO0lBRWpCOzs7O09BSUc7SUFDSCwrQ0FBaUIsQ0FBQTtJQUVqQjs7OztPQUlHO0lBQ0gsb0RBQXNCLENBQUE7SUFFdEI7Ozs7T0FJRztJQUNILGlEQUFtQixDQUFBO0FBQ3JCLENBQUMsRUE3Q1csMEJBQTBCLDBDQUExQiwwQkFBMEIsUUE2Q3JDO0FBRUQ7Ozs7R0FJRztBQUNILElBQVkseUJBcUJYO0FBckJELFdBQVkseUJBQXlCO0lBQ25DOzs7O09BSUc7SUFDSCwwQ0FBYSxDQUFBO0lBRWI7Ozs7T0FJRztJQUNILDhDQUFpQixDQUFBO0lBRWpCOzs7O09BSUc7SUFDSCw0Q0FBZSxDQUFBO0FBQ2pCLENBQUMsRUFyQlcseUJBQXlCLHlDQUF6Qix5QkFBeUIsUUFxQnBDO0FBRUQ7Ozs7R0FJRztBQUNILElBQVksZ0NBZ0JYO0FBaEJELFdBQVksZ0NBQWdDO0lBQzFDOztPQUVHO0lBQ0gscURBQWlCLENBQUE7SUFFakI7O09BRUc7SUFDSCx5REFBcUIsQ0FBQTtJQUVyQjs7O09BR0c7SUFDSCxtREFBZSxDQUFBO0FBQ2pCLENBQUMsRUFoQlcsZ0NBQWdDLGdEQUFoQyxnQ0FBZ0MsUUFnQjNDO0FBRUQ7Ozs7R0FJRztBQUNILElBQVksaUJBMkJYO0FBM0JE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QUFLLENBQUMsQ0FBQyxDQUFDO0lBQ3BELENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0ksVUFBVSxDQUFDLEtBQXVCO1FBQ3ZDLElBQUksQ0FBQyxRQUFRLEdBQUcsdUJBQXVCLENBQUMsU0FBUyxDQUFDO1lBQ2hELEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUU7WUFDekIsS0FBSyxDQUFDLElBQUksQ0FBQyxZQUFZO1NBQ3hCLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSxVQUFVLENBQUMsT0FBZTtRQUMvQixJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUMzQixJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUMvQixDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksVUFBVSxDQUFDLE9BQWU7UUFDL0IsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDM0IsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDL0IsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLGFBQWEsQ0FBQyxPQUFlO1FBQ2xDLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ2xDLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSxhQUFhLENBQUMsT0FBZTtRQUNsQyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNsQyxDQUFDO0lBRUQsYUFBYTtRQUNYLEtBQUssQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUN0QixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDekIsQ0FBQzs7QUFwTUgsNENBcU1DIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgcGF0aCBmcm9tIFwicGF0aFwiO1xuaW1wb3J0ICogYXMgc2VtdmVyIGZyb20gXCJzZW12ZXJcIjtcbmltcG9ydCB7IE5vZGVQcm9qZWN0IH0gZnJvbSBcIi5cIjtcbmltcG9ydCB7IENvbXBvbmVudCB9IGZyb20gXCIuLi9jb21wb25lbnRcIjtcbmltcG9ydCB7IEpzb25GaWxlIH0gZnJvbSBcIi4uL2pzb25cIjtcbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gXCIuLi9wcm9qZWN0XCI7XG5pbXBvcnQgeyBub3JtYWxpemVQZXJzaXN0ZWRQYXRoIH0gZnJvbSBcIi4uL3V0aWxcIjtcblxuZXhwb3J0IGludGVyZmFjZSBUeXBlc2NyaXB0Q29uZmlnT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBAZGVmYXVsdCBcInRzY29uZmlnLmpzb25cIlxuICAgKi9cbiAgcmVhZG9ubHkgZmlsZU5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEJhc2UgYHRzY29uZmlnLmpzb25gIGNvbmZpZ3VyYXRpb24ocykgdG8gaW5oZXJpdCBmcm9tLlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiBNdXN0IHByb3ZpZGUgZWl0aGVyIGBleHRlbmRzYCBvciBgY29tcGlsZXJPcHRpb25zYCAob3IgYm90aCkuXG4gICAqL1xuICByZWFkb25seSBleHRlbmRzPzogVHlwZXNjcmlwdENvbmZpZ0V4dGVuZHM7XG5cbiAgLyoqXG4gICAqIFNwZWNpZmllcyBhIGxpc3Qgb2YgZ2xvYiBwYXR0ZXJucyB0aGF0IG1hdGNoIFR5cGVTY3JpcHQgZmlsZXMgdG8gYmUgaW5jbHVkZWQgaW4gY29tcGlsYXRpb24uXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gYWxsIC50cyBmaWxlcyByZWN1cnNpdmVseVxuICAgKi9cbiAgcmVhZG9ubHkgaW5jbHVkZT86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBGaWx0ZXJzIHJlc3VsdHMgZnJvbSB0aGUgXCJpbmNsdWRlXCIgb3B0aW9uLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vZGVfbW9kdWxlcyBpcyBleGNsdWRlZCBieSBkZWZhdWx0XG4gICAqL1xuICByZWFkb25seSBleGNsdWRlPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIENvbXBpbGVyIG9wdGlvbnMgdG8gdXNlLlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiBNdXN0IHByb3ZpZGUgZWl0aGVyIGBleHRlbmRzYCBvciBgY29tcGlsZXJPcHRpb25zYCAob3IgYm90aCkuXG4gICAqL1xuICByZWFkb25seSBjb21waWxlck9wdGlvbnM/OiBUeXBlU2NyaXB0Q29tcGlsZXJPcHRpb25zO1xufVxuXG4vKipcbiAqIERldGVybWluZXMgaG93IG1vZHVsZXMgZ2V0IHJlc29sdmVkLlxuICpcbiAqIEBzZWUgaHR0cHM6Ly93d3cudHlwZXNjcmlwdGxhbmcub3JnL2RvY3MvaGFuZGJvb2svbW9kdWxlLXJlc29sdXRpb24uaHRtbFxuICovXG5leHBvcnQgZW51bSBUeXBlU2NyaXB0TW9kdWxlUmVzb2x1dGlvbiB7XG4gIC8qKlxuICAgKiBUeXBlU2NyaXB0J3MgZm9ybWVyIGRlZmF1bHQgcmVzb2x1dGlvbiBzdHJhdGVneS5cbiAgICpcbiAgICogQHNlZSBodHRwczovL3d3dy50eXBlc2NyaXB0bGFuZy5vcmcvZG9jcy9oYW5kYm9vay9tb2R1bGUtcmVzb2x1dGlvbi5odG1sI2NsYXNzaWNcbiAgICovXG4gIENMQVNTSUMgPSBcImNsYXNzaWNcIixcblxuICAvKipcbiAgICogUmVzb2x1dGlvbiBzdHJhdGVneSB3aGljaCBhdHRlbXB0cyB0byBtaW1pYyB0aGUgTm9kZS5qcyBtb2R1bGUgcmVzb2x1dGlvbiBzdHJhdGVneSBhdCBydW50aW1lLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vd3d3LnR5cGVzY3JpcHRsYW5nLm9yZy9kb2NzL2hhbmRib29rL21vZHVsZS1yZXNvbHV0aW9uLmh0bWwjbm9kZVxuICAgKi9cbiAgTk9ERSA9IFwibm9kZVwiLFxuXG4gIC8qKlxuICAgKiBgLS1tb2R1bGVSZXNvbHV0aW9uIG5vZGVgIHdhcyByZW5hbWVkIHRvIGBub2RlMTBgXG4gICAqIChrZWVwaW5nIGBub2RlYCBhcyBhbiBhbGlhcyBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSkgaW4gVHlwZVNjcmlwdCA1LjAuXG4gICAqIEl0IHJlZmxlY3RzIHRoZSBDb21tb25KUyBtb2R1bGUgcmVzb2x1dGlvbiBhbGdvcml0aG0gYXMgaXQgZXhpc3RlZCBpbiBOb2RlLmpzIHZlcnNpb25zXG4gICAqIGVhcmxpZXIgdGhhbiB2MTIuIEl0IHNob3VsZCBubyBsb25nZXIgYmUgdXNlZC5cbiAgICpcbiAgICogQHNlZSBodHRwczovL3d3dy50eXBlc2NyaXB0bGFuZy5vcmcvZG9jcy9oYW5kYm9vay9tb2R1bGVzL3JlZmVyZW5jZS5odG1sI25vZGUxMC1mb3JtZXJseS1rbm93bi1hcy1ub2RlXG4gICAqL1xuICBOT0RFMTAgPSBcIm5vZGUxMFwiLFxuXG4gIC8qKlxuICAgKiBOb2RlLmpz4oCZIEVDTUFTY3JpcHQgTW9kdWxlIFN1cHBvcnQgZnJvbSBUeXBlU2NyaXB0IDQuNyBvbndhcmRzXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly93d3cudHlwZXNjcmlwdGxhbmcub3JnL3RzY29uZmlnI21vZHVsZVJlc29sdXRpb25cbiAgICovXG4gIE5PREUxNiA9IFwibm9kZTE2XCIsXG5cbiAgLyoqXG4gICAqIE5vZGUuanPigJkgRUNNQVNjcmlwdCBNb2R1bGUgU3VwcG9ydCBmcm9tIFR5cGVTY3JpcHQgNC43IG9ud2FyZHNcbiAgICpcbiAgICogQHNlZSBodHRwczovL3d3dy50eXBlc2NyaXB0bGFuZy5vcmcvdHNjb25maWcjbW9kdWxlUmVzb2x1dGlvblxuICAgKi9cbiAgTk9ERV9ORVhUID0gXCJub2RlbmV4dFwiLFxuXG4gIC8qKlxuICAgKiBSZXNvbHV0aW9uIHN0cmF0ZWd5IHdoaWNoIGF0dGVtcHRzIHRvIG1pbWljIHJlc29sdXRpb24gcGF0dGVybnMgb2YgbW9kZXJuIGJ1bmRsZXJzOyBmcm9tIFR5cGVTY3JpcHQgNS4wIG9ud2FyZHMuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly93d3cudHlwZXNjcmlwdGxhbmcub3JnL3RzY29uZmlnI21vZHVsZVJlc29sdXRpb25cbiAgICovXG4gIEJVTkRMRVIgPSBcImJ1bmRsZXJcIixcbn1cblxuLyoqXG4gKiBUaGlzIHNldHRpbmcgY29udHJvbHMgaG93IFR5cGVTY3JpcHQgZGV0ZXJtaW5lcyB3aGV0aGVyIGEgZmlsZSBpcyBhIHNjcmlwdCBvciBhIG1vZHVsZS5cbiAqXG4gKiBAc2VlIGh0dHBzOi8vd3d3LnR5cGVzY3JpcHRsYW5nLm9yZy9kb2NzL2hhbmRib29rL21vZHVsZXMvdGhlb3J5Lmh0bWwjc2NyaXB0cy1hbmQtbW9kdWxlcy1pbi1qYXZhc2NyaXB0XG4gKi9cbmV4cG9ydCBlbnVtIFR5cGVTY3JpcHRNb2R1bGVEZXRlY3Rpb24ge1xuICAvKipcbiAgICogVHlwZVNjcmlwdCB3aWxsIG5vdCBvbmx5IGxvb2sgZm9yIGltcG9ydCBhbmQgZXhwb3J0IHN0YXRlbWVudHMsIGJ1dCBpdCB3aWxsIGFsc28gY2hlY2sgd2hldGhlciB0aGUgXCJ0eXBlXCIgZmllbGQgaW4gYSBwYWNrYWdlLmpzb24gaXMgc2V0IHRvIFwibW9kdWxlXCIgd2hlbiBydW5uaW5nIHdpdGggbW9kdWxlOiBub2RlbmV4dCBvciBub2RlMTYsIGFuZCBjaGVjayB3aGV0aGVyIHRoZSBjdXJyZW50IGZpbGUgaXMgYSBKU1ggZmlsZSB3aGVuIHJ1bm5pbmcgdW5kZXIganN4OiByZWFjdC1qc3guXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly93d3cudHlwZXNjcmlwdGxhbmcub3JnL3RzY29uZmlnLyNtb2R1bGVEZXRlY3Rpb25cbiAgICovXG4gIEFVVE8gPSBcImF1dG9cIixcblxuICAvKipcbiAgICogVGhlIHNhbWUgYmVoYXZpb3IgYXMgNC42IGFuZCBwcmlvciwgdXNpbmdzIGltcG9ydCBhbmQgZXhwb3J0IHN0YXRlbWVudHMgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgYSBmaWxlIGlzIGEgbW9kdWxlLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vd3d3LnR5cGVzY3JpcHRsYW5nLm9yZy90c2NvbmZpZy8jbW9kdWxlRGV0ZWN0aW9uXG4gICAqL1xuICBMRUdBQ1kgPSBcImxlZ2FjeVwiLFxuXG4gIC8qKlxuICAgKiBFbnN1cmVzIHRoYXQgZXZlcnkgbm9uLWRlY2xhcmF0aW9uIGZpbGUgaXMgdHJlYXRlZCBhcyBhIG1vZHVsZS5cbiAgICpcbiAgICogQHNlZSBodHRwczovL3d3dy50eXBlc2NyaXB0bGFuZy5vcmcvdHNjb25maWcvI21vZHVsZURldGVjdGlvblxuICAgKi9cbiAgRk9SQ0UgPSBcImZvcmNlXCIsXG59XG5cbi8qKlxuICogVGhpcyBmbGFnIGNvbnRyb2xzIGhvdyBgaW1wb3J0YCB3b3JrcywgdGhlcmUgYXJlIDMgZGlmZmVyZW50IG9wdGlvbnMuXG4gKlxuICogQHNlZSBodHRwczovL3d3dy50eXBlc2NyaXB0bGFuZy5vcmcvdHNjb25maWcjaW1wb3J0c05vdFVzZWRBc1ZhbHVlc1xuICovXG5leHBvcnQgZW51bSBUeXBlU2NyaXB0SW1wb3J0c05vdFVzZWRBc1ZhbHVlcyB7XG4gIC8qKlxuICAgKiBUaGUgZGVmYXVsdCBiZWhhdmlvciBvZiBkcm9wcGluZyBgaW1wb3J0YCBzdGF0ZW1lbnRzIHdoaWNoIG9ubHkgcmVmZXJlbmNlIHR5cGVzLlxuICAgKi9cbiAgUkVNT1ZFID0gXCJyZW1vdmVcIixcblxuICAvKipcbiAgICogUHJlc2VydmVzIGFsbCBgaW1wb3J0YCBzdGF0ZW1lbnRzIHdob3NlIHZhbHVlcyBvciB0eXBlcyBhcmUgbmV2ZXIgdXNlZC4gVGhpcyBjYW4gY2F1c2UgaW1wb3J0cy9zaWRlLWVmZmVjdHMgdG8gYmUgcHJlc2VydmVkLlxuICAgKi9cbiAgUFJFU0VSVkUgPSBcInByZXNlcnZlXCIsXG5cbiAgLyoqXG4gICAqIFRoaXMgcHJlc2VydmVzIGFsbCBpbXBvcnRzICh0aGUgc2FtZSBhcyB0aGUgcHJlc2VydmUgb3B0aW9uKSwgYnV0IHdpbGwgZXJyb3Igd2hlbiBhIHZhbHVlIGltcG9ydCBpcyBvbmx5IHVzZWQgYXMgYSB0eXBlLlxuICAgKiBUaGlzIG1pZ2h0IGJlIHVzZWZ1bCBpZiB5b3Ugd2FudCB0byBlbnN1cmUgbm8gdmFsdWVzIGFyZSBiZWluZyBhY2NpZGVudGFsbHkgaW1wb3J0ZWQsIGJ1dCBzdGlsbCBtYWtlIHNpZGUtZWZmZWN0IGltcG9ydHMgZXhwbGljaXQuXG4gICAqL1xuICBFUlJPUiA9IFwiZXJyb3JcIixcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmVzIGhvdyBKU1ggc2hvdWxkIGdldCB0cmFuc2Zvcm1lZCBpbnRvIHZhbGlkIEphdmFTY3JpcHQuXG4gKlxuICogQHNlZSBodHRwczovL3d3dy50eXBlc2NyaXB0bGFuZy5vcmcvZG9jcy9oYW5kYm9vay9qc3guaHRtbFxuICovXG5leHBvcnQgZW51bSBUeXBlU2NyaXB0SnN4TW9kZSB7XG4gIC8qKlxuICAgKiBLZWVwcyB0aGUgSlNYIGFzIHBhcnQgb2YgdGhlIG91dHB1dCB0byBiZSBmdXJ0aGVyIGNvbnN1bWVkIGJ5IGFub3RoZXIgdHJhbnNmb3JtIHN0ZXAgKGUuZy4gQmFiZWwpLlxuICAgKi9cbiAgUFJFU0VSVkUgPSBcInByZXNlcnZlXCIsXG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIEpTWCBzeW50YXggaW50byBSZWFjdC5jcmVhdGVFbGVtZW50LCBkb2VzIG5vdCBuZWVkIHRvIGdvIHRocm91Z2ggYSBKU1ggdHJhbnNmb3JtYXRpb24gYmVmb3JlIHVzZSwgYW5kIHRoZSBvdXRwdXQgd2lsbCBoYXZlIGEgLmpzIGZpbGUgZXh0ZW5zaW9uLlxuICAgKi9cbiAgUkVBQ1QgPSBcInJlYWN0XCIsXG5cbiAgLyoqXG4gICAqIEtlZXBzIGFsbCBKU1ggbGlrZSAncHJlc2VydmUnIG1vZGUsIGJ1dCBvdXRwdXQgd2lsbCBoYXZlIGEgLmpzIGV4dGVuc2lvbi5cbiAgICovXG4gIFJFQUNUX05BVElWRSA9IFwicmVhY3QtbmF0aXZlXCIsXG5cbiAgLyoqXG4gICAqIFBhc3NlcyBga2V5YCBzZXBhcmF0ZWx5IGZyb20gcHJvcHMgYW5kIGFsd2F5cyBwYXNzZXMgYGNoaWxkcmVuYCBhcyBwcm9wcyAoc2luY2UgUmVhY3QgMTcpLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vd3d3LnR5cGVzY3JpcHRsYW5nLm9yZy9kb2NzL2hhbmRib29rL3JlbGVhc2Utbm90ZXMvdHlwZXNjcmlwdC00LTEuaHRtbCNyZWFjdC0xNy1qc3gtZmFjdG9yaWVzXG4gICAqL1xuICBSRUFDVF9KU1ggPSBcInJlYWN0LWpzeFwiLFxuXG4gIC8qKlxuICAgKiBTYW1lIGFzIGBSRUFDVF9KU1hgIHdpdGggYWRkaXRpb25hbCBkZWJ1ZyBkYXRhLlxuICAgKi9cbiAgUkVBQ1RfSlNYREVWID0gXCJyZWFjdC1qc3hkZXZcIixcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUeXBlU2NyaXB0Q29tcGlsZXJPcHRpb25zIHtcbiAgLyoqXG4gICAqIEFsbG93IEphdmFTY3JpcHQgZmlsZXMgdG8gYmUgY29tcGlsZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBhbGxvd0pzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQWxsb3dzIFR5cGVTY3JpcHQgZmlsZXMgdG8gaW1wb3J0IGVhY2ggb3RoZXIgd2l0aCBUeXBlU2NyaXB0LXNwZWNpZmljIGV4dGVuc2lvbnMgKGAudHNgLCBgLm10c2AsIGAudHN4YCkuXG4gICAqIFJlcXVpcmVzIGBub0VtaXRgIG9yIGBlbWl0RGVjbGFyYXRpb25Pbmx5YC5cbiAgICpcbiAgICogQGRlZmF1bHQgdW5kZWZpbmVkXG4gICAqL1xuICByZWFkb25seSBhbGxvd0ltcG9ydGluZ1RzRXh0ZW5zaW9ucz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFN1cHByZXNzIGFyYml0cmFyeSBleHRlbnNpb24gaW1wb3J0IGVycm9ycyB3aXRoIHRoZSBhc3N1bXB0aW9uIHRoYXQgYSBidW5kbGVyIHdpbGwgYmUgaGFuZGxpbmcgaXQuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly93d3cudHlwZXNjcmlwdGxhbmcub3JnL3RzY29uZmlnI2FsbG93QXJiaXRyYXJ5RXh0ZW5zaW9uc1xuICAgKiBAZGVmYXVsdCB1bmRlZmluZWRcbiAgICovXG4gIHJlYWRvbmx5IGFsbG93QXJiaXRyYXJ5RXh0ZW5zaW9ucz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEVuc3VyZXMgdGhhdCB5b3VyIGZpbGVzIGFyZSBwYXJzZWQgaW4gdGhlIEVDTUFTY3JpcHQgc3RyaWN0IG1vZGUsIGFuZCBlbWl0IOKAnHVzZSBzdHJpY3TigJ1cbiAgICogZm9yIGVhY2ggc291cmNlIGZpbGUuXG4gICAqXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIHJlYWRvbmx5IGFsd2F5c1N0cmljdD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIE9mZmVycyBhIHdheSB0byBjb25maWd1cmUgdGhlIHJvb3QgZGlyZWN0b3J5IGZvciB3aGVyZSBkZWNsYXJhdGlvbiBmaWxlcyBhcmUgZW1pdHRlZC5cbiAgICpcbiAgICovXG4gIHJlYWRvbmx5IGRlY2xhcmF0aW9uRGlyPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUbyBiZSBzcGVjaWZpZWQgYWxvbmcgd2l0aCB0aGUgYWJvdmVcbiAgICpcbiAgICovXG4gIHJlYWRvbmx5IGRlY2xhcmF0aW9uPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogR2VuZXJhdGVzIGEgc291cmNlIG1hcCBmb3IgLmQudHMgZmlsZXMgd2hpY2ggbWFwIGJhY2sgdG8gdGhlIG9yaWdpbmFsIC50cyBzb3VyY2UgZmlsZS5cbiAgICogVGhpcyB3aWxsIGFsbG93IGVkaXRvcnMgc3VjaCBhcyBWUyBDb2RlIHRvIGdvIHRvIHRoZSBvcmlnaW5hbCAudHMgZmlsZSB3aGVuIHVzaW5nIGZlYXR1cmVzIGxpa2UgR28gdG8gRGVmaW5pdGlvbi5cbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly93d3cudHlwZXNjcmlwdGxhbmcub3JnL3RzY29uZmlnI2RlY2xhcmF0aW9uTWFwfVxuICAgKi9cbiAgcmVhZG9ubHkgZGVjbGFyYXRpb25NYXA/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBEb3dubGV2ZWxpbmcgaXMgVHlwZVNjcmlwdOKAmXMgdGVybSBmb3IgdHJhbnNwaWxpbmcgdG8gYW4gb2xkZXIgdmVyc2lvbiBvZiBKYXZhU2NyaXB0LlxuICAgKiBUaGlzIGZsYWcgaXMgdG8gZW5hYmxlIHN1cHBvcnQgZm9yIGEgbW9yZSBhY2N1cmF0ZSBpbXBsZW1lbnRhdGlvbiBvZiBob3cgbW9kZXJuIEphdmFTY3JpcHQgaXRlcmF0ZXMgdGhyb3VnaCBuZXcgY29uY2VwdHMgaW4gb2xkZXIgSmF2YVNjcmlwdCBydW50aW1lcy5cbiAgICpcbiAgICogRUNNQVNjcmlwdCA2IGFkZGVkIHNldmVyYWwgbmV3IGl0ZXJhdGlvbiBwcmltaXRpdmVzOiB0aGUgZm9yIC8gb2YgbG9vcCAoZm9yIChlbCBvZiBhcnIpKSwgQXJyYXkgc3ByZWFkIChbYSwgLi4uYl0pLCBhcmd1bWVudCBzcHJlYWQgKGZuKC4uLmFyZ3MpKSwgYW5kIFN5bWJvbC5pdGVyYXRvci5cbiAgICogZG93bmxldmVsSXRlcmF0aW9uIGFsbG93cyBmb3IgdGhlc2UgaXRlcmF0aW9uIHByaW1pdGl2ZXMgdG8gYmUgdXNlZCBtb3JlIGFjY3VyYXRlbHkgaW4gRVM1IGVudmlyb25tZW50cyBpZiBhIFN5bWJvbC5pdGVyYXRvciBpbXBsZW1lbnRhdGlvbiBpcyBwcmVzZW50LlxuICAgKi9cbiAgcmVhZG9ubHkgZG93bmxldmVsSXRlcmF0aW9uPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogTGlzdCBvZiBhZGRpdGlvbmFsIGNvbmRpdGlvbnMgdGhhdCBzaG91bGQgc3VjY2VlZCB3aGVuIFR5cGVTY3JpcHQgcmVzb2x2ZXMgZnJvbSBhbiBgZXhwb3J0c2Agb3IgYGltcG9ydHNgIGZpZWxkIG9mIGEgYHBhY2thZ2UuanNvbmAuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly93d3cudHlwZXNjcmlwdGxhbmcub3JnL3RzY29uZmlnI2N1c3RvbUNvbmRpdGlvbnNcbiAgICogQGRlZmF1bHQgdW5kZWZpbmVkXG4gICAqL1xuICByZWFkb25seSBjdXN0b21Db25kaXRpb25zPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIEVtaXQgX19pbXBvcnRTdGFyIGFuZCBfX2ltcG9ydERlZmF1bHQgaGVscGVycyBmb3IgcnVudGltZSBiYWJlbFxuICAgKiBlY29zeXN0ZW0gY29tcGF0aWJpbGl0eSBhbmQgZW5hYmxlIC0tYWxsb3dTeW50aGV0aWNEZWZhdWx0SW1wb3J0cyBmb3JcbiAgICogdHlwZXN5c3RlbSBjb21wYXRpYmlsaXR5LlxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgZXNNb2R1bGVJbnRlcm9wPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogRW5hYmxlcyBleHBlcmltZW50YWwgc3VwcG9ydCBmb3IgZGVjb3JhdG9ycywgd2hpY2ggaXMgaW4gc3RhZ2UgMiBvZiB0aGUgVEMzOSBzdGFuZGFyZGl6YXRpb24gcHJvY2Vzcy5cbiAgICpcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgcmVhZG9ubHkgZXhwZXJpbWVudGFsRGVjb3JhdG9ycz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEVuYWJsZXMgZXhwZXJpbWVudGFsIHN1cHBvcnQgZm9yIGRlY29yYXRvcnMsIHdoaWNoIGlzIGluIHN0YWdlIDIgb2YgdGhlIFRDMzkgc3RhbmRhcmRpemF0aW9uIHByb2Nlc3MuXG4gICAqIERlY29yYXRvcnMgYXJlIGEgbGFuZ3VhZ2UgZmVhdHVyZSB3aGljaCBoYXNu4oCZdCB5ZXQgYmVlbiBmdWxseSByYXRpZmllZCBpbnRvIHRoZSBKYXZhU2NyaXB0IHNwZWNpZmljYXRpb24uXG4gICAqIFRoaXMgbWVhbnMgdGhhdCB0aGUgaW1wbGVtZW50YXRpb24gdmVyc2lvbiBpbiBUeXBlU2NyaXB0IG1heSBkaWZmZXIgZnJvbSB0aGUgaW1wbGVtZW50YXRpb24gaW4gSmF2YVNjcmlwdCB3aGVuIGl0IGl0IGRlY2lkZWQgYnkgVEMzOS5cbiAgICogWW91IGNhbiBmaW5kIG91dCBtb3JlIGFib3V0IGRlY29yYXRvciBzdXBwb3J0IGluIFR5cGVTY3JpcHQgaW4gdGhlIGhhbmRib29rLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vd3d3LnR5cGVzY3JpcHRsYW5nLm9yZy9kb2NzL2hhbmRib29rL2RlY29yYXRvcnMuaHRtbFxuICAgKiBAZGVmYXVsdCB1bmRlZmluZWRcbiAgICovXG4gIHJlYWRvbmx5IGVtaXREZWNvcmF0b3JNZXRhZGF0YT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIERpc2FsbG93IGluY29uc2lzdGVudGx5LWNhc2VkIHJlZmVyZW5jZXMgdG8gdGhlIHNhbWUgZmlsZS5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IGZvcmNlQ29uc2lzdGVudENhc2luZ0luRmlsZU5hbWVzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogU2ltcGxpZmllcyBUeXBlU2NyaXB0J3MgaGFuZGxpbmcgb2YgaW1wb3J0L2V4cG9ydCBgdHlwZWAgbW9kaWZpZXJzLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vd3d3LnR5cGVzY3JpcHRsYW5nLm9yZy90c2NvbmZpZyN2ZXJiYXRpbU1vZHVsZVN5bnRheFxuICAgKiBAZGVmYXVsdCB1bmRlZmluZWRcbiAgICovXG4gIHJlYWRvbmx5IHZlcmJhdGltTW9kdWxlU3ludGF4PzogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhpcyBmbGFnIHdvcmtzIGJlY2F1c2UgeW91IGNhbiB1c2UgYGltcG9ydCB0eXBlYCB0byBleHBsaWNpdGx5IGNyZWF0ZSBhbiBgaW1wb3J0YCBzdGF0ZW1lbnQgd2hpY2ggc2hvdWxkIG5ldmVyIGJlIGVtaXR0ZWQgaW50byBKYXZhU2NyaXB0LlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiBGb3IgVHlwZVNjcmlwdCA1LjArIHVzZSBgdmVyYmF0aW1Nb2R1bGVTeW50YXhgIGluc3RlYWQuXG4gICAqIFBvc2VkIGZvciBkZXByZWNhdGlvbiB1cG9uIFR5cGVTY3JpcHQgNS41LlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vd3d3LnR5cGVzY3JpcHRsYW5nLm9yZy90c2NvbmZpZyNpbXBvcnRzTm90VXNlZEFzVmFsdWVzXG4gICAqIEBkZWZhdWx0IFwicmVtb3ZlXCJcbiAgICovXG4gIHJlYWRvbmx5IGltcG9ydHNOb3RVc2VkQXNWYWx1ZXM/OiBUeXBlU2NyaXB0SW1wb3J0c05vdFVzZWRBc1ZhbHVlcztcblxuICAvKipcbiAgICogV2hlbiBzZXQsIGluc3RlYWQgb2Ygd3JpdGluZyBvdXQgYSAuanMubWFwIGZpbGUgdG8gcHJvdmlkZSBzb3VyY2UgbWFwcyxcbiAgICogVHlwZVNjcmlwdCB3aWxsIGVtYmVkIHRoZSBzb3VyY2UgbWFwIGNvbnRlbnQgaW4gdGhlIC5qcyBmaWxlcy5cbiAgICpcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgcmVhZG9ubHkgaW5saW5lU291cmNlTWFwPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hlbiBzZXQsIFR5cGVTY3JpcHQgd2lsbCBpbmNsdWRlIHRoZSBvcmlnaW5hbCBjb250ZW50IG9mIHRoZSAudHMgZmlsZSBhcyBhbiBlbWJlZGRlZFxuICAgKiBzdHJpbmcgaW4gdGhlIHNvdXJjZSBtYXAuIFRoaXMgaXMgb2Z0ZW4gdXNlZnVsIGluIHRoZSBzYW1lIGNhc2VzIGFzIGlubGluZVNvdXJjZU1hcC5cbiAgICpcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgcmVhZG9ubHkgaW5saW5lU291cmNlcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEVuYWJsZXMgdGhlIGdlbmVyYXRpb24gb2Ygc291cmNlbWFwIGZpbGVzLlxuICAgKlxuICAgKiBAZGVmYXVsdCB1bmRlZmluZWRcbiAgICovXG4gIHJlYWRvbmx5IHNvdXJjZU1hcD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFNwZWNpZnkgdGhlIGxvY2F0aW9uIHdoZXJlIGEgZGVidWdnZXIgc2hvdWxkIGxvY2F0ZSBUeXBlU2NyaXB0IGZpbGVzXG4gICAqIGluc3RlYWQgb2YgcmVsYXRpdmUgc291cmNlIGxvY2F0aW9ucy5cbiAgICpcbiAgICogQGRlZmF1bHQgdW5kZWZpbmVkXG4gICAqL1xuICByZWFkb25seSBzb3VyY2VSb290Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBQZXJmb3JtIGFkZGl0aW9uYWwgY2hlY2tzIHRvIGVuc3VyZSB0aGF0IHNlcGFyYXRlIGNvbXBpbGF0aW9uIChzdWNoIGFzXG4gICAqIHdpdGggdHJhbnNwaWxlTW9kdWxlIG9yIEBiYWJlbC9wbHVnaW4tdHJhbnNmb3JtLXR5cGVzY3JpcHQpIHdvdWxkIGJlIHNhZmUuXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBpc29sYXRlZE1vZHVsZXM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBTdXBwb3J0IEpTWCBpbiAudHN4IGZpbGVzOiBcInJlYWN0XCIsIFwicHJlc2VydmVcIiwgXCJyZWFjdC1uYXRpdmVcIiBldGMuXG4gICAqXG4gICAqIEBkZWZhdWx0IHVuZGVmaW5lZFxuICAgKi9cbiAgcmVhZG9ubHkganN4PzogVHlwZVNjcmlwdEpzeE1vZGU7XG5cbiAgLyoqXG4gICAqIERlY2xhcmVzIHRoZSBtb2R1bGUgc3BlY2lmaWVyIHRvIGJlIHVzZWQgZm9yIGltcG9ydGluZyB0aGUganN4IGFuZCBqc3hzIGZhY3RvcnkgZnVuY3Rpb25zIHdoZW4gdXNpbmcganN4LlxuICAgKlxuICAgKiBAZGVmYXVsdCB1bmRlZmluZWRcbiAgICovXG4gIHJlYWRvbmx5IGpzeEltcG9ydFNvdXJjZT86IHN0cmluZztcblxuICAvKipcbiAgICogUmVmZXJlbmNlIGZvciB0eXBlIGRlZmluaXRpb25zIC8gbGlicmFyaWVzIHRvIHVzZSAoZWcuIEVTMjAxNiwgRVM1LCBFUzIwMTgpLlxuICAgKlxuICAgKiBAZGVmYXVsdCBbIFwiZXMyMDE4XCIgXVxuICAgKi9cbiAgcmVhZG9ubHkgbGliPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIFRoaXMgc2V0dGluZyBjb250cm9scyBob3cgVHlwZVNjcmlwdCBkZXRlcm1pbmVzIHdoZXRoZXIgYSBmaWxlIGlzIGEgW3NjcmlwdCBvciBhIG1vZHVsZV0oaHR0cHM6Ly93d3cudHlwZXNjcmlwdGxhbmcub3JnL2RvY3MvaGFuZGJvb2svbW9kdWxlcy90aGVvcnkuaHRtbCNzY3JpcHRzLWFuZC1tb2R1bGVzLWluLWphdmFzY3JpcHQpLlxuICAgKlxuICAgKiBAZGVmYXVsdCBcImF1dG9cIlxuICAgKi9cbiAgcmVhZG9ubHkgbW9kdWxlRGV0ZWN0aW9uPzogVHlwZVNjcmlwdE1vZHVsZURldGVjdGlvbjtcblxuICAvKipcbiAgICogU2V0cyB0aGUgbW9kdWxlIHN5c3RlbSBmb3IgdGhlIHByb2dyYW0uXG4gICAqIFNlZSBodHRwczovL3d3dy50eXBlc2NyaXB0bGFuZy5vcmcvZG9jcy9oYW5kYm9vay9tb2R1bGVzLmh0bWwjYW1iaWVudC1tb2R1bGVzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBcIkNvbW1vbkpTXCJcbiAgICovXG4gIHJlYWRvbmx5IG1vZHVsZT86IHN0cmluZztcblxuICAvKipcbiAgICogRGV0ZXJtaW5lIGhvdyBtb2R1bGVzIGdldCByZXNvbHZlZC4gRWl0aGVyIFwiTm9kZVwiIGZvciBOb2RlLmpzL2lvLmpzIHN0eWxlIHJlc29sdXRpb24sIG9yIFwiQ2xhc3NpY1wiLlxuICAgKlxuICAgKiBAZGVmYXVsdCBcIm5vZGVcIlxuICAgKi9cbiAgcmVhZG9ubHkgbW9kdWxlUmVzb2x1dGlvbj86IFR5cGVTY3JpcHRNb2R1bGVSZXNvbHV0aW9uO1xuXG4gIC8qKlxuICAgKiBEbyBub3QgZW1pdCBvdXRwdXRzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgbm9FbWl0PzogYm9vbGVhbjtcblxuICAvKipcbiAgICogT25seSBlbWl0IC5kLnRzIGZpbGVzOyBkbyBub3QgZW1pdCAuanMgZmlsZXMuXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBlbWl0RGVjbGFyYXRpb25Pbmx5PzogYm9vbGVhbjtcblxuICAvKipcbiAgICogRG8gbm90IGVtaXQgY29tcGlsZXIgb3V0cHV0IGZpbGVzIGxpa2UgSmF2YVNjcmlwdCBzb3VyY2UgY29kZSwgc291cmNlLW1hcHMgb3JcbiAgICogZGVjbGFyYXRpb25zIGlmIGFueSBlcnJvcnMgd2VyZSByZXBvcnRlZC5cbiAgICpcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgcmVhZG9ubHkgbm9FbWl0T25FcnJvcj86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFJlcG9ydCBlcnJvcnMgZm9yIGZhbGx0aHJvdWdoIGNhc2VzIGluIHN3aXRjaCBzdGF0ZW1lbnRzLiBFbnN1cmVzIHRoYXQgYW55IG5vbi1lbXB0eVxuICAgKiBjYXNlIGluc2lkZSBhIHN3aXRjaCBzdGF0ZW1lbnQgaW5jbHVkZXMgZWl0aGVyIGJyZWFrIG9yIHJldHVybi4gVGhpcyBtZWFucyB5b3Ugd29u4oCZdFxuICAgKiBhY2NpZGVudGFsbHkgc2hpcCBhIGNhc2UgZmFsbHRocm91Z2ggYnVnLlxuICAgKlxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICByZWFkb25seSBub0ZhbGx0aHJvdWdoQ2FzZXNJblN3aXRjaD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEluIHNvbWUgY2FzZXMgd2hlcmUgbm8gdHlwZSBhbm5vdGF0aW9ucyBhcmUgcHJlc2VudCwgVHlwZVNjcmlwdCB3aWxsIGZhbGwgYmFjayB0byBhXG4gICAqIHR5cGUgb2YgYW55IGZvciBhIHZhcmlhYmxlIHdoZW4gaXQgY2Fubm90IGluZmVyIHRoZSB0eXBlLlxuICAgKlxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICByZWFkb25seSBub0ltcGxpY2l0QW55PzogYm9vbGVhbjtcblxuICAvKipcbiAgICogVXNpbmcgYG5vSW1wbGljaXRPdmVycmlkZWAsIHlvdSBjYW4gZW5zdXJlIHRoYXQgc3ViLWNsYXNzZXMgbmV2ZXIgZ28gb3V0IG9mIHN5bmMgYXNcbiAgICogdGhleSBhcmUgcmVxdWlyZWQgdG8gZXhwbGljaXRseSBkZWNsYXJlIHRoYXQgdGhleSBhcmUgb3ZlcnJpZGluZyBhIG1lbWJlciB1c2luZyB0aGVcbiAgICogYG92ZXJyaWRlYCBrZXl3b3JkLiBUaGlzIGFsc28gaW1wcm92ZXMgcmVhZGFiaWxpdHkgb2YgdGhlIHByb2dyYW1tZXIncyBpbnRlbnQuXG4gICAqXG4gICAqIEF2YWlsYWJsZSB3aXRoIFR5cGVTY3JpcHQgNC4zIGFuZCBuZXdlci5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IG5vSW1wbGljaXRPdmVycmlkZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZW4gZW5hYmxlZCwgVHlwZVNjcmlwdCB3aWxsIGNoZWNrIGFsbCBjb2RlIHBhdGhzIGluIGEgZnVuY3Rpb24gdG8gZW5zdXJlIHRoZXlcbiAgICogcmV0dXJuIGEgdmFsdWUuXG4gICAqXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIHJlYWRvbmx5IG5vSW1wbGljaXRSZXR1cm5zPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFJhaXNlIGVycm9yIG9uIOKAmHRoaXPigJkgZXhwcmVzc2lvbnMgd2l0aCBhbiBpbXBsaWVkIOKAmGFueeKAmSB0eXBlLlxuICAgKlxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICByZWFkb25seSBub0ltcGxpY2l0VGhpcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFJhaXNlIGVycm9yIG9uIHVzZSBvZiB0aGUgZG90IHN5bnRheCB0byBhY2Nlc3MgZmllbGRzIHdoaWNoIGFyZSBub3QgZGVmaW5lZC5cbiAgICpcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgcmVhZG9ubHkgbm9Qcm9wZXJ0eUFjY2Vzc0Zyb21JbmRleFNpZ25hdHVyZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFJhaXNlIGVycm9yIHdoZW4gYWNjZXNzaW5nIGluZGV4ZXMgb24gb2JqZWN0cyB3aXRoIHVua25vd24ga2V5cyBkZWZpbmVkIGluIGluZGV4IHNpZ25hdHVyZXMuXG4gICAqXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIHJlYWRvbmx5IG5vVW5jaGVja2VkSW5kZXhlZEFjY2Vzcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFJlcG9ydCBlcnJvcnMgb24gdW51c2VkIGxvY2FsIHZhcmlhYmxlcy5cbiAgICpcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgcmVhZG9ubHkgbm9VbnVzZWRMb2NhbHM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBSZXBvcnQgZXJyb3JzIG9uIHVudXNlZCBwYXJhbWV0ZXJzIGluIGZ1bmN0aW9ucy5cbiAgICpcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgcmVhZG9ubHkgbm9VbnVzZWRQYXJhbWV0ZXJzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQWxsb3dzIGltcG9ydGluZyBtb2R1bGVzIHdpdGggYSDigJguanNvbuKAmSBleHRlbnNpb24sIHdoaWNoIGlzIGEgY29tbW9uIHByYWN0aWNlXG4gICAqIGluIG5vZGUgcHJvamVjdHMuIFRoaXMgaW5jbHVkZXMgZ2VuZXJhdGluZyBhIHR5cGUgZm9yIHRoZSBpbXBvcnQgYmFzZWQgb24gdGhlIHN0YXRpYyBKU09OIHNoYXBlLlxuICAgKlxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICByZWFkb25seSByZXNvbHZlSnNvbk1vZHVsZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFNraXAgdHlwZSBjaGVja2luZyBvZiBhbGwgZGVjbGFyYXRpb24gZmlsZXMgKCouZC50cykuXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBza2lwTGliQ2hlY2s/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgc3RyaWN0IGZsYWcgZW5hYmxlcyBhIHdpZGUgcmFuZ2Ugb2YgdHlwZSBjaGVja2luZyBiZWhhdmlvciB0aGF0IHJlc3VsdHMgaW4gc3Ryb25nZXIgZ3VhcmFudGVlc1xuICAgKiBvZiBwcm9ncmFtIGNvcnJlY3RuZXNzLiBUdXJuaW5nIHRoaXMgb24gaXMgZXF1aXZhbGVudCB0byBlbmFibGluZyBhbGwgb2YgdGhlIHN0cmljdCBtb2RlIGZhbWlseVxuICAgKiBvcHRpb25zLCB3aGljaCBhcmUgb3V0bGluZWQgYmVsb3cuIFlvdSBjYW4gdGhlbiB0dXJuIG9mZiBpbmRpdmlkdWFsIHN0cmljdCBtb2RlIGZhbWlseSBjaGVja3MgYXNcbiAgICogbmVlZGVkLlxuICAgKlxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICByZWFkb25seSBzdHJpY3Q/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGVuIHN0cmljdE51bGxDaGVja3MgaXMgZmFsc2UsIG51bGwgYW5kIHVuZGVmaW5lZCBhcmUgZWZmZWN0aXZlbHkgaWdub3JlZCBieSB0aGUgbGFuZ3VhZ2UuXG4gICAqIFRoaXMgY2FuIGxlYWQgdG8gdW5leHBlY3RlZCBlcnJvcnMgYXQgcnVudGltZS5cbiAgICogV2hlbiBzdHJpY3ROdWxsQ2hlY2tzIGlzIHRydWUsIG51bGwgYW5kIHVuZGVmaW5lZCBoYXZlIHRoZWlyIG93biBkaXN0aW5jdCB0eXBlcyBhbmQgeW914oCZbGxcbiAgICogZ2V0IGEgdHlwZSBlcnJvciBpZiB5b3UgdHJ5IHRvIHVzZSB0aGVtIHdoZXJlIGEgY29uY3JldGUgdmFsdWUgaXMgZXhwZWN0ZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIHJlYWRvbmx5IHN0cmljdE51bGxDaGVja3M/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGVuIHNldCB0byB0cnVlLCBUeXBlU2NyaXB0IHdpbGwgcmFpc2UgYW4gZXJyb3Igd2hlbiBhIGNsYXNzIHByb3BlcnR5IHdhcyBkZWNsYXJlZCBidXRcbiAgICogbm90IHNldCBpbiB0aGUgY29uc3RydWN0b3IuXG4gICAqXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIHJlYWRvbmx5IHN0cmljdFByb3BlcnR5SW5pdGlhbGl6YXRpb24/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBEbyBub3QgZW1pdCBkZWNsYXJhdGlvbnMgZm9yIGNvZGUgdGhhdCBoYXMgYW4gYEBpbnRlcm5hbGAgYW5ub3RhdGlvbiBpbiBpdOKAmXMgSlNEb2MgY29tbWVudC5cbiAgICpcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgcmVhZG9ubHkgc3RyaXBJbnRlcm5hbD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEZvcmNlcyBUeXBlU2NyaXB0IHRvIGNvbnN1bHQgdGhlIGBleHBvcnRzYCBmaWVsZCBvZiBgcGFja2FnZS5qc29uYCBmaWxlcyBpZiBpdCBldmVyIHJlYWRzIGZyb20gYSBwYWNrYWdlIGluIGBub2RlX21vZHVsZXNgLlxuICAgKlxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICByZWFkb25seSByZXNvbHZlUGFja2FnZUpzb25FeHBvcnRzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogRm9yY2VzIFR5cGVTY3JpcHQgdG8gY29uc3VsdCB0aGUgYGltcG9ydHNgIGZpZWxkIG9mIGBwYWNrYWdlLmpzb25gIHdoZW4gcGVyZm9ybWluZyBhIGxvb2t1cCB0aGF0IGJlZ2lucyB3aXRoIGAjYCBmcm9tIGEgZmlsZSB0aGF0IGhhcyBhIGBwYWNrYWdlLmpzb25gIGFzIGFuIGFuY2VzdG9yLlxuICAgKlxuICAgKiBAZGVmYXVsdCB1bmRlZmluZWRcbiAgICovXG4gIHJlYWRvbmx5IHJlc29sdmVQYWNrYWdlSnNvbkltcG9ydHM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBNb2Rlcm4gYnJvd3NlcnMgc3VwcG9ydCBhbGwgRVM2IGZlYXR1cmVzLCBzbyBFUzYgaXMgYSBnb29kIGNob2ljZS4gWW91IG1pZ2h0IGNob29zZSB0byBzZXRcbiAgICogYSBsb3dlciB0YXJnZXQgaWYgeW91ciBjb2RlIGlzIGRlcGxveWVkIHRvIG9sZGVyIGVudmlyb25tZW50cywgb3IgYSBoaWdoZXIgdGFyZ2V0IGlmIHlvdXJcbiAgICogY29kZSBpcyBndWFyYW50ZWVkIHRvIHJ1biBpbiBuZXdlciBlbnZpcm9ubWVudHMuXG4gICAqXG4gICAqIEBkZWZhdWx0IFwiRVMyMDE4XCJcbiAgICovXG4gIHJlYWRvbmx5IHRhcmdldD86IHN0cmluZztcblxuICAvKipcbiAgICogT3V0cHV0IGRpcmVjdG9yeSBmb3IgdGhlIGNvbXBpbGVkIGZpbGVzLlxuICAgKi9cbiAgcmVhZG9ubHkgb3V0RGlyPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgdGhlIHJvb3QgZGlyZWN0b3J5IG9mIGlucHV0IGZpbGVzLlxuICAgKlxuICAgKiBPbmx5IHVzZSB0byBjb250cm9sIHRoZSBvdXRwdXQgZGlyZWN0b3J5IHN0cnVjdHVyZSB3aXRoIGBvdXREaXJgLlxuICAgKi9cbiAgcmVhZG9ubHkgcm9vdERpcj86IHN0cmluZztcblxuICAvKipcbiAgICogQWxsb3cgZGVmYXVsdCBpbXBvcnRzIGZyb20gbW9kdWxlcyB3aXRoIG5vIGRlZmF1bHQgZXhwb3J0LiBUaGlzIGRvZXMgbm90IGFmZmVjdCBjb2RlIGVtaXQsIGp1c3QgdHlwZWNoZWNraW5nLlxuICAgKi9cbiAgcmVhZG9ubHkgYWxsb3dTeW50aGV0aWNEZWZhdWx0SW1wb3J0cz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFNwZWNpZmllcyB0aGF0IG9wdGlvbmFsIHByb3BlcnR5IHR5cGVzIHNob3VsZCBiZSBpbnRlcnByZXRlZCBleGFjdGx5IGFzIHdyaXR0ZW4sIG1lYW5pbmcgdGhhdCBgfCB1bmRlZmluZWRgIGlzIG5vdCBhZGRlZCB0byB0aGUgdHlwZVxuICAgKiBBdmFpbGFibGUgd2l0aCBUeXBlU2NyaXB0IDQuNCBhbmQgbmV3ZXIuXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBleGFjdE9wdGlvbmFsUHJvcGVydHlUeXBlcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIENoYW5nZSB0aGUgdHlwZSBvZiB0aGUgdmFyaWFibGUgaW4gYSBjYXRjaCBjbGF1c2UgZnJvbSBhbnkgdG8gdW5rbm93blxuICAgKiBBdmFpbGFibGUgd2l0aCBUeXBlU2NyaXB0IDQuNCBhbmQgbmV3ZXIuXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIHJlYWRvbmx5IHVzZVVua25vd25JbkNhdGNoVmFyaWFibGVzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogTGV0cyB5b3Ugc2V0IGEgYmFzZSBkaXJlY3RvcnkgdG8gcmVzb2x2ZSBub24tYWJzb2x1dGUgbW9kdWxlIG5hbWVzLlxuICAgKlxuICAgKiBZb3UgY2FuIGRlZmluZSBhIHJvb3QgZm9sZGVyIHdoZXJlIHlvdSBjYW4gZG8gYWJzb2x1dGUgZmlsZSByZXNvbHV0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgYmFzZVVybD86IHN0cmluZztcblxuICAvKipcbiAgICogQSBzZXJpZXMgb2YgZW50cmllcyB3aGljaCByZS1tYXAgaW1wb3J0cyB0byBsb29rdXAgbG9jYXRpb25zIHJlbGF0aXZlIHRvIHRoZSBiYXNlVXJsLCB0aGVyZSBpcyBhIGxhcmdlciBjb3ZlcmFnZSBvZiBwYXRocyBpbiB0aGUgaGFuZGJvb2suXG4gICAqXG4gICAqIHBhdGhzIGxldHMgeW91IGRlY2xhcmUgaG93IFR5cGVTY3JpcHQgc2hvdWxkIHJlc29sdmUgYW4gaW1wb3J0IGluIHlvdXIgcmVxdWlyZS9pbXBvcnRzLlxuICAgKi9cbiAgcmVhZG9ubHkgcGF0aHM/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZ1tdIH07XG5cbiAgLyoqXG4gICAqIElmIHR5cGVSb290cyBpcyBzcGVjaWZpZWQsIG9ubHkgcGFja2FnZXMgdW5kZXIgdHlwZVJvb3RzIHdpbGwgYmUgaW5jbHVkZWRcbiAgICogQHNlZSBodHRwczovL3d3dy50eXBlc2NyaXB0bGFuZy5vcmcvdHNjb25maWcvI3R5cGVSb290c1xuICAgKi9cbiAgcmVhZG9ubHkgdHlwZVJvb3RzPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIElmIHR5cGVzIGlzIHNwZWNpZmllZCwgb25seSBwYWNrYWdlcyBsaXN0ZWQgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgZ2xvYmFsIHNjb3BlXG4gICAqIEBzZWUgaHR0cHM6Ly93d3cudHlwZXNjcmlwdGxhbmcub3JnL3RzY29uZmlnI3R5cGVzXG4gICAqL1xuICByZWFkb25seSB0eXBlcz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBUZWxscyBUeXBlU2NyaXB0IHRvIHNhdmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHByb2plY3QgZ3JhcGggZnJvbSB0aGUgbGFzdCBjb21waWxhdGlvbiB0byBmaWxlcyBzdG9yZWQgb24gZGlzay5cbiAgICogVGhpcyBjcmVhdGVzIGEgc2VyaWVzIG9mIC50c2J1aWxkaW5mbyBmaWxlcyBpbiB0aGUgc2FtZSBmb2xkZXIgYXMgeW91ciBjb21waWxhdGlvbiBvdXRwdXQuXG4gICAqIFRoZXkgYXJlIG5vdCB1c2VkIGJ5IHlvdXIgSmF2YVNjcmlwdCBhdCBydW50aW1lIGFuZCBjYW4gYmUgc2FmZWx5IGRlbGV0ZWQuXG4gICAqIFlvdSBjYW4gcmVhZCBtb3JlIGFib3V0IHRoZSBmbGFnIGluIHRoZSAzLjQgcmVsZWFzZSBub3Rlcy5cbiAgICpcbiAgICogQHNlZSBodHRwczovL3d3dy50eXBlc2NyaXB0bGFuZy5vcmcvZG9jcy9oYW5kYm9vay9yZWxlYXNlLW5vdGVzL3R5cGVzY3JpcHQtMy00Lmh0bWwjZmFzdGVyLXN1YnNlcXVlbnQtYnVpbGRzLXdpdGgtdGhlLS0taW5jcmVtZW50YWwtZmxhZ1xuICAgKlxuICAgKiBUbyBjb250cm9sIHdoaWNoIGZvbGRlcnMgeW91IHdhbnQgdG8gdGhlIGZpbGVzIHRvIGJlIGJ1aWx0IHRvLCB1c2UgdGhlIGNvbmZpZyBvcHRpb24gdHNCdWlsZEluZm9GaWxlLlxuICAgKi9cbiAgcmVhZG9ubHkgaW5jcmVtZW50YWw/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGlzIHNldHRpbmcgbGV0cyB5b3Ugc3BlY2lmeSBhIGZpbGUgZm9yIHN0b3JpbmcgaW5jcmVtZW50YWwgY29tcGlsYXRpb24gaW5mb3JtYXRpb24gYXMgYSBwYXJ0IG9mIGNvbXBvc2l0ZSBwcm9qZWN0cyB3aGljaCBlbmFibGVzIGZhc3RlciBidWlsZGluZyBvZiBsYXJnZXIgVHlwZVNjcmlwdCBjb2RlYmFzZXMuXG4gICAqIFlvdSBjYW4gcmVhZCBtb3JlIGFib3V0IGNvbXBvc2l0ZSBwcm9qZWN0cyBpbiB0aGUgaGFuZGJvb2suXG4gICAqL1xuICByZWFkb25seSB0c0J1aWxkSW5mb0ZpbGU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFsbG93IFVudXNlZCBMYWJlbHNcbiAgICpcbiAgICogV2hlbjpcbiAgICpcbiAgICogLSBgdW5kZWZpbmVkYCAoZGVmYXVsdCkgcHJvdmlkZSBzdWdnZXN0aW9ucyBhcyB3YXJuaW5ncyB0byBlZGl0b3JzXG4gICAqIC0gYHRydWVgIHVudXNlZCBsYWJlbHMgYXJlIGlnbm9yZWRcbiAgICogLSBgZmFsc2VgIHJhaXNlcyBjb21waWxlciBlcnJvcnMgYWJvdXQgdW51c2VkIGxhYmVsc1xuICAgKlxuICAgKiBMYWJlbHMgYXJlIHZlcnkgcmFyZSBpbiBKYXZhU2NyaXB0IGFuZCB0eXBpY2FsbHkgaW5kaWNhdGUgYW4gYXR0ZW1wdCB0byB3cml0ZSBhbiBvYmplY3QgbGl0ZXJhbDpcbiAgICpcbiAgICogYGBgdHNcbiAgICogZnVuY3Rpb24gdmVyaWZ5QWdlKGFnZTogbnVtYmVyKSB7XG4gICAqICAgLy8gRm9yZ290ICdyZXR1cm4nIHN0YXRlbWVudFxuICAgKiAgIGlmIChhZ2UgPiAxOCkge1xuICAgKiAgICAgdmVyaWZpZWQ6IHRydWU7XG4gICAqIC8vICBeXl5eXl5eXiBVbnVzZWQgbGFiZWwuXG4gICAqICAgfVxuICAgKiB9XG4gICAqIGBgYFxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vd3d3LnR5cGVzY3JpcHRsYW5nLm9yZy90c2NvbmZpZyNhbGxvd1VudXNlZExhYmVsc1xuICAgKi9cbiAgcmVhZG9ubHkgYWxsb3dVbnVzZWRMYWJlbHM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBBbGxvdyBVbnJlYWNoYWJsZSBDb2RlXG4gICAqXG4gICAqIFdoZW46XG4gICAqXG4gICAqIC0gYHVuZGVmaW5lZGAgKGRlZmF1bHQpIHByb3ZpZGUgc3VnZ2VzdGlvbnMgYXMgd2FybmluZ3MgdG8gZWRpdG9yc1xuICAgKiAtIGB0cnVlYCB1bnJlYWNoYWJsZSBjb2RlIGlzIGlnbm9yZWRcbiAgICogLSBgZmFsc2VgIHJhaXNlcyBjb21waWxlciBlcnJvcnMgYWJvdXQgdW5yZWFjaGFibGUgY29kZVxuICAgKlxuICAgKiBUaGVzZSB3YXJuaW5ncyBhcmUgb25seSBhYm91dCBjb2RlIHdoaWNoIGlzIHByb3ZhYmx5IHVucmVhY2hhYmxlIGR1ZSB0byB0aGUgdXNlIG9mIEphdmFTY3JpcHQgc3ludGF4LlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vd3d3LnR5cGVzY3JpcHRsYW5nLm9yZy90c2NvbmZpZyNhbGxvd1VucmVhY2hhYmxlQ29kZVxuICAgKi9cbiAgcmVhZG9ubHkgYWxsb3dVbnJlYWNoYWJsZUNvZGU/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBDaGVjayBKU1xuICAgKlxuICAgKiBXb3JrcyBpbiB0YW5kZW0gd2l0aCBbYWxsb3dKc10oaHR0cHM6Ly93d3cudHlwZXNjcmlwdGxhbmcub3JnL3RzY29uZmlnI2FsbG93SnMpLiBXaGVuIGNoZWNrSnMgaXMgZW5hYmxlZCB0aGVuXG4gICAqIGVycm9ycyBhcmUgcmVwb3J0ZWQgaW4gSmF2YVNjcmlwdCBmaWxlcy4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiBpbmNsdWRpbmcgLy8gQHRzLWNoZWNrIGF0IHRoZSB0b3Agb2YgYWxsXG4gICAqIEphdmFTY3JpcHQgZmlsZXMgd2hpY2ggYXJlIGluY2x1ZGVkIGluIHlvdXIgcHJvamVjdC5cbiAgICpcbiAgICogQHNlZSBodHRwczovL3d3dy50eXBlc2NyaXB0bGFuZy5vcmcvdHNjb25maWcjY2hlY2tKc1xuICAgKi9cbiAgcmVhZG9ubHkgY2hlY2tKcz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQ29udGFpbmVyIGZvciBgVHlwZXNjcmlwdENvbmZpZ2AgYHRzY29uZmlnLmpzb25gIGJhc2UgY29uZmlndXJhdGlvbihzKS5cbiAqIEV4dGVuZGluZyBmcm9tIG1vcmUgdGhhbiBvbmUgYmFzZSBjb25maWcgZmlsZSByZXF1aXJlcyBUeXBlU2NyaXB0IDUuMCsuXG4gKi9cbmV4cG9ydCBjbGFzcyBUeXBlc2NyaXB0Q29uZmlnRXh0ZW5kcyB7XG4gIC8qKlxuICAgKiBGYWN0b3J5IGZvciBjcmVhdGlvbiBmcm9tIGFycmF5IG9mIGZpbGUgcGF0aHMuXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIFR5cGVTY3JpcHQgNS4wKyBpcyByZXF1aXJlZCB0byBzcGVjaWZ5IG1vcmUgdGhhbiBvbmUgdmFsdWUgaW4gYHBhdGhzYC5cbiAgICpcbiAgICogQHBhcmFtIHBhdGhzIEFic29sdXRlIG9yIHJlbGF0aXZlIHBhdGhzIHRvIGJhc2UgYHRzY29uZmlnLmpzb25gIGZpbGVzLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmcm9tUGF0aHMocGF0aHM6IHN0cmluZ1tdKSB7XG4gICAgcmV0dXJuIG5ldyBUeXBlc2NyaXB0Q29uZmlnRXh0ZW5kcyhwYXRocyk7XG4gIH1cblxuICAvKipcbiAgICogRmFjdG9yeSBmb3IgY3JlYXRpb24gZnJvbSBhcnJheSBvZiBvdGhlciBgVHlwZXNjcmlwdENvbmZpZ2AgaW5zdGFuY2VzLlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiBUeXBlU2NyaXB0IDUuMCsgaXMgcmVxdWlyZWQgdG8gc3BlY2lmeSBtb3JlIHRoYW4gb24gdmFsdWUgaW4gYGNvbmZpZ3NgLlxuICAgKlxuICAgKiBAcGFyYW0gY29uZmlncyBCYXNlIGBUeXBlc2NyaXB0Q29uZmlnYCBpbnN0YW5jZXMuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGZyb21UeXBlc2NyaXB0Q29uZmlncyhjb25maWdzOiBUeXBlc2NyaXB0Q29uZmlnW10pIHtcbiAgICBjb25zdCBwYXRocyA9IGNvbmZpZ3MubWFwKChjb25maWcpID0+IGNvbmZpZy5maWxlLmFic29sdXRlUGF0aCk7XG4gICAgcmV0dXJuIFR5cGVzY3JpcHRDb25maWdFeHRlbmRzLmZyb21QYXRocyhwYXRocyk7XG4gIH1cblxuICBwcml2YXRlIHJlYWRvbmx5IGJhc2VzOiBzdHJpbmdbXTtcblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKGJhc2VzOiBzdHJpbmdbXSkge1xuICAgIHRoaXMuYmFzZXMgPSBiYXNlcztcbiAgfVxuXG4gIHB1YmxpYyB0b0pTT04oKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLmJhc2VzO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBUeXBlc2NyaXB0Q29uZmlnIGV4dGVuZHMgQ29tcG9uZW50IHtcbiAgcHJpdmF0ZSBfZXh0ZW5kczogVHlwZXNjcmlwdENvbmZpZ0V4dGVuZHM7XG4gIHB1YmxpYyByZWFkb25seSBjb21waWxlck9wdGlvbnM/OiBUeXBlU2NyaXB0Q29tcGlsZXJPcHRpb25zO1xuICBwcml2YXRlIHJlYWRvbmx5IGluY2x1ZGVTZXQ6IFNldDxzdHJpbmc+O1xuICBwcml2YXRlIHJlYWRvbmx5IGV4Y2x1ZGVTZXQ6IFNldDxzdHJpbmc+O1xuICBwdWJsaWMgcmVhZG9ubHkgZmlsZU5hbWU6IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IGZpbGU6IEpzb25GaWxlO1xuXG4gIGNvbnN0cnVjdG9yKHByb2plY3Q6IFByb2plY3QsIG9wdGlvbnM6IFR5cGVzY3JpcHRDb25maWdPcHRpb25zKSB7XG4gICAgc3VwZXIocHJvamVjdCk7XG4gICAgY29uc3QgZmlsZU5hbWUgPSBvcHRpb25zLmZpbGVOYW1lID8/IFwidHNjb25maWcuanNvblwiO1xuXG4gICAgaWYgKCFvcHRpb25zLmV4dGVuZHMgJiYgIW9wdGlvbnMuY29tcGlsZXJPcHRpb25zKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIFwiVHlwZXNjcmlwdENvbmZpZzogTXVzdCBwcm92aWRlIGVpdGhlciBgZXh0ZW5kc2Agb3IgYGNvbXBpbGVyT3B0aW9uc2AgKG9yIGJvdGgpLlwiLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICB0aGlzLl9leHRlbmRzID0gb3B0aW9ucy5leHRlbmRzID8/IFR5cGVzY3JpcHRDb25maWdFeHRlbmRzLmZyb21QYXRocyhbXSk7XG4gICAgdGhpcy5pbmNsdWRlU2V0ID0gb3B0aW9ucy5pbmNsdWRlXG4gICAgICA/IG5ldyBTZXQob3B0aW9ucy5pbmNsdWRlKVxuICAgICAgOiBuZXcgU2V0KFtcIioqLyoudHNcIl0pO1xuICAgIHRoaXMuZXhjbHVkZVNldCA9IG9wdGlvbnMuZXhjbHVkZVxuICAgICAgPyBuZXcgU2V0KG9wdGlvbnMuZXhjbHVkZSlcbiAgICAgIDogbmV3IFNldChbXCJub2RlX21vZHVsZXNcIl0pO1xuICAgIHRoaXMuZmlsZU5hbWUgPSBmaWxlTmFtZTtcblxuICAgIHRoaXMuY29tcGlsZXJPcHRpb25zID0gb3B0aW9ucy5jb21waWxlck9wdGlvbnM7XG5cbiAgICB0aGlzLmZpbGUgPSBuZXcgSnNvbkZpbGUocHJvamVjdCwgZmlsZU5hbWUsIHtcbiAgICAgIGFsbG93Q29tbWVudHM6IHRydWUsXG4gICAgICBvYmo6IHtcbiAgICAgICAgZXh0ZW5kczogKCkgPT4gdGhpcy5yZW5kZXJFeHRlbmRzKCksXG4gICAgICAgIGNvbXBpbGVyT3B0aW9uczogdGhpcy5jb21waWxlck9wdGlvbnMsXG4gICAgICAgIGluY2x1ZGU6ICgpID0+IHRoaXMuaW5jbHVkZSxcbiAgICAgICAgZXhjbHVkZTogKCkgPT4gdGhpcy5leGNsdWRlLFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIGlmIChwcm9qZWN0IGluc3RhbmNlb2YgTm9kZVByb2plY3QpIHtcbiAgICAgIHByb2plY3QubnBtaWdub3JlPy5leGNsdWRlKGAvJHtmaWxlTmFtZX1gKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZ2V0IGluY2x1ZGUoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBbLi4udGhpcy5pbmNsdWRlU2V0XTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZXhjbHVkZSgpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIFsuLi50aGlzLmV4Y2x1ZGVTZXRdO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbmRlciBhcHByb3ByaWF0ZSB2YWx1ZSBmb3IgYGV4dGVuZHNgIGZpZWxkLlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSByZW5kZXJFeHRlbmRzKCk6IHN0cmluZyB8IHN0cmluZ1tdIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5leHRlbmRzLmxlbmd0aCA8PSAxKSB7XG4gICAgICAvLyByZW5kZXIgc3RyaW5nIHZhbHVlIHdoZW4gb25seSBvbmUgZXh0ZW5zaW9uIChUUzw1LjApO1xuICAgICAgLy8gb21pdCBpZiBubyBleHRlbnNpb25zLlxuICAgICAgcmV0dXJuIHRoaXMuZXh0ZW5kc1swXTtcbiAgICB9XG4gICAgLy8gcmVuZGVyIG1hbnkgZXh0ZW5zaW9ucyBhcyBhcnJheSAoVFM+PTUuMClcbiAgICByZXR1cm4gdGhpcy5leHRlbmRzO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmUgdmFsaWQgVHlwZVNjcmlwdCBleHRlbmRzIHBhdGhzIHJlbGF0aXZlIHRvIHRoaXMgY29uZmlnLlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiBUaGlzIHdpbGwgb25seSByZXNvbHZlIHRoZSByZWxhdGl2ZSBwYXRoIGZyb20gdGhpcyBjb25maWcgdG8gYW5vdGhlciBnaXZlblxuICAgKiBhbiBhYnNvbHV0ZSBwYXRoIGFzIGlucHV0LiBBbnkgbm9uLWFic29sdXRlIHBhdGggb3Igb3RoZXIgc3RyaW5nIHdpbGwgYmUgcmV0dXJuZWQgYXMgaXMuXG4gICAqIFRoaXMgaXMgdG8gcHJlc2VydmUgbWFudWFsbHkgc3BlY2lmaWVkIHJlbGF0aXZlIHBhdGhzIGFzIHdlbGwgYXMgbnBtIGltcG9ydCBwYXRocy5cbiAgICpcbiAgICogQHBhcmFtIGNvbmZpZ1BhdGggUGF0aCB0byByZXNvbHZlIGFnYWluc3QuXG4gICAqL1xuICBwdWJsaWMgcmVzb2x2ZUV4dGVuZHNQYXRoKGNvbmZpZ1BhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgLy8gaWYgbm90IGFic29sdXRlIGFzc3VtZSB1c2VyLWRlZmluZWQgcGF0aCAob3IgbnBtIHBhY2thZ2UpLlxuICAgIGlmICghcGF0aC5pc0Fic29sdXRlKGNvbmZpZ1BhdGgpKSByZXR1cm4gY29uZmlnUGF0aDtcbiAgICBjb25zdCByZWxhdGl2ZUNvbmZpZyA9IHBhdGgucmVsYXRpdmUoXG4gICAgICBwYXRoLmRpcm5hbWUodGhpcy5maWxlLmFic29sdXRlUGF0aCksXG4gICAgICBjb25maWdQYXRoLFxuICAgICk7XG4gICAgLy8gZW5zdXJlIGltbWVkaWF0ZSBzaWJsaW5nIGZpbGVzIGFyZSBwcmVmaXhlZCB3aXRoICcuLydcbiAgICAvLyB0eXBlc2NyaXB0IGZpZ3VyZXMgdGhpcyBvdXQsIGJ1dCBzb21lIHRvb2xzIHNlZW1pbmdseSBicmVhayB3aXRob3V0IGl0IChpLmUsIGVzbGludCkuXG4gICAgY29uc3QgeyBkaXIsIC4uLnBhdGhQYXJ0cyB9ID0gcGF0aC5wYXJzZShyZWxhdGl2ZUNvbmZpZyk7XG4gICAgY29uc3QgY29uZmlnRGlyID0gZGlyXG4gICAgICA/IHBhdGguZm9ybWF0KHsgZGlyOiBkaXIuc3RhcnRzV2l0aChcIi4uXCIpID8gXCJcIiA6IFwiLlwiLCBiYXNlOiBkaXIgfSlcbiAgICAgIDogXCIuXCI7XG5cbiAgICBjb25zdCBleHRlbmRzUGF0aCA9IHBhdGguZm9ybWF0KHsgLi4ucGF0aFBhcnRzLCBkaXI6IGNvbmZpZ0RpciB9KTtcblxuICAgIHJldHVybiBub3JtYWxpemVQZXJzaXN0ZWRQYXRoKGV4dGVuZHNQYXRoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZSB1c2FnZSBvZiBgZXh0ZW5kc2AgYWdhaW5zdCBjdXJyZW50IFR5cGVTY3JpcHQgdmVyc2lvbi5cbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgdmFsaWRhdGVFeHRlbmRzKCkge1xuICAgIGNvbnN0IHByb2plY3QgPSB0aGlzLnByb2plY3Q7XG4gICAgY29uc3QgaGFzT25lT3JOb25lRXh0ZW5kcyA9IHRoaXMuZXh0ZW5kcy5sZW5ndGggPD0gMTtcbiAgICBjb25zdCBpc05vZGVQcm9qZWN0ID0gcHJvamVjdCBpbnN0YW5jZW9mIE5vZGVQcm9qZWN0O1xuICAgIGlmIChoYXNPbmVPck5vbmVFeHRlbmRzIHx8ICFpc05vZGVQcm9qZWN0KSB7XG4gICAgICAvLyBhbHdheXMgYWNjZXB0IG5vIGV4dGVuZHMgb3Igc2luZ3VsYXIgZXh0ZW5kcy5cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgdHNWZXJzaW9uID0gc2VtdmVyLmNvZXJjZShcbiAgICAgIHByb2plY3QucGFja2FnZS50cnlSZXNvbHZlRGVwZW5kZW5jeVZlcnNpb24oXCJ0eXBlc2NyaXB0XCIpLFxuICAgICAgeyBsb29zZTogdHJ1ZSB9LFxuICAgICk7XG4gICAgaWYgKHRzVmVyc2lvbiAmJiB0c1ZlcnNpb24ubWFqb3IgPCA1KSB7XG4gICAgICB0aGlzLnByb2plY3QubG9nZ2VyLndhcm4oXG4gICAgICAgIFwiVHlwZVNjcmlwdCA8IDUuMC4wIGNhbiBvbmx5IGV4dGVuZCBmcm9tIGEgc2luZ2xlIGJhc2UgY29uZmlnLlwiLFxuICAgICAgICBgVHlwZVNjcmlwdCBWZXJzaW9uOiAke3RzVmVyc2lvbi5mb3JtYXQoKX1gLFxuICAgICAgICBgRmlsZTogJHt0aGlzLmZpbGUuYWJzb2x1dGVQYXRofWAsXG4gICAgICAgIGBFeHRlbmRzOiAke3RoaXMuZXh0ZW5kc31gLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQXJyYXkgb2YgYmFzZSBgdHNjb25maWcuanNvbmAgcGF0aHMuXG4gICAqIEFueSBhYnNvbHV0ZSBwYXRocyBhcmUgcmVzb2x2ZWQgcmVsYXRpdmUgdG8gdGhpcyBpbnN0YW5jZSxcbiAgICogd2hpbGUgYW55IHJlbGF0aXZlIHBhdGhzIGFyZSB1c2VkIGFzIGlzLlxuICAgKi9cbiAgcHVibGljIGdldCBleHRlbmRzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5fZXh0ZW5kc1xuICAgICAgLnRvSlNPTigpXG4gICAgICAubWFwKCh2YWx1ZSkgPT4gdGhpcy5yZXNvbHZlRXh0ZW5kc1BhdGgodmFsdWUpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeHRlbmQgZnJvbSBiYXNlIGBUeXBlc2NyaXB0Q29uZmlnYCBpbnN0YW5jZS5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogVHlwZVNjcmlwdCA1LjArIGlzIHJlcXVpcmVkIHRvIGV4dGVuZCBmcm9tIG1vcmUgdGhhbiBvbmUgYmFzZSBgVHlwZXNjcmlwdENvbmZpZ2AuXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSBCYXNlIGBUeXBlc2NyaXB0Q29uZmlnYCBpbnN0YW5jZS5cbiAgICovXG4gIHB1YmxpYyBhZGRFeHRlbmRzKHZhbHVlOiBUeXBlc2NyaXB0Q29uZmlnKSB7XG4gICAgdGhpcy5fZXh0ZW5kcyA9IFR5cGVzY3JpcHRDb25maWdFeHRlbmRzLmZyb21QYXRocyhbXG4gICAgICAuLi50aGlzLl9leHRlbmRzLnRvSlNPTigpLFxuICAgICAgdmFsdWUuZmlsZS5hYnNvbHV0ZVBhdGgsXG4gICAgXSk7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGFuIGluY2x1ZGUgcGF0dGVybiB0byB0aGUgYGluY2x1ZGVgIGFycmF5IG9mIHRoZSBUU0NvbmZpZy5cbiAgICpcbiAgICogQHNlZSBodHRwczovL3d3dy50eXBlc2NyaXB0bGFuZy5vcmcvdHNjb25maWcjaW5jbHVkZVxuICAgKlxuICAgKiBAcGFyYW0gcGF0dGVybiBUaGUgcGF0dGVybiB0byBhZGQuXG4gICAqL1xuICBwdWJsaWMgYWRkSW5jbHVkZShwYXR0ZXJuOiBzdHJpbmcpIHtcbiAgICB0aGlzLmluY2x1ZGUucHVzaChwYXR0ZXJuKTtcbiAgICB0aGlzLmluY2x1ZGVTZXQuYWRkKHBhdHRlcm4pO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhbiBleGNsdWRlIHBhdHRlcm4gdG8gdGhlIGBleGNsdWRlYCBhcnJheSBvZiB0aGUgVFNDb25maWcuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly93d3cudHlwZXNjcmlwdGxhbmcub3JnL3RzY29uZmlnI2V4Y2x1ZGVcbiAgICpcbiAgICogQHBhcmFtIHBhdHRlcm4gVGhlIHBhdHRlcm4gdG8gYWRkLlxuICAgKi9cbiAgcHVibGljIGFkZEV4Y2x1ZGUocGF0dGVybjogc3RyaW5nKSB7XG4gICAgdGhpcy5leGNsdWRlLnB1c2gocGF0dGVybik7XG4gICAgdGhpcy5leGNsdWRlU2V0LmFkZChwYXR0ZXJuKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgYW4gaW5jbHVkZSBwYXR0ZXJuIGZyb20gdGhlIGBpbmNsdWRlYCBhcnJheSBvZiB0aGUgVFNDb25maWcuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly93d3cudHlwZXNjcmlwdGxhbmcub3JnL3RzY29uZmlnI2luY2x1ZGVcbiAgICpcbiAgICogQHBhcmFtIHBhdHRlcm4gVGhlIHBhdHRlcm4gdG8gcmVtb3ZlLlxuICAgKi9cbiAgcHVibGljIHJlbW92ZUluY2x1ZGUocGF0dGVybjogc3RyaW5nKSB7XG4gICAgdGhpcy5pbmNsdWRlU2V0LmRlbGV0ZShwYXR0ZXJuKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgYW4gZXhjbHVkZSBwYXR0ZXJuIGZyb20gdGhlIGBleGNsdWRlYCBhcnJheSBvZiB0aGUgVFNDb25maWcuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly93d3cudHlwZXNjcmlwdGxhbmcub3JnL3RzY29uZmlnI2V4Y2x1ZGVcbiAgICpcbiAgICogQHBhcmFtIHBhdHRlcm4gVGhlIHBhdHRlcm4gdG8gcmVtb3ZlLlxuICAgKi9cbiAgcHVibGljIHJlbW92ZUV4Y2x1ZGUocGF0dGVybjogc3RyaW5nKSB7XG4gICAgdGhpcy5leGNsdWRlU2V0LmRlbGV0ZShwYXR0ZXJuKTtcbiAgfVxuXG4gIHByZVN5bnRoZXNpemUoKSB7XG4gICAgc3VwZXIucHJlU3ludGhlc2l6ZSgpO1xuICAgIHRoaXMudmFsaWRhdGVFeHRlbmRzKCk7XG4gIH1cbn1cbiJdfQ==
@@ -152,23 +152,8 @@ class UpgradeDependencies extends component_1.Component {
152
152
  * Build npm-check-updates command with common options.
153
153
  */
154
154
  buildNcuCommand(includePackages, options = {}) {
155
- function executeCommand(packageManager) {
156
- switch (packageManager) {
157
- case javascript_1.NodePackageManager.NPM:
158
- case javascript_1.NodePackageManager.YARN:
159
- case javascript_1.NodePackageManager.YARN_CLASSIC:
160
- return "npx";
161
- case javascript_1.NodePackageManager.PNPM:
162
- return "pnpm dlx";
163
- case javascript_1.NodePackageManager.YARN2:
164
- case javascript_1.NodePackageManager.YARN_BERRY:
165
- return "yarn dlx";
166
- case javascript_1.NodePackageManager.BUN:
167
- return "bunx";
168
- }
169
- }
170
155
  const command = [
171
- `${executeCommand(this.project.package.packageManager)} npm-check-updates@20`,
156
+ `${(0, util_1.executeCommandPriorInstallation)(this.project.package.packageManager)} npm-check-updates@20`,
172
157
  ];
173
158
  if (options.upgrade) {
174
159
  command.push("--upgrade");
@@ -383,7 +368,7 @@ class UpgradeDependencies extends component_1.Component {
383
368
  }
384
369
  exports.UpgradeDependencies = UpgradeDependencies;
385
370
  _a = JSII_RTTI_SYMBOL_1;
386
- UpgradeDependencies[_a] = { fqn: "projen.javascript.UpgradeDependencies", version: "0.99.48" };
371
+ UpgradeDependencies[_a] = { fqn: "projen.javascript.UpgradeDependencies", version: "0.99.49" };
387
372
  /**
388
373
  * How often to check for new versions and raise pull requests for version upgrades.
389
374
  */
@@ -400,7 +385,7 @@ class UpgradeDependenciesSchedule {
400
385
  }
401
386
  exports.UpgradeDependenciesSchedule = UpgradeDependenciesSchedule;
402
387
  _b = JSII_RTTI_SYMBOL_1;
403
- UpgradeDependenciesSchedule[_b] = { fqn: "projen.javascript.UpgradeDependenciesSchedule", version: "0.99.48" };
388
+ UpgradeDependenciesSchedule[_b] = { fqn: "projen.javascript.UpgradeDependenciesSchedule", version: "0.99.49" };
404
389
  /**
405
390
  * Disables automatic upgrades.
406
391
  */
@@ -445,4 +430,4 @@ function daysToSeconds(days) {
445
430
  function daysToMilliseconds(days) {
446
431
  return days * 86400000;
447
432
  }
448
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBncmFkZS1kZXBlbmRlbmNpZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvamF2YXNjcmlwdC91cGdyYWRlLWRlcGVuZGVuY2llcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLDRDQUF5QztBQUN6QyxrREFBaUQ7QUFPakQsc0NBQWdFO0FBQ2hFLGlDQUEyRDtBQUMzRCxtREFBa0U7QUFDbEUsaURBQXVFO0FBQ3ZFLGlFQUE2RDtBQU03RCwrREFBMEQ7QUFFMUQsOENBQW1EO0FBQ25ELHdDQUFxQztBQUVyQyxzREFBMEQ7QUFHMUQsdUNBQXNEO0FBRXRELE1BQU0sb0JBQW9CLEdBQUcsY0FBYyxDQUFDO0FBQzVDLE1BQU0sb0JBQW9CLEdBQUcsZUFBZSxDQUFDO0FBZ0k3Qzs7R0FFRztBQUNILE1BQWEsbUJBQW9CLFNBQVEscUJBQVM7SUFrQ2hELFlBQVksT0FBb0IsRUFBRSxVQUFzQyxFQUFFO1FBQ3hFLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztRQWxDakI7O1dBRUc7UUFDYSxjQUFTLEdBQXFCLEVBQUUsQ0FBQztRQWlDL0MsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7UUFDdkIsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7UUFFdkIsb0JBQW9CO1FBQ3BCLElBQ0UsT0FBTyxDQUFDLFFBQVEsS0FBSyxTQUFTO1lBQzlCLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxPQUFPLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQyxFQUM3RCxDQUFDO1lBQ0QsTUFBTSxJQUFJLEtBQUssQ0FDYix3RUFBd0UsQ0FDekUsQ0FBQztRQUNKLENBQUM7UUFFRCx3Q0FBd0M7UUFDeEMsSUFBSSxPQUFPLENBQUMsUUFBUSxJQUFJLElBQUEsb0JBQWEsRUFBQyxPQUFPLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUM7WUFDdEUsTUFB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Q0FBTyxHQUFHLElBQUksMkJBQTJCLENBQUM7SUFDL0QsYUFBYTtDQUNkLENBQUMsQ0FBQztBQUVIOztHQUVHO0FBQ29CLGtDQUFNLEdBQUcsSUFBSSwyQkFBMkIsQ0FBQztJQUM5RCxXQUFXO0NBQ1osQ0FBQyxDQUFDO0FBRUg7O0dBRUc7QUFDb0IsbUNBQU8sR0FBRyxJQUFJLDJCQUEyQixDQUFDO0lBQy9ELFdBQVc7Q0FDWixDQUFDLENBQUM7QUFZTDs7R0FFRztBQUNILFNBQVMsYUFBYSxDQUFDLElBQVk7SUFDakMsT0FBTyxJQUFJLEdBQUcsSUFBSSxDQUFDO0FBQ3JCLENBQUM7QUFFRDs7R0FFRztBQUNILFNBQVMsYUFBYSxDQUFDLElBQVk7SUFDakMsT0FBTyxJQUFJLEdBQUcsS0FBSyxDQUFDO0FBQ3RCLENBQUM7QUFFRDs7R0FFRztBQUNILFNBQVMsa0JBQWtCLENBQUMsSUFBWTtJQUN0QyxPQUFPLElBQUksR0FBRyxRQUFRLENBQUM7QUFDekIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCB9IGZyb20gXCIuLi9jb21wb25lbnRcIjtcbmltcG9ydCB7IERlcGVuZGVuY3lUeXBlIH0gZnJvbSBcIi4uL2RlcGVuZGVuY2llc1wiO1xuaW1wb3J0IHR5cGUge1xuICBHaXRodWJDcmVkZW50aWFscyxcbiAgR2l0aHViV29ya2Zsb3csXG4gIEdpdElkZW50aXR5LFxuICB3b3JrZmxvd3MsXG59IGZyb20gXCIuLi9naXRodWJcIjtcbmltcG9ydCB7IEdpdEh1YiwgV29ya2Zsb3dKb2JzLCBXb3JrZmxvd1N0ZXBzIH0gZnJvbSBcIi4uL2dpdGh1YlwiO1xuaW1wb3J0IHsgaXNZYXJuQ2xhc3NpYywgaXNZYXJuQmVycnksIGlzTnBtIH0gZnJvbSBcIi4vdXRpbFwiO1xuaW1wb3J0IHsgREVGQVVMVF9HSVRIVUJfQUNUSU9OU19VU0VSIH0gZnJvbSBcIi4uL2dpdGh1Yi9jb25zdGFudHNcIjtcbmltcG9ydCB7IHByb2plY3RQYXRoUmVsYXRpdmVUb1JlcG9Sb290IH0gZnJvbSBcIi4uL2dpdGh1Yi9wcml2YXRlL3V0aWxcIjtcbmltcG9ydCB7IFdvcmtmbG93QWN0aW9ucyB9IGZyb20gXCIuLi9naXRodWIvd29ya2Zsb3ctYWN0aW9uc1wiO1xuaW1wb3J0IHR5cGUge1xuICBDb250YWluZXJPcHRpb25zLFxuICBKb2JTdGVwLFxuICBKb2JQZXJtaXNzaW9ucyxcbn0gZnJvbSBcIi4uL2dpdGh1Yi93b3JrZmxvd3MtbW9kZWxcIjtcbmltcG9ydCB7IEpvYlBlcm1pc3Npb24gfSBmcm9tIFwiLi4vZ2l0aHViL3dvcmtmbG93cy1tb2RlbFwiO1xuaW1wb3J0IHR5cGUgeyBOb2RlUHJvamVjdCB9IGZyb20gXCIuLi9qYXZhc2NyaXB0XCI7XG5pbXBvcnQgeyBOb2RlUGFja2FnZU1hbmFnZXIgfSBmcm9tIFwiLi4vamF2YXNjcmlwdFwiO1xuaW1wb3J0IHsgUmVsZWFzZSB9IGZyb20gXCIuLi9yZWxlYXNlXCI7XG5pbXBvcnQgdHlwZSB7IEdyb3VwUnVubmVyT3B0aW9ucyB9IGZyb20gXCIuLi9ydW5uZXItb3B0aW9uc1wiO1xuaW1wb3J0IHsgZmlsdGVyZWRSdW5zT25PcHRpb25zIH0gZnJvbSBcIi4uL3J1bm5lci1vcHRpb25zXCI7XG5pbXBvcnQgdHlwZSB7IFRhc2sgfSBmcm9tIFwiLi4vdGFza1wiO1xuaW1wb3J0IHR5cGUgeyBUYXNrU3RlcCB9IGZyb20gXCIuLi90YXNrLW1vZGVsXCI7XG5pbXBvcnQgeyB3b3JrZmxvd05hbWVGb3JQcm9qZWN0IH0gZnJvbSBcIi4uL3V0aWwvbmFtZVwiO1xuXG5jb25zdCBDUkVBVEVfUEFUQ0hfU1RFUF9JRCA9IFwiY3JlYXRlX3BhdGNoXCI7XG5jb25zdCBQQVRDSF9DUkVBVEVEX09VVFBVVCA9IFwicGF0Y2hfY3JlYXRlZFwiO1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIGBVcGdyYWRlRGVwZW5kZW5jaWVzYC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVcGdyYWRlRGVwZW5kZW5jaWVzT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBMaXN0IG9mIHBhY2thZ2UgbmFtZXMgdG8gZXhjbHVkZSBkdXJpbmcgdGhlIHVwZ3JhZGUuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm90aGluZyBpcyBleGNsdWRlZC5cbiAgICovXG4gIHJlYWRvbmx5IGV4Y2x1ZGU/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogTGlzdCBvZiBwYWNrYWdlIG5hbWVzIHRvIGluY2x1ZGUgZHVyaW5nIHRoZSB1cGdyYWRlLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIEV2ZXJ5dGhpbmcgaXMgaW5jbHVkZWQuXG4gICAqL1xuICByZWFkb25seSBpbmNsdWRlPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIERldGVybWluZXMgdGhlIHRhcmdldCB2ZXJzaW9uIHRvIHVwZ3JhZGUgZGVwZW5kZW5jaWVzIHRvLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9yYWluZW9yc2hpbmUvbnBtLWNoZWNrLXVwZGF0ZXMjdGFyZ2V0XG4gICAqXG4gICAqIEBkZWZhdWx0IFwibWlub3JcIlxuICAgKi9cbiAgcmVhZG9ubHkgdGFyZ2V0Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBDaGVjayBwZWVyIGRlcGVuZGVuY2llcyBvZiBpbnN0YWxsZWQgcGFja2FnZXMgYW5kIGZpbHRlciB1cGRhdGVzIHRvIGNvbXBhdGlibGUgdmVyc2lvbnMuXG4gICAqXG4gICAqIEJ5IGRlZmF1bHQsIHRoZSB1cGdyYWRlIHdvcmtmbG93IHdpbGwgYWRoZXJlIHRvIHZlcnNpb24gY29uc3RyYWludHMgZnJvbSBwZWVyIGRlcGVuZGVuY2llcy5cbiAgICogU29tZXRpbWVzIHRoaXMgaXMgbm90IGRlc2lyYWJsZSBhbmQgY2FuIGJlIGRpc2FibGVkLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9yYWluZW9yc2hpbmUvbnBtLWNoZWNrLXVwZGF0ZXMjcGVlclxuICAgKlxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICByZWFkb25seSBzYXRpc2Z5UGVlckRlcGVuZGVuY2llcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEluY2x1ZGUgZGVwcmVjYXRlZCBwYWNrYWdlcy5cbiAgICpcbiAgICogQnkgZGVmYXVsdCwgZGVwcmVjYXRlZCB2ZXJzaW9ucyB3aWxsIGJlIGV4Y2x1ZGVkIGZyb20gdXBncmFkZXMuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL3JhaW5lb3JzaGluZS9ucG0tY2hlY2stdXBkYXRlcz90YWI9cmVhZG1lLW92LWZpbGUjb3B0aW9uc1xuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgaW5jbHVkZURlcHJlY2F0ZWRWZXJzaW9ucz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEluY2x1ZGUgYSBnaXRodWIgd29ya2Zsb3cgZm9yIGNyZWF0aW5nIFBSJ3MgdGhhdCB1cGdyYWRlcyB0aGVcbiAgICogcmVxdWlyZWQgZGVwZW5kZW5jaWVzLCBlaXRoZXIgYnkgbWFudWFsIGRpc3BhdGNoLCBvciBieSBhIHNjaGVkdWxlLlxuICAgKlxuICAgKiBJZiB0aGlzIGlzIGBmYWxzZWAsIG9ubHkgYSBsb2NhbCBwcm9qZW4gdGFzayBpcyBjcmVhdGVkLCB3aGljaCBjYW4gYmUgZXhlY3V0ZWQgbWFudWFsbHkgdG9cbiAgICogdXBncmFkZSB0aGUgZGVwZW5kZW5jaWVzLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIHRydWUgZm9yIHJvb3QgcHJvamVjdHMsIGZhbHNlIGZvciBzdWJwcm9qZWN0cy5cbiAgICovXG4gIHJlYWRvbmx5IHdvcmtmbG93PzogYm9vbGVhbjtcblxuICAvKipcbiAgICogT3B0aW9ucyBmb3IgdGhlIGdpdGh1YiB3b3JrZmxvdy4gT25seSBhcHBsaWVzIGlmIGB3b3JrZmxvd2AgaXMgdHJ1ZS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBkZWZhdWx0IG9wdGlvbnMuXG4gICAqL1xuICByZWFkb25seSB3b3JrZmxvd09wdGlvbnM/OiBVcGdyYWRlRGVwZW5kZW5jaWVzV29ya2Zsb3dPcHRpb25zO1xuXG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgdGFzayB0aGF0IHdpbGwgYmUgY3JlYXRlZC5cbiAgICogVGhpcyB3aWxsIGFsc28gYmUgdGhlIHdvcmtmbG93IG5hbWUuXG4gICAqXG4gICAqIEBkZWZhdWx0IFwidXBncmFkZVwiLlxuICAgKi9cbiAgcmVhZG9ubHkgdGFza05hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRpdGxlIG9mIHRoZSBwdWxsIHJlcXVlc3QgdG8gdXNlIChzaG91bGQgYmUgYWxsIGxvd2VyLWNhc2UpLlxuICAgKlxuICAgKiBAZGVmYXVsdCBcInVwZ3JhZGUgZGVwZW5kZW5jaWVzXCJcbiAgICovXG4gIHJlYWRvbmx5IHB1bGxSZXF1ZXN0VGl0bGU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBzZW1hbnRpYyBjb21taXQgdHlwZS5cbiAgICpcbiAgICogQGRlZmF1bHQgJ2Nob3JlJ1xuICAgKi9cbiAgcmVhZG9ubHkgc2VtYW50aWNDb21taXQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFkZCBTaWduZWQtb2ZmLWJ5IGxpbmUgYnkgdGhlIGNvbW1pdHRlciBhdCB0aGUgZW5kIG9mIHRoZSBjb21taXQgbG9nIG1lc3NhZ2UuXG4gICAqXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIHJlYWRvbmx5IHNpZ25vZmY/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZ5IHdoaWNoIGRlcGVuZGVuY3kgdHlwZXMgdGhlIHVwZ3JhZGUgc2hvdWxkIG9wZXJhdGUgb24uXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gQWxsIGRlcGVuZGVuY3kgdHlwZXMuXG4gICAqL1xuICByZWFkb25seSB0eXBlcz86IERlcGVuZGVuY3lUeXBlW107XG5cbiAgLyoqXG4gICAqIEV4Y2x1ZGUgcGFja2FnZSB2ZXJzaW9ucyBwdWJsaXNoZWQgd2l0aGluIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGRheXMuXG4gICAqXG4gICAqIFRoaXMgbWF5IHByb3ZpZGUgc29tZSBwcm90ZWN0aW9uIGFnYWluc3Qgc3VwcGx5IGNoYWluIGF0dGFja3MsIHNpbXBseSBieSBhdm9pZGluZ1xuICAgKiBuZXdseSBwdWJsaXNoZWQgcGFja2FnZXMgdGhhdCBtYXkgYmUgbWFsaWNpb3VzLiBJdCBnaXZlcyB0aGUgZWNvc3lzdGVtIG1vcmUgdGltZVxuICAgKiB0byBkZXRlY3QgbWFsaWNpb3VzIHBhY2thZ2VzLiBIb3dldmVyIGl0IGNvbWVzIGF0IHRoZSBjb3N0IG9mIHVwZGF0aW5nIG90aGVyXG4gICAqIHBhY2thZ2VzIHNsb3dlciwgd2hpY2ggbWlnaHQgYWxzbyBjb250YWluIHZ1bG5lcmFiaWxpdGllcyBvciBidWdzIGluIG5lZWQgb2YgYSBmaXguXG4gICAqXG4gICAqIFRoZSBjb29sZG93biBwZXJpb2QgYXBwbGllcyB0byBib3RoIG5wbS1jaGVjay11cGRhdGVzIGRpc2NvdmVyeVxuICAgKiBhbmQgdGhlIHBhY2thZ2UgbWFuYWdlciB1cGRhdGUgY29tbWFuZC5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2dpdGh1Yi5jb20vcmFpbmVvcnNoaW5lL25wbS1jaGVjay11cGRhdGVzI2Nvb2xkb3duXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLm5wbWpzLmNvbS9jbGkvdjExL2NvbW1hbmRzL25wbS11cGRhdGUjYmVmb3JlXG4gICAqIEBzZWUgaHR0cHM6Ly9wbnBtLmlvL3NldHRpbmdzI21pbmltdW1yZWxlYXNlYWdlXG4gICAqIEBzZWUgaHR0cHM6Ly9idW4uY29tL2RvY3MvcG0vY2xpL2luc3RhbGwjbWluaW11bS1yZWxlYXNlLWFnZVxuICAgKiBAc2VlIGh0dHBzOi8veWFybnBrZy5jb20vY29uZmlndXJhdGlvbi95YXJucmMjbnBtTWluaW1hbEFnZUdhdGVcbiAgICpcbiAgICogQGRlZmF1bHQgLSBObyBjb29sZG93biBwZXJpb2QuXG4gICAqL1xuICByZWFkb25seSBjb29sZG93bj86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBVcGdyYWRlIG5vZGUgcHJvamVjdCBkZXBlbmRlbmNpZXMuXG4gKi9cbmV4cG9ydCBjbGFzcyBVcGdyYWRlRGVwZW5kZW5jaWVzIGV4dGVuZHMgQ29tcG9uZW50IHtcbiAgLyoqXG4gICAqIFRoZSB3b3JrZmxvd3MgdGhhdCBleGVjdXRlIHRoZSB1cGdyYWRlcy4gT25lIHdvcmtmbG93IHBlciBicmFuY2guXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgd29ya2Zsb3dzOiBHaXRodWJXb3JrZmxvd1tdID0gW107XG5cbiAgcHVibGljIHJlYWRvbmx5IHByb2plY3Q6IE5vZGVQcm9qZWN0O1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgb3B0aW9uczogVXBncmFkZURlcGVuZGVuY2llc09wdGlvbnM7XG4gIHByaXZhdGUgcmVhZG9ubHkgcHVsbFJlcXVlc3RUaXRsZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBDb250YWluZXIgZGVmaW5pdGlvbnMgZm9yIHRoZSB1cGdyYWRlIHdvcmtmbG93LlxuICAgKi9cbiAgcHVibGljIGNvbnRhaW5lck9wdGlvbnM/OiBDb250YWluZXJPcHRpb25zO1xuXG4gIC8qKlxuICAgKiBUaGUgdXBncmFkZSB0YXNrLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHVwZ3JhZGVUYXNrOiBUYXNrO1xuXG4gIC8qKlxuICAgKiBBIHRhc2sgcnVuIGFmdGVyIHRoZSB1cGdyYWRlIHRhc2suXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcG9zdFVwZ3JhZGVUYXNrOiBUYXNrO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgZ2l0SWRlbnRpdHk6IEdpdElkZW50aXR5O1xuICBwcml2YXRlIHJlYWRvbmx5IHBvc3RCdWlsZFN0ZXBzOiBKb2JTdGVwW107XG4gIHByaXZhdGUgcmVhZG9ubHkgcGVybWlzc2lvbnM6IEpvYlBlcm1pc3Npb25zO1xuICBwcml2YXRlIHJlYWRvbmx5IGRlcFR5cGVzOiBEZXBlbmRlbmN5VHlwZVtdO1xuICBwcml2YXRlIHJlYWRvbmx5IHVwZ3JhZGVUYXJnZXQ6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBzYXRpc2Z5UGVlckRlcGVuZGVuY2llczogYm9vbGVhbjtcbiAgcHJpdmF0ZSByZWFkb25seSBpbmNsdWRlRGVwcmVjYXRlZFZlcnNpb25zOiBib29sZWFuO1xuXG4gIGNvbnN0cnVjdG9yKHByb2plY3Q6IE5vZGVQcm9qZWN0LCBvcHRpb25zOiBVcGdyYWRlRGVwZW5kZW5jaWVzT3B0aW9ucyA9IHt9KSB7XG4gICAgc3VwZXIocHJvamVjdCk7XG5cbiAgICB0aGlzLnByb2plY3QgPSBwcm9qZWN0O1xuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG5cbiAgICAvLyBWYWxpZGF0ZSBjb29sZG93blxuICAgIGlmIChcbiAgICAgIG9wdGlvbnMuY29vbGRvd24gIT09IHVuZGVmaW5lZCAmJlxuICAgICAgKCFOdW1iZXIuaXNJbnRlZ2VyKG9wdGlvbnMuY29vbGRvd24pIHx8IG9wdGlvbnMuY29vbGRvd24gPCAwKVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBcIlRoZSAnY29vbGRvd24nIG9wdGlvbiBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIGludGVnZXIgcmVwcmVzZW50aW5nIGRheXNcIixcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gWWFybiBjbGFzc2ljIGRvZXNuJ3Qgc3VwcG9ydCBjb29sZG93blxuICAgIGlmIChvcHRpb25zLmNvb2xkb3duICYmIGlzWWFybkNsYXNzaWMocHJvamVjdC5wYWNrYWdlLnBhY2thZ2VNYW5hZ2VyKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBcIlRoZSAnY29vbGRvd24nIG9wdGlvbiBpcyBub3Qgc3VwcG9ydGVkIHdpdGggeWFybiBjbGFzc2ljLiBcIiArXG4gICAgICAgICAgXCJDb25zaWRlciB1c2luZyBucG0sIHBucG0sIGJ1biwgb3IgeWFybiBiZXJyeSBpbnN0ZWFkLlwiLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICB0aGlzLmRlcFR5cGVzID0gdGhpcy5vcHRpb25zLnR5cGVzID8/IFtcbiAgICAgIERlcGVuZGVuY3lUeXBlLkJVSUxELFxuICAgICAgRGVwZW5kZW5jeVR5cGUuQlVORExFRCxcbiAgICAgIERlcGVuZGVuY3lUeXBlLkRFVkVOVixcbiAgICAgIERlcGVuZGVuY3lUeXBlLlBFRVIsXG4gICAgICBEZXBlbmRlbmN5VHlwZS5SVU5USU1FLFxuICAgICAgRGVwZW5kZW5jeVR5cGUuVEVTVCxcbiAgICAgIERlcGVuZGVuY3lUeXBlLk9QVElPTkFMLFxuICAgIF07XG4gICAgdGhpcy51cGdyYWRlVGFyZ2V0ID0gdGhpcy5vcHRpb25zLnRhcmdldCA/PyBcIm1pbm9yXCI7XG4gICAgdGhpcy5zYXRpc2Z5UGVlckRlcGVuZGVuY2llcyA9IHRoaXMub3B0aW9ucy5zYXRpc2Z5UGVlckRlcGVuZGVuY2llcyA/PyB0cnVlO1xuICAgIHRoaXMuaW5jbHVkZURlcHJlY2F0ZWRWZXJzaW9ucyA9XG4gICAgICB0aGlzLm9wdGlvbnMuaW5jbHVkZURlcHJlY2F0ZWRWZXJzaW9ucyA/PyBmYWxzZTtcbiAgICB0aGlzLnB1bGxSZXF1ZXN0VGl0bGUgPSBvcHRpb25zLnB1bGxSZXF1ZXN0VGl0bGUgPz8gXCJ1cGdyYWRlIGRlcGVuZGVuY2llc1wiO1xuICAgIHRoaXMuZ2l0SWRlbnRpdHkgPVxuICAgICAgb3B0aW9ucy53b3JrZmxvd09wdGlvbnM/LmdpdElkZW50aXR5ID8/IERFRkFVTFRfR0lUSFVCX0FDVElPTlNfVVNFUjtcbiAgICB0aGlzLnBlcm1pc3Npb25zID0ge1xuICAgICAgY29udGVudHM6IEpvYlBlcm1pc3Npb24uUkVBRCxcbiAgICAgIC4uLm9wdGlvbnMud29ya2Zsb3dPcHRpb25zPy5wZXJtaXNzaW9ucyxcbiAgICB9O1xuICAgIHRoaXMucG9zdEJ1aWxkU3RlcHMgPSBbXTtcbiAgICB0aGlzLmNvbnRhaW5lck9wdGlvbnMgPSBvcHRpb25zLndvcmtmbG93T3B0aW9ucz8uY29udGFpbmVyO1xuXG4gICAgdGhpcy5wb3N0VXBncmFkZVRhc2sgPVxuICAgICAgcHJvamVjdC50YXNrcy50cnlGaW5kKFwicG9zdC11cGdyYWRlXCIpID8/XG4gICAgICBwcm9qZWN0LnRhc2tzLmFkZFRhc2soXCJwb3N0LXVwZ3JhZGVcIiwge1xuICAgICAgICBkZXNjcmlwdGlvbjogXCJSdW5zIGFmdGVyIHVwZ3JhZGluZyBkZXBlbmRlbmNpZXNcIixcbiAgICAgIH0pO1xuXG4gICAgY29uc3QgdGFza0VudjogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHsgQ0k6IFwiMFwiIH07XG5cbiAgICAvLyBZYXJuIGJlcnJ5IHRyZWF0cyBhbnkgbm9uLWVtcHR5IENJIHZhbHVlIGFzIHRydXRoeSBhbmQgYXV0by1lbmFibGVzXG4gICAgLy8gaW1tdXRhYmxlIGluc3RhbGxzLiBFeHBsaWNpdGx5IGRpc2FibGUgaXQgc28geWFybiBkbHgvdXAgY2FuIG1vZGlmeVxuICAgIC8vIHRoZSBsb2NrZmlsZSBkdXJpbmcgdXBncmFkZXMuXG4gICAgaWYgKGlzWWFybkJlcnJ5KHByb2plY3QucGFja2FnZS5wYWNrYWdlTWFuYWdlcikpIHtcbiAgICAgIHRhc2tFbnYuWUFSTl9FTkFCTEVfSU1NVVRBQkxFX0lOU1RBTExTID0gXCJmYWxzZVwiO1xuICAgIH1cblxuICAgIC8vIFNldCB5YXJuIGJlcnJ5IGNvb2xkb3duIHZpYSBlbnZpcm9ubWVudCB2YXJpYWJsZSwgZXhwZWN0cyBtaW51dGVzXG4gICAgaWYgKG9wdGlvbnMuY29vbGRvd24gJiYgaXNZYXJuQmVycnkocHJvamVjdC5wYWNrYWdlLnBhY2thZ2VNYW5hZ2VyKSkge1xuICAgICAgdGFza0Vudi5ZQVJOX05QTV9NSU5JTUFMX0FHRV9HQVRFID0gU3RyaW5nKFxuICAgICAgICBkYXlzVG9NaW51dGVzKG9wdGlvbnMuY29vbGRvd24pLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBTZXQgbnBtIGNvb2xkb3duIGRhdGUgdmlhIGVudmlyb25tZW50IHZhcmlhYmxlIChjYWxjdWxhdGVkIGF0IHJ1bnRpbWUpLCBleHBlY3RzIGEgZGF0ZSBpbiBJU08gZm9ybWF0XG4gICAgaWYgKG9wdGlvbnMuY29vbGRvd24gJiYgaXNOcG0ocHJvamVjdC5wYWNrYWdlLnBhY2thZ2VNYW5hZ2VyKSkge1xuICAgICAgdGFza0Vudi5OUE1fQ09ORklHX0JFRk9SRSA9IGAkKG5vZGUgLXAgXCJuZXcgRGF0ZShEYXRlLm5vdygpLSR7ZGF5c1RvTWlsbGlzZWNvbmRzKFxuICAgICAgICBvcHRpb25zLmNvb2xkb3duLFxuICAgICAgKX0pLnRvSVNPU3RyaW5nKClcIilgO1xuICAgIH1cblxuICAgIHRoaXMudXBncmFkZVRhc2sgPSBwcm9qZWN0LmFkZFRhc2sob3B0aW9ucy50YXNrTmFtZSA/PyBcInVwZ3JhZGVcIiwge1xuICAgICAgLy8gdGhpcyB0YXNrIHNob3VsZCBub3QgcnVuIGluIENJIG1vZGUgYmVjYXVzZSBpdHMgZGVzaWduZWQgdG9cbiAgICAgIC8vIHVwZGF0ZSBwYWNrYWdlLmpzb24gYW5kIGxvY2sgZmlsZXMuXG4gICAgICBlbnY6IHRhc2tFbnYsXG4gICAgICBkZXNjcmlwdGlvbjogdGhpcy5wdWxsUmVxdWVzdFRpdGxlLFxuICAgICAgc3RlcHM6IHsgdG9KU09OOiAoKSA9PiB0aGlzLnJlbmRlclRhc2tTdGVwcygpIH0gYXMgYW55LFxuICAgIH0pO1xuICAgIHRoaXMudXBncmFkZVRhc2subG9jaygpOyAvLyB0aGlzIHRhc2sgaXMgYSBsYXp5IHZhbHVlLCBzbyBtYWtlIGl0IHJlYWRvbmx5XG5cbiAgICAvLyBhbHdheXMgdXNlIHRoZSBHaXRIdWIgb2YgdGhlIHJvb3QgcHJvamVjdCAtIHRoZXJlIGNhbiBvbmx5IGJlIG9uZVxuICAgIGNvbnN0IGdpdGh1YiA9IEdpdEh1Yi5vZihwcm9qZWN0LnJvb3QpO1xuXG4gICAgaWYgKHRoaXMudXBncmFkZVRhc2sgJiYgZ2l0aHViICYmIChvcHRpb25zLndvcmtmbG93ID8/IHRydWUpKSB7XG4gICAgICBpZiAob3B0aW9ucy53b3JrZmxvd09wdGlvbnM/LmJyYW5jaGVzKSB7XG4gICAgICAgIGZvciAoY29uc3QgYnJhbmNoIG9mIG9wdGlvbnMud29ya2Zsb3dPcHRpb25zLmJyYW5jaGVzKSB7XG4gICAgICAgICAgdGhpcy53b3JrZmxvd3MucHVzaChcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlV29ya2Zsb3codGhpcy51cGdyYWRlVGFzaywgZ2l0aHViLCBicmFuY2gpLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoUmVsZWFzZS5vZihwcm9qZWN0KSkge1xuICAgICAgICBjb25zdCByZWxlYXNlID0gUmVsZWFzZS5vZihwcm9qZWN0KSE7XG4gICAgICAgIHJlbGVhc2UuX2ZvckVhY2hCcmFuY2goKGJyYW5jaDogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgdGhpcy53b3JrZmxvd3MucHVzaChcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlV29ya2Zsb3codGhpcy51cGdyYWRlVGFzaywgZ2l0aHViLCBicmFuY2gpLFxuICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gcmVwcmVzZW50cyB0aGUgZGVmYXVsdCByZXBvc2l0b3J5IGJyYW5jaC5cbiAgICAgICAgLy8ganVzdCBsaWtlIG5vdCBzcGVjaWZ5aW5nIGFueXRoaW5nLlxuICAgICAgICBjb25zdCBkZWZhdWx0QnJhbmNoID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLndvcmtmbG93cy5wdXNoKFxuICAgICAgICAgIHRoaXMuY3JlYXRlV29ya2Zsb3codGhpcy51cGdyYWRlVGFzaywgZ2l0aHViLCBkZWZhdWx0QnJhbmNoKSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQWRkIHN0ZXBzIHRvIGV4ZWN1dGUgYSBzdWNjZXNzZnVsIGJ1aWxkLlxuICAgKiBAcGFyYW0gc3RlcHMgd29ya2Zsb3cgc3RlcHNcbiAgICovXG4gIHB1YmxpYyBhZGRQb3N0QnVpbGRTdGVwcyguLi5zdGVwczogSm9iU3RlcFtdKSB7XG4gICAgdGhpcy5wb3N0QnVpbGRTdGVwcy5wdXNoKC4uLnN0ZXBzKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVuZGVyVGFza1N0ZXBzKCk6IFRhc2tTdGVwW10ge1xuICAgIGNvbnN0IHN0ZXBzID0gbmV3IEFycmF5PFRhc2tTdGVwPigpO1xuXG4gICAgLy8gUGFja2FnZSBNYW5hZ2VyIHVwZ3JhZGUgc2hvdWxkIGFsd2F5cyBpbmNsdWRlIGFsbCBkZXBzXG4gICAgY29uc3QgaW5jbHVkZUZvclBhY2thZ2VNYW5hZ2VyVXBncmFkZSA9IHRoaXMuYnVpbGREZXBlbmRlbmN5TGlzdCh0cnVlKTtcbiAgICBpZiAoaW5jbHVkZUZvclBhY2thZ2VNYW5hZ2VyVXBncmFkZS5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBbeyBleGVjOiBcImVjaG8gTm8gZGVwZW5kZW5jaWVzIHRvIHVwZ3JhZGUuXCIgfV07XG4gICAgfVxuXG4gICAgLy8gUmVtb3ZpbmcgYG5wbS1jaGVjay11cGRhdGVzYCBmcm9tIG91ciBkZXBlbmRlbmN5IHRyZWUgYmVjYXVzZSBpdCBkZXBlbmRzIG9uIGEgcGFja2FnZVxuICAgIC8vIHRoYXQgdXNlcyBhbiBucG0tc3BlY2lmaWMgZmVhdHVyZSB0aGF0IGNhdXNlcyBhbiBpbnZhbGlkIGRlcGVuZGVuY3kgdHJlZSB3aGVuIHVzaW5nIFlhcm4gMS5cbiAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3Byb2plbi9wcm9qZW4vcHVsbC8zMTM2IGZvciBtb3JlIGRldGFpbHMuXG4gICAgY29uc3QgaW5jbHVkZUZvck5jdSA9IHRoaXMuYnVpbGREZXBlbmRlbmN5TGlzdChmYWxzZSk7XG5cbiAgICAvLyBidW1wIHZlcnNpb25zIGluIHBhY2thZ2UuanNvblxuICAgIGlmIChpbmNsdWRlRm9yTmN1Lmxlbmd0aCkge1xuICAgICAgY29uc3QgbmN1Q29tbWFuZCA9IHRoaXMuYnVpbGROY3VDb21tYW5kKGluY2x1ZGVGb3JOY3UsIHtcbiAgICAgICAgdXBncmFkZTogdHJ1ZSxcbiAgICAgICAgdGFyZ2V0OiB0aGlzLnVwZ3JhZGVUYXJnZXQsXG4gICAgICB9KTtcbiAgICAgIHN0ZXBzLnB1c2goeyBleGVjOiBuY3VDb21tYW5kIH0pO1xuICAgIH1cblxuICAgIC8vIHJ1biBcInlhcm4vbnBtIGluc3RhbGxcIiB0byB1cGRhdGUgdGhlIGxvY2tmaWxlIGFuZCBpbnN0YWxsIGFueSBkZXBzIChzdWNoIGFzIHByb2plbilcbiAgICBzdGVwcy5wdXNoKHsgZXhlYzogdGhpcy5wcm9qZWN0LnBhY2thZ2UuaW5zdGFsbEFuZFVwZGF0ZUxvY2tmaWxlQ29tbWFuZCB9KTtcblxuICAgIC8vIHJ1biB1cGdyYWRlIGNvbW1hbmQgdG8gdXBncmFkZSB0cmFuc2l0aXZlIGRlcHMgYXMgd2VsbFxuICAgIHN0ZXBzLnB1c2goe1xuICAgICAgZXhlYzogdGhpcy5yZW5kZXJVcGdyYWRlUGFja2FnZXNDb21tYW5kKGluY2x1ZGVGb3JQYWNrYWdlTWFuYWdlclVwZ3JhZGUpLFxuICAgIH0pO1xuXG4gICAgLy8gcnVuIFwicHJvamVuXCIgdG8gZ2l2ZSBwcm9qZW4gYSBjaGFuY2UgdG8gdXBkYXRlIGRlcGVuZGVuY2llcyAoaXQgd2lsbCBhbHNvIHJ1biBcInlhcm4gaW5zdGFsbFwiKVxuICAgIHN0ZXBzLnB1c2goeyBleGVjOiB0aGlzLnByb2plY3QucHJvamVuQ29tbWFuZCB9KTtcbiAgICBzdGVwcy5wdXNoKHsgc3Bhd246IHRoaXMucG9zdFVwZ3JhZGVUYXNrLm5hbWUgfSk7XG5cbiAgICByZXR1cm4gc3RlcHM7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGQgbnBtLWNoZWNrLXVwZGF0ZXMgY29tbWFuZCB3aXRoIGNvbW1vbiBvcHRpb25zLlxuICAgKi9cbiAgcHJpdmF0ZSBidWlsZE5jdUNvbW1hbmQoXG4gICAgaW5jbHVkZVBhY2thZ2VzOiBzdHJpbmdbXSxcbiAgICBvcHRpb25zOiB7XG4gICAgICB1cGdyYWRlPzogYm9vbGVhbjtcbiAgICAgIHRhcmdldD86IHN0cmluZztcbiAgICAgIGZvcm1hdD86IHN0cmluZztcbiAgICAgIHJlbW92ZVJhbmdlPzogYm9vbGVhbjtcbiAgICB9ID0ge30sXG4gICk6IHN0cmluZyB7XG4gICAgZnVuY3Rpb24gZXhlY3V0ZUNvbW1hbmQocGFja2FnZU1hbmFnZXI6IE5vZGVQYWNrYWdlTWFuYWdlcik6IHN0cmluZyB7XG4gICAgICBzd2l0Y2ggKHBhY2thZ2VNYW5hZ2VyKSB7XG4gICAgICAgIGNhc2UgTm9kZVBhY2thZ2VNYW5hZ2VyLk5QTTpcbiAgICAgICAgY2FzZSBOb2RlUGFja2FnZU1hbmFnZXIuWUFSTjpcbiAgICAgICAgY2FzZSBOb2RlUGFja2FnZU1hbmFnZXIuWUFSTl9DTEFTU0lDOlxuICAgICAgICAgIHJldHVybiBcIm5weFwiO1xuICAgICAgICBjYXNlIE5vZGVQYWNrYWdlTWFuYWdlci5QTlBNOlxuICAgICAgICAgIHJldHVybiBcInBucG0gZGx4XCI7XG4gICAgICAgIGNhc2UgTm9kZVBhY2thZ2VNYW5hZ2VyLllBUk4yOlxuICAgICAgICBjYXNlIE5vZGVQYWNrYWdlTWFuYWdlci5ZQVJOX0JFUlJZOlxuICAgICAgICAgIHJldHVybiBcInlhcm4gZGx4XCI7XG4gICAgICAgIGNhc2UgTm9kZVBhY2thZ2VNYW5hZ2VyLkJVTjpcbiAgICAgICAgICByZXR1cm4gXCJidW54XCI7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgY29tbWFuZCA9IFtcbiAgICAgIGAke2V4ZWN1dGVDb21tYW5kKFxuICAgICAgICB0aGlzLnByb2plY3QucGFja2FnZS5wYWNrYWdlTWFuYWdlcixcbiAgICAgICl9IG5wbS1jaGVjay11cGRhdGVzQDIwYCxcbiAgICBdO1xuXG4gICAgaWYgKG9wdGlvbnMudXBncmFkZSkge1xuICAgICAgY29tbWFuZC5wdXNoKFwiLS11cGdyYWRlXCIpO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy50YXJnZXQpIHtcbiAgICAgIGNvbW1hbmQucHVzaChgLS10YXJnZXQ9JHtvcHRpb25zLnRhcmdldH1gKTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuZm9ybWF0KSB7XG4gICAgICBjb21tYW5kLnB1c2goYC0tZm9ybWF0PSR7b3B0aW9ucy5mb3JtYXR9YCk7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLnJlbW92ZVJhbmdlKSB7XG4gICAgICBjb21tYW5kLnB1c2goXCItLXJlbW92ZVJhbmdlXCIpO1xuICAgIH1cbiAgICBpZiAodGhpcy5vcHRpb25zLmNvb2xkb3duKSB7XG4gICAgICBjb21tYW5kLnB1c2goYC0tY29vbGRvd249JHt0aGlzLm9wdGlvbnMuY29vbGRvd259YCk7XG4gICAgfVxuXG4gICAgY29tbWFuZC5wdXNoKGAtLSR7dGhpcy5zYXRpc2Z5UGVlckRlcGVuZGVuY2llcyA/IFwicGVlclwiIDogXCJuby1wZWVyXCJ9YCk7XG4gICAgY29tbWFuZC5wdXNoKFxuICAgICAgYC0tJHt0aGlzLmluY2x1ZGVEZXByZWNhdGVkVmVyc2lvbnMgPyBcImRlcHJlY2F0ZWRcIiA6IFwibm8tZGVwcmVjYXRlZFwifWAsXG4gICAgKTtcbiAgICBjb21tYW5kLnB1c2goYC0tZGVwPSR7dGhpcy5yZW5kZXJOY3VEZXBlbmRlbmN5VHlwZXModGhpcy5kZXBUeXBlcyl9YCk7XG4gICAgY29tbWFuZC5wdXNoKGAtLWZpbHRlcj0ke2luY2x1ZGVQYWNrYWdlcy5qb2luKFwiLFwiKX1gKTtcblxuICAgIHJldHVybiBjb21tYW5kLmpvaW4oXCIgXCIpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbmRlciBwcm9qZW4gZGVwZW5kZW5jaWVzIHR5cGVzIHRvIGEgbGlzdCBvZiBuY3UgY29tcGF0aWJsZSB0eXBlc1xuICAgKi9cbiAgcHJpdmF0ZSByZW5kZXJOY3VEZXBlbmRlbmN5VHlwZXModHlwZXM6IERlcGVuZGVuY3lUeXBlW10pIHtcbiAgICByZXR1cm4gQXJyYXkuZnJvbShcbiAgICAgIG5ldyBTZXQoXG4gICAgICAgIHR5cGVzXG4gICAgICAgICAgLm1hcCgodHlwZSkgPT4ge1xuICAgICAgICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgICAgICAgIGNhc2UgRGVwZW5kZW5jeVR5cGUuUEVFUjpcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJwZWVyXCI7XG4gICAgICAgICAgICAgIGNhc2UgRGVwZW5kZW5jeVR5cGUuUlVOVElNRTpcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJwcm9kXCI7XG4gICAgICAgICAgICAgIGNhc2UgRGVwZW5kZW5jeVR5cGUuT1BUSU9OQUw6XG4gICAgICAgICAgICAgICAgcmV0dXJuIFwib3B0aW9uYWxcIjtcblxuICAgICAgICAgICAgICBjYXNlIERlcGVuZGVuY3lUeXBlLlRFU1Q6XG4gICAgICAgICAgICAgIGNhc2UgRGVwZW5kZW5jeVR5cGUuREVWRU5WOlxuICAgICAgICAgICAgICBjYXNlIERlcGVuZGVuY3lUeXBlLkJVSUxEOlxuICAgICAgICAgICAgICAgIHJldHVybiBcImRldlwiO1xuXG4gICAgICAgICAgICAgIGNhc2UgRGVwZW5kZW5jeVR5cGUuQlVORExFRDpcbiAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgICAuZmlsdGVyKCh0eXBlKSA9PiBCb29sZWFuKHR5cGUpKSxcbiAgICAgICksXG4gICAgKS5qb2luKFwiLFwiKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXIgYSBwYWNrYWdlIG1hbmFnZXIgc3BlY2lmaWMgY29tbWFuZCB0byB1cGdyYWRlIGFsbCByZXF1ZXN0ZWQgZGVwZW5kZW5jaWVzLlxuICAgKi9cbiAgcHJpdmF0ZSByZW5kZXJVcGdyYWRlUGFja2FnZXNDb21tYW5kKGluY2x1ZGU6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgICBmdW5jdGlvbiB1cGdyYWRlUGFja2FnZXMoY29tbWFuZDogc3RyaW5nLCBjb29sZG93bkZsYWc/OiBzdHJpbmcpIHtcbiAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHBhcnRzID0gW2NvbW1hbmQsIC4uLmluY2x1ZGVdO1xuICAgICAgICBpZiAoY29vbGRvd25GbGFnKSB7XG4gICAgICAgICAgcGFydHMucHVzaChjb29sZG93bkZsYWcpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwYXJ0cy5qb2luKFwiIFwiKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgY29uc3QgcGFja2FnZU1hbmFnZXIgPSB0aGlzLnByb2plY3QucGFja2FnZS5wYWNrYWdlTWFuYWdlcjtcbiAgICBjb25zdCBjb29sZG93biA9IHRoaXMub3B0aW9ucy5jb29sZG93bjtcblxuICAgIGxldCBsYXp5ID0gdW5kZWZpbmVkO1xuICAgIHN3aXRjaCAocGFja2FnZU1hbmFnZXIpIHtcbiAgICAgIGNhc2UgTm9kZVBhY2thZ2VNYW5hZ2VyLllBUk46XG4gICAgICBjYXNlIE5vZGVQYWNrYWdlTWFuYWdlci5ZQVJOX0NMQVNTSUM6XG4gICAgICAgIGxhenkgPSB1cGdyYWRlUGFja2FnZXMoXCJ5YXJuIHVwZ3JhZGVcIik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBOb2RlUGFja2FnZU1hbmFnZXIuWUFSTjI6XG4gICAgICBjYXNlIE5vZGVQYWNrYWdlTWFuYWdlci5ZQVJOX0JFUlJZOlxuICAgICAgICAvLyBZYXJuIEJlcnJ5IGNvb2xkb3duIHNldCB2aWEgdGFzayBlbnZcbiAgICAgICAgbGF6eSA9IHVwZ3JhZGVQYWNrYWdlcyhcInlhcm4gdXBcIik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBOb2RlUGFja2FnZU1hbmFnZXIuTlBNOlxuICAgICAgICAvLyBucG0gY29vbGRvd24gc2V0IHZpYSBOUE1fQ09ORklHX0JFRk9SRSBlbnZcbiAgICAgICAgbGF6eSA9IHVwZ3JhZGVQYWNrYWdlcyhcIm5wbSB1cGRhdGVcIik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBOb2RlUGFja2FnZU1hbmFnZXIuUE5QTTpcbiAgICAgICAgLy8gcG5wbSBleHBlY3RzIG1pbnV0ZXNcbiAgICAgICAgbGF6eSA9IHVwZ3JhZGVQYWNrYWdlcyhcbiAgICAgICAgICBcInBucG0gdXBkYXRlXCIsXG4gICAgICAgICAgY29vbGRvd24gIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgPyBgLS1jb25maWcubWluaW11bS1yZWxlYXNlLWFnZT0ke2RheXNUb01pbnV0ZXMoY29vbGRvd24pfWBcbiAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICApO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgTm9kZVBhY2thZ2VNYW5hZ2VyLkJVTjpcbiAgICAgICAgLy8gYnVuIGV4cGVjdHMgc2Vjb25kc1xuICAgICAgICBsYXp5ID0gdXBncmFkZVBhY2thZ2VzKFxuICAgICAgICAgIFwiYnVuIHVwZGF0ZVwiLFxuICAgICAgICAgIGNvb2xkb3duXG4gICAgICAgICAgICA/IGAtLW1pbmltdW0tcmVsZWFzZS1hZ2U9JHtkYXlzVG9TZWNvbmRzKGNvb2xkb3duKX1gXG4gICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHVuZXhwZWN0ZWQgcGFja2FnZSBtYW5hZ2VyICR7cGFja2FnZU1hbmFnZXJ9YCk7XG4gICAgfVxuXG4gICAgLy8gcmV0dXJuIGEgbGF6eSBmdW5jdGlvbiBzbyB0aGF0IGRlcGVuZGVuY2llcyBpbmNsdWRlIG9uZXMgdGhhdCB3ZXJlXG4gICAgLy8gYWRkZWQgcG9zdCBwcm9qZWN0IGluc3RhbnRpYXRpb24gKGkuZSB1c2luZyBwcm9qZWN0LmFkZERlcHMpXG4gICAgcmV0dXJuIGxhenkgYXMgdW5rbm93biBhcyBzdHJpbmc7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkRGVwZW5kZW5jeUxpc3QoaW5jbHVkZURlcGVuZGVuY2llc1dpdGhDb25zdHJhaW50OiBib29sZWFuKSB7XG4gICAgcmV0dXJuIEFycmF5LmZyb20oXG4gICAgICBuZXcgU2V0KFxuICAgICAgICB0aGlzLm9wdGlvbnMuaW5jbHVkZSA/P1xuICAgICAgICAgIHRoaXMuZmlsdGVyRGVwZW5kZW5jaWVzKGluY2x1ZGVEZXBlbmRlbmNpZXNXaXRoQ29uc3RyYWludCksXG4gICAgICApLFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGZpbHRlckRlcGVuZGVuY2llcyhpbmNsdWRlQ29uc3RyYWludDogYm9vbGVhbik6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBkZXBlbmRlbmNpZXMgPSBbXTtcblxuICAgIGNvbnN0IGRlcHMgPSB0aGlzLnByb2plY3QuZGVwcy5hbGxcbiAgICAgIC8vIHJlbW92ZSB0aG9zZSB0aGF0IGhhdmUgYSBjb25zdHJhaW50IHZlcnNpb24gKHVubGVzcyBpbmNsdWRlQ29uc3RyYWludCBpcyB0cnVlKVxuICAgICAgLmZpbHRlcihcbiAgICAgICAgKGQpID0+XG4gICAgICAgICAgaW5jbHVkZUNvbnN0cmFpbnQgfHxcbiAgICAgICAgICB0aGlzLnBhY2thZ2VDYW5CZVVwZ3JhZGVkSW5QYWNrYWdlSnNvbihkLnZlcnNpb24pLFxuICAgICAgKVxuICAgICAgLy8gcmVtb3ZlIG92ZXJyaWRlIGRlcGVuZGVuY2llc1xuICAgICAgLmZpbHRlcigoZCkgPT4gZC50eXBlICE9PSBEZXBlbmRlbmN5VHlwZS5PVkVSUklERSk7XG5cbiAgICBmb3IgKGNvbnN0IHR5cGUgb2YgdGhpcy5kZXBUeXBlcykge1xuICAgICAgZGVwZW5kZW5jaWVzLnB1c2goXG4gICAgICAgIC4uLmRlcHNcbiAgICAgICAgICAuZmlsdGVyKChkKSA9PiBkLnR5cGUgPT09IHR5cGUpXG4gICAgICAgICAgLmZpbHRlcigoZCkgPT4gISh0aGlzLm9wdGlvbnMuZXhjbHVkZSA/PyBbXSkuaW5jbHVkZXMoZC5uYW1lKSksXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiBkZXBlbmRlbmNpZXMubWFwKChkKSA9PiBkLm5hbWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFByb2plbiBjYW4gYWx0ZXIgYSBwYWNrYWdlJ3MgdmVyc2lvbiBpbiBwYWNrYWdlLmpzb24gd2hlbiBlaXRoZXIgdGhlIHZlcnNpb24gaXMgb21pdHRlZCwgb3Igc2V0IHRvIFwiKlwiLlxuICAgKiBPdGhlcndpc2UsIHRoZSBleGFjdCB2ZXJzaW9uIHNlbGVjdGVkIGlzIHBsYWNlZCBpbiB0aGUgcGFja2FnZS5qc29uIGZpbGUgYW5kIHVwZ3JhZGluZyBpcyBoYW5kbGVkIHRocm91Z2ggdGhlIHBhY2thZ2UgbWFuYWdlclxuICAgKiByYXRoZXIgdGhhbiBucG0tY2hlY2stdXBkYXRlcy5cbiAgICpcbiAgICogQHBhcmFtIHZlcnNpb24gc2VtdmVyIGZyb20gRGVwZW5kZW5jeUNvb3JkaW5hdGVzLnZlcnNpb24sIG1heSBiZSB1bmRlZmluZWRcbiAgICogQHJldHVybnMgd2hldGhlciB0aGUgdmVyc2lvbiBpcyB0aGUgZGVmYXVsdCB2ZXJzaW9uaW5nIGJlaGF2aW9yXG4gICAqL1xuICBwcml2YXRlIHBhY2thZ2VDYW5CZVVwZ3JhZGVkSW5QYWNrYWdlSnNvbihcbiAgICB2ZXJzaW9uOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICk6IGJvb2xlYW4ge1xuICAgIC8vIE5vIHZlcnNpb24gbWVhbnMgXCJsYXRlc3RcIlxuICAgIHJldHVybiAhdmVyc2lvbiB8fCB2ZXJzaW9uID09PSBcIipcIjtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlV29ya2Zsb3coXG4gICAgdGFzazogVGFzayxcbiAgICBnaXRodWI6IEdpdEh1YixcbiAgICBicmFuY2g/OiBzdHJpbmcsXG4gICk6IEdpdGh1YldvcmtmbG93IHtcbiAgICBjb25zdCBzY2hlZHVsZSA9XG4gICAgICB0aGlzLm9wdGlvbnMud29ya2Zsb3dPcHRpb25zPy5zY2hlZHVsZSA/P1xuICAgICAgVXBncmFkZURlcGVuZGVuY2llc1NjaGVkdWxlLkRBSUxZO1xuXG4gICAgY29uc3QgdGFza0JyYW5jaE5hbWUgPSBgJHt0YXNrLm5hbWV9JHtcbiAgICAgIGJyYW5jaCA/IGAtJHticmFuY2gucmVwbGFjZSgvXFwvL2csIFwiLVwiKX1gIDogXCJcIlxuICAgIH1gO1xuICAgIGNvbnN0IHdvcmtmbG93TmFtZSA9IHdvcmtmbG93TmFtZUZvclByb2plY3QodGFza0JyYW5jaE5hbWUsIHRoaXMucHJvamVjdCk7XG5cbiAgICBjb25zdCB3b3JrZmxvdyA9IGdpdGh1Yi5hZGRXb3JrZmxvdyh3b3JrZmxvd05hbWUpO1xuICAgIGNvbnN0IHRyaWdnZXJzOiB3b3JrZmxvd3MuVHJpZ2dlcnMgPSB7XG4gICAgICB3b3JrZmxvd0Rpc3BhdGNoOiB7fSxcbiAgICAgIHNjaGVkdWxlOlxuICAgICAgICBzY2hlZHVsZS5jcm9uLmxlbmd0aCA+IDBcbiAgICAgICAgICA/IHNjaGVkdWxlLmNyb24ubWFwKChlKSA9PiAoeyBjcm9uOiBlIH0pKVxuICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgIH07XG4gICAgd29ya2Zsb3cub24odHJpZ2dlcnMpO1xuXG4gICAgY29uc3QgdXBncmFkZSA9IHRoaXMuY3JlYXRlVXBncmFkZSh0YXNrLCBnaXRodWIsIGJyYW5jaCk7XG4gICAgY29uc3QgcHIgPSB0aGlzLmNyZWF0ZVByKHdvcmtmbG93LCB1cGdyYWRlKTtcblxuICAgIGNvbnN0IGpvYnM6IFJlY29yZDxzdHJpbmcsIHdvcmtmbG93cy5Kb2I+ID0ge307XG4gICAgam9ic1t1cGdyYWRlLmpvYklkXSA9IHVwZ3JhZGUuam9iO1xuICAgIGpvYnNbcHIuam9iSWRdID0gcHIuam9iO1xuXG4gICAgd29ya2Zsb3cuYWRkSm9icyhqb2JzKTtcbiAgICByZXR1cm4gd29ya2Zsb3c7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZVVwZ3JhZGUodGFzazogVGFzaywgZ2l0aHViOiBHaXRIdWIsIGJyYW5jaD86IHN0cmluZyk6IFVwZ3JhZGUge1xuICAgIGNvbnN0IHdpdGhfID0ge1xuICAgICAgLi4uKGJyYW5jaCA/IHsgcmVmOiBicmFuY2ggfSA6IHt9KSxcbiAgICAgIC4uLihnaXRodWIuZG93bmxvYWRMZnMgPyB7IGxmczogdHJ1ZSB9IDoge30pLFxuICAgIH07XG5cbiAgICBjb25zdCBzdGVwczogd29ya2Zsb3dzLkpvYlN0ZXBbXSA9IFtcbiAgICAgIFdvcmtmbG93U3RlcHMuY2hlY2tvdXQoeyB3aXRoOiB3aXRoXyB9KSxcbiAgICAgIC4uLnRoaXMucHJvamVjdC5yZW5kZXJXb3JrZmxvd1NldHVwKHsgbXV0YWJsZTogZmFsc2UgfSksXG4gICAgICB7XG4gICAgICAgIG5hbWU6IFwiVXBncmFkZSBkZXBlbmRlbmNpZXNcIixcbiAgICAgICAgcnVuOiB0aGlzLnByb2plY3QucnVuVGFza0NvbW1hbmQodGFzayksXG4gICAgICAgIHdvcmtpbmdEaXJlY3Rvcnk6IHRoaXMucHJvamVjdC5wYXJlbnRcbiAgICAgICAgICA/IHByb2plY3RQYXRoUmVsYXRpdmVUb1JlcG9Sb290KHRoaXMucHJvamVjdClcbiAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgIH0sXG4gICAgXTtcblxuICAgIHN0ZXBzLnB1c2goLi4udGhpcy5wb3N0QnVpbGRTdGVwcyk7XG4gICAgc3RlcHMucHVzaChcbiAgICAgIC4uLldvcmtmbG93QWN0aW9ucy51cGxvYWRHaXRQYXRjaCh7XG4gICAgICAgIHN0ZXBJZDogQ1JFQVRFX1BBVENIX1NURVBfSUQsXG4gICAgICAgIG91dHB1dE5hbWU6IFBBVENIX0NSRUFURURfT1VUUFVULFxuICAgICAgfSksXG4gICAgKTtcblxuICAgIHJldHVybiB7XG4gICAgICBqb2I6IHtcbiAgICAgICAgbmFtZTogXCJVcGdyYWRlXCIsXG4gICAgICAgIGNvbnRhaW5lcjogdGhpcy5jb250YWluZXJPcHRpb25zLFxuICAgICAgICBwZXJtaXNzaW9uczogdGhpcy5wZXJtaXNzaW9ucyxcbiAgICAgICAgZW52OiB0aGlzLm9wdGlvbnMud29ya2Zsb3dPcHRpb25zPy5lbnYsXG4gICAgICAgIC4uLmZpbHRlcmVkUnVuc09uT3B0aW9ucyhcbiAgICAgICAgICB0aGlzLm9wdGlvbnMud29ya2Zsb3dPcHRpb25zPy5ydW5zT24sXG4gICAgICAgICAgdGhpcy5vcHRpb25zLndvcmtmbG93T3B0aW9ucz8ucnVuc09uR3JvdXAsXG4gICAgICAgICksXG4gICAgICAgIHN0ZXBzOiBzdGVwcyxcbiAgICAgICAgb3V0cHV0czoge1xuICAgICAgICAgIFtQQVRDSF9DUkVBVEVEX09VVFBVVF06IHtcbiAgICAgICAgICAgIHN0ZXBJZDogQ1JFQVRFX1BBVENIX1NURVBfSUQsXG4gICAgICAgICAgICBvdXRwdXROYW1lOiBQQVRDSF9DUkVBVEVEX09VVFBVVCxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGpvYklkOiBcInVwZ3JhZGVcIixcbiAgICAgIHJlZjogYnJhbmNoLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZVByKHdvcmtmbG93OiBHaXRodWJXb3JrZmxvdywgdXBncmFkZTogVXBncmFkZSk6IFBSIHtcbiAgICBjb25zdCBjcmVkZW50aWFscyA9XG4gICAgICB0aGlzLm9wdGlvbnMud29ya2Zsb3dPcHRpb25zPy5wcm9qZW5DcmVkZW50aWFscyA/P1xuICAgICAgd29ya2Zsb3cucHJvamVuQ3JlZGVudGlhbHM7XG5cbiAgICBjb25zdCBzZW1hbnRpY0NvbW1pdCA9IHRoaXMub3B0aW9ucy5zZW1hbnRpY0NvbW1pdCA/PyBcImNob3JlXCI7XG5cbiAgICByZXR1cm4ge1xuICAgICAgam9iOiBXb3JrZmxvd0pvYnMucHVsbFJlcXVlc3RGcm9tUGF0Y2goe1xuICAgICAgICBwYXRjaDoge1xuICAgICAgICAgIGpvYklkOiB1cGdyYWRlLmpvYklkLFxuICAgICAgICAgIG91dHB1dE5hbWU6IFBBVENIX0NSRUFURURfT1VUUFVULFxuICAgICAgICAgIHJlZjogdXBncmFkZS5yZWYsXG4gICAgICAgIH0sXG4gICAgICAgIHdvcmtmbG93TmFtZTogd29ya2Zsb3cubmFtZSxcbiAgICAgICAgY3JlZGVudGlhbHMsXG4gICAgICAgIC4uLmZpbHRlcmVkUnVuc09uT3B0aW9ucyhcbiAgICAgICAgICB0aGlzLm9wdGlvbnMud29ya2Zsb3dPcHRpb25zPy5ydW5zT24sXG4gICAgICAgICAgdGhpcy5vcHRpb25zLndvcmtmbG93T3B0aW9ucz8ucnVuc09uR3JvdXAsXG4gICAgICAgICksXG4gICAgICAgIHB1bGxSZXF1ZXN0VGl0bGU6IGAke3NlbWFudGljQ29tbWl0fShkZXBzKTogJHt0aGlzLnB1bGxSZXF1ZXN0VGl0bGV9YCxcbiAgICAgICAgcHVsbFJlcXVlc3REZXNjcmlwdGlvbjogXCJVcGdyYWRlcyBwcm9qZWN0IGRlcGVuZGVuY2llcy5cIixcbiAgICAgICAgZ2l0SWRlbnRpdHk6IHRoaXMuZ2l0SWRlbnRpdHksXG4gICAgICAgIGFzc2lnbmVlczogdGhpcy5vcHRpb25zLndvcmtmbG93T3B0aW9ucz8uYXNzaWduZWVzLFxuICAgICAgICBsYWJlbHM6IHRoaXMub3B0aW9ucy53b3JrZmxvd09wdGlvbnM/LmxhYmVscyxcbiAgICAgICAgc2lnbm9mZjogdGhpcy5vcHRpb25zLnNpZ25vZmYsXG4gICAgICB9KSxcbiAgICAgIGpvYklkOiBcInByXCIsXG4gICAgfTtcbiAgfVxufVxuXG5pbnRlcmZhY2UgVXBncmFkZSB7XG4gIHJlYWRvbmx5IHJlZj86IHN0cmluZztcbiAgcmVhZG9ubHkgam9iOiB3b3JrZmxvd3MuSm9iO1xuICByZWFkb25seSBqb2JJZDogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgUFIge1xuICByZWFkb25seSBqb2I6IHdvcmtmbG93cy5Kb2I7XG4gIHJlYWRvbmx5IGpvYklkOiBzdHJpbmc7XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgYFVwZ3JhZGVEZXBlbmRlbmNpZXMud29ya2Zsb3dPcHRpb25zYC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVcGdyYWRlRGVwZW5kZW5jaWVzV29ya2Zsb3dPcHRpb25zIHtcbiAgLyoqXG4gICAqIFNjaGVkdWxlIHRvIHJ1biBvbi5cbiAgICpcbiAgICogQGRlZmF1bHQgVXBncmFkZURlcGVuZGVuY2llc1NjaGVkdWxlLkRBSUxZXG4gICAqL1xuICByZWFkb25seSBzY2hlZHVsZT86IFVwZ3JhZGVEZXBlbmRlbmNpZXNTY2hlZHVsZTtcblxuICAvKipcbiAgICogQ2hvb3NlIGEgbWV0aG9kIGZvciBhdXRoZW50aWNhdGluZyB3aXRoIEdpdEh1YiBmb3IgY3JlYXRpbmcgdGhlIFBSLlxuICAgKlxuICAgKiBXaGVuIHVzaW5nIHRoZSBkZWZhdWx0IGdpdGh1YiB0b2tlbiwgUFIncyBjcmVhdGVkIGJ5IHRoaXMgd29ya2Zsb3dcbiAgICogd2lsbCBub3QgdHJpZ2dlciBhbnkgc3Vic2VxdWVudCB3b3JrZmxvd3MgKGkuZSB0aGUgYnVpbGQgd29ya2Zsb3cpLCBzb1xuICAgKiBwcm9qZW4gcmVxdWlyZXMgQVBJIGFjY2VzcyB0byBiZSBwcm92aWRlZCB0aHJvdWdoIGUuZy4gYSBwZXJzb25hbFxuICAgKiBhY2Nlc3MgdG9rZW4gb3Igb3RoZXIgbWV0aG9kLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9wZXRlci1ldmFucy9jcmVhdGUtcHVsbC1yZXF1ZXN0L2lzc3Vlcy80OFxuICAgKiBAZGVmYXVsdCAtIHBlcnNvbmFsIGFjY2VzcyB0b2tlbiBuYW1lZCBQUk9KRU5fR0lUSFVCX1RPS0VOXG4gICAqL1xuICByZWFkb25seSBwcm9qZW5DcmVkZW50aWFscz86IEdpdGh1YkNyZWRlbnRpYWxzO1xuXG4gIC8qKlxuICAgKiBMYWJlbHMgdG8gYXBwbHkgb24gdGhlIFBSLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIGxhYmVscy5cbiAgICovXG4gIHJlYWRvbmx5IGxhYmVscz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBBc3NpZ25lZXMgdG8gYWRkIG9uIHRoZSBQUi5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBubyBhc3NpZ25lZXNcbiAgICovXG4gIHJlYWRvbmx5IGFzc2lnbmVlcz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBKb2IgY29udGFpbmVyIG9wdGlvbnMuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gZGVmYXVsdHNcbiAgICovXG4gIHJlYWRvbmx5IGNvbnRhaW5lcj86IHdvcmtmbG93cy5Db250YWluZXJPcHRpb25zO1xuXG4gIC8qKlxuICAgKiBMaXN0IG9mIGJyYW5jaGVzIHRvIGNyZWF0ZSBQUidzIGZvci5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBBbGwgcmVsZWFzZSBicmFuY2hlcyBjb25maWd1cmVkIGZvciB0aGUgcHJvamVjdC5cbiAgICovXG4gIHJlYWRvbmx5IGJyYW5jaGVzPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIFRoZSBnaXQgaWRlbnRpdHkgdG8gdXNlIGZvciBjb21taXRzLlxuICAgKiBAZGVmYXVsdCAtIGRlZmF1bHQgR2l0SHViIEFjdGlvbnMgdXNlclxuICAgKi9cbiAgcmVhZG9ubHkgZ2l0SWRlbnRpdHk/OiBHaXRJZGVudGl0eTtcblxuICAvKipcbiAgICogR2l0aHViIFJ1bm5lciBzZWxlY3Rpb24gbGFiZWxzXG4gICAqIEBkZWZhdWx0IFtcInVidW50dS1sYXRlc3RcIl1cbiAgICogQGRlc2NyaXB0aW9uIERlZmluZXMgYSB0YXJnZXQgUnVubmVyIGJ5IGxhYmVsc1xuICAgKiBAdGhyb3dzIHtFcnJvcn0gaWYgYm90aCBgcnVuc09uYCBhbmQgYHJ1bnNPbkdyb3VwYCBhcmUgc3BlY2lmaWVkXG4gICAqL1xuICByZWFkb25seSBydW5zT24/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogR2l0aHViIFJ1bm5lciBHcm91cCBzZWxlY3Rpb24gb3B0aW9uc1xuICAgKiBAZGVzY3JpcHRpb24gRGVmaW5lcyBhIHRhcmdldCBSdW5uZXIgR3JvdXAgYnkgbmFtZSBhbmQvb3IgbGFiZWxzXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBpZiBib3RoIGBydW5zT25gIGFuZCBgcnVuc09uR3JvdXBgIGFyZSBzcGVjaWZpZWRcbiAgICovXG4gIHJlYWRvbmx5IHJ1bnNPbkdyb3VwPzogR3JvdXBSdW5uZXJPcHRpb25zO1xuXG4gIC8qKlxuICAgKiBQZXJtaXNzaW9ucyBncmFudGVkIHRvIHRoZSB1cGdyYWRlIGpvYlxuICAgKiBUbyBsaW1pdCBqb2IgcGVybWlzc2lvbnMgZm9yIGBjb250ZW50c2AsIHRoZSBkZXNpcmVkIHBlcm1pc3Npb25zIGhhdmUgdG8gYmUgZXhwbGljaXRseSBzZXQsIGUuZy46IGB7IGNvbnRlbnRzOiBKb2JQZXJtaXNzaW9uLk5PTkUgfWBcbiAgICogQGRlZmF1bHQgYHsgY29udGVudHM6IEpvYlBlcm1pc3Npb24uUkVBRCB9YFxuICAgKi9cbiAgcmVhZG9ubHkgcGVybWlzc2lvbnM/OiBKb2JQZXJtaXNzaW9ucztcblxuICAvKipcbiAgICogQnVpbGQgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZvciB0aGUgdXBncmFkZSBqb2IuXG4gICAqXG4gICAqIEBkZWZhdWx0IHt9XG4gICAqL1xuICByZWFkb25seSBlbnY/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xufVxuXG4vKipcbiAqIEhvdyBvZnRlbiB0byBjaGVjayBmb3IgbmV3IHZlcnNpb25zIGFuZCByYWlzZSBwdWxsIHJlcXVlc3RzIGZvciB2ZXJzaW9uIHVwZ3JhZGVzLlxuICovXG5leHBvcnQgY2xhc3MgVXBncmFkZURlcGVuZGVuY2llc1NjaGVkdWxlIHtcbiAgLyoqXG4gICAqIERpc2FibGVzIGF1dG9tYXRpYyB1cGdyYWRlcy5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgTkVWRVIgPSBuZXcgVXBncmFkZURlcGVuZGVuY2llc1NjaGVkdWxlKFtdKTtcblxuICAvKipcbiAgICogQXQgMDA6MDAuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IERBSUxZID0gbmV3IFVwZ3JhZGVEZXBlbmRlbmNpZXNTY2hlZHVsZShbXCIwIDAgKiAqICpcIl0pO1xuXG4gIC8qKlxuICAgKiBBdCAwMDowMCBvbiBldmVyeSBkYXktb2Ytd2VlayBmcm9tIE1vbmRheSB0aHJvdWdoIEZyaWRheS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgV0VFS0RBWSA9IG5ldyBVcGdyYWRlRGVwZW5kZW5jaWVzU2NoZWR1bGUoW1xuICAgIFwiMCAwICogKiAxLTVcIixcbiAgXSk7XG5cbiAgLyoqXG4gICAqIEF0IDAwOjAwIG9uIE1vbmRheS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgV0VFS0xZID0gbmV3IFVwZ3JhZGVEZXBlbmRlbmNpZXNTY2hlZHVsZShbXG4gICAgXCIwIDAgKiAqIDFcIixcbiAgXSk7XG5cbiAgLyoqXG4gICAqIEF0IDAwOjAwIG9uIGRheS1vZi1tb250aCAxLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBNT05USExZID0gbmV3IFVwZ3JhZGVEZXBlbmRlbmNpZXNTY2hlZHVsZShbXG4gICAgXCIwIDAgMSAqICpcIixcbiAgXSk7XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIHNjaGVkdWxlIGZyb20gYSByYXcgY3JvbiBleHByZXNzaW9uLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBleHByZXNzaW9ucyhjcm9uOiBzdHJpbmdbXSkge1xuICAgIHJldHVybiBuZXcgVXBncmFkZURlcGVuZGVuY2llc1NjaGVkdWxlKGNyb24pO1xuICB9XG5cbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcihwdWJsaWMgcmVhZG9ubHkgY3Jvbjogc3RyaW5nW10pIHt9XG59XG5cbi8qKlxuICogQ29udmVydCBkYXlzIHRvIG1pbnV0ZXMuXG4gKi9cbmZ1bmN0aW9uIGRheXNUb01pbnV0ZXMoZGF5czogbnVtYmVyKTogbnVtYmVyIHtcbiAgcmV0dXJuIGRheXMgKiAxNDQwO1xufVxuXG4vKipcbiAqIENvbnZlcnQgZGF5cyB0byBzZWNvbmRzLlxuICovXG5mdW5jdGlvbiBkYXlzVG9TZWNvbmRzKGRheXM6IG51bWJlcik6IG51bWJlciB7XG4gIHJldHVybiBkYXlzICogODY0MDA7XG59XG5cbi8qKlxuICogQ29udmVydCBkYXlzIHRvIG1pbGxpc2Vjb25kcy5cbiAqL1xuZnVuY3Rpb24gZGF5c1RvTWlsbGlzZWNvbmRzKGRheXM6IG51bWJlcik6IG51bWJlciB7XG4gIHJldHVybiBkYXlzICogODY0MDAwMDA7XG59XG4iXX0=
433
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBncmFkZS1kZXBlbmRlbmNpZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvamF2YXNjcmlwdC91cGdyYWRlLWRlcGVuZGVuY2llcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLDRDQUF5QztBQUN6QyxrREFBaUQ7QUFPakQsc0NBQWdFO0FBQ2hFLGlDQUtnQjtBQUNoQixtREFBa0U7QUFDbEUsaURBQXVFO0FBQ3ZFLGlFQUE2RDtBQU03RCwrREFBMEQ7QUFFMUQsOENBQW1EO0FBQ25ELHdDQUFxQztBQUVyQyxzREFBMEQ7QUFHMUQsdUNBQXNEO0FBRXRELE1BQU0sb0JBQW9CLEdBQUcsY0FBYyxDQUFDO0FBQzVDLE1BQU0sb0JBQW9CLEdBQUcsZUFBZSxDQUFDO0FBZ0k3Qzs7R0FFRztBQUNILE1BQWEsbUJBQW9CLFNBQVEscUJBQVM7SUFrQ2hELFlBQVksT0FBb0IsRUFBRSxVQUFzQyxFQUFFO1FBQ3hFLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztRQWxDakI7O1dBRUc7UUFDYSxjQUFTLEdBQXFCLEVBQUUsQ0FBQztRQWlDL0MsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7UUFDdkIsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7UUFFdkIsb0JBQW9CO1FBQ3BCLElBQ0UsT0FBTyxDQUFDLFFBQVEsS0FBSyxTQUFTO1lBQzlCLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxPQUFPLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQyxFQUM3RCxDQUFDO1lBQ0QsTUFBTSxJQUFJLEtBQUssQ0FDYix3RUFBd0UsQ0FDekUsQ0FBQztRQUNKLENBQUM7UUFFRCx3Q0FBd0M7UUFDeEMsSUFBSSxPQUFPLENBQUMsUUFBUSxJQUFJLElBQUEsb0JBQWEsRUFBQyxPQUFPLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUM7WUFDdEUsTUFB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UyxrQkFBa0IsQ0FBQyxJQUFZO0lBQ3RDLE9BQU8sSUFBSSxHQUFHLFFBQVEsQ0FBQztBQUN6QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50IH0gZnJvbSBcIi4uL2NvbXBvbmVudFwiO1xuaW1wb3J0IHsgRGVwZW5kZW5jeVR5cGUgfSBmcm9tIFwiLi4vZGVwZW5kZW5jaWVzXCI7XG5pbXBvcnQgdHlwZSB7XG4gIEdpdGh1YkNyZWRlbnRpYWxzLFxuICBHaXRodWJXb3JrZmxvdyxcbiAgR2l0SWRlbnRpdHksXG4gIHdvcmtmbG93cyxcbn0gZnJvbSBcIi4uL2dpdGh1YlwiO1xuaW1wb3J0IHsgR2l0SHViLCBXb3JrZmxvd0pvYnMsIFdvcmtmbG93U3RlcHMgfSBmcm9tIFwiLi4vZ2l0aHViXCI7XG5pbXBvcnQge1xuICBpc1lhcm5DbGFzc2ljLFxuICBpc1lhcm5CZXJyeSxcbiAgaXNOcG0sXG4gIGV4ZWN1dGVDb21tYW5kUHJpb3JJbnN0YWxsYXRpb24sXG59IGZyb20gXCIuL3V0aWxcIjtcbmltcG9ydCB7IERFRkFVTFRfR0lUSFVCX0FDVElPTlNfVVNFUiB9IGZyb20gXCIuLi9naXRodWIvY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBwcm9qZWN0UGF0aFJlbGF0aXZlVG9SZXBvUm9vdCB9IGZyb20gXCIuLi9naXRodWIvcHJpdmF0ZS91dGlsXCI7XG5pbXBvcnQgeyBXb3JrZmxvd0FjdGlvbnMgfSBmcm9tIFwiLi4vZ2l0aHViL3dvcmtmbG93LWFjdGlvbnNcIjtcbmltcG9ydCB0eXBlIHtcbiAgQ29udGFpbmVyT3B0aW9ucyxcbiAgSm9iU3RlcCxcbiAgSm9iUGVybWlzc2lvbnMsXG59IGZyb20gXCIuLi9naXRodWIvd29ya2Zsb3dzLW1vZGVsXCI7XG5pbXBvcnQgeyBKb2JQZXJtaXNzaW9uIH0gZnJvbSBcIi4uL2dpdGh1Yi93b3JrZmxvd3MtbW9kZWxcIjtcbmltcG9ydCB0eXBlIHsgTm9kZVByb2plY3QgfSBmcm9tIFwiLi4vamF2YXNjcmlwdFwiO1xuaW1wb3J0IHsgTm9kZVBhY2thZ2VNYW5hZ2VyIH0gZnJvbSBcIi4uL2phdmFzY3JpcHRcIjtcbmltcG9ydCB7IFJlbGVhc2UgfSBmcm9tIFwiLi4vcmVsZWFzZVwiO1xuaW1wb3J0IHR5cGUgeyBHcm91cFJ1bm5lck9wdGlvbnMgfSBmcm9tIFwiLi4vcnVubmVyLW9wdGlvbnNcIjtcbmltcG9ydCB7IGZpbHRlcmVkUnVuc09uT3B0aW9ucyB9IGZyb20gXCIuLi9ydW5uZXItb3B0aW9uc1wiO1xuaW1wb3J0IHR5cGUgeyBUYXNrIH0gZnJvbSBcIi4uL3Rhc2tcIjtcbmltcG9ydCB0eXBlIHsgVGFza1N0ZXAgfSBmcm9tIFwiLi4vdGFzay1tb2RlbFwiO1xuaW1wb3J0IHsgd29ya2Zsb3dOYW1lRm9yUHJvamVjdCB9IGZyb20gXCIuLi91dGlsL25hbWVcIjtcblxuY29uc3QgQ1JFQVRFX1BBVENIX1NURVBfSUQgPSBcImNyZWF0ZV9wYXRjaFwiO1xuY29uc3QgUEFUQ0hfQ1JFQVRFRF9PVVRQVVQgPSBcInBhdGNoX2NyZWF0ZWRcIjtcblxuLyoqXG4gKiBPcHRpb25zIGZvciBgVXBncmFkZURlcGVuZGVuY2llc2AuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXBncmFkZURlcGVuZGVuY2llc09wdGlvbnMge1xuICAvKipcbiAgICogTGlzdCBvZiBwYWNrYWdlIG5hbWVzIHRvIGV4Y2x1ZGUgZHVyaW5nIHRoZSB1cGdyYWRlLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vdGhpbmcgaXMgZXhjbHVkZWQuXG4gICAqL1xuICByZWFkb25seSBleGNsdWRlPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIExpc3Qgb2YgcGFja2FnZSBuYW1lcyB0byBpbmNsdWRlIGR1cmluZyB0aGUgdXBncmFkZS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBFdmVyeXRoaW5nIGlzIGluY2x1ZGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgaW5jbHVkZT86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIHRoZSB0YXJnZXQgdmVyc2lvbiB0byB1cGdyYWRlIGRlcGVuZGVuY2llcyB0by5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2dpdGh1Yi5jb20vcmFpbmVvcnNoaW5lL25wbS1jaGVjay11cGRhdGVzI3RhcmdldFxuICAgKlxuICAgKiBAZGVmYXVsdCBcIm1pbm9yXCJcbiAgICovXG4gIHJlYWRvbmx5IHRhcmdldD86IHN0cmluZztcblxuICAvKipcbiAgICogQ2hlY2sgcGVlciBkZXBlbmRlbmNpZXMgb2YgaW5zdGFsbGVkIHBhY2thZ2VzIGFuZCBmaWx0ZXIgdXBkYXRlcyB0byBjb21wYXRpYmxlIHZlcnNpb25zLlxuICAgKlxuICAgKiBCeSBkZWZhdWx0LCB0aGUgdXBncmFkZSB3b3JrZmxvdyB3aWxsIGFkaGVyZSB0byB2ZXJzaW9uIGNvbnN0cmFpbnRzIGZyb20gcGVlciBkZXBlbmRlbmNpZXMuXG4gICAqIFNvbWV0aW1lcyB0aGlzIGlzIG5vdCBkZXNpcmFibGUgYW5kIGNhbiBiZSBkaXNhYmxlZC5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2dpdGh1Yi5jb20vcmFpbmVvcnNoaW5lL25wbS1jaGVjay11cGRhdGVzI3BlZXJcbiAgICpcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgcmVhZG9ubHkgc2F0aXNmeVBlZXJEZXBlbmRlbmNpZXM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBJbmNsdWRlIGRlcHJlY2F0ZWQgcGFja2FnZXMuXG4gICAqXG4gICAqIEJ5IGRlZmF1bHQsIGRlcHJlY2F0ZWQgdmVyc2lvbnMgd2lsbCBiZSBleGNsdWRlZCBmcm9tIHVwZ3JhZGVzLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9yYWluZW9yc2hpbmUvbnBtLWNoZWNrLXVwZGF0ZXM/dGFiPXJlYWRtZS1vdi1maWxlI29wdGlvbnNcbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IGluY2x1ZGVEZXByZWNhdGVkVmVyc2lvbnM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBJbmNsdWRlIGEgZ2l0aHViIHdvcmtmbG93IGZvciBjcmVhdGluZyBQUidzIHRoYXQgdXBncmFkZXMgdGhlXG4gICAqIHJlcXVpcmVkIGRlcGVuZGVuY2llcywgZWl0aGVyIGJ5IG1hbnVhbCBkaXNwYXRjaCwgb3IgYnkgYSBzY2hlZHVsZS5cbiAgICpcbiAgICogSWYgdGhpcyBpcyBgZmFsc2VgLCBvbmx5IGEgbG9jYWwgcHJvamVuIHRhc2sgaXMgY3JlYXRlZCwgd2hpY2ggY2FuIGJlIGV4ZWN1dGVkIG1hbnVhbGx5IHRvXG4gICAqIHVwZ3JhZGUgdGhlIGRlcGVuZGVuY2llcy5cbiAgICpcbiAgICogQGRlZmF1bHQgLSB0cnVlIGZvciByb290IHByb2plY3RzLCBmYWxzZSBmb3Igc3VicHJvamVjdHMuXG4gICAqL1xuICByZWFkb25seSB3b3JrZmxvdz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIE9wdGlvbnMgZm9yIHRoZSBnaXRodWIgd29ya2Zsb3cuIE9ubHkgYXBwbGllcyBpZiBgd29ya2Zsb3dgIGlzIHRydWUuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gZGVmYXVsdCBvcHRpb25zLlxuICAgKi9cbiAgcmVhZG9ubHkgd29ya2Zsb3dPcHRpb25zPzogVXBncmFkZURlcGVuZGVuY2llc1dvcmtmbG93T3B0aW9ucztcblxuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIHRhc2sgdGhhdCB3aWxsIGJlIGNyZWF0ZWQuXG4gICAqIFRoaXMgd2lsbCBhbHNvIGJlIHRoZSB3b3JrZmxvdyBuYW1lLlxuICAgKlxuICAgKiBAZGVmYXVsdCBcInVwZ3JhZGVcIi5cbiAgICovXG4gIHJlYWRvbmx5IHRhc2tOYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaXRsZSBvZiB0aGUgcHVsbCByZXF1ZXN0IHRvIHVzZSAoc2hvdWxkIGJlIGFsbCBsb3dlci1jYXNlKS5cbiAgICpcbiAgICogQGRlZmF1bHQgXCJ1cGdyYWRlIGRlcGVuZGVuY2llc1wiXG4gICAqL1xuICByZWFkb25seSBwdWxsUmVxdWVzdFRpdGxlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgc2VtYW50aWMgY29tbWl0IHR5cGUuXG4gICAqXG4gICAqIEBkZWZhdWx0ICdjaG9yZSdcbiAgICovXG4gIHJlYWRvbmx5IHNlbWFudGljQ29tbWl0Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBZGQgU2lnbmVkLW9mZi1ieSBsaW5lIGJ5IHRoZSBjb21taXR0ZXIgYXQgdGhlIGVuZCBvZiB0aGUgY29tbWl0IGxvZyBtZXNzYWdlLlxuICAgKlxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICByZWFkb25seSBzaWdub2ZmPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogU3BlY2lmeSB3aGljaCBkZXBlbmRlbmN5IHR5cGVzIHRoZSB1cGdyYWRlIHNob3VsZCBvcGVyYXRlIG9uLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIEFsbCBkZXBlbmRlbmN5IHR5cGVzLlxuICAgKi9cbiAgcmVhZG9ubHkgdHlwZXM/OiBEZXBlbmRlbmN5VHlwZVtdO1xuXG4gIC8qKlxuICAgKiBFeGNsdWRlIHBhY2thZ2UgdmVyc2lvbnMgcHVibGlzaGVkIHdpdGhpbiB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBkYXlzLlxuICAgKlxuICAgKiBUaGlzIG1heSBwcm92aWRlIHNvbWUgcHJvdGVjdGlvbiBhZ2FpbnN0IHN1cHBseSBjaGFpbiBhdHRhY2tzLCBzaW1wbHkgYnkgYXZvaWRpbmdcbiAgICogbmV3bHkgcHVibGlzaGVkIHBhY2thZ2VzIHRoYXQgbWF5IGJlIG1hbGljaW91cy4gSXQgZ2l2ZXMgdGhlIGVjb3N5c3RlbSBtb3JlIHRpbWVcbiAgICogdG8gZGV0ZWN0IG1hbGljaW91cyBwYWNrYWdlcy4gSG93ZXZlciBpdCBjb21lcyBhdCB0aGUgY29zdCBvZiB1cGRhdGluZyBvdGhlclxuICAgKiBwYWNrYWdlcyBzbG93ZXIsIHdoaWNoIG1pZ2h0IGFsc28gY29udGFpbiB2dWxuZXJhYmlsaXRpZXMgb3IgYnVncyBpbiBuZWVkIG9mIGEgZml4LlxuICAgKlxuICAgKiBUaGUgY29vbGRvd24gcGVyaW9kIGFwcGxpZXMgdG8gYm90aCBucG0tY2hlY2stdXBkYXRlcyBkaXNjb3ZlcnlcbiAgICogYW5kIHRoZSBwYWNrYWdlIG1hbmFnZXIgdXBkYXRlIGNvbW1hbmQuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL3JhaW5lb3JzaGluZS9ucG0tY2hlY2stdXBkYXRlcyNjb29sZG93blxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5ucG1qcy5jb20vY2xpL3YxMS9jb21tYW5kcy9ucG0tdXBkYXRlI2JlZm9yZVxuICAgKiBAc2VlIGh0dHBzOi8vcG5wbS5pby9zZXR0aW5ncyNtaW5pbXVtcmVsZWFzZWFnZVxuICAgKiBAc2VlIGh0dHBzOi8vYnVuLmNvbS9kb2NzL3BtL2NsaS9pbnN0YWxsI21pbmltdW0tcmVsZWFzZS1hZ2VcbiAgICogQHNlZSBodHRwczovL3lhcm5wa2cuY29tL2NvbmZpZ3VyYXRpb24veWFybnJjI25wbU1pbmltYWxBZ2VHYXRlXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm8gY29vbGRvd24gcGVyaW9kLlxuICAgKi9cbiAgcmVhZG9ubHkgY29vbGRvd24/OiBudW1iZXI7XG59XG5cbi8qKlxuICogVXBncmFkZSBub2RlIHByb2plY3QgZGVwZW5kZW5jaWVzLlxuICovXG5leHBvcnQgY2xhc3MgVXBncmFkZURlcGVuZGVuY2llcyBleHRlbmRzIENvbXBvbmVudCB7XG4gIC8qKlxuICAgKiBUaGUgd29ya2Zsb3dzIHRoYXQgZXhlY3V0ZSB0aGUgdXBncmFkZXMuIE9uZSB3b3JrZmxvdyBwZXIgYnJhbmNoLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHdvcmtmbG93czogR2l0aHViV29ya2Zsb3dbXSA9IFtdO1xuXG4gIHB1YmxpYyByZWFkb25seSBwcm9qZWN0OiBOb2RlUHJvamVjdDtcblxuICBwcml2YXRlIHJlYWRvbmx5IG9wdGlvbnM6IFVwZ3JhZGVEZXBlbmRlbmNpZXNPcHRpb25zO1xuICBwcml2YXRlIHJlYWRvbmx5IHB1bGxSZXF1ZXN0VGl0bGU6IHN0cmluZztcblxuICAvKipcbiAgICogQ29udGFpbmVyIGRlZmluaXRpb25zIGZvciB0aGUgdXBncmFkZSB3b3JrZmxvdy5cbiAgICovXG4gIHB1YmxpYyBjb250YWluZXJPcHRpb25zPzogQ29udGFpbmVyT3B0aW9ucztcblxuICAvKipcbiAgICogVGhlIHVwZ3JhZGUgdGFzay5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB1cGdyYWRlVGFzazogVGFzaztcblxuICAvKipcbiAgICogQSB0YXNrIHJ1biBhZnRlciB0aGUgdXBncmFkZSB0YXNrLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHBvc3RVcGdyYWRlVGFzazogVGFzaztcblxuICBwcml2YXRlIHJlYWRvbmx5IGdpdElkZW50aXR5OiBHaXRJZGVudGl0eTtcbiAgcHJpdmF0ZSByZWFkb25seSBwb3N0QnVpbGRTdGVwczogSm9iU3RlcFtdO1xuICBwcml2YXRlIHJlYWRvbmx5IHBlcm1pc3Npb25zOiBKb2JQZXJtaXNzaW9ucztcbiAgcHJpdmF0ZSByZWFkb25seSBkZXBUeXBlczogRGVwZW5kZW5jeVR5cGVbXTtcbiAgcHJpdmF0ZSByZWFkb25seSB1cGdyYWRlVGFyZ2V0OiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2F0aXNmeVBlZXJEZXBlbmRlbmNpZXM6IGJvb2xlYW47XG4gIHByaXZhdGUgcmVhZG9ubHkgaW5jbHVkZURlcHJlY2F0ZWRWZXJzaW9uczogYm9vbGVhbjtcblxuICBjb25zdHJ1Y3Rvcihwcm9qZWN0OiBOb2RlUHJvamVjdCwgb3B0aW9uczogVXBncmFkZURlcGVuZGVuY2llc09wdGlvbnMgPSB7fSkge1xuICAgIHN1cGVyKHByb2plY3QpO1xuXG4gICAgdGhpcy5wcm9qZWN0ID0gcHJvamVjdDtcbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuXG4gICAgLy8gVmFsaWRhdGUgY29vbGRvd25cbiAgICBpZiAoXG4gICAgICBvcHRpb25zLmNvb2xkb3duICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICghTnVtYmVyLmlzSW50ZWdlcihvcHRpb25zLmNvb2xkb3duKSB8fCBvcHRpb25zLmNvb2xkb3duIDwgMClcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgXCJUaGUgJ2Nvb2xkb3duJyBvcHRpb24gbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyIHJlcHJlc2VudGluZyBkYXlzXCIsXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIFlhcm4gY2xhc3NpYyBkb2Vzbid0IHN1cHBvcnQgY29vbGRvd25cbiAgICBpZiAob3B0aW9ucy5jb29sZG93biAmJiBpc1lhcm5DbGFzc2ljKHByb2plY3QucGFja2FnZS5wYWNrYWdlTWFuYWdlcikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgXCJUaGUgJ2Nvb2xkb3duJyBvcHRpb24gaXMgbm90IHN1cHBvcnRlZCB3aXRoIHlhcm4gY2xhc3NpYy4gXCIgK1xuICAgICAgICAgIFwiQ29uc2lkZXIgdXNpbmcgbnBtLCBwbnBtLCBidW4sIG9yIHlhcm4gYmVycnkgaW5zdGVhZC5cIixcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdGhpcy5kZXBUeXBlcyA9IHRoaXMub3B0aW9ucy50eXBlcyA/PyBbXG4gICAgICBEZXBlbmRlbmN5VHlwZS5CVUlMRCxcbiAgICAgIERlcGVuZGVuY3lUeXBlLkJVTkRMRUQsXG4gICAgICBEZXBlbmRlbmN5VHlwZS5ERVZFTlYsXG4gICAgICBEZXBlbmRlbmN5VHlwZS5QRUVSLFxuICAgICAgRGVwZW5kZW5jeVR5cGUuUlVOVElNRSxcbiAgICAgIERlcGVuZGVuY3lUeXBlLlRFU1QsXG4gICAgICBEZXBlbmRlbmN5VHlwZS5PUFRJT05BTCxcbiAgICBdO1xuICAgIHRoaXMudXBncmFkZVRhcmdldCA9IHRoaXMub3B0aW9ucy50YXJnZXQgPz8gXCJtaW5vclwiO1xuICAgIHRoaXMuc2F0aXNmeVBlZXJEZXBlbmRlbmNpZXMgPSB0aGlzLm9wdGlvbnMuc2F0aXNmeVBlZXJEZXBlbmRlbmNpZXMgPz8gdHJ1ZTtcbiAgICB0aGlzLmluY2x1ZGVEZXByZWNhdGVkVmVyc2lvbnMgPVxuICAgICAgdGhpcy5vcHRpb25zLmluY2x1ZGVEZXByZWNhdGVkVmVyc2lvbnMgPz8gZmFsc2U7XG4gICAgdGhpcy5wdWxsUmVxdWVzdFRpdGxlID0gb3B0aW9ucy5wdWxsUmVxdWVzdFRpdGxlID8/IFwidXBncmFkZSBkZXBlbmRlbmNpZXNcIjtcbiAgICB0aGlzLmdpdElkZW50aXR5ID1cbiAgICAgIG9wdGlvbnMud29ya2Zsb3dPcHRpb25zPy5naXRJZGVudGl0eSA/PyBERUZBVUxUX0dJVEhVQl9BQ1RJT05TX1VTRVI7XG4gICAgdGhpcy5wZXJtaXNzaW9ucyA9IHtcbiAgICAgIGNvbnRlbnRzOiBKb2JQZXJtaXNzaW9uLlJFQUQsXG4gICAgICAuLi5vcHRpb25zLndvcmtmbG93T3B0aW9ucz8ucGVybWlzc2lvbnMsXG4gICAgfTtcbiAgICB0aGlzLnBvc3RCdWlsZFN0ZXBzID0gW107XG4gICAgdGhpcy5jb250YWluZXJPcHRpb25zID0gb3B0aW9ucy53b3JrZmxvd09wdGlvbnM/LmNvbnRhaW5lcjtcblxuICAgIHRoaXMucG9zdFVwZ3JhZGVUYXNrID1cbiAgICAgIHByb2plY3QudGFza3MudHJ5RmluZChcInBvc3QtdXBncmFkZVwiKSA/P1xuICAgICAgcHJvamVjdC50YXNrcy5hZGRUYXNrKFwicG9zdC11cGdyYWRlXCIsIHtcbiAgICAgICAgZGVzY3JpcHRpb246IFwiUnVucyBhZnRlciB1cGdyYWRpbmcgZGVwZW5kZW5jaWVzXCIsXG4gICAgICB9KTtcblxuICAgIGNvbnN0IHRhc2tFbnY6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7IENJOiBcIjBcIiB9O1xuXG4gICAgLy8gWWFybiBiZXJyeSB0cmVhdHMgYW55IG5vbi1lbXB0eSBDSSB2YWx1ZSBhcyB0cnV0aHkgYW5kIGF1dG8tZW5hYmxlc1xuICAgIC8vIGltbXV0YWJsZSBpbnN0YWxscy4gRXhwbGljaXRseSBkaXNhYmxlIGl0IHNvIHlhcm4gZGx4L3VwIGNhbiBtb2RpZnlcbiAgICAvLyB0aGUgbG9ja2ZpbGUgZHVyaW5nIHVwZ3JhZGVzLlxuICAgIGlmIChpc1lhcm5CZXJyeShwcm9qZWN0LnBhY2thZ2UucGFja2FnZU1hbmFnZXIpKSB7XG4gICAgICB0YXNrRW52LllBUk5fRU5BQkxFX0lNTVVUQUJMRV9JTlNUQUxMUyA9IFwiZmFsc2VcIjtcbiAgICB9XG5cbiAgICAvLyBTZXQgeWFybiBiZXJyeSBjb29sZG93biB2aWEgZW52aXJvbm1lbnQgdmFyaWFibGUsIGV4cGVjdHMgbWludXRlc1xuICAgIGlmIChvcHRpb25zLmNvb2xkb3duICYmIGlzWWFybkJlcnJ5KHByb2plY3QucGFja2FnZS5wYWNrYWdlTWFuYWdlcikpIHtcbiAgICAgIHRhc2tFbnYuWUFSTl9OUE1fTUlOSU1BTF9BR0VfR0FURSA9IFN0cmluZyhcbiAgICAgICAgZGF5c1RvTWludXRlcyhvcHRpb25zLmNvb2xkb3duKSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gU2V0IG5wbSBjb29sZG93biBkYXRlIHZpYSBlbnZpcm9ubWVudCB2YXJpYWJsZSAoY2FsY3VsYXRlZCBhdCBydW50aW1lKSwgZXhwZWN0cyBhIGRhdGUgaW4gSVNPIGZvcm1hdFxuICAgIGlmIChvcHRpb25zLmNvb2xkb3duICYmIGlzTnBtKHByb2plY3QucGFja2FnZS5wYWNrYWdlTWFuYWdlcikpIHtcbiAgICAgIHRhc2tFbnYuTlBNX0NPTkZJR19CRUZPUkUgPSBgJChub2RlIC1wIFwibmV3IERhdGUoRGF0ZS5ub3coKS0ke2RheXNUb01pbGxpc2Vjb25kcyhcbiAgICAgICAgb3B0aW9ucy5jb29sZG93bixcbiAgICAgICl9KS50b0lTT1N0cmluZygpXCIpYDtcbiAgICB9XG5cbiAgICB0aGlzLnVwZ3JhZGVUYXNrID0gcHJvamVjdC5hZGRUYXNrKG9wdGlvbnMudGFza05hbWUgPz8gXCJ1cGdyYWRlXCIsIHtcbiAgICAgIC8vIHRoaXMgdGFzayBzaG91bGQgbm90IHJ1biBpbiBDSSBtb2RlIGJlY2F1c2UgaXRzIGRlc2lnbmVkIHRvXG4gICAgICAvLyB1cGRhdGUgcGFja2FnZS5qc29uIGFuZCBsb2NrIGZpbGVzLlxuICAgICAgZW52OiB0YXNrRW52LFxuICAgICAgZGVzY3JpcHRpb246IHRoaXMucHVsbFJlcXVlc3RUaXRsZSxcbiAgICAgIHN0ZXBzOiB7IHRvSlNPTjogKCkgPT4gdGhpcy5yZW5kZXJUYXNrU3RlcHMoKSB9IGFzIGFueSxcbiAgICB9KTtcbiAgICB0aGlzLnVwZ3JhZGVUYXNrLmxvY2soKTsgLy8gdGhpcyB0YXNrIGlzIGEgbGF6eSB2YWx1ZSwgc28gbWFrZSBpdCByZWFkb25seVxuXG4gICAgLy8gYWx3YXlzIHVzZSB0aGUgR2l0SHViIG9mIHRoZSByb290IHByb2plY3QgLSB0aGVyZSBjYW4gb25seSBiZSBvbmVcbiAgICBjb25zdCBnaXRodWIgPSBHaXRIdWIub2YocHJvamVjdC5yb290KTtcblxuICAgIGlmICh0aGlzLnVwZ3JhZGVUYXNrICYmIGdpdGh1YiAmJiAob3B0aW9ucy53b3JrZmxvdyA/PyB0cnVlKSkge1xuICAgICAgaWYgKG9wdGlvbnMud29ya2Zsb3dPcHRpb25zPy5icmFuY2hlcykge1xuICAgICAgICBmb3IgKGNvbnN0IGJyYW5jaCBvZiBvcHRpb25zLndvcmtmbG93T3B0aW9ucy5icmFuY2hlcykge1xuICAgICAgICAgIHRoaXMud29ya2Zsb3dzLnB1c2goXG4gICAgICAgICAgICB0aGlzLmNyZWF0ZVdvcmtmbG93KHRoaXMudXBncmFkZVRhc2ssIGdpdGh1YiwgYnJhbmNoKSxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKFJlbGVhc2Uub2YocHJvamVjdCkpIHtcbiAgICAgICAgY29uc3QgcmVsZWFzZSA9IFJlbGVhc2Uub2YocHJvamVjdCkhO1xuICAgICAgICByZWxlYXNlLl9mb3JFYWNoQnJhbmNoKChicmFuY2g6IHN0cmluZykgPT4ge1xuICAgICAgICAgIHRoaXMud29ya2Zsb3dzLnB1c2goXG4gICAgICAgICAgICB0aGlzLmNyZWF0ZVdvcmtmbG93KHRoaXMudXBncmFkZVRhc2ssIGdpdGh1YiwgYnJhbmNoKSxcbiAgICAgICAgICApO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIHJlcHJlc2VudHMgdGhlIGRlZmF1bHQgcmVwb3NpdG9yeSBicmFuY2guXG4gICAgICAgIC8vIGp1c3QgbGlrZSBub3Qgc3BlY2lmeWluZyBhbnl0aGluZy5cbiAgICAgICAgY29uc3QgZGVmYXVsdEJyYW5jaCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy53b3JrZmxvd3MucHVzaChcbiAgICAgICAgICB0aGlzLmNyZWF0ZVdvcmtmbG93KHRoaXMudXBncmFkZVRhc2ssIGdpdGh1YiwgZGVmYXVsdEJyYW5jaCksXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBzdGVwcyB0byBleGVjdXRlIGEgc3VjY2Vzc2Z1bCBidWlsZC5cbiAgICogQHBhcmFtIHN0ZXBzIHdvcmtmbG93IHN0ZXBzXG4gICAqL1xuICBwdWJsaWMgYWRkUG9zdEJ1aWxkU3RlcHMoLi4uc3RlcHM6IEpvYlN0ZXBbXSkge1xuICAgIHRoaXMucG9zdEJ1aWxkU3RlcHMucHVzaCguLi5zdGVwcyk7XG4gIH1cblxuICBwcml2YXRlIHJlbmRlclRhc2tTdGVwcygpOiBUYXNrU3RlcFtdIHtcbiAgICBjb25zdCBzdGVwcyA9IG5ldyBBcnJheTxUYXNrU3RlcD4oKTtcblxuICAgIC8vIFBhY2thZ2UgTWFuYWdlciB1cGdyYWRlIHNob3VsZCBhbHdheXMgaW5jbHVkZSBhbGwgZGVwc1xuICAgIGNvbnN0IGluY2x1ZGVGb3JQYWNrYWdlTWFuYWdlclVwZ3JhZGUgPSB0aGlzLmJ1aWxkRGVwZW5kZW5jeUxpc3QodHJ1ZSk7XG4gICAgaWYgKGluY2x1ZGVGb3JQYWNrYWdlTWFuYWdlclVwZ3JhZGUubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gW3sgZXhlYzogXCJlY2hvIE5vIGRlcGVuZGVuY2llcyB0byB1cGdyYWRlLlwiIH1dO1xuICAgIH1cblxuICAgIC8vIFJlbW92aW5nIGBucG0tY2hlY2stdXBkYXRlc2AgZnJvbSBvdXIgZGVwZW5kZW5jeSB0cmVlIGJlY2F1c2UgaXQgZGVwZW5kcyBvbiBhIHBhY2thZ2VcbiAgICAvLyB0aGF0IHVzZXMgYW4gbnBtLXNwZWNpZmljIGZlYXR1cmUgdGhhdCBjYXVzZXMgYW4gaW52YWxpZCBkZXBlbmRlbmN5IHRyZWUgd2hlbiB1c2luZyBZYXJuIDEuXG4gICAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9wcm9qZW4vcHJvamVuL3B1bGwvMzEzNiBmb3IgbW9yZSBkZXRhaWxzLlxuICAgIGNvbnN0IGluY2x1ZGVGb3JOY3UgPSB0aGlzLmJ1aWxkRGVwZW5kZW5jeUxpc3QoZmFsc2UpO1xuXG4gICAgLy8gYnVtcCB2ZXJzaW9ucyBpbiBwYWNrYWdlLmpzb25cbiAgICBpZiAoaW5jbHVkZUZvck5jdS5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IG5jdUNvbW1hbmQgPSB0aGlzLmJ1aWxkTmN1Q29tbWFuZChpbmNsdWRlRm9yTmN1LCB7XG4gICAgICAgIHVwZ3JhZGU6IHRydWUsXG4gICAgICAgIHRhcmdldDogdGhpcy51cGdyYWRlVGFyZ2V0LFxuICAgICAgfSk7XG4gICAgICBzdGVwcy5wdXNoKHsgZXhlYzogbmN1Q29tbWFuZCB9KTtcbiAgICB9XG5cbiAgICAvLyBydW4gXCJ5YXJuL25wbSBpbnN0YWxsXCIgdG8gdXBkYXRlIHRoZSBsb2NrZmlsZSBhbmQgaW5zdGFsbCBhbnkgZGVwcyAoc3VjaCBhcyBwcm9qZW4pXG4gICAgc3RlcHMucHVzaCh7IGV4ZWM6IHRoaXMucHJvamVjdC5wYWNrYWdlLmluc3RhbGxBbmRVcGRhdGVMb2NrZmlsZUNvbW1hbmQgfSk7XG5cbiAgICAvLyBydW4gdXBncmFkZSBjb21tYW5kIHRvIHVwZ3JhZGUgdHJhbnNpdGl2ZSBkZXBzIGFzIHdlbGxcbiAgICBzdGVwcy5wdXNoKHtcbiAgICAgIGV4ZWM6IHRoaXMucmVuZGVyVXBncmFkZVBhY2thZ2VzQ29tbWFuZChpbmNsdWRlRm9yUGFja2FnZU1hbmFnZXJVcGdyYWRlKSxcbiAgICB9KTtcblxuICAgIC8vIHJ1biBcInByb2plblwiIHRvIGdpdmUgcHJvamVuIGEgY2hhbmNlIHRvIHVwZGF0ZSBkZXBlbmRlbmNpZXMgKGl0IHdpbGwgYWxzbyBydW4gXCJ5YXJuIGluc3RhbGxcIilcbiAgICBzdGVwcy5wdXNoKHsgZXhlYzogdGhpcy5wcm9qZWN0LnByb2plbkNvbW1hbmQgfSk7XG4gICAgc3RlcHMucHVzaCh7IHNwYXduOiB0aGlzLnBvc3RVcGdyYWRlVGFzay5uYW1lIH0pO1xuXG4gICAgcmV0dXJuIHN0ZXBzO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIG5wbS1jaGVjay11cGRhdGVzIGNvbW1hbmQgd2l0aCBjb21tb24gb3B0aW9ucy5cbiAgICovXG4gIHByaXZhdGUgYnVpbGROY3VDb21tYW5kKFxuICAgIGluY2x1ZGVQYWNrYWdlczogc3RyaW5nW10sXG4gICAgb3B0aW9uczoge1xuICAgICAgdXBncmFkZT86IGJvb2xlYW47XG4gICAgICB0YXJnZXQ/OiBzdHJpbmc7XG4gICAgICBmb3JtYXQ/OiBzdHJpbmc7XG4gICAgICByZW1vdmVSYW5nZT86IGJvb2xlYW47XG4gICAgfSA9IHt9LFxuICApOiBzdHJpbmcge1xuICAgIGNvbnN0IGNvbW1hbmQgPSBbXG4gICAgICBgJHtleGVjdXRlQ29tbWFuZFByaW9ySW5zdGFsbGF0aW9uKFxuICAgICAgICB0aGlzLnByb2plY3QucGFja2FnZS5wYWNrYWdlTWFuYWdlcixcbiAgICAgICl9IG5wbS1jaGVjay11cGRhdGVzQDIwYCxcbiAgICBdO1xuXG4gICAgaWYgKG9wdGlvbnMudXBncmFkZSkge1xuICAgICAgY29tbWFuZC5wdXNoKFwiLS11cGdyYWRlXCIpO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy50YXJnZXQpIHtcbiAgICAgIGNvbW1hbmQucHVzaChgLS10YXJnZXQ9JHtvcHRpb25zLnRhcmdldH1gKTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuZm9ybWF0KSB7XG4gICAgICBjb21tYW5kLnB1c2goYC0tZm9ybWF0PSR7b3B0aW9ucy5mb3JtYXR9YCk7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLnJlbW92ZVJhbmdlKSB7XG4gICAgICBjb21tYW5kLnB1c2goXCItLXJlbW92ZVJhbmdlXCIpO1xuICAgIH1cbiAgICBpZiAodGhpcy5vcHRpb25zLmNvb2xkb3duKSB7XG4gICAgICBjb21tYW5kLnB1c2goYC0tY29vbGRvd249JHt0aGlzLm9wdGlvbnMuY29vbGRvd259YCk7XG4gICAgfVxuXG4gICAgY29tbWFuZC5wdXNoKGAtLSR7dGhpcy5zYXRpc2Z5UGVlckRlcGVuZGVuY2llcyA/IFwicGVlclwiIDogXCJuby1wZWVyXCJ9YCk7XG4gICAgY29tbWFuZC5wdXNoKFxuICAgICAgYC0tJHt0aGlzLmluY2x1ZGVEZXByZWNhdGVkVmVyc2lvbnMgPyBcImRlcHJlY2F0ZWRcIiA6IFwibm8tZGVwcmVjYXRlZFwifWAsXG4gICAgKTtcbiAgICBjb21tYW5kLnB1c2goYC0tZGVwPSR7dGhpcy5yZW5kZXJOY3VEZXBlbmRlbmN5VHlwZXModGhpcy5kZXBUeXBlcyl9YCk7XG4gICAgY29tbWFuZC5wdXNoKGAtLWZpbHRlcj0ke2luY2x1ZGVQYWNrYWdlcy5qb2luKFwiLFwiKX1gKTtcblxuICAgIHJldHVybiBjb21tYW5kLmpvaW4oXCIgXCIpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbmRlciBwcm9qZW4gZGVwZW5kZW5jaWVzIHR5cGVzIHRvIGEgbGlzdCBvZiBuY3UgY29tcGF0aWJsZSB0eXBlc1xuICAgKi9cbiAgcHJpdmF0ZSByZW5kZXJOY3VEZXBlbmRlbmN5VHlwZXModHlwZXM6IERlcGVuZGVuY3lUeXBlW10pIHtcbiAgICByZXR1cm4gQXJyYXkuZnJvbShcbiAgICAgIG5ldyBTZXQoXG4gICAgICAgIHR5cGVzXG4gICAgICAgICAgLm1hcCgodHlwZSkgPT4ge1xuICAgICAgICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgICAgICAgIGNhc2UgRGVwZW5kZW5jeVR5cGUuUEVFUjpcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJwZWVyXCI7XG4gICAgICAgICAgICAgIGNhc2UgRGVwZW5kZW5jeVR5cGUuUlVOVElNRTpcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJwcm9kXCI7XG4gICAgICAgICAgICAgIGNhc2UgRGVwZW5kZW5jeVR5cGUuT1BUSU9OQUw6XG4gICAgICAgICAgICAgICAgcmV0dXJuIFwib3B0aW9uYWxcIjtcblxuICAgICAgICAgICAgICBjYXNlIERlcGVuZGVuY3lUeXBlLlRFU1Q6XG4gICAgICAgICAgICAgIGNhc2UgRGVwZW5kZW5jeVR5cGUuREVWRU5WOlxuICAgICAgICAgICAgICBjYXNlIERlcGVuZGVuY3lUeXBlLkJVSUxEOlxuICAgICAgICAgICAgICAgIHJldHVybiBcImRldlwiO1xuXG4gICAgICAgICAgICAgIGNhc2UgRGVwZW5kZW5jeVR5cGUuQlVORExFRDpcbiAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgICAuZmlsdGVyKCh0eXBlKSA9PiBCb29sZWFuKHR5cGUpKSxcbiAgICAgICksXG4gICAgKS5qb2luKFwiLFwiKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXIgYSBwYWNrYWdlIG1hbmFnZXIgc3BlY2lmaWMgY29tbWFuZCB0byB1cGdyYWRlIGFsbCByZXF1ZXN0ZWQgZGVwZW5kZW5jaWVzLlxuICAgKi9cbiAgcHJpdmF0ZSByZW5kZXJVcGdyYWRlUGFja2FnZXNDb21tYW5kKGluY2x1ZGU6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgICBmdW5jdGlvbiB1cGdyYWRlUGFja2FnZXMoY29tbWFuZDogc3RyaW5nLCBjb29sZG93bkZsYWc/OiBzdHJpbmcpIHtcbiAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHBhcnRzID0gW2NvbW1hbmQsIC4uLmluY2x1ZGVdO1xuICAgICAgICBpZiAoY29vbGRvd25GbGFnKSB7XG4gICAgICAgICAgcGFydHMucHVzaChjb29sZG93bkZsYWcpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwYXJ0cy5qb2luKFwiIFwiKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgY29uc3QgcGFja2FnZU1hbmFnZXIgPSB0aGlzLnByb2plY3QucGFja2FnZS5wYWNrYWdlTWFuYWdlcjtcbiAgICBjb25zdCBjb29sZG93biA9IHRoaXMub3B0aW9ucy5jb29sZG93bjtcblxuICAgIGxldCBsYXp5ID0gdW5kZWZpbmVkO1xuICAgIHN3aXRjaCAocGFja2FnZU1hbmFnZXIpIHtcbiAgICAgIGNhc2UgTm9kZVBhY2thZ2VNYW5hZ2VyLllBUk46XG4gICAgICBjYXNlIE5vZGVQYWNrYWdlTWFuYWdlci5ZQVJOX0NMQVNTSUM6XG4gICAgICAgIGxhenkgPSB1cGdyYWRlUGFja2FnZXMoXCJ5YXJuIHVwZ3JhZGVcIik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBOb2RlUGFja2FnZU1hbmFnZXIuWUFSTjI6XG4gICAgICBjYXNlIE5vZGVQYWNrYWdlTWFuYWdlci5ZQVJOX0JFUlJZOlxuICAgICAgICAvLyBZYXJuIEJlcnJ5IGNvb2xkb3duIHNldCB2aWEgdGFzayBlbnZcbiAgICAgICAgbGF6eSA9IHVwZ3JhZGVQYWNrYWdlcyhcInlhcm4gdXBcIik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBOb2RlUGFja2FnZU1hbmFnZXIuTlBNOlxuICAgICAgICAvLyBucG0gY29vbGRvd24gc2V0IHZpYSBOUE1fQ09ORklHX0JFRk9SRSBlbnZcbiAgICAgICAgbGF6eSA9IHVwZ3JhZGVQYWNrYWdlcyhcIm5wbSB1cGRhdGVcIik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBOb2RlUGFja2FnZU1hbmFnZXIuUE5QTTpcbiAgICAgICAgLy8gcG5wbSBleHBlY3RzIG1pbnV0ZXNcbiAgICAgICAgbGF6eSA9IHVwZ3JhZGVQYWNrYWdlcyhcbiAgICAgICAgICBcInBucG0gdXBkYXRlXCIsXG4gICAgICAgICAgY29vbGRvd24gIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgPyBgLS1jb25maWcubWluaW11bS1yZWxlYXNlLWFnZT0ke2RheXNUb01pbnV0ZXMoY29vbGRvd24pfWBcbiAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICApO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgTm9kZVBhY2thZ2VNYW5hZ2VyLkJVTjpcbiAgICAgICAgLy8gYnVuIGV4cGVjdHMgc2Vjb25kc1xuICAgICAgICBsYXp5ID0gdXBncmFkZVBhY2thZ2VzKFxuICAgICAgICAgIFwiYnVuIHVwZGF0ZVwiLFxuICAgICAgICAgIGNvb2xkb3duXG4gICAgICAgICAgICA/IGAtLW1pbmltdW0tcmVsZWFzZS1hZ2U9JHtkYXlzVG9TZWNvbmRzKGNvb2xkb3duKX1gXG4gICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHVuZXhwZWN0ZWQgcGFja2FnZSBtYW5hZ2VyICR7cGFja2FnZU1hbmFnZXJ9YCk7XG4gICAgfVxuXG4gICAgLy8gcmV0dXJuIGEgbGF6eSBmdW5jdGlvbiBzbyB0aGF0IGRlcGVuZGVuY2llcyBpbmNsdWRlIG9uZXMgdGhhdCB3ZXJlXG4gICAgLy8gYWRkZWQgcG9zdCBwcm9qZWN0IGluc3RhbnRpYXRpb24gKGkuZSB1c2luZyBwcm9qZWN0LmFkZERlcHMpXG4gICAgcmV0dXJuIGxhenkgYXMgdW5rbm93biBhcyBzdHJpbmc7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkRGVwZW5kZW5jeUxpc3QoaW5jbHVkZURlcGVuZGVuY2llc1dpdGhDb25zdHJhaW50OiBib29sZWFuKSB7XG4gICAgcmV0dXJuIEFycmF5LmZyb20oXG4gICAgICBuZXcgU2V0KFxuICAgICAgICB0aGlzLm9wdGlvbnMuaW5jbHVkZSA/P1xuICAgICAgICAgIHRoaXMuZmlsdGVyRGVwZW5kZW5jaWVzKGluY2x1ZGVEZXBlbmRlbmNpZXNXaXRoQ29uc3RyYWludCksXG4gICAgICApLFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGZpbHRlckRlcGVuZGVuY2llcyhpbmNsdWRlQ29uc3RyYWludDogYm9vbGVhbik6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBkZXBlbmRlbmNpZXMgPSBbXTtcblxuICAgIGNvbnN0IGRlcHMgPSB0aGlzLnByb2plY3QuZGVwcy5hbGxcbiAgICAgIC8vIHJlbW92ZSB0aG9zZSB0aGF0IGhhdmUgYSBjb25zdHJhaW50IHZlcnNpb24gKHVubGVzcyBpbmNsdWRlQ29uc3RyYWludCBpcyB0cnVlKVxuICAgICAgLmZpbHRlcihcbiAgICAgICAgKGQpID0+XG4gICAgICAgICAgaW5jbHVkZUNvbnN0cmFpbnQgfHxcbiAgICAgICAgICB0aGlzLnBhY2thZ2VDYW5CZVVwZ3JhZGVkSW5QYWNrYWdlSnNvbihkLnZlcnNpb24pLFxuICAgICAgKVxuICAgICAgLy8gcmVtb3ZlIG92ZXJyaWRlIGRlcGVuZGVuY2llc1xuICAgICAgLmZpbHRlcigoZCkgPT4gZC50eXBlICE9PSBEZXBlbmRlbmN5VHlwZS5PVkVSUklERSk7XG5cbiAgICBmb3IgKGNvbnN0IHR5cGUgb2YgdGhpcy5kZXBUeXBlcykge1xuICAgICAgZGVwZW5kZW5jaWVzLnB1c2goXG4gICAgICAgIC4uLmRlcHNcbiAgICAgICAgICAuZmlsdGVyKChkKSA9PiBkLnR5cGUgPT09IHR5cGUpXG4gICAgICAgICAgLmZpbHRlcigoZCkgPT4gISh0aGlzLm9wdGlvbnMuZXhjbHVkZSA/PyBbXSkuaW5jbHVkZXMoZC5uYW1lKSksXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiBkZXBlbmRlbmNpZXMubWFwKChkKSA9PiBkLm5hbWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFByb2plbiBjYW4gYWx0ZXIgYSBwYWNrYWdlJ3MgdmVyc2lvbiBpbiBwYWNrYWdlLmpzb24gd2hlbiBlaXRoZXIgdGhlIHZlcnNpb24gaXMgb21pdHRlZCwgb3Igc2V0IHRvIFwiKlwiLlxuICAgKiBPdGhlcndpc2UsIHRoZSBleGFjdCB2ZXJzaW9uIHNlbGVjdGVkIGlzIHBsYWNlZCBpbiB0aGUgcGFja2FnZS5qc29uIGZpbGUgYW5kIHVwZ3JhZGluZyBpcyBoYW5kbGVkIHRocm91Z2ggdGhlIHBhY2thZ2UgbWFuYWdlclxuICAgKiByYXRoZXIgdGhhbiBucG0tY2hlY2stdXBkYXRlcy5cbiAgICpcbiAgICogQHBhcmFtIHZlcnNpb24gc2VtdmVyIGZyb20gRGVwZW5kZW5jeUNvb3JkaW5hdGVzLnZlcnNpb24sIG1heSBiZSB1bmRlZmluZWRcbiAgICogQHJldHVybnMgd2hldGhlciB0aGUgdmVyc2lvbiBpcyB0aGUgZGVmYXVsdCB2ZXJzaW9uaW5nIGJlaGF2aW9yXG4gICAqL1xuICBwcml2YXRlIHBhY2thZ2VDYW5CZVVwZ3JhZGVkSW5QYWNrYWdlSnNvbihcbiAgICB2ZXJzaW9uOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICk6IGJvb2xlYW4ge1xuICAgIC8vIE5vIHZlcnNpb24gbWVhbnMgXCJsYXRlc3RcIlxuICAgIHJldHVybiAhdmVyc2lvbiB8fCB2ZXJzaW9uID09PSBcIipcIjtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlV29ya2Zsb3coXG4gICAgdGFzazogVGFzayxcbiAgICBnaXRodWI6IEdpdEh1YixcbiAgICBicmFuY2g/OiBzdHJpbmcsXG4gICk6IEdpdGh1YldvcmtmbG93IHtcbiAgICBjb25zdCBzY2hlZHVsZSA9XG4gICAgICB0aGlzLm9wdGlvbnMud29ya2Zsb3dPcHRpb25zPy5zY2hlZHVsZSA/P1xuICAgICAgVXBncmFkZURlcGVuZGVuY2llc1NjaGVkdWxlLkRBSUxZO1xuXG4gICAgY29uc3QgdGFza0JyYW5jaE5hbWUgPSBgJHt0YXNrLm5hbWV9JHtcbiAgICAgIGJyYW5jaCA/IGAtJHticmFuY2gucmVwbGFjZSgvXFwvL2csIFwiLVwiKX1gIDogXCJcIlxuICAgIH1gO1xuICAgIGNvbnN0IHdvcmtmbG93TmFtZSA9IHdvcmtmbG93TmFtZUZvclByb2plY3QodGFza0JyYW5jaE5hbWUsIHRoaXMucHJvamVjdCk7XG5cbiAgICBjb25zdCB3b3JrZmxvdyA9IGdpdGh1Yi5hZGRXb3JrZmxvdyh3b3JrZmxvd05hbWUpO1xuICAgIGNvbnN0IHRyaWdnZXJzOiB3b3JrZmxvd3MuVHJpZ2dlcnMgPSB7XG4gICAgICB3b3JrZmxvd0Rpc3BhdGNoOiB7fSxcbiAgICAgIHNjaGVkdWxlOlxuICAgICAgICBzY2hlZHVsZS5jcm9uLmxlbmd0aCA+IDBcbiAgICAgICAgICA/IHNjaGVkdWxlLmNyb24ubWFwKChlKSA9PiAoeyBjcm9uOiBlIH0pKVxuICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgIH07XG4gICAgd29ya2Zsb3cub24odHJpZ2dlcnMpO1xuXG4gICAgY29uc3QgdXBncmFkZSA9IHRoaXMuY3JlYXRlVXBncmFkZSh0YXNrLCBnaXRodWIsIGJyYW5jaCk7XG4gICAgY29uc3QgcHIgPSB0aGlzLmNyZWF0ZVByKHdvcmtmbG93LCB1cGdyYWRlKTtcblxuICAgIGNvbnN0IGpvYnM6IFJlY29yZDxzdHJpbmcsIHdvcmtmbG93cy5Kb2I+ID0ge307XG4gICAgam9ic1t1cGdyYWRlLmpvYklkXSA9IHVwZ3JhZGUuam9iO1xuICAgIGpvYnNbcHIuam9iSWRdID0gcHIuam9iO1xuXG4gICAgd29ya2Zsb3cuYWRkSm9icyhqb2JzKTtcbiAgICByZXR1cm4gd29ya2Zsb3c7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZVVwZ3JhZGUodGFzazogVGFzaywgZ2l0aHViOiBHaXRIdWIsIGJyYW5jaD86IHN0cmluZyk6IFVwZ3JhZGUge1xuICAgIGNvbnN0IHdpdGhfID0ge1xuICAgICAgLi4uKGJyYW5jaCA/IHsgcmVmOiBicmFuY2ggfSA6IHt9KSxcbiAgICAgIC4uLihnaXRodWIuZG93bmxvYWRMZnMgPyB7IGxmczogdHJ1ZSB9IDoge30pLFxuICAgIH07XG5cbiAgICBjb25zdCBzdGVwczogd29ya2Zsb3dzLkpvYlN0ZXBbXSA9IFtcbiAgICAgIFdvcmtmbG93U3RlcHMuY2hlY2tvdXQoeyB3aXRoOiB3aXRoXyB9KSxcbiAgICAgIC4uLnRoaXMucHJvamVjdC5yZW5kZXJXb3JrZmxvd1NldHVwKHsgbXV0YWJsZTogZmFsc2UgfSksXG4gICAgICB7XG4gICAgICAgIG5hbWU6IFwiVXBncmFkZSBkZXBlbmRlbmNpZXNcIixcbiAgICAgICAgcnVuOiB0aGlzLnByb2plY3QucnVuVGFza0NvbW1hbmQodGFzayksXG4gICAgICAgIHdvcmtpbmdEaXJlY3Rvcnk6IHRoaXMucHJvamVjdC5wYXJlbnRcbiAgICAgICAgICA/IHByb2plY3RQYXRoUmVsYXRpdmVUb1JlcG9Sb290KHRoaXMucHJvamVjdClcbiAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgIH0sXG4gICAgXTtcblxuICAgIHN0ZXBzLnB1c2goLi4udGhpcy5wb3N0QnVpbGRTdGVwcyk7XG4gICAgc3RlcHMucHVzaChcbiAgICAgIC4uLldvcmtmbG93QWN0aW9ucy51cGxvYWRHaXRQYXRjaCh7XG4gICAgICAgIHN0ZXBJZDogQ1JFQVRFX1BBVENIX1NURVBfSUQsXG4gICAgICAgIG91dHB1dE5hbWU6IFBBVENIX0NSRUFURURfT1VUUFVULFxuICAgICAgfSksXG4gICAgKTtcblxuICAgIHJldHVybiB7XG4gICAgICBqb2I6IHtcbiAgICAgICAgbmFtZTogXCJVcGdyYWRlXCIsXG4gICAgICAgIGNvbnRhaW5lcjogdGhpcy5jb250YWluZXJPcHRpb25zLFxuICAgICAgICBwZXJtaXNzaW9uczogdGhpcy5wZXJtaXNzaW9ucyxcbiAgICAgICAgZW52OiB0aGlzLm9wdGlvbnMud29ya2Zsb3dPcHRpb25zPy5lbnYsXG4gICAgICAgIC4uLmZpbHRlcmVkUnVuc09uT3B0aW9ucyhcbiAgICAgICAgICB0aGlzLm9wdGlvbnMud29ya2Zsb3dPcHRpb25zPy5ydW5zT24sXG4gICAgICAgICAgdGhpcy5vcHRpb25zLndvcmtmbG93T3B0aW9ucz8ucnVuc09uR3JvdXAsXG4gICAgICAgICksXG4gICAgICAgIHN0ZXBzOiBzdGVwcyxcbiAgICAgICAgb3V0cHV0czoge1xuICAgICAgICAgIFtQQVRDSF9DUkVBVEVEX09VVFBVVF06IHtcbiAgICAgICAgICAgIHN0ZXBJZDogQ1JFQVRFX1BBVENIX1NURVBfSUQsXG4gICAgICAgICAgICBvdXRwdXROYW1lOiBQQVRDSF9DUkVBVEVEX09VVFBVVCxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGpvYklkOiBcInVwZ3JhZGVcIixcbiAgICAgIHJlZjogYnJhbmNoLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZVByKHdvcmtmbG93OiBHaXRodWJXb3JrZmxvdywgdXBncmFkZTogVXBncmFkZSk6IFBSIHtcbiAgICBjb25zdCBjcmVkZW50aWFscyA9XG4gICAgICB0aGlzLm9wdGlvbnMud29ya2Zsb3dPcHRpb25zPy5wcm9qZW5DcmVkZW50aWFscyA/P1xuICAgICAgd29ya2Zsb3cucHJvamVuQ3JlZGVudGlhbHM7XG5cbiAgICBjb25zdCBzZW1hbnRpY0NvbW1pdCA9IHRoaXMub3B0aW9ucy5zZW1hbnRpY0NvbW1pdCA/PyBcImNob3JlXCI7XG5cbiAgICByZXR1cm4ge1xuICAgICAgam9iOiBXb3JrZmxvd0pvYnMucHVsbFJlcXVlc3RGcm9tUGF0Y2goe1xuICAgICAgICBwYXRjaDoge1xuICAgICAgICAgIGpvYklkOiB1cGdyYWRlLmpvYklkLFxuICAgICAgICAgIG91dHB1dE5hbWU6IFBBVENIX0NSRUFURURfT1VUUFVULFxuICAgICAgICAgIHJlZjogdXBncmFkZS5yZWYsXG4gICAgICAgIH0sXG4gICAgICAgIHdvcmtmbG93TmFtZTogd29ya2Zsb3cubmFtZSxcbiAgICAgICAgY3JlZGVudGlhbHMsXG4gICAgICAgIC4uLmZpbHRlcmVkUnVuc09uT3B0aW9ucyhcbiAgICAgICAgICB0aGlzLm9wdGlvbnMud29ya2Zsb3dPcHRpb25zPy5ydW5zT24sXG4gICAgICAgICAgdGhpcy5vcHRpb25zLndvcmtmbG93T3B0aW9ucz8ucnVuc09uR3JvdXAsXG4gICAgICAgICksXG4gICAgICAgIHB1bGxSZXF1ZXN0VGl0bGU6IGAke3NlbWFudGljQ29tbWl0fShkZXBzKTogJHt0aGlzLnB1bGxSZXF1ZXN0VGl0bGV9YCxcbiAgICAgICAgcHVsbFJlcXVlc3REZXNjcmlwdGlvbjogXCJVcGdyYWRlcyBwcm9qZWN0IGRlcGVuZGVuY2llcy5cIixcbiAgICAgICAgZ2l0SWRlbnRpdHk6IHRoaXMuZ2l0SWRlbnRpdHksXG4gICAgICAgIGFzc2lnbmVlczogdGhpcy5vcHRpb25zLndvcmtmbG93T3B0aW9ucz8uYXNzaWduZWVzLFxuICAgICAgICBsYWJlbHM6IHRoaXMub3B0aW9ucy53b3JrZmxvd09wdGlvbnM/LmxhYmVscyxcbiAgICAgICAgc2lnbm9mZjogdGhpcy5vcHRpb25zLnNpZ25vZmYsXG4gICAgICB9KSxcbiAgICAgIGpvYklkOiBcInByXCIsXG4gICAgfTtcbiAgfVxufVxuXG5pbnRlcmZhY2UgVXBncmFkZSB7XG4gIHJlYWRvbmx5IHJlZj86IHN0cmluZztcbiAgcmVhZG9ubHkgam9iOiB3b3JrZmxvd3MuSm9iO1xuICByZWFkb25seSBqb2JJZDogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgUFIge1xuICByZWFkb25seSBqb2I6IHdvcmtmbG93cy5Kb2I7XG4gIHJlYWRvbmx5IGpvYklkOiBzdHJpbmc7XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgYFVwZ3JhZGVEZXBlbmRlbmNpZXMud29ya2Zsb3dPcHRpb25zYC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVcGdyYWRlRGVwZW5kZW5jaWVzV29ya2Zsb3dPcHRpb25zIHtcbiAgLyoqXG4gICAqIFNjaGVkdWxlIHRvIHJ1biBvbi5cbiAgICpcbiAgICogQGRlZmF1bHQgVXBncmFkZURlcGVuZGVuY2llc1NjaGVkdWxlLkRBSUxZXG4gICAqL1xuICByZWFkb25seSBzY2hlZHVsZT86IFVwZ3JhZGVEZXBlbmRlbmNpZXNTY2hlZHVsZTtcblxuICAvKipcbiAgICogQ2hvb3NlIGEgbWV0aG9kIGZvciBhdXRoZW50aWNhdGluZyB3aXRoIEdpdEh1YiBmb3IgY3JlYXRpbmcgdGhlIFBSLlxuICAgKlxuICAgKiBXaGVuIHVzaW5nIHRoZSBkZWZhdWx0IGdpdGh1YiB0b2tlbiwgUFIncyBjcmVhdGVkIGJ5IHRoaXMgd29ya2Zsb3dcbiAgICogd2lsbCBub3QgdHJpZ2dlciBhbnkgc3Vic2VxdWVudCB3b3JrZmxvd3MgKGkuZSB0aGUgYnVpbGQgd29ya2Zsb3cpLCBzb1xuICAgKiBwcm9qZW4gcmVxdWlyZXMgQVBJIGFjY2VzcyB0byBiZSBwcm92aWRlZCB0aHJvdWdoIGUuZy4gYSBwZXJzb25hbFxuICAgKiBhY2Nlc3MgdG9rZW4gb3Igb3RoZXIgbWV0aG9kLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9wZXRlci1ldmFucy9jcmVhdGUtcHVsbC1yZXF1ZXN0L2lzc3Vlcy80OFxuICAgKiBAZGVmYXVsdCAtIHBlcnNvbmFsIGFjY2VzcyB0b2tlbiBuYW1lZCBQUk9KRU5fR0lUSFVCX1RPS0VOXG4gICAqL1xuICByZWFkb25seSBwcm9qZW5DcmVkZW50aWFscz86IEdpdGh1YkNyZWRlbnRpYWxzO1xuXG4gIC8qKlxuICAgKiBMYWJlbHMgdG8gYXBwbHkgb24gdGhlIFBSLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIGxhYmVscy5cbiAgICovXG4gIHJlYWRvbmx5IGxhYmVscz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBBc3NpZ25lZXMgdG8gYWRkIG9uIHRoZSBQUi5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBubyBhc3NpZ25lZXNcbiAgICovXG4gIHJlYWRvbmx5IGFzc2lnbmVlcz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBKb2IgY29udGFpbmVyIG9wdGlvbnMuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gZGVmYXVsdHNcbiAgICovXG4gIHJlYWRvbmx5IGNvbnRhaW5lcj86IHdvcmtmbG93cy5Db250YWluZXJPcHRpb25zO1xuXG4gIC8qKlxuICAgKiBMaXN0IG9mIGJyYW5jaGVzIHRvIGNyZWF0ZSBQUidzIGZvci5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBBbGwgcmVsZWFzZSBicmFuY2hlcyBjb25maWd1cmVkIGZvciB0aGUgcHJvamVjdC5cbiAgICovXG4gIHJlYWRvbmx5IGJyYW5jaGVzPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIFRoZSBnaXQgaWRlbnRpdHkgdG8gdXNlIGZvciBjb21taXRzLlxuICAgKiBAZGVmYXVsdCAtIGRlZmF1bHQgR2l0SHViIEFjdGlvbnMgdXNlclxuICAgKi9cbiAgcmVhZG9ubHkgZ2l0SWRlbnRpdHk/OiBHaXRJZGVudGl0eTtcblxuICAvKipcbiAgICogR2l0aHViIFJ1bm5lciBzZWxlY3Rpb24gbGFiZWxzXG4gICAqIEBkZWZhdWx0IFtcInVidW50dS1sYXRlc3RcIl1cbiAgICogQGRlc2NyaXB0aW9uIERlZmluZXMgYSB0YXJnZXQgUnVubmVyIGJ5IGxhYmVsc1xuICAgKiBAdGhyb3dzIHtFcnJvcn0gaWYgYm90aCBgcnVuc09uYCBhbmQgYHJ1bnNPbkdyb3VwYCBhcmUgc3BlY2lmaWVkXG4gICAqL1xuICByZWFkb25seSBydW5zT24/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogR2l0aHViIFJ1bm5lciBHcm91cCBzZWxlY3Rpb24gb3B0aW9uc1xuICAgKiBAZGVzY3JpcHRpb24gRGVmaW5lcyBhIHRhcmdldCBSdW5uZXIgR3JvdXAgYnkgbmFtZSBhbmQvb3IgbGFiZWxzXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBpZiBib3RoIGBydW5zT25gIGFuZCBgcnVuc09uR3JvdXBgIGFyZSBzcGVjaWZpZWRcbiAgICovXG4gIHJlYWRvbmx5IHJ1bnNPbkdyb3VwPzogR3JvdXBSdW5uZXJPcHRpb25zO1xuXG4gIC8qKlxuICAgKiBQZXJtaXNzaW9ucyBncmFudGVkIHRvIHRoZSB1cGdyYWRlIGpvYlxuICAgKiBUbyBsaW1pdCBqb2IgcGVybWlzc2lvbnMgZm9yIGBjb250ZW50c2AsIHRoZSBkZXNpcmVkIHBlcm1pc3Npb25zIGhhdmUgdG8gYmUgZXhwbGljaXRseSBzZXQsIGUuZy46IGB7IGNvbnRlbnRzOiBKb2JQZXJtaXNzaW9uLk5PTkUgfWBcbiAgICogQGRlZmF1bHQgYHsgY29udGVudHM6IEpvYlBlcm1pc3Npb24uUkVBRCB9YFxuICAgKi9cbiAgcmVhZG9ubHkgcGVybWlzc2lvbnM/OiBKb2JQZXJtaXNzaW9ucztcblxuICAvKipcbiAgICogQnVpbGQgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZvciB0aGUgdXBncmFkZSBqb2IuXG4gICAqXG4gICAqIEBkZWZhdWx0IHt9XG4gICAqL1xuICByZWFkb25seSBlbnY/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xufVxuXG4vKipcbiAqIEhvdyBvZnRlbiB0byBjaGVjayBmb3IgbmV3IHZlcnNpb25zIGFuZCByYWlzZSBwdWxsIHJlcXVlc3RzIGZvciB2ZXJzaW9uIHVwZ3JhZGVzLlxuICovXG5leHBvcnQgY2xhc3MgVXBncmFkZURlcGVuZGVuY2llc1NjaGVkdWxlIHtcbiAgLyoqXG4gICAqIERpc2FibGVzIGF1dG9tYXRpYyB1cGdyYWRlcy5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgTkVWRVIgPSBuZXcgVXBncmFkZURlcGVuZGVuY2llc1NjaGVkdWxlKFtdKTtcblxuICAvKipcbiAgICogQXQgMDA6MDAuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IERBSUxZID0gbmV3IFVwZ3JhZGVEZXBlbmRlbmNpZXNTY2hlZHVsZShbXCIwIDAgKiAqICpcIl0pO1xuXG4gIC8qKlxuICAgKiBBdCAwMDowMCBvbiBldmVyeSBkYXktb2Ytd2VlayBmcm9tIE1vbmRheSB0aHJvdWdoIEZyaWRheS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgV0VFS0RBWSA9IG5ldyBVcGdyYWRlRGVwZW5kZW5jaWVzU2NoZWR1bGUoW1xuICAgIFwiMCAwICogKiAxLTVcIixcbiAgXSk7XG5cbiAgLyoqXG4gICAqIEF0IDAwOjAwIG9uIE1vbmRheS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgV0VFS0xZID0gbmV3IFVwZ3JhZGVEZXBlbmRlbmNpZXNTY2hlZHVsZShbXG4gICAgXCIwIDAgKiAqIDFcIixcbiAgXSk7XG5cbiAgLyoqXG4gICAqIEF0IDAwOjAwIG9uIGRheS1vZi1tb250aCAxLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBNT05USExZID0gbmV3IFVwZ3JhZGVEZXBlbmRlbmNpZXNTY2hlZHVsZShbXG4gICAgXCIwIDAgMSAqICpcIixcbiAgXSk7XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIHNjaGVkdWxlIGZyb20gYSByYXcgY3JvbiBleHByZXNzaW9uLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBleHByZXNzaW9ucyhjcm9uOiBzdHJpbmdbXSkge1xuICAgIHJldHVybiBuZXcgVXBncmFkZURlcGVuZGVuY2llc1NjaGVkdWxlKGNyb24pO1xuICB9XG5cbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcihwdWJsaWMgcmVhZG9ubHkgY3Jvbjogc3RyaW5nW10pIHt9XG59XG5cbi8qKlxuICogQ29udmVydCBkYXlzIHRvIG1pbnV0ZXMuXG4gKi9cbmZ1bmN0aW9uIGRheXNUb01pbnV0ZXMoZGF5czogbnVtYmVyKTogbnVtYmVyIHtcbiAgcmV0dXJuIGRheXMgKiAxNDQwO1xufVxuXG4vKipcbiAqIENvbnZlcnQgZGF5cyB0byBzZWNvbmRzLlxuICovXG5mdW5jdGlvbiBkYXlzVG9TZWNvbmRzKGRheXM6IG51bWJlcik6IG51bWJlciB7XG4gIHJldHVybiBkYXlzICogODY0MDA7XG59XG5cbi8qKlxuICogQ29udmVydCBkYXlzIHRvIG1pbGxpc2Vjb25kcy5cbiAqL1xuZnVuY3Rpb24gZGF5c1RvTWlsbGlzZWNvbmRzKGRheXM6IG51bWJlcik6IG51bWJlciB7XG4gIHJldHVybiBkYXlzICogODY0MDAwMDA7XG59XG4iXX0=
@@ -17,6 +17,11 @@ export declare function isNpm(packageManager: NodePackageManager): boolean;
17
17
  * Optionally followed by a binary name.
18
18
  */
19
19
  export declare function execCommand(packageManager?: NodePackageManager, bin?: string): string;
20
+ /**
21
+ * Returns the command to execute a binary with the given package manager, without requiring installation of that binary as a project dependency.
22
+ * @param packageManager The package manager to use when executing the command.
23
+ */
24
+ export declare function executeCommandPriorInstallation(packageManager: NodePackageManager): string;
20
25
  /**
21
26
  * Basic interface for `package.json`.
22
27
  */
@@ -5,6 +5,7 @@ exports.isYarnClassic = isYarnClassic;
5
5
  exports.isYarnBerry = isYarnBerry;
6
6
  exports.isNpm = isNpm;
7
7
  exports.execCommand = execCommand;
8
+ exports.executeCommandPriorInstallation = executeCommandPriorInstallation;
8
9
  exports.renderBundleName = renderBundleName;
9
10
  exports.extractCodeArtifactDetails = extractCodeArtifactDetails;
10
11
  exports.minVersion = minVersion;
@@ -68,6 +69,26 @@ function execCommand(packageManager, bin) {
68
69
  }
69
70
  return bin ? `${cmd} ${bin}` : cmd;
70
71
  }
72
+ /**
73
+ * Returns the command to execute a binary with the given package manager, without requiring installation of that binary as a project dependency.
74
+ * @param packageManager The package manager to use when executing the command.
75
+ */
76
+ function executeCommandPriorInstallation(packageManager) {
77
+ switch (packageManager) {
78
+ case node_package_1.NodePackageManager.PNPM:
79
+ return "pnpm dlx";
80
+ case node_package_1.NodePackageManager.YARN2:
81
+ case node_package_1.NodePackageManager.YARN_BERRY:
82
+ return "yarn dlx";
83
+ case node_package_1.NodePackageManager.BUN:
84
+ return "bunx";
85
+ case node_package_1.NodePackageManager.NPM:
86
+ case node_package_1.NodePackageManager.YARN:
87
+ case node_package_1.NodePackageManager.YARN_CLASSIC:
88
+ default:
89
+ return "npx";
90
+ }
91
+ }
71
92
  function renderBundleName(entrypoint) {
72
93
  const parts = (0, path_1.join)(entrypoint).split(path_1.sep);
73
94
  if (parts[0] === "src") {
@@ -345,4 +366,4 @@ function installedVersionProbablyMatches(requestedRange, checkRange) {
345
366
  // we're in the bottom case with `<=` checks, and return `false`.
346
367
  return !semver.eq(semver.minVersion(requestedRange, options) ?? "1.2.3", semver.minVersion(checkRange, options) ?? "1.2.3");
347
368
  }
348
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9qYXZhc2NyaXB0L3V0aWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBVUEsc0NBS0M7QUFLRCxrQ0FLQztBQUtELHNCQUVDO0FBTUQsa0NBd0JDO0FBa0JELDRDQVVDO0FBY0QsZ0VBT0M7QUFFRCxnQ0FNQztBQU9ELDRDQVNDO0FBY0Qsb0VBUUM7QUFTRCwwRkFhQztBQVlELHdFQVlDO0FBUUQsNEVBZ0JDO0FBT0QsNERBMkJDO0FBT0Qsa0VBU0M7QUEyQ0Qsb0RBNENDO0FBUUQsMEVBcUNDO0FBelpELDJCQUE4QztBQUM5QywrQkFBNkU7QUFDN0UsaUNBQWlDO0FBQ2pDLGlEQUFpRTtBQUVqRSxrQ0FBaUM7QUFFakM7O0dBRUc7QUFDSCxTQUFnQixhQUFhLENBQUMsY0FBa0M7SUFDOUQsT0FBTyxDQUNMLGNBQWMsS0FBSyxpQ0FBa0IsQ0FBQyxJQUFJO1FBQzFDLGNBQWMsS0FBSyxpQ0FBa0IsQ0FBQyxZQUFZLENBQ25ELENBQUM7QUFDSixDQUFDO0FBRUQ7O0dBRUc7QUFDSCxTQUFnQixXQUFXLENBQUMsY0FBa0M7SUFDNUQsT0FBTyxDQUNMLGNBQWMsS0FBSyxpQ0FBa0IsQ0FBQyxLQUFLO1FBQzNDLGNBQWMsS0FBSyxpQ0FBa0IsQ0FBQyxVQUFVLENBQ2pELENBQUM7QUFDSixDQUFDO0FBRUQ7O0dBRUc7QUFDSCxTQUFnQixLQUFLLENBQUMsY0FBa0M7SUFDdEQsT0FBTyxjQUFjLEtBQUssaUNBQWtCLENBQUMsR0FBRyxDQUFDO0FBQ25ELENBQUM7QUFFRDs7O0dBR0c7QUFDSCxTQUFnQixXQUFXLENBQ3pCLGNBQW1DLEVBQ25DLEdBQVk7SUFFWixJQUFJLEdBQVcsQ0FBQztJQUNoQixRQUFRLGNBQWMsRUFBRSxDQUFDO1FBQ3ZCLEtBQUssaUNBQWtCLENBQUMsSUFBSTtZQUMxQixHQUFHLEdBQUcsV0FBVyxDQUFDO1lBQ2xCLE1BQU07UUFDUixLQUFLLGlD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QUUsQ0FDZixNQUFNLENBQUMsVUFBVSxDQUFDLGNBQWMsRUFBRSxPQUFPLENBQUMsSUFBSSxPQUFPLEVBQ3JELE1BQU0sQ0FBQyxVQUFVLENBQUMsVUFBVSxFQUFFLE9BQU8sQ0FBQyxJQUFJLE9BQU8sQ0FDbEQsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBleGlzdHNTeW5jLCByZWFkRmlsZVN5bmMgfSBmcm9tIFwiZnNcIjtcbmltcG9ydCB7IGJhc2VuYW1lLCBkaXJuYW1lLCBleHRuYW1lLCBqb2luLCBzZXAsIHJlc29sdmUsIHBvc2l4IH0gZnJvbSBcInBhdGhcIjtcbmltcG9ydCAqIGFzIHNlbXZlciBmcm9tIFwic2VtdmVyXCI7XG5pbXBvcnQgeyBOb2RlUGFja2FnZSwgTm9kZVBhY2thZ2VNYW5hZ2VyIH0gZnJvbSBcIi4vbm9kZS1wYWNrYWdlXCI7XG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tIFwiLi4vcHJvamVjdFwiO1xuaW1wb3J0IHsgZmluZFVwIH0gZnJvbSBcIi4uL3V0aWxcIjtcblxuLyoqXG4gKiBDaGVjayBpZiBwYWNrYWdlIG1hbmFnZXIgaXMgeWFybiBjbGFzc2ljLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNZYXJuQ2xhc3NpYyhwYWNrYWdlTWFuYWdlcjogTm9kZVBhY2thZ2VNYW5hZ2VyKTogYm9vbGVhbiB7XG4gIHJldHVybiAoXG4gICAgcGFja2FnZU1hbmFnZXIgPT09IE5vZGVQYWNrYWdlTWFuYWdlci5ZQVJOIHx8XG4gICAgcGFja2FnZU1hbmFnZXIgPT09IE5vZGVQYWNrYWdlTWFuYWdlci5ZQVJOX0NMQVNTSUNcbiAgKTtcbn1cblxuLyoqXG4gKiBDaGVjayBpZiBwYWNrYWdlIG1hbmFnZXIgaXMgeWFybiBiZXJyeS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzWWFybkJlcnJ5KHBhY2thZ2VNYW5hZ2VyOiBOb2RlUGFja2FnZU1hbmFnZXIpOiBib29sZWFuIHtcbiAgcmV0dXJuIChcbiAgICBwYWNrYWdlTWFuYWdlciA9PT0gTm9kZVBhY2thZ2VNYW5hZ2VyLllBUk4yIHx8XG4gICAgcGFja2FnZU1hbmFnZXIgPT09IE5vZGVQYWNrYWdlTWFuYWdlci5ZQVJOX0JFUlJZXG4gICk7XG59XG5cbi8qKlxuICogQ2hlY2sgaWYgcGFja2FnZSBtYW5hZ2VyIGlzIG5wbS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzTnBtKHBhY2thZ2VNYW5hZ2VyOiBOb2RlUGFja2FnZU1hbmFnZXIpOiBib29sZWFuIHtcbiAgcmV0dXJuIHBhY2thZ2VNYW5hZ2VyID09PSBOb2RlUGFja2FnZU1hbmFnZXIuTlBNO1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIGV4ZWMgY29tbWFuZCBwcmVmaXggZm9yIHRoZSBnaXZlbiBwYWNrYWdlIG1hbmFnZXIsIG9yIGRlZmF1bHRzIHRvIG5weCBpZiBub24gcHJvdmlkZWQuXG4gKiBPcHRpb25hbGx5IGZvbGxvd2VkIGJ5IGEgYmluYXJ5IG5hbWUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleGVjQ29tbWFuZChcbiAgcGFja2FnZU1hbmFnZXI/OiBOb2RlUGFja2FnZU1hbmFnZXIsXG4gIGJpbj86IHN0cmluZyxcbik6IHN0cmluZyB7XG4gIGxldCBjbWQ6IHN0cmluZztcbiAgc3dpdGNoIChwYWNrYWdlTWFuYWdlcikge1xuICAgIGNhc2UgTm9kZVBhY2thZ2VNYW5hZ2VyLlBOUE06XG4gICAgICBjbWQgPSBcInBucG0gZXhlY1wiO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBOb2RlUGFja2FnZU1hbmFnZXIuWUFSTjI6XG4gICAgY2FzZSBOb2RlUGFja2FnZU1hbmFnZXIuWUFSTl9CRVJSWTpcbiAgICAgIGNtZCA9IFwieWFyblwiO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBOb2RlUGFja2FnZU1hbmFnZXIuQlVOOlxuICAgICAgY21kID0gXCJidW54XCI7XG4gICAgICBicmVhaztcbiAgICBjYXNlIE5vZGVQYWNrYWdlTWFuYWdlci5OUE06XG4gICAgY2FzZSBOb2RlUGFja2FnZU1hbmFnZXIuWUFSTjpcbiAgICBjYXNlIE5vZGVQYWNrYWdlTWFuYWdlci5ZQVJOX0NMQVNTSUM6XG4gICAgZGVmYXVsdDpcbiAgICAgIGNtZCA9IFwibnB4XCI7XG4gICAgICBicmVhaztcbiAgfVxuICByZXR1cm4gYmluID8gYCR7Y21kfSAke2Jpbn1gIDogY21kO1xufVxuXG4vKipcbiAqIEJhc2ljIGludGVyZmFjZSBmb3IgYHBhY2thZ2UuanNvbmAuXG4gKi9cbmludGVyZmFjZSBQYWNrYWdlTWFuaWZlc3Qge1xuICBba2V5OiBzdHJpbmddOiBhbnk7XG5cbiAgLyoqXG4gICAqIFBhY2thZ2UgbmFtZS5cbiAgICovXG4gIG5hbWU6IHN0cmluZztcbiAgLyoqXG4gICAqIFBhY2thZ2UgdmVyc2lvbi5cbiAgICovXG4gIHZlcnNpb246IHN0cmluZztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlbmRlckJ1bmRsZU5hbWUoZW50cnlwb2ludDogc3RyaW5nKSB7XG4gIGNvbnN0IHBhcnRzID0gam9pbihlbnRyeXBvaW50KS5zcGxpdChzZXApO1xuICBpZiAocGFydHNbMF0gPT09IFwic3JjXCIpIHtcbiAgICBwYXJ0cy5zaGlmdCgpOyAvLyBqdXN0IHJlbW92ZSAnc3JjJyBpZiBpdHMgdGhlIGZpcnN0IGVsZW1lbnQgZm9yIGVyZ29ub21pY3NcbiAgfVxuXG4gIGNvbnN0IHAgPSBwYXJ0cy5qb2luKHBvc2l4LnNlcCk7XG4gIGNvbnN0IGRpciA9IGRpcm5hbWUocCk7XG4gIGNvbnN0IGJhc2UgPSBiYXNlbmFtZShwLCBleHRuYW1lKHApKTtcbiAgcmV0dXJuIHBvc2l4LmpvaW4oZGlyLCBiYXNlKTtcbn1cblxuLyoqXG4gKiBSZWdleCBmb3IgQVdTIENvZGVBcnRpZmFjdCByZWdpc3RyeVxuICovXG5leHBvcnQgY29uc3QgY29kZUFydGlmYWN0UmVnZXggPVxuICAvXmh0dHBzOlxcL1xcLyg/PHJlZ2lzdHJ5Pig/PGRvbWFpbj5bXlxcLl0rKS0oPzxhY2NvdW50SWQ+XFxkezEyfSlcXC5kXFwuY29kZWFydGlmYWN0XFwuKD88cmVnaW9uPlteXFwuXSspLipcXC5hbWF6b25hd3NcXC5jb21cXC8uKlxcLyg/PHJlcG9zaXRvcnk+W15cXC9dKylcXC8pLztcblxuLyoqXG4gKiBnZXRzIEFXUyBkZXRhaWxzIGZyb20gdGhlIENvZGUgQXJ0aWZhY3QgcmVnaXN0cnkgVVJMXG4gKiB0aHJvd3MgZXhjZXB0aW9uIGlmIG5vdCBtYXRjaGluZyBleHBlY3RlZCBwYXR0ZXJuXG4gKiBAcGFyYW0gcmVnaXN0cnlVcmwgQ29kZSBBcnRpZmFjdCByZWdpc3RyeSBVUkxcbiAqIEByZXR1cm5zIG9iamVjdCBjb250YWluaW5nIHRoZSAoZG9tYWluLCBhY2NvdW50SWQsIHJlZ2lvbiwgcmVwb3NpdG9yeSlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RDb2RlQXJ0aWZhY3REZXRhaWxzKHJlZ2lzdHJ5VXJsOiBzdHJpbmcpIHtcbiAgY29uc3QgbWF0Y2ggPSByZWdpc3RyeVVybC5tYXRjaChjb2RlQXJ0aWZhY3RSZWdleCk7XG4gIGlmIChtYXRjaD8uZ3JvdXBzKSB7XG4gICAgY29uc3QgeyBkb21haW4sIGFjY291bnRJZCwgcmVnaW9uLCByZXBvc2l0b3J5LCByZWdpc3RyeSB9ID0gbWF0Y2guZ3JvdXBzO1xuICAgIHJldHVybiB7IGRvbWFpbiwgYWNjb3VudElkLCByZWdpb24sIHJlcG9zaXRvcnksIHJlZ2lzdHJ5IH07XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKFwiQ291bGQgbm90IGdldCBDb2RlQXJ0aWZhY3QgZGV0YWlscyBmcm9tIG5wbSBSZWdpc3RyeVwiKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1pblZlcnNpb24odmVyc2lvbjogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKHNlbXZlci52YWxpZFJhbmdlKHZlcnNpb24pKSB7XG4gICAgcmV0dXJuIHNlbXZlci5taW5WZXJzaW9uKHZlcnNpb24pPy52ZXJzaW9uO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiB2ZXJzaW9uO1xuICB9XG59XG5cbi8qKlxuICogQXR0ZW1wdCB0byByZXNvbHZlIGxvY2F0aW9uIG9mIHRoZSBnaXZlbiBgbW9kdWxlSWRgLlxuICogQHBhcmFtIG1vZHVsZUlkIE1vZHVsZSBJRCB0byBsb29rdXAuXG4gKiBAcGFyYW0gb3B0aW9ucyBQYXNzZWQgdGhyb3VnaCB0byBgcmVxdWlyZS5yZXNvbHZlYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRyeVJlc29sdmVNb2R1bGUoXG4gIG1vZHVsZUlkOiBzdHJpbmcsXG4gIG9wdGlvbnM/OiB7IHBhdGhzOiBzdHJpbmdbXSB9LFxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gcmVxdWlyZS5yZXNvbHZlKG1vZHVsZUlkLCBvcHRpb25zKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG4vKipcbiAqIEF0dGVtcHQgdG8gcmVzb2x2ZSBhIG1vZHVsZSdzIG1hbmlmZXN0IChwYWNrYWdlLmpzb24pIHBhdGggdmlhIGByZXF1aXJlLnJlc29sdmVgIGxvb2t1cC5cbiAqXG4gKiBAcmVtYXJrc1xuICogSWYgdGhlIHRhcmdldCBwYWNrYWdlIGhhcyBgZXhwb3J0c2AgdGhhdCBkaWZmZXIgZnJvbSB0aGUgZGVmYXVsdFxuICogKGkuZSwgaXQgZGVmaW5lcyB0aGUgYGV4cG9ydHNgIGZpZWxkIGluIGl0cyBtYW5pZmVzdCkgYW5kIGRvZXMgbm90XG4gKiBleHBsaWNpdGx5IGluY2x1ZGUgYW4gZW50cnkgZm9yIGBwYWNrYWdlLmpzb25gLCB0aGlzIHN0cmF0ZWd5IHdpbGwgZmFpbC5cbiAqIFNlZSB7QGxpbmsgdHJ5UmVzb2x2ZU1hbmlmZXN0UGF0aEZyb21EZWZhdWx0RXhwb3J0fSBhcyBhbiBhbHRlcm5hdGl2ZS5cbiAqXG4gKiBAcGFyYW0gbW9kdWxlSWQgTW9kdWxlIElEIHRvIGxvb2t1cC5cbiAqIEBwYXJhbSBvcHRpb25zIFBhc3NlZCB0aHJvdWdoIHRvIGByZXF1aXJlLnJlc29sdmVgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdHJ5UmVzb2x2ZU1vZHVsZU1hbmlmZXN0UGF0aChcbiAgbW9kdWxlSWQ6IHN0cmluZyxcbiAgb3B0aW9ucz86IHsgcGF0aHM6IHN0cmluZ1tdIH0sXG4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAvLyBjYW5ub3QganVzdCBgcmVxdWlyZSgnZGVwZW5kZW5jeS9wYWNrYWdlLmpzb24nKWAgaGVyZSBiZWNhdXNlXG4gIC8vIGBvcHRpb25zLnBhdGhzYCBtYXkgbm90IG92ZXJsYXAgd2l0aCB0aGlzIG5vZGUgcHJvYydzIHJlc29sdXRpb24gcGF0aHMuXG4gIGNvbnN0IG1hbmlmZXN0SWQgPSBgJHttb2R1bGVJZH0vcGFja2FnZS5qc29uYDtcbiAgcmV0dXJuIHRyeVJlc29sdmVNb2R1bGUobWFuaWZlc3RJZCwgb3B0aW9ucyk7XG59XG5cbi8qKlxuICogQXR0ZW1wdCB0byByZXNvbHZlIGEgbW9kdWxlJ3MgbWFuaWZlc3QgKHBhY2thZ2UuanNvbikgcGF0aCBieSBsb29raW5nIGZvciB0aGUgbmVhcmVzdFxuICogYHBhY2thZ2UuanNvbmAgZmlsZSB0aGF0IGlzIGFuIGFuY2VzdG9yIHRvIHRoZSBtb2R1bGUncyBkZWZhdWx0IGV4cG9ydCBsb2NhdGlvbi5cbiAqXG4gKiBAcGFyYW0gbW9kdWxlSWQgTW9kdWxlIElEIHRvIGxvb2t1cC5cbiAqIEBwYXJhbSBvcHRpb25zIFBhc3NlZCB0aHJvdWdoIHRvIGByZXF1aXJlLnJlc29sdmVgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdHJ5UmVzb2x2ZU1hbmlmZXN0UGF0aEZyb21EZWZhdWx0RXhwb3J0KFxuICBtb2R1bGVJZDogc3RyaW5nLFxuICBvcHRpb25zPzogeyBwYXRoczogc3RyaW5nW10gfSxcbik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGRlZmF1bHRFeHBvcnRQYXRoID0gdHJ5UmVzb2x2ZU1vZHVsZShtb2R1bGVJZCwgb3B0aW9ucyk7XG4gIGlmICghZGVmYXVsdEV4cG9ydFBhdGgpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIGNvbnN0IG1vZHVsZURpciA9IGZpbmRVcChcInBhY2thZ2UuanNvblwiLCBkZWZhdWx0RXhwb3J0UGF0aCk7XG4gIGlmICghbW9kdWxlRGlyKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICByZXR1cm4gam9pbihtb2R1bGVEaXIsIFwicGFja2FnZS5qc29uXCIpO1xufVxuXG4vKipcbiAqIEF0dGVtcHQgdG8gcmVzb2x2ZSBhIG1vZHVsZSdzIG1hbmlmZXN0IChwYWNrYWdlLmpzb24pIHBhdGggYnkgY2hlY2tpbmcgZm9yIGl0cyBleGlzdGVuY2UgdW5kZXIgYG5vZGVfbW9kdWxlc2AgcmVsYXRpdmUgdG8gYGJhc2VQYXRoYC5cbiAqXG4gKiBAcmVtYXJrc1xuICogVGhpcyBzdHJhdGVneSBjYW4gYmUgaGVscGZ1bCBpbiB0aGUgc2NlbmFyaW8gdGhhdCBhIG1vZHVsZSBkZWZpbmVzXG4gKiBjdXN0b20gZXhwb3J0cyB3aXRob3V0IGBwYWNrYWdlLmpzb25gIGFuZCBubyBkZWZhdWx0IGV4cG9ydCAoaS5lLCBzb21lIHR5cGUgZGVmaW5pdGlvbiBwYWNrYWdlcykuXG4gKlxuICogQHBhcmFtIG1vZHVsZUlkIE1vZHVsZSBJRCB0byBsb29rdXAuXG4gKiBAcGFyYW0gYmFzZVBhdGggUm9vdCBwYXRoIHRvIHNlYXJjaCBmcm9tLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdHJ5UmVzb2x2ZU1hbmlmZXN0UGF0aEZyb21QYXRoKFxuICBtb2R1bGVJZDogc3RyaW5nLFxuICBiYXNlUGF0aDogc3RyaW5nLFxuKSB7XG4gIGNvbnN0IGJhc2UgPSBiYXNlUGF0aC5pbmNsdWRlcyhcIm5vZGVfbW9kdWxlc1wiKVxuICAgID8gYmFzZVBhdGhcbiAgICA6IGpvaW4oYmFzZVBhdGgsIFwibm9kZV9tb2R1bGVzXCIpO1xuICBjb25zdCBmaWxlUGF0aCA9IHJlc29sdmUoYmFzZSwgLi4ubW9kdWxlSWQuc3BsaXQoXCIvXCIpLCBcInBhY2thZ2UuanNvblwiKTtcbiAgaWYgKGV4aXN0c1N5bmMoZmlsZVBhdGgpKSB7XG4gICAgcmV0dXJuIGZpbGVQYXRoO1xuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogQXR0ZW1wdCB0byByZXNvbHZlIGEgbW9kdWxlJ3MgbWFuaWZlc3QgKHBhY2thZ2UuanNvbikgcGF0aCBieSBzZWFyY2hpbmcgZm9yIGl0IGluIHRoZSBvcHRpb25hbGx5IHByb3ZpZGVkIHBhdGhzIGFycmF5XG4gKiBhcyB3ZWxsIGFzIHRoZSBjdXJyZW50IG5vZGUgcHJvY2Vzc2VzJyBkZWZhdWx0IHJlc29sdXRpb24gcGF0aHMuXG4gKiBAcGFyYW0gbW9kdWxlSWQgTW9kdWxlIElEIHRvIHNlYXJjaCBmb3IuXG4gKiBAcGFyYW0gb3B0aW9ucyBTZWFyY2ggb3B0aW9ucy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRyeVJlc29sdmVNYW5pZmVzdFBhdGhGcm9tU2VhcmNoKFxuICBtb2R1bGVJZDogc3RyaW5nLFxuICBvcHRpb25zPzogeyBwYXRoczogc3RyaW5nW10gfSxcbik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHNlYXJjaFBhdGhzID0gW1xuICAgIC4uLihvcHRpb25zPy5wYXRocyA/PyBbXSksXG4gICAgLi4uKHJlcXVpcmUucmVzb2x2ZS5wYXRocyhtb2R1bGVJZCkgPz8gW10pLFxuICBdO1xuICBmb3IgKGNvbnN0IHBhdGggb2Ygc2VhcmNoUGF0aHMpIHtcbiAgICBjb25zdCByZXN1bHQgPSB0cnlSZXNvbHZlTWFuaWZlc3RQYXRoRnJvbVBhdGgobW9kdWxlSWQsIHBhdGgpO1xuICAgIC8vIGVhcmx5IHJldHVybiBvbiBmaXJzdCByZXN1bHQuXG4gICAgaWYgKHJlc3VsdCkge1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBBdHRlbXB0IHRvIHJlc29sdmUgYSBtb2R1bGUncyBtYW5pZmVzdCAocGFja2FnZS5qc29uKSB1c2luZyBtdWx0aXBsZSBzdHJhdGVnaWVzLlxuICogQHBhcmFtIG1vZHVsZUlkIE1vZHVsZSB0byByZXNvbHZlIG1hbmlmZXN0IHBhdGggZm9yLlxuICogQHBhcmFtIG9wdGlvbnMgUmVzb2x1dGlvbiBvcHRpb25zLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdHJ5UmVzb2x2ZU1vZHVsZU1hbmlmZXN0KFxuICBtb2R1bGVJZDogc3RyaW5nLFxuICBvcHRpb25zPzogeyBwYXRoczogc3RyaW5nW10gfSxcbik6IFBhY2thZ2VNYW5pZmVzdCB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHN0cmF0ZWdpZXMgPSBbXG4gICAgdHJ5UmVzb2x2ZU1vZHVsZU1hbmlmZXN0UGF0aCxcbiAgICB0cnlSZXNvbHZlTWFuaWZlc3RQYXRoRnJvbURlZmF1bHRFeHBvcnQsXG4gICAgdHJ5UmVzb2x2ZU1hbmlmZXN0UGF0aEZyb21TZWFyY2gsXG4gIF07XG4gIGZvciAoY29uc3Qgc3RyYXRlZ3kgb2Ygc3RyYXRlZ2llcykge1xuICAgIGNvbnN0IHJlc3VsdCA9IHN0cmF0ZWd5KG1vZHVsZUlkLCBvcHRpb25zKTtcbiAgICAvLyBlYXJseSByZXR1cm4gb24gZmlyc3QgcmVzdWx0LlxuICAgIGlmIChyZXN1bHQpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IG1hbmlmZXN0ID0gSlNPTi5wYXJzZShcbiAgICAgICAgICByZWFkRmlsZVN5bmMocmVzdWx0LCBcInV0ZjhcIiksXG4gICAgICAgICkgYXMgUGFja2FnZU1hbmlmZXN0O1xuICAgICAgICAvLyB2ZXJpZnkgbmFtZSBtYXRjaGVzIHRhcmdldCBtb2R1bGUuXG4gICAgICAgIGlmIChtYW5pZmVzdC5uYW1lID09PSBtb2R1bGVJZCkge1xuICAgICAgICAgIHJldHVybiBtYW5pZmVzdDtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIGNvbnRpbnVlIHRvIG5leHQgc3RyYXRlZ3kuXG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogQXR0ZW1wdCB0byByZXNvbHZlIHRoZSBpbnN0YWxsZWQgdmVyc2lvbiBvZiBhIGdpdmVuIGRlcGVuZGVuY3kuXG4gKiBAcGFyYW0gZGVwZW5kZW5jeU5hbWUgTmFtZSBvZiBkZXBlbmRlbmN5LlxuICogQHBhcmFtIG9wdGlvbnMgT3B0aW9uYWwgb3B0aW9ucyBwYXNzZWQgdGhyb3VnaCB0byBgcmVxdWlyZS5yZXNvbHZlYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRyeVJlc29sdmVEZXBlbmRlbmN5VmVyc2lvbihcbiAgZGVwZW5kZW5jeU5hbWU6IHN0cmluZyxcbiAgb3B0aW9ucz86IHsgcGF0aHM6IHN0cmluZ1tdIH0sXG4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBtYW5pZmVzdCA9IHRyeVJlc29sdmVNb2R1bGVNYW5pZmVzdChkZXBlbmRlbmN5TmFtZSwgb3B0aW9ucyk7XG4gIGlmICghbWFuaWZlc3QpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIHJldHVybiBtYW5pZmVzdD8udmVyc2lvbjtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIHRoZSBnaXZlbiBkZXBlbmRlbmN5IHZlcnNpb24gaXMgaW5zdGFsbGVkXG4gKlxuICogVGhpcyBjYW4gYmUgdXNlZCB0byB0ZXN0IGZvciB0aGUgcHJlc2VuY2Ugb2YgY2VydGFpbiB2ZXJzaW9ucyBvZiBkZXZEZXBlbmRlbmNpZXMsXG4gKiBhbmQgZG8gc29tZXRoaW5nIGRlcGVuZGVuY3ktc3BlY2lmaWMgaW4gY2VydGFpbiBDb21wb25lbnRzLiBGb3IgZXhhbXBsZSwgdGVzdCBmb3JcbiAqIGEgdmVyc2lvbiBvZiBKZXN0IGFuZCBnZW5lcmF0ZSBkaWZmZXJlbnQgY29uZmlncyBiYXNlZCBvbiB0aGUgSmVzdCB2ZXJzaW9uLlxuICpcbiAqIE5PVEU6IFRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGZ1bmN0aW9uIGN1cnJlbnRseSBpcyBjdXJyZW50bHlcbiAqIGFwcHJveGltYXRlOiB0byBkbyBpdCBjb3JyZWN0bHksIHdlIHdvdWxkIG5lZWQgYSBzZXBhcmF0ZSBpbXBsZW1lbnRhdGlvblxuICogZm9yIGV2ZXJ5IHBhY2thZ2UgbWFuYWdlciwgdG8gcXVlcnkgaXRzIGluc3RhbGxlZCB2ZXJzaW9uIChlaXRoZXIgdGhhdCwgb3Igd2VcbiAqIHdvdWxkIGNvZGUgdG8gcXVlcnkgYHBhY2thZ2UtbG9jay5qc29uYCwgYHlhcm4ubG9ja2AsIGV0Yy4uLikuXG4gKlxuICogSW5zdGVhZCwgd2Ugd2lsbCBsb29rIGF0IGBwYWNrYWdlLmpzb25gLCBhbmQgYXNzdW1lIHRoYXQgdGhlIHZlcnNpb25zXG4gKiBwaWNrZWQgYnkgdGhlIHBhY2thZ2UgbWFuYWdlciBtYXRjaCB+dGhhdC4gVGhpcyB3aWxsIHdvcmsgd2VsbCBlbm91Z2ggZm9yXG4gKiBtYWpvciB2ZXJzaW9uIGNoZWNrcywgYnV0IG1heSBmYWlsIGZvciBwb2ludCB2ZXJzaW9ucy5cbiAqXG4gKiBXaGF0IHdlIFNIT1VMRCBkbyBpczogYGFjdHVhbFZlcnNpb24g4oiIIGNoZWNrUmFuZ2VgLlxuICpcbiAqIFdoYXQgd2UgZG8gaW5zdGVhZCBpcyBhIHNsaWdodGx5IG1vcmUgc29waGlzdGljYXRlZCB2ZXJzaW9uIG9mXG4gKiBgcmVxdWVzdGVkUmFuZ2Ug4oipIGNoZWNrUmFuZ2UgIT0g4oiFYC4gVGhpcyB3aWxsIGFsd2F5cyBnaXZlIGEgY29ycmVjdCByZXN1bHQgaWZcbiAqIGByZXF1ZXN0ZWRSYW5nZSDiioYgY2hlY2tSYW5nZWAsIGJ1dCBtYXkgZ2l2ZSBmYWxzZSBwb3NpdGl2ZXMgd2hlbiBgY2hlY2tSYW5nZVxuICog4oqGIHJlcXVlc3RlZFJhbmdlYC5cbiAqXG4gKiBNYXkgcmV0dXJuIGB1bmRlZmluZWRgIGlmIHRoZSBxdWVzdGlvbiBjYW5ub3QgYmUgYW5zd2VyZWQuIFRoZXNlIGluY2x1ZGUgdGhlXG4gKiBmb2xsb3dpbmcgY2FzZXM6XG4gKlxuICogICAtIFRoZSBkZXBlbmRlbmN5IGlzIHJlcXVlc3RlZCB2aWEgbG9jYWwgZmlsZSBkZXBlbmRlbmNpZXMgKGBmaWxlOi8vLi4uYClcbiAqICAgLSBUaGUgZGVwZW5kZW5jeSB1c2VzIGFuIG90aGVyIHR5cGUgb2YgVVJMLCBzdWNoIGFzIGEgR2l0SHViIFVSTFxuICogICAtIFRoZSBkZXBlbmRlbmN5IGlzIG5vdCBmb3VuZCBpbiB0aGUgYHBhY2thZ2UuanNvbmAsIHN1Y2ggYXMgd2hlblxuICogICAgIGJvb3RzdHJhcHBpbmcgZnJvbSBhbiBleHRlcm5hbCBwcm9qZW4gcGFja2FnZSwgYW5kIHRoZSBgcGFja2FnZS5qc29uYFxuICogICAgIGZpbGUgb25seSBoYXMgdGhhdCBvbmUgZXh0ZXJuYWwgcGFja2FnZSBhcyBhIGRlcGVuZGVuY3lcbiAqXG4gKiBPdGhlcndpc2UgaXQgd2lsbCByZXR1cm4gYHRydWVgIGlmIHRoZSBpbnN0YWxsZWQgdmVyc2lvbiBpcyBwcm9iYWJseSBpbiB0aGVcbiAqIHJlcXVlc3RlZCByYW5nZSwgYW5kIGBmYWxzZWAgaWYgaXQgaXMgcHJvYmFibHkgbm90LlxuICpcbiAqIFRoaXMgQVBJIG1heSBldmVudHVhbGx5IGJlIGFkZGVkIHRvIHRoZSBwdWJsaWMgcHJvamVuIEFQSSwgYnV0IG9ubHkgYWZ0ZXJcbiAqIHdlIGltcGxlbWVudCBleGFjdCB2ZXJzaW9uIGNoZWNraW5nLlxuICpcbiAqIEBwYXJhbSBkZXBlbmRlbmN5TmFtZSBUaGUgbmFtZSBvZiB0aGUgZGVwZW5kZW5jeVxuICogQHBhcmFtIGNoZWNrUmFuZ2UgQSBwYXJ0aWN1bGFyIHZlcnNpb24sIG9yIHJhbmdlIG9mIHZlcnNpb25zLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaGFzRGVwZW5kZW5jeVZlcnNpb24oXG4gIHByb2plY3Q6IFByb2plY3QsXG4gIGRlcGVuZGVuY3lOYW1lOiBzdHJpbmcsXG4gIGNoZWNrUmFuZ2U6IHN0cmluZyxcbik6IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuICBjb25zdCBmaWxlID0gTm9kZVBhY2thZ2Uub2YocHJvamVjdCk/LmZpbGU7XG4gIGlmICghZmlsZSkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBpZiAoIWV4aXN0c1N5bmMoZmlsZS5hYnNvbHV0ZVBhdGgpKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGNvbnN0IHBqID0gSlNPTi5wYXJzZShyZWFkRmlsZVN5bmMoZmlsZS5hYnNvbHV0ZVBhdGgsIFwidXRmLThcIikpO1xuXG4gIC8vIFRlY2huaWNhbHksIHdlIHNob3VsZCBiZSBpbnRlcnNlY3RpbmcgYWxsIHJhbmdlcyB0byBjb21lIHVwIHdpdGggdGhlIG1vc3QgbmFycm93IGRlcGVuZGVuY3lcbiAgLy8gcmFuZ2UsIGJ1dCBgc2VtdmVyYCBkb2Vzbid0IGFsbG93IGRvaW5nIHRoYXQgYW5kIHdlIGRvbid0IHdhbnQgdG8gYWRkIGEgZGVwZW5kZW5jeSBvbiBgc2VtdmVyLWludGVyc2VjdGAuXG4gIC8vXG4gIC8vIExldCdzIHRha2UgdGhlIGZpcnN0IGRlcGVuZGVuY3kgZGVjbGFyYXRpb24gd2UgZmluZCwgYW5kIGFzc3VtZSB0aGF0IHBlb3BsZVxuICAvLyBzZXQgdXAgdGhlaXIgYHBhY2thZ2UuanNvbmAgY29ycmVjdGx5LlxuICBsZXQgcmVxdWVzdGVkUmFuZ2U6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgZm9yIChjb25zdCBrZXkgb2YgW1wiZGVwZW5kZW5jaWVzXCIsIFwiZGV2RGVwZW5kZW5jaWVzXCIsIFwicGVlckRlcGVuZGVuY2llc1wiXSkge1xuICAgIGNvbnN0IGRlcHMgPSBwaltrZXldID8/IHt9O1xuICAgIGxldCByZXF1ZXN0ZWRWZXJzaW9uID0gZGVwc1tkZXBlbmRlbmN5TmFtZV07XG4gICAgaWYgKHJlcXVlc3RlZFZlcnNpb24pIHtcbiAgICAgIC8vIElmIHRoaXMgaXMgbm90IGEgdmFsaWQgcmFuZ2UsIGl0IGNvdWxkIGJlICdmaWxlOmRlcC50Z3onLCBvciBhIEdpdEh1YiBVUkwuIE5vIHdheSB0byBrbm93IHdoYXRcbiAgICAgIC8vIHZlcnNpb24gd2UncmUgZ2V0dGluZywgYmFpbCBvdXQuXG4gICAgICBpZiAoIXNlbXZlci52YWxpZFJhbmdlKHJlcXVlc3RlZFZlcnNpb24pKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICByZXF1ZXN0ZWRSYW5nZSA9IHJlcXVlc3RlZFZlcnNpb247XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICAvLyBJZiB0aGUgZGVwZW5kZW5jeSBpcyBub3QgZm91bmQgaW4gdGhlIGBwYWNrYWdlLmpzb25gLCB3ZSBjYW4ndCBhbnN3ZXIgdGhlIHF1ZXN0aW9uICh5ZXQpLlxuICAvLyBUaGlzIG1lYW5zIHRoYXQgdGhlIGRlcGVuZGVuY3kgaGFzbid0IGJlZW4gYWRkZWQgeWV0LCB3aGljaCBtZWFucyB3ZSBrbm93ICh1cHN0cmVhbSkgd2hhdCB3ZSdyZSBnb2luZyB0byByZXF1ZXN0LFxuICAvLyBvciB3ZSdyZSBnb2luZyB0byBhc2sgZm9yICcqJyBhbmQgd2UnbGwgZ2V0IHRoZSBsYXRlc3QgdmVyc2lvbi5cbiAgaWYgKCFyZXF1ZXN0ZWRSYW5nZSkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICByZXR1cm4gaW5zdGFsbGVkVmVyc2lvblByb2JhYmx5TWF0Y2hlcyhyZXF1ZXN0ZWRSYW5nZSwgY2hlY2tSYW5nZSk7XG59XG5cbi8qKlxuICogV2hldGhlciB0aGUgZ2l2ZW4gcmVxdWVzdGVkUmFuZ2UgKnByb2JhYmx5KiBsZWFkcyB0byB0aGUgaW5zdGFsbGF0aW9uIG9mIGEgdmVyc2lvbiB0aGF0IG1hdGNoZXMgY2hlY2tSYW5nZVxuICpcbiAqIFdlIGFzc3VtZSB0aGF0IE5QTSBhbHdheXMgaW5zdGFsbHMgdGhlIG1vc3QgcmVjZW50IHZlcnNpb24gb2YgYSBwYWNrYWdlIHRoYXRcbiAqIGlzIGFsbG93ZWQgYnkgdGhlIHJlcXVlc3RlZFJhbmdlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5zdGFsbGVkVmVyc2lvblByb2JhYmx5TWF0Y2hlcyhcbiAgcmVxdWVzdGVkUmFuZ2U6IHN0cmluZyxcbiAgY2hlY2tSYW5nZTogc3RyaW5nLFxuKTogYm9vbGVhbiB7XG4gIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgaW5jbHVkZVByZXJlbGVhc2U6IHRydWUsXG4gICAgbG9vc2U6IHRydWUsXG4gIH07XG5cbiAgLy8gTm8gcXVlc3Rpb25zIGFza2VkOiBhbHdheXMgdHJ1ZVxuICBpZiAoc2VtdmVyLnN1YnNldChyZXF1ZXN0ZWRSYW5nZSwgY2hlY2tSYW5nZSwgb3B0aW9ucykpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8vIEFsc28gbm8gcXVlc3Rpb25zIGFza2VkOiBhbHdheXMgZmFsc2VcbiAgaWYgKCFzZW12ZXIuaW50ZXJzZWN0cyhyZXF1ZXN0ZWRSYW5nZSwgY2hlY2tSYW5nZSwgb3B0aW9ucykpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyBOb3cgd2UncmUgaW4gdHJpY2t5IHRlcnJpdG9yeS4gV2UgaW50ZXJzZWN0LCBidXQgYXJlbid0IGEgZnVsbCBzdWJzZXQuXG4gIC8vIFdlIGFyZSBpbiBvbmUgb2YgdGhlIGZvbGxvd2luZyAyIHNpdHVhdGlvbnMsIHdoaWNoIHdlIHdpbGwgdGllLWJyZWFrIGJ5XG4gIC8vIGFzc3VtaW5nIE5QTSB3aWxsIGluc3RhbGwgdGhlIG1vc3QgcmVjZW50IG1hdGNoaW5nIHZlcnNpb24gaW4gJ3JlcXVlc3RlZCcuXG4gIC8vXG4gIC8vIHJlcXVlc3RlZCAgfCBjaGVjayAgICB8IHJlc3VsdFxuICAvLyAtLS0tLS0tLS0tLXwtLS0tLS0tLS0tfC0tLS0tLS0tLS0tXG4gIC8vICAgPj0gMiAgICAgfCAgPj0gMyAgICB8IHByb2JhYmx5IHRydWUgKGNoYW5jZSBvZiBGUClcbiAgLy8gICA8PSAyICAgICB8ICA8PSAxICAgIHwgcHJvYmFibHkgZmFsc2UgKGNoYW5nZSBvZiBGTilcbiAgLy9cbiAgLy8gYHNlbXZlcmAgZG9lc24ndCBtYWtlIGl0IGVhc3kgdG8gZGlzdGluZ3Vpc2ggdGhlc2UgY2FzZXMgKHdlIGNhbid0IHJlcXVlc3RcbiAgLy8gdGhlIGBtYXhWZXJzaW9uYCB0aGF0IHNhdGlzZmllcyBhIHJhbmdlKS4gSW5zdGVhZCB3aGF0IHdlIGRvIGlzXG4gIC8vIGdldCB0aGUgYG1pblZlcnNpb25gIG9mIGVhY2ggcmFuZ2UsIGFuZCBpZiB0aGV5IGNvbXBhcmUgZXF1YWwgd2UgYXNzdW1lXG4gIC8vIHdlJ3JlIGluIHRoZSBib3R0b20gY2FzZSB3aXRoIGA8PWAgY2hlY2tzLCBhbmQgcmV0dXJuIGBmYWxzZWAuXG5cbiAgcmV0dXJuICFzZW12ZXIuZXEoXG4gICAgc2VtdmVyLm1pblZlcnNpb24ocmVxdWVzdGVkUmFuZ2UsIG9wdGlvbnMpID8/IFwiMS4yLjNcIixcbiAgICBzZW12ZXIubWluVmVyc2lvbihjaGVja1JhbmdlLCBvcHRpb25zKSA/PyBcIjEuMi4zXCIsXG4gICk7XG59XG4iXX0=
369
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9qYXZhc2NyaXB0L3V0aWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBVUEsc0NBS0M7QUFLRCxrQ0FLQztBQUtELHNCQUVDO0FBTUQsa0NBd0JDO0FBTUQsMEVBaUJDO0FBa0JELDRDQVVDO0FBY0QsZ0VBT0M7QUFFRCxnQ0FNQztBQU9ELDRDQVNDO0FBY0Qsb0VBUUM7QUFTRCwwRkFhQztBQVlELHdFQVlDO0FBUUQsNEVBZ0JDO0FBT0QsNERBMkJDO0FBT0Qsa0VBU0M7QUEyQ0Qsb0RBNENDO0FBUUQsMEVBcUNDO0FBaGJELDJCQUE4QztBQUM5QywrQkFBNkU7QUFDN0UsaUNBQWlDO0FBQ2pDLGlEQUFpRTtBQUVqRSxrQ0FBaUM7QUFFakM7O0dBRUc7QUFDSCxTQUFnQixhQUFhLENBQUMsY0FBa0M7SUFDOUQsT0FBTyxDQUNMLGNBQWMsS0FBSyxpQ0FBa0IsQ0FBQyxJQUFJO1FBQzFDLGNBQWMsS0FBSyxpQ0FBa0IsQ0FBQyxZQUFZLENBQ25ELENBQUM7QUFDSixDQUFDO0FBRUQ7O0dBRUc7QUFDSCxTQUFnQixXQUFXLENBQUMsY0FBa0M7SUFDNUQsT0FBTyxDQUNMLGNBQWMsS0FBSyxpQ0FBa0IsQ0FBQyxLQUFLO1FBQzNDLGNBQWMsS0FBSyxpQ0FBa0IsQ0FBQyxVQUFVLENBQ2pELENBQUM7QUFDSixDQUFDO0FBRUQ7O0dBRUc7QUFDSCxTQUFnQixLQUFLLENBQUMsY0FBa0M7SUFDdEQsT0FBTyxjQUFjLEtBQUssaUNBQWtCLENBQUMsR0FBRyxDQUFDO0FBQ25ELENBQUM7QUFFRDs7O0dBR0c7QUFDSCxTQUFnQixXQUFXLENBQ3pCLGNBQW1DLEVBQ25DLEdBQVk7SUFFWixJQUFJLEdBQVcsQ0FBQztJQUNoQixRQUFRLGNBQWMsRUFBRSxDQUFDO1FBQ3ZCLEtBQUssaUNBQWtCLENBQUMsSUFBSTtZQUMxQixHQUFHLEdBQUcsV0FBVyxDQUFDO1lBQ2xCLE1BQU07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LElBQUksTUFBTSxDQUFDLE1BQU0sQ0FBQyxjQUFjLEVBQUUsVUFBVSxFQUFFLE9BQU8sQ0FBQyxFQUFFLENBQUM7UUFDdkQsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsd0NBQXdDO0lBQ3hDLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLGNBQWMsRUFBRSxVQUFVLEVBQUUsT0FBTyxDQUFDLEVBQUUsQ0FBQztRQUM1RCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRCx5RUFBeUU7SUFDekUsMEVBQTBFO0lBQzFFLDZFQUE2RTtJQUM3RSxFQUFFO0lBQ0YsaUNBQWlDO0lBQ2pDLHFDQUFxQztJQUNyQyx1REFBdUQ7SUFDdkQsd0RBQXdEO0lBQ3hELEVBQUU7SUFDRiw2RUFBNkU7SUFDN0Usa0VBQWtFO0lBQ2xFLDBFQUEwRTtJQUMxRSxpRUFBaUU7SUFFakUsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQ2YsTUFBTSxDQUFDLFVBQVUsQ0FBQyxjQUFjLEVBQUUsT0FBTyxDQUFDLElBQUksT0FBTyxFQUNyRCxNQUFNLENBQUMsVUFBVSxDQUFDLFVBQVUsRUFBRSxPQUFPLENBQUMsSUFBSSxPQUFPLENBQ2xELENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZXhpc3RzU3luYywgcmVhZEZpbGVTeW5jIH0gZnJvbSBcImZzXCI7XG5pbXBvcnQgeyBiYXNlbmFtZSwgZGlybmFtZSwgZXh0bmFtZSwgam9pbiwgc2VwLCByZXNvbHZlLCBwb3NpeCB9IGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgKiBhcyBzZW12ZXIgZnJvbSBcInNlbXZlclwiO1xuaW1wb3J0IHsgTm9kZVBhY2thZ2UsIE5vZGVQYWNrYWdlTWFuYWdlciB9IGZyb20gXCIuL25vZGUtcGFja2FnZVwiO1xuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSBcIi4uL3Byb2plY3RcIjtcbmltcG9ydCB7IGZpbmRVcCB9IGZyb20gXCIuLi91dGlsXCI7XG5cbi8qKlxuICogQ2hlY2sgaWYgcGFja2FnZSBtYW5hZ2VyIGlzIHlhcm4gY2xhc3NpYy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzWWFybkNsYXNzaWMocGFja2FnZU1hbmFnZXI6IE5vZGVQYWNrYWdlTWFuYWdlcik6IGJvb2xlYW4ge1xuICByZXR1cm4gKFxuICAgIHBhY2thZ2VNYW5hZ2VyID09PSBOb2RlUGFja2FnZU1hbmFnZXIuWUFSTiB8fFxuICAgIHBhY2thZ2VNYW5hZ2VyID09PSBOb2RlUGFja2FnZU1hbmFnZXIuWUFSTl9DTEFTU0lDXG4gICk7XG59XG5cbi8qKlxuICogQ2hlY2sgaWYgcGFja2FnZSBtYW5hZ2VyIGlzIHlhcm4gYmVycnkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1lhcm5CZXJyeShwYWNrYWdlTWFuYWdlcjogTm9kZVBhY2thZ2VNYW5hZ2VyKTogYm9vbGVhbiB7XG4gIHJldHVybiAoXG4gICAgcGFja2FnZU1hbmFnZXIgPT09IE5vZGVQYWNrYWdlTWFuYWdlci5ZQVJOMiB8fFxuICAgIHBhY2thZ2VNYW5hZ2VyID09PSBOb2RlUGFja2FnZU1hbmFnZXIuWUFSTl9CRVJSWVxuICApO1xufVxuXG4vKipcbiAqIENoZWNrIGlmIHBhY2thZ2UgbWFuYWdlciBpcyBucG0uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc05wbShwYWNrYWdlTWFuYWdlcjogTm9kZVBhY2thZ2VNYW5hZ2VyKTogYm9vbGVhbiB7XG4gIHJldHVybiBwYWNrYWdlTWFuYWdlciA9PT0gTm9kZVBhY2thZ2VNYW5hZ2VyLk5QTTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBleGVjIGNvbW1hbmQgcHJlZml4IGZvciB0aGUgZ2l2ZW4gcGFja2FnZSBtYW5hZ2VyLCBvciBkZWZhdWx0cyB0byBucHggaWYgbm9uIHByb3ZpZGVkLlxuICogT3B0aW9uYWxseSBmb2xsb3dlZCBieSBhIGJpbmFyeSBuYW1lLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXhlY0NvbW1hbmQoXG4gIHBhY2thZ2VNYW5hZ2VyPzogTm9kZVBhY2thZ2VNYW5hZ2VyLFxuICBiaW4/OiBzdHJpbmcsXG4pOiBzdHJpbmcge1xuICBsZXQgY21kOiBzdHJpbmc7XG4gIHN3aXRjaCAocGFja2FnZU1hbmFnZXIpIHtcbiAgICBjYXNlIE5vZGVQYWNrYWdlTWFuYWdlci5QTlBNOlxuICAgICAgY21kID0gXCJwbnBtIGV4ZWNcIjtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgTm9kZVBhY2thZ2VNYW5hZ2VyLllBUk4yOlxuICAgIGNhc2UgTm9kZVBhY2thZ2VNYW5hZ2VyLllBUk5fQkVSUlk6XG4gICAgICBjbWQgPSBcInlhcm5cIjtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgTm9kZVBhY2thZ2VNYW5hZ2VyLkJVTjpcbiAgICAgIGNtZCA9IFwiYnVueFwiO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBOb2RlUGFja2FnZU1hbmFnZXIuTlBNOlxuICAgIGNhc2UgTm9kZVBhY2thZ2VNYW5hZ2VyLllBUk46XG4gICAgY2FzZSBOb2RlUGFja2FnZU1hbmFnZXIuWUFSTl9DTEFTU0lDOlxuICAgIGRlZmF1bHQ6XG4gICAgICBjbWQgPSBcIm5weFwiO1xuICAgICAgYnJlYWs7XG4gIH1cbiAgcmV0dXJuIGJpbiA/IGAke2NtZH0gJHtiaW59YCA6IGNtZDtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBjb21tYW5kIHRvIGV4ZWN1dGUgYSBiaW5hcnkgd2l0aCB0aGUgZ2l2ZW4gcGFja2FnZSBtYW5hZ2VyLCB3aXRob3V0IHJlcXVpcmluZyBpbnN0YWxsYXRpb24gb2YgdGhhdCBiaW5hcnkgYXMgYSBwcm9qZWN0IGRlcGVuZGVuY3kuXG4gKiBAcGFyYW0gcGFja2FnZU1hbmFnZXIgVGhlIHBhY2thZ2UgbWFuYWdlciB0byB1c2Ugd2hlbiBleGVjdXRpbmcgdGhlIGNvbW1hbmQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleGVjdXRlQ29tbWFuZFByaW9ySW5zdGFsbGF0aW9uKFxuICBwYWNrYWdlTWFuYWdlcjogTm9kZVBhY2thZ2VNYW5hZ2VyLFxuKTogc3RyaW5nIHtcbiAgc3dpdGNoIChwYWNrYWdlTWFuYWdlcikge1xuICAgIGNhc2UgTm9kZVBhY2thZ2VNYW5hZ2VyLlBOUE06XG4gICAgICByZXR1cm4gXCJwbnBtIGRseFwiO1xuICAgIGNhc2UgTm9kZVBhY2thZ2VNYW5hZ2VyLllBUk4yOlxuICAgIGNhc2UgTm9kZVBhY2thZ2VNYW5hZ2VyLllBUk5fQkVSUlk6XG4gICAgICByZXR1cm4gXCJ5YXJuIGRseFwiO1xuICAgIGNhc2UgTm9kZVBhY2thZ2VNYW5hZ2VyLkJVTjpcbiAgICAgIHJldHVybiBcImJ1bnhcIjtcbiAgICBjYXNlIE5vZGVQYWNrYWdlTWFuYWdlci5OUE06XG4gICAgY2FzZSBOb2RlUGFja2FnZU1hbmFnZXIuWUFSTjpcbiAgICBjYXNlIE5vZGVQYWNrYWdlTWFuYWdlci5ZQVJOX0NMQVNTSUM6XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBcIm5weFwiO1xuICB9XG59XG5cbi8qKlxuICogQmFzaWMgaW50ZXJmYWNlIGZvciBgcGFja2FnZS5qc29uYC5cbiAqL1xuaW50ZXJmYWNlIFBhY2thZ2VNYW5pZmVzdCB7XG4gIFtrZXk6IHN0cmluZ106IGFueTtcblxuICAvKipcbiAgICogUGFja2FnZSBuYW1lLlxuICAgKi9cbiAgbmFtZTogc3RyaW5nO1xuICAvKipcbiAgICogUGFja2FnZSB2ZXJzaW9uLlxuICAgKi9cbiAgdmVyc2lvbjogc3RyaW5nO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVuZGVyQnVuZGxlTmFtZShlbnRyeXBvaW50OiBzdHJpbmcpIHtcbiAgY29uc3QgcGFydHMgPSBqb2luKGVudHJ5cG9pbnQpLnNwbGl0KHNlcCk7XG4gIGlmIChwYXJ0c1swXSA9PT0gXCJzcmNcIikge1xuICAgIHBhcnRzLnNoaWZ0KCk7IC8vIGp1c3QgcmVtb3ZlICdzcmMnIGlmIGl0cyB0aGUgZmlyc3QgZWxlbWVudCBmb3IgZXJnb25vbWljc1xuICB9XG5cbiAgY29uc3QgcCA9IHBhcnRzLmpvaW4ocG9zaXguc2VwKTtcbiAgY29uc3QgZGlyID0gZGlybmFtZShwKTtcbiAgY29uc3QgYmFzZSA9IGJhc2VuYW1lKHAsIGV4dG5hbWUocCkpO1xuICByZXR1cm4gcG9zaXguam9pbihkaXIsIGJhc2UpO1xufVxuXG4vKipcbiAqIFJlZ2V4IGZvciBBV1MgQ29kZUFydGlmYWN0IHJlZ2lzdHJ5XG4gKi9cbmV4cG9ydCBjb25zdCBjb2RlQXJ0aWZhY3RSZWdleCA9XG4gIC9eaHR0cHM6XFwvXFwvKD88cmVnaXN0cnk+KD88ZG9tYWluPlteXFwuXSspLSg/PGFjY291bnRJZD5cXGR7MTJ9KVxcLmRcXC5jb2RlYXJ0aWZhY3RcXC4oPzxyZWdpb24+W15cXC5dKykuKlxcLmFtYXpvbmF3c1xcLmNvbVxcLy4qXFwvKD88cmVwb3NpdG9yeT5bXlxcL10rKVxcLykvO1xuXG4vKipcbiAqIGdldHMgQVdTIGRldGFpbHMgZnJvbSB0aGUgQ29kZSBBcnRpZmFjdCByZWdpc3RyeSBVUkxcbiAqIHRocm93cyBleGNlcHRpb24gaWYgbm90IG1hdGNoaW5nIGV4cGVjdGVkIHBhdHRlcm5cbiAqIEBwYXJhbSByZWdpc3RyeVVybCBDb2RlIEFydGlmYWN0IHJlZ2lzdHJ5IFVSTFxuICogQHJldHVybnMgb2JqZWN0IGNvbnRhaW5pbmcgdGhlIChkb21haW4sIGFjY291bnRJZCwgcmVnaW9uLCByZXBvc2l0b3J5KVxuICovXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdENvZGVBcnRpZmFjdERldGFpbHMocmVnaXN0cnlVcmw6IHN0cmluZykge1xuICBjb25zdCBtYXRjaCA9IHJlZ2lzdHJ5VXJsLm1hdGNoKGNvZGVBcnRpZmFjdFJlZ2V4KTtcbiAgaWYgKG1hdGNoPy5ncm91cHMpIHtcbiAgICBjb25zdCB7IGRvbWFpbiwgYWNjb3VudElkLCByZWdpb24sIHJlcG9zaXRvcnksIHJlZ2lzdHJ5IH0gPSBtYXRjaC5ncm91cHM7XG4gICAgcmV0dXJuIHsgZG9tYWluLCBhY2NvdW50SWQsIHJlZ2lvbiwgcmVwb3NpdG9yeSwgcmVnaXN0cnkgfTtcbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoXCJDb3VsZCBub3QgZ2V0IENvZGVBcnRpZmFjdCBkZXRhaWxzIGZyb20gbnBtIFJlZ2lzdHJ5XCIpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbWluVmVyc2lvbih2ZXJzaW9uOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAoc2VtdmVyLnZhbGlkUmFuZ2UodmVyc2lvbikpIHtcbiAgICByZXR1cm4gc2VtdmVyLm1pblZlcnNpb24odmVyc2lvbik/LnZlcnNpb247XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHZlcnNpb247XG4gIH1cbn1cblxuLyoqXG4gKiBBdHRlbXB0IHRvIHJlc29sdmUgbG9jYXRpb24gb2YgdGhlIGdpdmVuIGBtb2R1bGVJZGAuXG4gKiBAcGFyYW0gbW9kdWxlSWQgTW9kdWxlIElEIHRvIGxvb2t1cC5cbiAqIEBwYXJhbSBvcHRpb25zIFBhc3NlZCB0aHJvdWdoIHRvIGByZXF1aXJlLnJlc29sdmVgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdHJ5UmVzb2x2ZU1vZHVsZShcbiAgbW9kdWxlSWQ6IHN0cmluZyxcbiAgb3B0aW9ucz86IHsgcGF0aHM6IHN0cmluZ1tdIH0sXG4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICB0cnkge1xuICAgIHJldHVybiByZXF1aXJlLnJlc29sdmUobW9kdWxlSWQsIG9wdGlvbnMpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbi8qKlxuICogQXR0ZW1wdCB0byByZXNvbHZlIGEgbW9kdWxlJ3MgbWFuaWZlc3QgKHBhY2thZ2UuanNvbikgcGF0aCB2aWEgYHJlcXVpcmUucmVzb2x2ZWAgbG9va3VwLlxuICpcbiAqIEByZW1hcmtzXG4gKiBJZiB0aGUgdGFyZ2V0IHBhY2thZ2UgaGFzIGBleHBvcnRzYCB0aGF0IGRpZmZlciBmcm9tIHRoZSBkZWZhdWx0XG4gKiAoaS5lLCBpdCBkZWZpbmVzIHRoZSBgZXhwb3J0c2AgZmllbGQgaW4gaXRzIG1hbmlmZXN0KSBhbmQgZG9lcyBub3RcbiAqIGV4cGxpY2l0bHkgaW5jbHVkZSBhbiBlbnRyeSBmb3IgYHBhY2thZ2UuanNvbmAsIHRoaXMgc3RyYXRlZ3kgd2lsbCBmYWlsLlxuICogU2VlIHtAbGluayB0cnlSZXNvbHZlTWFuaWZlc3RQYXRoRnJvbURlZmF1bHRFeHBvcnR9IGFzIGFuIGFsdGVybmF0aXZlLlxuICpcbiAqIEBwYXJhbSBtb2R1bGVJZCBNb2R1bGUgSUQgdG8gbG9va3VwLlxuICogQHBhcmFtIG9wdGlvbnMgUGFzc2VkIHRocm91Z2ggdG8gYHJlcXVpcmUucmVzb2x2ZWAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0cnlSZXNvbHZlTW9kdWxlTWFuaWZlc3RQYXRoKFxuICBtb2R1bGVJZDogc3RyaW5nLFxuICBvcHRpb25zPzogeyBwYXRoczogc3RyaW5nW10gfSxcbik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIC8vIGNhbm5vdCBqdXN0IGByZXF1aXJlKCdkZXBlbmRlbmN5L3BhY2thZ2UuanNvbicpYCBoZXJlIGJlY2F1c2VcbiAgLy8gYG9wdGlvbnMucGF0aHNgIG1heSBub3Qgb3ZlcmxhcCB3aXRoIHRoaXMgbm9kZSBwcm9jJ3MgcmVzb2x1dGlvbiBwYXRocy5cbiAgY29uc3QgbWFuaWZlc3RJZCA9IGAke21vZHVsZUlkfS9wYWNrYWdlLmpzb25gO1xuICByZXR1cm4gdHJ5UmVzb2x2ZU1vZHVsZShtYW5pZmVzdElkLCBvcHRpb25zKTtcbn1cblxuLyoqXG4gKiBBdHRlbXB0IHRvIHJlc29sdmUgYSBtb2R1bGUncyBtYW5pZmVzdCAocGFja2FnZS5qc29uKSBwYXRoIGJ5IGxvb2tpbmcgZm9yIHRoZSBuZWFyZXN0XG4gKiBgcGFja2FnZS5qc29uYCBmaWxlIHRoYXQgaXMgYW4gYW5jZXN0b3IgdG8gdGhlIG1vZHVsZSdzIGRlZmF1bHQgZXhwb3J0IGxvY2F0aW9uLlxuICpcbiAqIEBwYXJhbSBtb2R1bGVJZCBNb2R1bGUgSUQgdG8gbG9va3VwLlxuICogQHBhcmFtIG9wdGlvbnMgUGFzc2VkIHRocm91Z2ggdG8gYHJlcXVpcmUucmVzb2x2ZWAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0cnlSZXNvbHZlTWFuaWZlc3RQYXRoRnJvbURlZmF1bHRFeHBvcnQoXG4gIG1vZHVsZUlkOiBzdHJpbmcsXG4gIG9wdGlvbnM/OiB7IHBhdGhzOiBzdHJpbmdbXSB9LFxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgZGVmYXVsdEV4cG9ydFBhdGggPSB0cnlSZXNvbHZlTW9kdWxlKG1vZHVsZUlkLCBvcHRpb25zKTtcbiAgaWYgKCFkZWZhdWx0RXhwb3J0UGF0aCkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgY29uc3QgbW9kdWxlRGlyID0gZmluZFVwKFwicGFja2FnZS5qc29uXCIsIGRlZmF1bHRFeHBvcnRQYXRoKTtcbiAgaWYgKCFtb2R1bGVEaXIpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIHJldHVybiBqb2luKG1vZHVsZURpciwgXCJwYWNrYWdlLmpzb25cIik7XG59XG5cbi8qKlxuICogQXR0ZW1wdCB0byByZXNvbHZlIGEgbW9kdWxlJ3MgbWFuaWZlc3QgKHBhY2thZ2UuanNvbikgcGF0aCBieSBjaGVja2luZyBmb3IgaXRzIGV4aXN0ZW5jZSB1bmRlciBgbm9kZV9tb2R1bGVzYCByZWxhdGl2ZSB0byBgYmFzZVBhdGhgLlxuICpcbiAqIEByZW1hcmtzXG4gKiBUaGlzIHN0cmF0ZWd5IGNhbiBiZSBoZWxwZnVsIGluIHRoZSBzY2VuYXJpbyB0aGF0IGEgbW9kdWxlIGRlZmluZXNcbiAqIGN1c3RvbSBleHBvcnRzIHdpdGhvdXQgYHBhY2thZ2UuanNvbmAgYW5kIG5vIGRlZmF1bHQgZXhwb3J0IChpLmUsIHNvbWUgdHlwZSBkZWZpbml0aW9uIHBhY2thZ2VzKS5cbiAqXG4gKiBAcGFyYW0gbW9kdWxlSWQgTW9kdWxlIElEIHRvIGxvb2t1cC5cbiAqIEBwYXJhbSBiYXNlUGF0aCBSb290IHBhdGggdG8gc2VhcmNoIGZyb20uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0cnlSZXNvbHZlTWFuaWZlc3RQYXRoRnJvbVBhdGgoXG4gIG1vZHVsZUlkOiBzdHJpbmcsXG4gIGJhc2VQYXRoOiBzdHJpbmcsXG4pIHtcbiAgY29uc3QgYmFzZSA9IGJhc2VQYXRoLmluY2x1ZGVzKFwibm9kZV9tb2R1bGVzXCIpXG4gICAgPyBiYXNlUGF0aFxuICAgIDogam9pbihiYXNlUGF0aCwgXCJub2RlX21vZHVsZXNcIik7XG4gIGNvbnN0IGZpbGVQYXRoID0gcmVzb2x2ZShiYXNlLCAuLi5tb2R1bGVJZC5zcGxpdChcIi9cIiksIFwicGFja2FnZS5qc29uXCIpO1xuICBpZiAoZXhpc3RzU3luYyhmaWxlUGF0aCkpIHtcbiAgICByZXR1cm4gZmlsZVBhdGg7XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBBdHRlbXB0IHRvIHJlc29sdmUgYSBtb2R1bGUncyBtYW5pZmVzdCAocGFja2FnZS5qc29uKSBwYXRoIGJ5IHNlYXJjaGluZyBmb3IgaXQgaW4gdGhlIG9wdGlvbmFsbHkgcHJvdmlkZWQgcGF0aHMgYXJyYXlcbiAqIGFzIHdlbGwgYXMgdGhlIGN1cnJlbnQgbm9kZSBwcm9jZXNzZXMnIGRlZmF1bHQgcmVzb2x1dGlvbiBwYXRocy5cbiAqIEBwYXJhbSBtb2R1bGVJZCBNb2R1bGUgSUQgdG8gc2VhcmNoIGZvci5cbiAqIEBwYXJhbSBvcHRpb25zIFNlYXJjaCBvcHRpb25zLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdHJ5UmVzb2x2ZU1hbmlmZXN0UGF0aEZyb21TZWFyY2goXG4gIG1vZHVsZUlkOiBzdHJpbmcsXG4gIG9wdGlvbnM/OiB7IHBhdGhzOiBzdHJpbmdbXSB9LFxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3Qgc2VhcmNoUGF0aHMgPSBbXG4gICAgLi4uKG9wdGlvbnM/LnBhdGhzID8/IFtdKSxcbiAgICAuLi4ocmVxdWlyZS5yZXNvbHZlLnBhdGhzKG1vZHVsZUlkKSA/PyBbXSksXG4gIF07XG4gIGZvciAoY29uc3QgcGF0aCBvZiBzZWFyY2hQYXRocykge1xuICAgIGNvbnN0IHJlc3VsdCA9IHRyeVJlc29sdmVNYW5pZmVzdFBhdGhGcm9tUGF0aChtb2R1bGVJZCwgcGF0aCk7XG4gICAgLy8gZWFybHkgcmV0dXJuIG9uIGZpcnN0IHJlc3VsdC5cbiAgICBpZiAocmVzdWx0KSB7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIEF0dGVtcHQgdG8gcmVzb2x2ZSBhIG1vZHVsZSdzIG1hbmlmZXN0IChwYWNrYWdlLmpzb24pIHVzaW5nIG11bHRpcGxlIHN0cmF0ZWdpZXMuXG4gKiBAcGFyYW0gbW9kdWxlSWQgTW9kdWxlIHRvIHJlc29sdmUgbWFuaWZlc3QgcGF0aCBmb3IuXG4gKiBAcGFyYW0gb3B0aW9ucyBSZXNvbHV0aW9uIG9wdGlvbnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0cnlSZXNvbHZlTW9kdWxlTWFuaWZlc3QoXG4gIG1vZHVsZUlkOiBzdHJpbmcsXG4gIG9wdGlvbnM/OiB7IHBhdGhzOiBzdHJpbmdbXSB9LFxuKTogUGFja2FnZU1hbmlmZXN0IHwgdW5kZWZpbmVkIHtcbiAgY29uc3Qgc3RyYXRlZ2llcyA9IFtcbiAgICB0cnlSZXNvbHZlTW9kdWxlTWFuaWZlc3RQYXRoLFxuICAgIHRyeVJlc29sdmVNYW5pZmVzdFBhdGhGcm9tRGVmYXVsdEV4cG9ydCxcbiAgICB0cnlSZXNvbHZlTWFuaWZlc3RQYXRoRnJvbVNlYXJjaCxcbiAgXTtcbiAgZm9yIChjb25zdCBzdHJhdGVneSBvZiBzdHJhdGVnaWVzKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gc3RyYXRlZ3kobW9kdWxlSWQsIG9wdGlvbnMpO1xuICAgIC8vIGVhcmx5IHJldHVybiBvbiBmaXJzdCByZXN1bHQuXG4gICAgaWYgKHJlc3VsdCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgbWFuaWZlc3QgPSBKU09OLnBhcnNlKFxuICAgICAgICAgIHJlYWRGaWxlU3luYyhyZXN1bHQsIFwidXRmOFwiKSxcbiAgICAgICAgKSBhcyBQYWNrYWdlTWFuaWZlc3Q7XG4gICAgICAgIC8vIHZlcmlmeSBuYW1lIG1hdGNoZXMgdGFyZ2V0IG1vZHVsZS5cbiAgICAgICAgaWYgKG1hbmlmZXN0Lm5hbWUgPT09IG1vZHVsZUlkKSB7XG4gICAgICAgICAgcmV0dXJuIG1hbmlmZXN0O1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gY29udGludWUgdG8gbmV4dCBzdHJhdGVneS5cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBBdHRlbXB0IHRvIHJlc29sdmUgdGhlIGluc3RhbGxlZCB2ZXJzaW9uIG9mIGEgZ2l2ZW4gZGVwZW5kZW5jeS5cbiAqIEBwYXJhbSBkZXBlbmRlbmN5TmFtZSBOYW1lIG9mIGRlcGVuZGVuY3kuXG4gKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25hbCBvcHRpb25zIHBhc3NlZCB0aHJvdWdoIHRvIGByZXF1aXJlLnJlc29sdmVgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdHJ5UmVzb2x2ZURlcGVuZGVuY3lWZXJzaW9uKFxuICBkZXBlbmRlbmN5TmFtZTogc3RyaW5nLFxuICBvcHRpb25zPzogeyBwYXRoczogc3RyaW5nW10gfSxcbik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IG1hbmlmZXN0ID0gdHJ5UmVzb2x2ZU1vZHVsZU1hbmlmZXN0KGRlcGVuZGVuY3lOYW1lLCBvcHRpb25zKTtcbiAgaWYgKCFtYW5pZmVzdCkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgcmV0dXJuIG1hbmlmZXN0Py52ZXJzaW9uO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgdGhlIGdpdmVuIGRlcGVuZGVuY3kgdmVyc2lvbiBpcyBpbnN0YWxsZWRcbiAqXG4gKiBUaGlzIGNhbiBiZSB1c2VkIHRvIHRlc3QgZm9yIHRoZSBwcmVzZW5jZSBvZiBjZXJ0YWluIHZlcnNpb25zIG9mIGRldkRlcGVuZGVuY2llcyxcbiAqIGFuZCBkbyBzb21ldGhpbmcgZGVwZW5kZW5jeS1zcGVjaWZpYyBpbiBjZXJ0YWluIENvbXBvbmVudHMuIEZvciBleGFtcGxlLCB0ZXN0IGZvclxuICogYSB2ZXJzaW9uIG9mIEplc3QgYW5kIGdlbmVyYXRlIGRpZmZlcmVudCBjb25maWdzIGJhc2VkIG9uIHRoZSBKZXN0IHZlcnNpb24uXG4gKlxuICogTk9URTogVGhlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZnVuY3Rpb24gY3VycmVudGx5IGlzIGN1cnJlbnRseVxuICogYXBwcm94aW1hdGU6IHRvIGRvIGl0IGNvcnJlY3RseSwgd2Ugd291bGQgbmVlZCBhIHNlcGFyYXRlIGltcGxlbWVudGF0aW9uXG4gKiBmb3IgZXZlcnkgcGFja2FnZSBtYW5hZ2VyLCB0byBxdWVyeSBpdHMgaW5zdGFsbGVkIHZlcnNpb24gKGVpdGhlciB0aGF0LCBvciB3ZVxuICogd291bGQgY29kZSB0byBxdWVyeSBgcGFja2FnZS1sb2NrLmpzb25gLCBgeWFybi5sb2NrYCwgZXRjLi4uKS5cbiAqXG4gKiBJbnN0ZWFkLCB3ZSB3aWxsIGxvb2sgYXQgYHBhY2thZ2UuanNvbmAsIGFuZCBhc3N1bWUgdGhhdCB0aGUgdmVyc2lvbnNcbiAqIHBpY2tlZCBieSB0aGUgcGFja2FnZSBtYW5hZ2VyIG1hdGNoIH50aGF0LiBUaGlzIHdpbGwgd29yayB3ZWxsIGVub3VnaCBmb3JcbiAqIG1ham9yIHZlcnNpb24gY2hlY2tzLCBidXQgbWF5IGZhaWwgZm9yIHBvaW50IHZlcnNpb25zLlxuICpcbiAqIFdoYXQgd2UgU0hPVUxEIGRvIGlzOiBgYWN0dWFsVmVyc2lvbiDiiIggY2hlY2tSYW5nZWAuXG4gKlxuICogV2hhdCB3ZSBkbyBpbnN0ZWFkIGlzIGEgc2xpZ2h0bHkgbW9yZSBzb3BoaXN0aWNhdGVkIHZlcnNpb24gb2ZcbiAqIGByZXF1ZXN0ZWRSYW5nZSDiiKkgY2hlY2tSYW5nZSAhPSDiiIVgLiBUaGlzIHdpbGwgYWx3YXlzIGdpdmUgYSBjb3JyZWN0IHJlc3VsdCBpZlxuICogYHJlcXVlc3RlZFJhbmdlIOKKhiBjaGVja1JhbmdlYCwgYnV0IG1heSBnaXZlIGZhbHNlIHBvc2l0aXZlcyB3aGVuIGBjaGVja1JhbmdlXG4gKiDiioYgcmVxdWVzdGVkUmFuZ2VgLlxuICpcbiAqIE1heSByZXR1cm4gYHVuZGVmaW5lZGAgaWYgdGhlIHF1ZXN0aW9uIGNhbm5vdCBiZSBhbnN3ZXJlZC4gVGhlc2UgaW5jbHVkZSB0aGVcbiAqIGZvbGxvd2luZyBjYXNlczpcbiAqXG4gKiAgIC0gVGhlIGRlcGVuZGVuY3kgaXMgcmVxdWVzdGVkIHZpYSBsb2NhbCBmaWxlIGRlcGVuZGVuY2llcyAoYGZpbGU6Ly8uLi5gKVxuICogICAtIFRoZSBkZXBlbmRlbmN5IHVzZXMgYW4gb3RoZXIgdHlwZSBvZiBVUkwsIHN1Y2ggYXMgYSBHaXRIdWIgVVJMXG4gKiAgIC0gVGhlIGRlcGVuZGVuY3kgaXMgbm90IGZvdW5kIGluIHRoZSBgcGFja2FnZS5qc29uYCwgc3VjaCBhcyB3aGVuXG4gKiAgICAgYm9vdHN0cmFwcGluZyBmcm9tIGFuIGV4dGVybmFsIHByb2plbiBwYWNrYWdlLCBhbmQgdGhlIGBwYWNrYWdlLmpzb25gXG4gKiAgICAgZmlsZSBvbmx5IGhhcyB0aGF0IG9uZSBleHRlcm5hbCBwYWNrYWdlIGFzIGEgZGVwZW5kZW5jeVxuICpcbiAqIE90aGVyd2lzZSBpdCB3aWxsIHJldHVybiBgdHJ1ZWAgaWYgdGhlIGluc3RhbGxlZCB2ZXJzaW9uIGlzIHByb2JhYmx5IGluIHRoZVxuICogcmVxdWVzdGVkIHJhbmdlLCBhbmQgYGZhbHNlYCBpZiBpdCBpcyBwcm9iYWJseSBub3QuXG4gKlxuICogVGhpcyBBUEkgbWF5IGV2ZW50dWFsbHkgYmUgYWRkZWQgdG8gdGhlIHB1YmxpYyBwcm9qZW4gQVBJLCBidXQgb25seSBhZnRlclxuICogd2UgaW1wbGVtZW50IGV4YWN0IHZlcnNpb24gY2hlY2tpbmcuXG4gKlxuICogQHBhcmFtIGRlcGVuZGVuY3lOYW1lIFRoZSBuYW1lIG9mIHRoZSBkZXBlbmRlbmN5XG4gKiBAcGFyYW0gY2hlY2tSYW5nZSBBIHBhcnRpY3VsYXIgdmVyc2lvbiwgb3IgcmFuZ2Ugb2YgdmVyc2lvbnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYXNEZXBlbmRlbmN5VmVyc2lvbihcbiAgcHJvamVjdDogUHJvamVjdCxcbiAgZGVwZW5kZW5jeU5hbWU6IHN0cmluZyxcbiAgY2hlY2tSYW5nZTogc3RyaW5nLFxuKTogYm9vbGVhbiB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGZpbGUgPSBOb2RlUGFja2FnZS5vZihwcm9qZWN0KT8uZmlsZTtcbiAgaWYgKCFmaWxlKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGlmICghZXhpc3RzU3luYyhmaWxlLmFic29sdXRlUGF0aCkpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgY29uc3QgcGogPSBKU09OLnBhcnNlKHJlYWRGaWxlU3luYyhmaWxlLmFic29sdXRlUGF0aCwgXCJ1dGYtOFwiKSk7XG5cbiAgLy8gVGVjaG5pY2FseSwgd2Ugc2hvdWxkIGJlIGludGVyc2VjdGluZyBhbGwgcmFuZ2VzIHRvIGNvbWUgdXAgd2l0aCB0aGUgbW9zdCBuYXJyb3cgZGVwZW5kZW5jeVxuICAvLyByYW5nZSwgYnV0IGBzZW12ZXJgIGRvZXNuJ3QgYWxsb3cgZG9pbmcgdGhhdCBhbmQgd2UgZG9uJ3Qgd2FudCB0byBhZGQgYSBkZXBlbmRlbmN5IG9uIGBzZW12ZXItaW50ZXJzZWN0YC5cbiAgLy9cbiAgLy8gTGV0J3MgdGFrZSB0aGUgZmlyc3QgZGVwZW5kZW5jeSBkZWNsYXJhdGlvbiB3ZSBmaW5kLCBhbmQgYXNzdW1lIHRoYXQgcGVvcGxlXG4gIC8vIHNldCB1cCB0aGVpciBgcGFja2FnZS5qc29uYCBjb3JyZWN0bHkuXG4gIGxldCByZXF1ZXN0ZWRSYW5nZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBmb3IgKGNvbnN0IGtleSBvZiBbXCJkZXBlbmRlbmNpZXNcIiwgXCJkZXZEZXBlbmRlbmNpZXNcIiwgXCJwZWVyRGVwZW5kZW5jaWVzXCJdKSB7XG4gICAgY29uc3QgZGVwcyA9IHBqW2tleV0gPz8ge307XG4gICAgbGV0IHJlcXVlc3RlZFZlcnNpb24gPSBkZXBzW2RlcGVuZGVuY3lOYW1lXTtcbiAgICBpZiAocmVxdWVzdGVkVmVyc2lvbikge1xuICAgICAgLy8gSWYgdGhpcyBpcyBub3QgYSB2YWxpZCByYW5nZSwgaXQgY291bGQgYmUgJ2ZpbGU6ZGVwLnRneicsIG9yIGEgR2l0SHViIFVSTC4gTm8gd2F5IHRvIGtub3cgd2hhdFxuICAgICAgLy8gdmVyc2lvbiB3ZSdyZSBnZXR0aW5nLCBiYWlsIG91dC5cbiAgICAgIGlmICghc2VtdmVyLnZhbGlkUmFuZ2UocmVxdWVzdGVkVmVyc2lvbikpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIHJlcXVlc3RlZFJhbmdlID0gcmVxdWVzdGVkVmVyc2lvbjtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIC8vIElmIHRoZSBkZXBlbmRlbmN5IGlzIG5vdCBmb3VuZCBpbiB0aGUgYHBhY2thZ2UuanNvbmAsIHdlIGNhbid0IGFuc3dlciB0aGUgcXVlc3Rpb24gKHlldCkuXG4gIC8vIFRoaXMgbWVhbnMgdGhhdCB0aGUgZGVwZW5kZW5jeSBoYXNuJ3QgYmVlbiBhZGRlZCB5ZXQsIHdoaWNoIG1lYW5zIHdlIGtub3cgKHVwc3RyZWFtKSB3aGF0IHdlJ3JlIGdvaW5nIHRvIHJlcXVlc3QsXG4gIC8vIG9yIHdlJ3JlIGdvaW5nIHRvIGFzayBmb3IgJyonIGFuZCB3ZSdsbCBnZXQgdGhlIGxhdGVzdCB2ZXJzaW9uLlxuICBpZiAoIXJlcXVlc3RlZFJhbmdlKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHJldHVybiBpbnN0YWxsZWRWZXJzaW9uUHJvYmFibHlNYXRjaGVzKHJlcXVlc3RlZFJhbmdlLCBjaGVja1JhbmdlKTtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIHRoZSBnaXZlbiByZXF1ZXN0ZWRSYW5nZSAqcHJvYmFibHkqIGxlYWRzIHRvIHRoZSBpbnN0YWxsYXRpb24gb2YgYSB2ZXJzaW9uIHRoYXQgbWF0Y2hlcyBjaGVja1JhbmdlXG4gKlxuICogV2UgYXNzdW1lIHRoYXQgTlBNIGFsd2F5cyBpbnN0YWxscyB0aGUgbW9zdCByZWNlbnQgdmVyc2lvbiBvZiBhIHBhY2thZ2UgdGhhdFxuICogaXMgYWxsb3dlZCBieSB0aGUgcmVxdWVzdGVkUmFuZ2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbnN0YWxsZWRWZXJzaW9uUHJvYmFibHlNYXRjaGVzKFxuICByZXF1ZXN0ZWRSYW5nZTogc3RyaW5nLFxuICBjaGVja1JhbmdlOiBzdHJpbmcsXG4pOiBib29sZWFuIHtcbiAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICBpbmNsdWRlUHJlcmVsZWFzZTogdHJ1ZSxcbiAgICBsb29zZTogdHJ1ZSxcbiAgfTtcblxuICAvLyBObyBxdWVzdGlvbnMgYXNrZWQ6IGFsd2F5cyB0cnVlXG4gIGlmIChzZW12ZXIuc3Vic2V0KHJlcXVlc3RlZFJhbmdlLCBjaGVja1JhbmdlLCBvcHRpb25zKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLy8gQWxzbyBubyBxdWVzdGlvbnMgYXNrZWQ6IGFsd2F5cyBmYWxzZVxuICBpZiAoIXNlbXZlci5pbnRlcnNlY3RzKHJlcXVlc3RlZFJhbmdlLCBjaGVja1JhbmdlLCBvcHRpb25zKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIE5vdyB3ZSdyZSBpbiB0cmlja3kgdGVycml0b3J5LiBXZSBpbnRlcnNlY3QsIGJ1dCBhcmVuJ3QgYSBmdWxsIHN1YnNldC5cbiAgLy8gV2UgYXJlIGluIG9uZSBvZiB0aGUgZm9sbG93aW5nIDIgc2l0dWF0aW9ucywgd2hpY2ggd2Ugd2lsbCB0aWUtYnJlYWsgYnlcbiAgLy8gYXNzdW1pbmcgTlBNIHdpbGwgaW5zdGFsbCB0aGUgbW9zdCByZWNlbnQgbWF0Y2hpbmcgdmVyc2lvbiBpbiAncmVxdWVzdGVkJy5cbiAgLy9cbiAgLy8gcmVxdWVzdGVkICB8IGNoZWNrICAgIHwgcmVzdWx0XG4gIC8vIC0tLS0tLS0tLS0tfC0tLS0tLS0tLS18LS0tLS0tLS0tLS1cbiAgLy8gICA+PSAyICAgICB8ICA+PSAzICAgIHwgcHJvYmFibHkgdHJ1ZSAoY2hhbmNlIG9mIEZQKVxuICAvLyAgIDw9IDIgICAgIHwgIDw9IDEgICAgfCBwcm9iYWJseSBmYWxzZSAoY2hhbmdlIG9mIEZOKVxuICAvL1xuICAvLyBgc2VtdmVyYCBkb2Vzbid0IG1ha2UgaXQgZWFzeSB0byBkaXN0aW5ndWlzaCB0aGVzZSBjYXNlcyAod2UgY2FuJ3QgcmVxdWVzdFxuICAvLyB0aGUgYG1heFZlcnNpb25gIHRoYXQgc2F0aXNmaWVzIGEgcmFuZ2UpLiBJbnN0ZWFkIHdoYXQgd2UgZG8gaXNcbiAgLy8gZ2V0IHRoZSBgbWluVmVyc2lvbmAgb2YgZWFjaCByYW5nZSwgYW5kIGlmIHRoZXkgY29tcGFyZSBlcXVhbCB3ZSBhc3N1bWVcbiAgLy8gd2UncmUgaW4gdGhlIGJvdHRvbSBjYXNlIHdpdGggYDw9YCBjaGVja3MsIGFuZCByZXR1cm4gYGZhbHNlYC5cblxuICByZXR1cm4gIXNlbXZlci5lcShcbiAgICBzZW12ZXIubWluVmVyc2lvbihyZXF1ZXN0ZWRSYW5nZSwgb3B0aW9ucykgPz8gXCIxLjIuM1wiLFxuICAgIHNlbXZlci5taW5WZXJzaW9uKGNoZWNrUmFuZ2UsIG9wdGlvbnMpID8/IFwiMS4yLjNcIixcbiAgKTtcbn1cbiJdfQ==