projen 0.48.1 → 0.50.0

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 (297) hide show
  1. package/.jsii +6312 -1471
  2. package/.prettierignore +1 -0
  3. package/.prettierrc.json +3 -0
  4. package/API.md +1112 -55
  5. package/changelog.md +6 -2
  6. package/docs/gitlab.md +67 -0
  7. package/lib/_resolve.d.ts +1 -1
  8. package/lib/_resolve.js +5 -7
  9. package/lib/awscdk/auto-discover.d.ts +4 -4
  10. package/lib/awscdk/auto-discover.js +2 -2
  11. package/lib/awscdk/{java-app.d.ts → awscdk-app-java.d.ts} +13 -30
  12. package/lib/awscdk/awscdk-app-java.js +91 -0
  13. package/lib/awscdk/awscdk-app-ts.d.ts +5 -5
  14. package/lib/awscdk/awscdk-app-ts.js +35 -34
  15. package/lib/awscdk/awscdk-construct.d.ts +3 -3
  16. package/lib/awscdk/awscdk-construct.js +12 -10
  17. package/lib/awscdk/awscdk-deps-java.d.ts +14 -0
  18. package/lib/awscdk/awscdk-deps-java.js +30 -0
  19. package/lib/awscdk/awscdk-deps-js.d.ts +14 -0
  20. package/lib/awscdk/awscdk-deps-js.js +31 -0
  21. package/lib/awscdk/awscdk-deps.d.ts +59 -11
  22. package/lib/awscdk/awscdk-deps.js +27 -23
  23. package/lib/awscdk/cdk-config.d.ts +3 -3
  24. package/lib/awscdk/cdk-config.js +5 -5
  25. package/lib/awscdk/cdk-tasks.d.ts +3 -3
  26. package/lib/awscdk/cdk-tasks.js +21 -20
  27. package/lib/awscdk/index.d.ts +11 -9
  28. package/lib/awscdk/index.js +4 -2
  29. package/lib/awscdk/integration-test.d.ts +4 -4
  30. package/lib/awscdk/integration-test.js +15 -13
  31. package/lib/awscdk/internal.js +16 -16
  32. package/lib/awscdk/lambda-function.d.ts +4 -4
  33. package/lib/awscdk/lambda-function.js +29 -29
  34. package/lib/build/build-workflow.d.ts +5 -5
  35. package/lib/build/build-workflow.js +36 -30
  36. package/lib/build/index.d.ts +1 -1
  37. package/lib/build/index.js +1 -1
  38. package/lib/builtin-example.task.js +3 -3
  39. package/lib/cdk/construct-lib.d.ts +1 -1
  40. package/lib/cdk/construct-lib.js +4 -4
  41. package/lib/cdk/consts.d.ts +2 -2
  42. package/lib/cdk/consts.js +5 -5
  43. package/lib/cdk/index.d.ts +3 -3
  44. package/lib/cdk/index.js +1 -1
  45. package/lib/cdk/jsii-docgen.d.ts +1 -1
  46. package/lib/cdk/jsii-docgen.js +7 -7
  47. package/lib/cdk/jsii-project.d.ts +3 -3
  48. package/lib/cdk/jsii-project.js +39 -39
  49. package/lib/cdk8s/cdk8s-app-ts.d.ts +1 -1
  50. package/lib/cdk8s/cdk8s-app-ts.js +28 -21
  51. package/lib/cdk8s/cdk8s-construct.d.ts +1 -1
  52. package/lib/cdk8s/cdk8s-construct.js +10 -6
  53. package/lib/cdk8s/index.d.ts +2 -2
  54. package/lib/cdk8s/index.js +1 -1
  55. package/lib/cdktf/cdktf-construct.d.ts +1 -1
  56. package/lib/cdktf/cdktf-construct.js +4 -4
  57. package/lib/cdktf/index.d.ts +1 -1
  58. package/lib/cdktf/index.js +1 -1
  59. package/lib/cleanup.js +20 -14
  60. package/lib/cli/cmds/new.js +71 -42
  61. package/lib/cli/index.js +27 -10
  62. package/lib/cli/macros.js +15 -11
  63. package/lib/cli/synth.d.ts +1 -1
  64. package/lib/cli/synth.js +15 -12
  65. package/lib/cli/tasks.d.ts +2 -2
  66. package/lib/cli/tasks.js +9 -6
  67. package/lib/cli/util.js +4 -4
  68. package/lib/clobber.d.ts +2 -2
  69. package/lib/clobber.js +14 -10
  70. package/lib/common.js +7 -9
  71. package/lib/component.d.ts +1 -1
  72. package/lib/component.js +2 -2
  73. package/lib/dependencies.d.ts +2 -2
  74. package/lib/dependencies.js +14 -12
  75. package/lib/dev-env.d.ts +1 -1
  76. package/lib/dev-env.js +2 -2
  77. package/lib/docker-compose.d.ts +2 -2
  78. package/lib/docker-compose.js +23 -19
  79. package/lib/file.d.ts +2 -2
  80. package/lib/file.js +7 -5
  81. package/lib/gitattributes.d.ts +2 -2
  82. package/lib/gitattributes.js +7 -8
  83. package/lib/github/auto-approve.d.ts +2 -2
  84. package/lib/github/auto-approve.js +25 -15
  85. package/lib/github/auto-merge.d.ts +2 -2
  86. package/lib/github/auto-merge.js +14 -14
  87. package/lib/github/constants.d.ts +1 -1
  88. package/lib/github/constants.js +4 -4
  89. package/lib/github/dependabot.d.ts +2 -2
  90. package/lib/github/dependabot.js +16 -14
  91. package/lib/github/github-project.d.ts +5 -5
  92. package/lib/github/github-project.js +14 -10
  93. package/lib/github/github.d.ts +7 -7
  94. package/lib/github/github.js +7 -5
  95. package/lib/github/index.d.ts +13 -13
  96. package/lib/github/index.js +1 -1
  97. package/lib/github/mergify.d.ts +2 -2
  98. package/lib/github/mergify.js +3 -3
  99. package/lib/github/pr-template.d.ts +2 -2
  100. package/lib/github/pr-template.js +5 -5
  101. package/lib/github/pull-request-lint.d.ts +2 -2
  102. package/lib/github/pull-request-lint.js +17 -14
  103. package/lib/github/stale-util.d.ts +1 -1
  104. package/lib/github/stale-util.js +2 -3
  105. package/lib/github/stale.d.ts +2 -2
  106. package/lib/github/stale.js +28 -20
  107. package/lib/github/task-workflow.d.ts +4 -4
  108. package/lib/github/task-workflow.js +12 -10
  109. package/lib/github/workflow-actions.d.ts +2 -2
  110. package/lib/github/workflow-actions.js +22 -20
  111. package/lib/github/workflows-model.d.ts +20 -20
  112. package/lib/github/workflows-model.js +1 -1
  113. package/lib/github/workflows.d.ts +4 -4
  114. package/lib/github/workflows.js +42 -27
  115. package/lib/gitlab/configuration-model.d.ts +1308 -0
  116. package/lib/gitlab/configuration-model.js +122 -0
  117. package/lib/gitlab/configuration.d.ts +260 -0
  118. package/lib/gitlab/configuration.js +296 -0
  119. package/lib/gitlab/gitlab-configuration.d.ts +30 -0
  120. package/lib/gitlab/gitlab-configuration.js +49 -0
  121. package/lib/gitlab/index.d.ts +4 -0
  122. package/lib/gitlab/index.js +17 -0
  123. package/lib/gitlab/nested-configuration.d.ts +26 -0
  124. package/lib/gitlab/nested-configuration.js +38 -0
  125. package/lib/gitpod.d.ts +4 -4
  126. package/lib/gitpod.js +12 -9
  127. package/lib/ignore-file.d.ts +2 -2
  128. package/lib/ignore-file.js +10 -13
  129. package/lib/index.d.ts +47 -46
  130. package/lib/index.js +2 -1
  131. package/lib/ini.d.ts +3 -3
  132. package/lib/ini.js +4 -4
  133. package/lib/inventory.d.ts +1 -1
  134. package/lib/inventory.js +34 -30
  135. package/lib/java/index.d.ts +7 -7
  136. package/lib/java/index.js +1 -1
  137. package/lib/java/java-project.d.ts +7 -6
  138. package/lib/java/java-project.js +11 -13
  139. package/lib/java/junit.d.ts +3 -3
  140. package/lib/java/junit.js +17 -17
  141. package/lib/java/maven-compile.d.ts +3 -3
  142. package/lib/java/maven-compile.js +7 -7
  143. package/lib/java/maven-packaging.d.ts +3 -3
  144. package/lib/java/maven-packaging.js +12 -16
  145. package/lib/java/maven-sample.d.ts +2 -2
  146. package/lib/java/maven-sample.js +12 -12
  147. package/lib/java/pom.d.ts +2 -2
  148. package/lib/java/pom.js +16 -14
  149. package/lib/java/projenrc.d.ts +3 -3
  150. package/lib/java/projenrc.js +35 -25
  151. package/lib/javascript/bundler.d.ts +3 -3
  152. package/lib/javascript/bundler.js +14 -12
  153. package/lib/javascript/eslint.d.ts +4 -3
  154. package/lib/javascript/eslint.js +102 -86
  155. package/lib/javascript/index.d.ts +10 -10
  156. package/lib/javascript/index.js +1 -1
  157. package/lib/javascript/jest.d.ts +3 -11
  158. package/lib/javascript/jest.js +43 -55
  159. package/lib/javascript/node-package.d.ts +2 -2
  160. package/lib/javascript/node-package.js +87 -77
  161. package/lib/javascript/node-project.d.ts +11 -11
  162. package/lib/javascript/node-project.js +78 -52
  163. package/lib/javascript/npm-config.d.ts +2 -2
  164. package/lib/javascript/npm-config.js +4 -4
  165. package/lib/javascript/prettier.d.ts +4 -4
  166. package/lib/javascript/prettier.js +5 -5
  167. package/lib/javascript/projenrc.d.ts +2 -2
  168. package/lib/javascript/projenrc.js +8 -8
  169. package/lib/javascript/render-options.d.ts +2 -2
  170. package/lib/javascript/render-options.js +23 -18
  171. package/lib/javascript/typescript-config.d.ts +2 -2
  172. package/lib/javascript/typescript-config.js +5 -5
  173. package/lib/javascript/upgrade-dependencies.d.ts +4 -4
  174. package/lib/javascript/upgrade-dependencies.js +67 -53
  175. package/lib/javascript/util.js +2 -2
  176. package/lib/json.d.ts +3 -3
  177. package/lib/json.js +4 -4
  178. package/lib/license.d.ts +2 -2
  179. package/lib/license.js +7 -7
  180. package/lib/logger.d.ts +2 -2
  181. package/lib/logger.js +14 -9
  182. package/lib/logging.js +2 -2
  183. package/lib/makefile.d.ts +2 -2
  184. package/lib/makefile.js +12 -15
  185. package/lib/object-file.d.ts +2 -2
  186. package/lib/object-file.js +9 -7
  187. package/lib/option-hints.js +1 -1
  188. package/lib/project-build.d.ts +3 -3
  189. package/lib/project-build.js +14 -14
  190. package/lib/project.d.ts +14 -14
  191. package/lib/project.js +41 -23
  192. package/lib/projects.d.ts +1 -1
  193. package/lib/projects.js +10 -11
  194. package/lib/projenrc-json.d.ts +2 -2
  195. package/lib/projenrc-json.js +5 -5
  196. package/lib/python/index.d.ts +13 -13
  197. package/lib/python/index.js +1 -1
  198. package/lib/python/pip.d.ts +4 -4
  199. package/lib/python/pip.js +16 -12
  200. package/lib/python/poetry.d.ts +7 -7
  201. package/lib/python/poetry.js +41 -33
  202. package/lib/python/projenrc.d.ts +2 -2
  203. package/lib/python/projenrc.js +24 -21
  204. package/lib/python/pytest.d.ts +2 -2
  205. package/lib/python/pytest.js +19 -19
  206. package/lib/python/python-deps.d.ts +2 -2
  207. package/lib/python/python-deps.js +1 -1
  208. package/lib/python/python-packaging.d.ts +2 -2
  209. package/lib/python/python-packaging.js +1 -1
  210. package/lib/python/python-project.d.ts +7 -7
  211. package/lib/python/python-project.js +14 -13
  212. package/lib/python/python-sample.d.ts +2 -2
  213. package/lib/python/python-sample.js +17 -17
  214. package/lib/python/requirements-file.d.ts +3 -3
  215. package/lib/python/requirements-file.js +7 -8
  216. package/lib/python/setuppy.d.ts +2 -2
  217. package/lib/python/setuppy.js +23 -23
  218. package/lib/python/setuptools.d.ts +4 -4
  219. package/lib/python/setuptools.js +11 -11
  220. package/lib/python/venv.d.ts +3 -3
  221. package/lib/python/venv.js +6 -6
  222. package/lib/readme.d.ts +2 -2
  223. package/lib/readme.js +5 -3
  224. package/lib/release/bump-version.d.ts +1 -1
  225. package/lib/release/bump-version.js +37 -26
  226. package/lib/release/bump-version.task.js +7 -7
  227. package/lib/release/index.d.ts +3 -3
  228. package/lib/release/index.js +1 -1
  229. package/lib/release/publisher.d.ts +4 -4
  230. package/lib/release/publisher.js +93 -78
  231. package/lib/release/release-trigger.js +3 -3
  232. package/lib/release/release.d.ts +6 -6
  233. package/lib/release/release.js +37 -23
  234. package/lib/release/reset-version.task.js +4 -4
  235. package/lib/release/tag-version.js +1 -1
  236. package/lib/release/tag-version.task.js +3 -3
  237. package/lib/release/update-changelog.js +6 -4
  238. package/lib/release/update-changelog.task.js +4 -4
  239. package/lib/run-projenrc-json.task.js +5 -5
  240. package/lib/sample-file.d.ts +2 -2
  241. package/lib/sample-file.js +8 -8
  242. package/lib/semver.js +17 -7
  243. package/lib/source-code.d.ts +2 -2
  244. package/lib/source-code.js +5 -5
  245. package/lib/task-model.js +1 -1
  246. package/lib/task-runtime.d.ts +1 -1
  247. package/lib/task-runtime.js +27 -27
  248. package/lib/task.d.ts +1 -1
  249. package/lib/task.js +2 -2
  250. package/lib/tasks.d.ts +3 -3
  251. package/lib/tasks.js +5 -5
  252. package/lib/testing.d.ts +1 -1
  253. package/lib/testing.js +2 -2
  254. package/lib/textfile.d.ts +2 -2
  255. package/lib/textfile.js +3 -3
  256. package/lib/toml.d.ts +3 -3
  257. package/lib/toml.js +4 -4
  258. package/lib/typescript/index.d.ts +3 -3
  259. package/lib/typescript/index.js +1 -1
  260. package/lib/typescript/projenrc.d.ts +2 -2
  261. package/lib/typescript/projenrc.js +10 -10
  262. package/lib/typescript/typescript-typedoc.d.ts +1 -1
  263. package/lib/typescript/typescript-typedoc.js +4 -4
  264. package/lib/typescript/typescript.d.ts +9 -3
  265. package/lib/typescript/typescript.js +107 -94
  266. package/lib/util/semver.js +33 -33
  267. package/lib/util/synth.d.ts +1 -1
  268. package/lib/util/synth.js +15 -12
  269. package/lib/util.js +39 -32
  270. package/lib/version.d.ts +3 -3
  271. package/lib/version.js +12 -12
  272. package/lib/vscode/devcontainer.d.ts +4 -4
  273. package/lib/vscode/devcontainer.js +13 -8
  274. package/lib/vscode/index.d.ts +3 -3
  275. package/lib/vscode/index.js +1 -1
  276. package/lib/vscode/launch-config.d.ts +2 -2
  277. package/lib/vscode/launch-config.js +4 -4
  278. package/lib/vscode/vscode.d.ts +3 -3
  279. package/lib/vscode/vscode.js +2 -2
  280. package/lib/web/index.d.ts +4 -4
  281. package/lib/web/index.js +1 -1
  282. package/lib/web/next.d.ts +3 -3
  283. package/lib/web/next.js +241 -237
  284. package/lib/web/postcss.d.ts +3 -3
  285. package/lib/web/postcss.js +9 -6
  286. package/lib/web/react.d.ts +4 -4
  287. package/lib/web/react.js +172 -177
  288. package/lib/web/tailwind.d.ts +2 -2
  289. package/lib/web/tailwind.js +3 -3
  290. package/lib/xmlfile.d.ts +3 -3
  291. package/lib/xmlfile.js +5 -5
  292. package/lib/yaml.d.ts +3 -3
  293. package/lib/yaml.js +4 -4
  294. package/package.json +6 -3
  295. package/releasetag.txt +1 -1
  296. package/version.txt +1 -1
  297. package/lib/awscdk/java-app.js +0 -90
@@ -22,7 +22,7 @@ class TypeScriptProject extends javascript_1.NodeProject {
22
22
  * @experimental
23
23
  */
24
24
  constructor(options) {
25
- var _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _0, _1, _2;
25
+ var _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _0, _1;
26
26
  super({
27
27
  ...options,
28
28
  // disable .projenrc.js if typescript is enabled
@@ -35,24 +35,26 @@ class TypeScriptProject extends javascript_1.NodeProject {
35
35
  },
36
36
  },
37
37
  });
38
- this.srcdir = (_e = options.srcdir) !== null && _e !== void 0 ? _e : 'src';
39
- this.libdir = (_f = options.libdir) !== null && _f !== void 0 ? _f : 'lib';
38
+ this.srcdir = (_e = options.srcdir) !== null && _e !== void 0 ? _e : "src";
39
+ this.libdir = (_f = options.libdir) !== null && _f !== void 0 ? _f : "lib";
40
40
  this.docgen = options.docgen;
41
- this.docsDirectory = (_g = options.docsDirectory) !== null && _g !== void 0 ? _g : 'docs/';
42
- this.compileTask.exec('tsc --build');
43
- this.watchTask = this.addTask('watch', {
44
- description: 'Watch & compile in the background',
45
- exec: 'tsc --build -w',
41
+ this.docsDirectory = (_g = options.docsDirectory) !== null && _g !== void 0 ? _g : "docs/";
42
+ this.compileTask.exec("tsc --build");
43
+ this.watchTask = this.addTask("watch", {
44
+ description: "Watch & compile in the background",
45
+ exec: "tsc --build -w",
46
46
  });
47
- this.testdir = (_h = options.testdir) !== null && _h !== void 0 ? _h : 'test';
47
+ this.testdir = (_h = options.testdir) !== null && _h !== void 0 ? _h : "test";
48
48
  this.gitignore.include(`/${this.testdir}/`);
49
49
  (_j = this.npmignore) === null || _j === void 0 ? void 0 : _j.exclude(`/${this.testdir}/`);
50
50
  // if the test directory is under `src/`, then we will run our tests against
51
51
  // the javascript files and not let jest compile it for us.
52
52
  const compiledTests = this.testdir.startsWith(this.srcdir + path.posix.sep);
53
- if (options.entrypointTypes || this.entrypoint !== '') {
54
- const entrypointTypes = (_k = options.entrypointTypes) !== null && _k !== void 0 ? _k : `${path.join(path.dirname(this.entrypoint), path.basename(this.entrypoint, '.js')).replace(/\\/g, '/')}.d.ts`;
55
- this.package.addField('types', entrypointTypes);
53
+ if (options.entrypointTypes || this.entrypoint !== "") {
54
+ const entrypointTypes = (_k = options.entrypointTypes) !== null && _k !== void 0 ? _k : `${path
55
+ .join(path.dirname(this.entrypoint), path.basename(this.entrypoint, ".js"))
56
+ .replace(/\\/g, "/")}.d.ts`;
57
+ this.package.addField("types", entrypointTypes);
56
58
  }
57
59
  const compilerOptionDefaults = {
58
60
  alwaysStrict: true,
@@ -61,8 +63,8 @@ class TypeScriptProject extends javascript_1.NodeProject {
61
63
  experimentalDecorators: true,
62
64
  inlineSourceMap: true,
63
65
  inlineSources: true,
64
- lib: ['es2019'],
65
- module: 'CommonJS',
66
+ lib: ["es2019"],
67
+ module: "CommonJS",
66
68
  noEmitOnError: false,
67
69
  noFallthroughCasesInSwitch: true,
68
70
  noImplicitAny: true,
@@ -75,7 +77,7 @@ class TypeScriptProject extends javascript_1.NodeProject {
75
77
  strictNullChecks: true,
76
78
  strictPropertyInitialization: true,
77
79
  stripInternal: true,
78
- target: 'ES2019',
80
+ target: "ES2019",
79
81
  };
80
82
  if (!options.disableTsconfig) {
81
83
  this.tsconfig = new javascript_1.TypescriptConfig(this, mergeTsconfigOptions({
@@ -88,7 +90,7 @@ class TypeScriptProject extends javascript_1.NodeProject {
88
90
  },
89
91
  }, options.tsconfig));
90
92
  }
91
- const tsconfigDevFile = (_l = options.tsconfigDevFile) !== null && _l !== void 0 ? _l : 'tsconfig.dev.json';
93
+ const tsconfigDevFile = (_l = options.tsconfigDevFile) !== null && _l !== void 0 ? _l : "tsconfig.dev.json";
92
94
  this.tsconfigDev = new javascript_1.TypescriptConfig(this, mergeTsconfigOptions({
93
95
  fileName: tsconfigDevFile,
94
96
  include: [
@@ -96,7 +98,7 @@ class TypeScriptProject extends javascript_1.NodeProject {
96
98
  `${this.srcdir}/**/*.ts`,
97
99
  `${this.testdir}/**/*.ts`,
98
100
  ],
99
- exclude: ['node_modules'],
101
+ exclude: ["node_modules"],
100
102
  compilerOptions: compilerOptionDefaults,
101
103
  }, options.tsconfig, options.tsconfigDev));
102
104
  this.gitignore.include(`/${this.srcdir}/`);
@@ -113,63 +115,35 @@ class TypeScriptProject extends javascript_1.NodeProject {
113
115
  (_o = this.npmignore) === null || _o === void 0 ? void 0 : _o.include(`/${this.libdir}/`);
114
116
  (_p = this.npmignore) === null || _p === void 0 ? void 0 : _p.include(`/${this.libdir}/**/*.js`);
115
117
  (_q = this.npmignore) === null || _q === void 0 ? void 0 : _q.include(`/${this.libdir}/**/*.d.ts`);
116
- this.gitignore.exclude('/dist/');
117
- (_r = this.npmignore) === null || _r === void 0 ? void 0 : _r.exclude('dist'); // jsii-pacmak expects this to be "dist" and not "/dist". otherwise it will tamper with it
118
- (_s = this.npmignore) === null || _s === void 0 ? void 0 : _s.exclude('/tsconfig.json');
119
- (_t = this.npmignore) === null || _t === void 0 ? void 0 : _t.exclude('/.github/');
120
- (_u = this.npmignore) === null || _u === void 0 ? void 0 : _u.exclude('/.vscode/');
121
- (_v = this.npmignore) === null || _v === void 0 ? void 0 : _v.exclude('/.idea/');
122
- (_w = this.npmignore) === null || _w === void 0 ? void 0 : _w.exclude('/.projenrc.js');
123
- (_x = this.npmignore) === null || _x === void 0 ? void 0 : _x.exclude('tsconfig.tsbuildinfo');
124
- // tests are compiled to `lib/TESTDIR`, so we don't need jest to compile them for us.
125
- // just run them directly from javascript.
126
- if (this.jest && compiledTests) {
127
- this.addDevDeps('@types/jest');
128
- const testout = path.posix.relative(this.srcdir, this.testdir);
129
- const libtest = path.posix.join(this.libdir, testout);
130
- const srctest = this.testdir;
131
- (_y = this.npmignore) === null || _y === void 0 ? void 0 : _y.exclude(`/${libtest}/`);
132
- this.jest.addTestMatch(`**/${libtest}/**/?(*.)+(spec|test).js?(x)`);
133
- this.jest.addWatchIgnorePattern(`/${this.srcdir}/`);
134
- const resolveSnapshotPath = (test, ext) => {
135
- const fullpath = test.replace(libtest, srctest);
136
- return path.join(path.dirname(fullpath), '__snapshots__', path.basename(fullpath, '.js') + '.ts' + ext);
137
- };
138
- const resolveTestPath = (snap, ext) => {
139
- const filename = path.basename(snap, '.ts' + ext) + '.js';
140
- const dir = path.dirname(path.dirname(snap)).replace(srctest, libtest);
141
- return path.join(dir, filename);
142
- };
143
- const resolver = new textfile_1.TextFile(this, path.posix.join(common_1.PROJEN_DIR, 'jest-snapshot-resolver.js'));
144
- resolver.addLine(`// ${textfile_1.TextFile.PROJEN_MARKER}`);
145
- resolver.addLine('const path = require("path");');
146
- resolver.addLine(`const libtest = "${libtest}";`);
147
- resolver.addLine(`const srctest= "${srctest}";`);
148
- resolver.addLine('module.exports = {');
149
- resolver.addLine(` resolveSnapshotPath: ${resolveSnapshotPath.toString()},`);
150
- resolver.addLine(` resolveTestPath: ${resolveTestPath.toString()},`);
151
- resolver.addLine(' testPathForConsistencyCheck: path.join(\'some\', \'__tests__\', \'example.test.js\')');
152
- resolver.addLine('};');
153
- this.jest.addSnapshotResolver(`./${resolver.path}`);
118
+ this.gitignore.exclude("/dist/");
119
+ (_r = this.npmignore) === null || _r === void 0 ? void 0 : _r.exclude("dist"); // jsii-pacmak expects this to be "dist" and not "/dist". otherwise it will tamper with it
120
+ (_s = this.npmignore) === null || _s === void 0 ? void 0 : _s.exclude("/tsconfig.json");
121
+ (_t = this.npmignore) === null || _t === void 0 ? void 0 : _t.exclude("/.github/");
122
+ (_u = this.npmignore) === null || _u === void 0 ? void 0 : _u.exclude("/.vscode/");
123
+ (_v = this.npmignore) === null || _v === void 0 ? void 0 : _v.exclude("/.idea/");
124
+ (_w = this.npmignore) === null || _w === void 0 ? void 0 : _w.exclude("/.projenrc.js");
125
+ (_x = this.npmignore) === null || _x === void 0 ? void 0 : _x.exclude("tsconfig.tsbuildinfo");
126
+ if (this.jest) {
127
+ if (compiledTests) {
128
+ this.addJestCompiled(this.jest);
129
+ }
130
+ else {
131
+ this.addJestNoCompile(this.jest);
132
+ }
154
133
  }
155
- if (this.jest && !compiledTests) {
156
- this.jest.addTestMatch('**\/__tests__/**\/*.ts?(x)');
157
- this.jest.addTestMatch('**\/?(*.)+(spec|test).ts?(x)');
158
- // create a tsconfig for jest that does NOT include outDir and rootDir and
159
- // includes both "src" and "test" as inputs.
160
- this.jest.addTypeScriptSupport(this.tsconfigDev);
161
- }
162
- if ((_z = options.eslint) !== null && _z !== void 0 ? _z : true) {
134
+ if ((_y = options.eslint) !== null && _y !== void 0 ? _y : true) {
163
135
  this.eslint = new javascript_1.Eslint(this, {
164
136
  tsconfigPath: `./${this.tsconfigDev.fileName}`,
165
137
  dirs: [this.srcdir],
166
- devdirs: [this.testdir, 'build-tools'],
167
- fileExtensions: ['.ts', '.tsx'],
138
+ devdirs: [this.testdir, "build-tools"],
139
+ fileExtensions: [".ts", ".tsx"],
168
140
  ...options.eslintOptions,
169
141
  });
170
142
  this.tsconfigEslint = this.tsconfigDev;
171
143
  }
172
- const tsver = options.typescriptVersion ? `@${options.typescriptVersion}` : '';
144
+ const tsver = options.typescriptVersion
145
+ ? `@${options.typescriptVersion}`
146
+ : "";
173
147
  this.addDevDeps(`typescript${tsver}`,
174
148
  // @types/node versions numbers match the node runtime versions' major.minor, however, new
175
149
  // releases are only created when API changes are included in a node release... We might for
@@ -180,48 +154,94 @@ class TypeScriptProject extends javascript_1.NodeProject {
180
154
  // Additionally, we default to tracking the 12.x line, as the current earliest LTS release of
181
155
  // node is 12.x, so this is what corresponds to the broadest compatibility with supported node
182
156
  // runtimes.
183
- `@types/node@^${semver.major((_0 = this.package.minNodeVersion) !== null && _0 !== void 0 ? _0 : '12.0.0')}`);
157
+ `@types/node@^${semver.major((_z = this.package.minNodeVersion) !== null && _z !== void 0 ? _z : "12.0.0")}`);
184
158
  // generate sample code in `src` and `lib` if these directories are empty or non-existent.
185
- if ((_1 = options.sampleCode) !== null && _1 !== void 0 ? _1 : true) {
159
+ if ((_0 = options.sampleCode) !== null && _0 !== void 0 ? _0 : true) {
186
160
  new SampleCode(this);
187
161
  }
188
162
  if (this.docgen) {
189
163
  new typescript_1.TypedocDocgen(this);
190
164
  }
191
- const projenrcTypeScript = (_2 = options.projenrcTs) !== null && _2 !== void 0 ? _2 : false;
165
+ const projenrcTypeScript = (_1 = options.projenrcTs) !== null && _1 !== void 0 ? _1 : false;
192
166
  if (projenrcTypeScript) {
193
167
  new typescript_1.Projenrc(this, options.projenrcTsOptions);
194
168
  }
195
169
  }
170
+ /**
171
+ * Tests are compiled to `lib/TESTDIR`, so we don't need jest to compile them
172
+ * for us. just run them directly from javascript.
173
+ */
174
+ addJestCompiled(jest) {
175
+ var _d;
176
+ this.addDevDeps("@types/jest");
177
+ const testout = path.posix.relative(this.srcdir, this.testdir);
178
+ const libtest = path.posix.join(this.libdir, testout);
179
+ const srctest = this.testdir;
180
+ (_d = this.npmignore) === null || _d === void 0 ? void 0 : _d.exclude(`/${libtest}/`);
181
+ jest.addTestMatch(`**/${libtest}/**/?(*.)+(spec|test).js?(x)`);
182
+ jest.addWatchIgnorePattern(`/${this.srcdir}/`);
183
+ const resolveSnapshotPath = (test, ext) => {
184
+ const fullpath = test.replace(libtest, srctest);
185
+ return path.join(path.dirname(fullpath), "__snapshots__", path.basename(fullpath, ".js") + ".ts" + ext);
186
+ };
187
+ const resolveTestPath = (snap, ext) => {
188
+ const filename = path.basename(snap, ".ts" + ext) + ".js";
189
+ const dir = path.dirname(path.dirname(snap)).replace(srctest, libtest);
190
+ return path.join(dir, filename);
191
+ };
192
+ const resolver = new textfile_1.TextFile(this, path.posix.join(common_1.PROJEN_DIR, "jest-snapshot-resolver.js"));
193
+ resolver.addLine(`// ${textfile_1.TextFile.PROJEN_MARKER}`);
194
+ resolver.addLine('const path = require("path");');
195
+ resolver.addLine(`const libtest = "${libtest}";`);
196
+ resolver.addLine(`const srctest= "${srctest}";`);
197
+ resolver.addLine("module.exports = {");
198
+ resolver.addLine(` resolveSnapshotPath: ${resolveSnapshotPath.toString()},`);
199
+ resolver.addLine(` resolveTestPath: ${resolveTestPath.toString()},`);
200
+ resolver.addLine(" testPathForConsistencyCheck: path.join('some', '__tests__', 'example.test.js')");
201
+ resolver.addLine("};");
202
+ jest.addSnapshotResolver(`./${resolver.path}`);
203
+ }
204
+ addJestNoCompile(jest) {
205
+ this.addDevDeps("@types/jest", "ts-jest");
206
+ jest.addTestMatch(`<rootDir>/${this.srcdir}/**/__tests__/**/*.ts?(x)`);
207
+ jest.addTestMatch(`<rootDir>/(${this.testdir}|${this.srcdir})/**/?(*.)+(spec|test).ts?(x)`);
208
+ // add relevant deps
209
+ jest.config.preset = "ts-jest";
210
+ jest.config.globals = {
211
+ "ts-jest": {
212
+ tsconfig: this.tsconfigDev.fileName,
213
+ },
214
+ };
215
+ }
196
216
  }
197
217
  exports.TypeScriptProject = TypeScriptProject;
198
218
  _a = JSII_RTTI_SYMBOL_1;
199
- TypeScriptProject[_a] = { fqn: "projen.typescript.TypeScriptProject", version: "0.48.1" };
219
+ TypeScriptProject[_a] = { fqn: "projen.typescript.TypeScriptProject", version: "0.50.0" };
200
220
  class SampleCode extends component_1.Component {
201
221
  constructor(project) {
202
222
  super(project);
203
223
  const srcCode = [
204
- 'export class Hello {',
205
- ' public sayHello() {',
206
- ' return \'hello, world!\';',
207
- ' }',
208
- '}',
209
- ].join('\n');
224
+ "export class Hello {",
225
+ " public sayHello() {",
226
+ " return 'hello, world!';",
227
+ " }",
228
+ "}",
229
+ ].join("\n");
210
230
  const testCode = [
211
231
  "import { Hello } from '../src';",
212
- '',
232
+ "",
213
233
  "test('hello', () => {",
214
234
  " expect(new Hello().sayHello()).toBe('hello, world!');",
215
- '});',
216
- ].join('\n');
235
+ "});",
236
+ ].join("\n");
217
237
  new sample_file_1.SampleDir(project, project.srcdir, {
218
238
  files: {
219
- 'index.ts': srcCode,
239
+ "index.ts": srcCode,
220
240
  },
221
241
  });
222
242
  new sample_file_1.SampleDir(project, project.testdir, {
223
243
  files: {
224
- 'hello.test.ts': testCode,
244
+ "hello.test.ts": testCode,
225
245
  },
226
246
  });
227
247
  }
@@ -240,7 +260,7 @@ class TypeScriptAppProject extends TypeScriptProject {
240
260
  super({
241
261
  allowLibraryDependencies: false,
242
262
  releaseWorkflow: false,
243
- entrypoint: '',
263
+ entrypoint: "",
244
264
  package: false,
245
265
  ...options,
246
266
  });
@@ -248,7 +268,7 @@ class TypeScriptAppProject extends TypeScriptProject {
248
268
  }
249
269
  exports.TypeScriptAppProject = TypeScriptAppProject;
250
270
  _b = JSII_RTTI_SYMBOL_1;
251
- TypeScriptAppProject[_b] = { fqn: "projen.typescript.TypeScriptAppProject", version: "0.48.1" };
271
+ TypeScriptAppProject[_b] = { fqn: "projen.typescript.TypeScriptAppProject", version: "0.50.0" };
252
272
  /**
253
273
  * @deprecated use `TypeScriptProject`
254
274
  */
@@ -256,8 +276,7 @@ class TypeScriptLibraryProject extends TypeScriptProject {
256
276
  }
257
277
  exports.TypeScriptLibraryProject = TypeScriptLibraryProject;
258
278
  _c = JSII_RTTI_SYMBOL_1;
259
- TypeScriptLibraryProject[_c] = { fqn: "projen.typescript.TypeScriptLibraryProject", version: "0.48.1" };
260
- ;
279
+ TypeScriptLibraryProject[_c] = { fqn: "projen.typescript.TypeScriptLibraryProject", version: "0.50.0" };
261
280
  /**
262
281
  * @internal
263
282
  */
@@ -268,14 +287,8 @@ function mergeTsconfigOptions(...options) {
268
287
  return ({
269
288
  ...previous,
270
289
  ...current,
271
- include: [
272
- ...(_d = previous.include) !== null && _d !== void 0 ? _d : [],
273
- ...(_e = current.include) !== null && _e !== void 0 ? _e : [],
274
- ],
275
- exclude: [
276
- ...(_f = previous.exclude) !== null && _f !== void 0 ? _f : [],
277
- ...(_g = current.exclude) !== null && _g !== void 0 ? _g : [],
278
- ],
290
+ include: [...((_d = previous.include) !== null && _d !== void 0 ? _d : []), ...((_e = current.include) !== null && _e !== void 0 ? _e : [])],
291
+ exclude: [...((_f = previous.exclude) !== null && _f !== void 0 ? _f : []), ...((_g = current.exclude) !== null && _g !== void 0 ? _g : [])],
279
292
  compilerOptions: {
280
293
  ...previous.compilerOptions,
281
294
  ...current.compilerOptions,
@@ -284,4 +297,4 @@ function mergeTsconfigOptions(...options) {
284
297
  }, { compilerOptions: {} });
285
298
  }
286
299
  exports.mergeTsconfigOptions = mergeTsconfigOptions;
287
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXNjcmlwdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90eXBlc2NyaXB0L3R5cGVzY3JpcHQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSw2QkFBNkI7QUFDN0IsaUNBQWlDO0FBQ2pDLHNDQUFrRDtBQUNsRCw0Q0FBeUM7QUFDekMsOENBQTZKO0FBQzdKLGdEQUEyQztBQUUzQywwQ0FBdUM7QUFDdkMsOENBQTRHOzs7Ozs7O0FBcUQ1RyxNQUFhLGlCQUFrQixTQUFRLHdCQUFXOzs7O0lBc0JoRCxZQUFZLE9BQWlDOztRQUMzQyxLQUFLLENBQUM7WUFDSixHQUFHLE9BQU87WUFFVixnREFBZ0Q7WUFDaEQsVUFBVSxFQUFFLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQVU7WUFFM0QsV0FBVyxFQUFFO2dCQUNYLEdBQUcsT0FBTyxDQUFDLFdBQVc7Z0JBQ3RCLFVBQVUsRUFBRTtvQkFDVixTQUFHLE9BQU8sQ0FBQyxXQUFXLDBDQUFFLFVBQVU7b0JBQ2xDLFNBQVMsRUFBRSxFQUFFO2lCQUNkO2FBQ0Y7U0FDRixDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsTUFBTSxTQUFHLE9BQU8sQ0FBQyxNQUFNLG1DQUFJLEtBQUssQ0FBQztRQUN0QyxJQUFJLENBQUMsTUFBTSxTQUFHLE9BQU8sQ0FBQyxNQUFNLG1DQUFJLEtBQUssQ0FBQztRQUV0QyxJQUFJLENBQUMsTUFBTSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUM7UUFDN0IsSUFBSSxDQUFDLGFBQWEsU0FBRyxPQUFPLENBQUMsYUFBYSxtQ0FBSSxPQUFPLENBQUM7UUFFdEQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7UUFFckMsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRTtZQUNyQyxXQUFXLEVBQUUsbUNB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RTtnQkFDUCxTQUFHLFFBQVEsQ0FBQyxPQUFPLG1DQUFJLEVBQUU7Z0JBQ3pCLFNBQUcsT0FBTyxDQUFDLE9BQU8sbUNBQUksRUFBRTthQUN6QjtZQUNELGVBQWUsRUFBRTtnQkFDZixHQUFHLFFBQVEsQ0FBQyxlQUFlO2dCQUMzQixHQUFHLE9BQU8sQ0FBQyxlQUFlO2FBQzNCO1NBQ0YsQ0FBQyxDQUFBO0tBQUEsRUFBRSxFQUFFLGVBQWUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQy9CLENBQUM7QUFsQkQsb0RBa0JDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCAqIGFzIHNlbXZlciBmcm9tICdzZW12ZXInO1xuaW1wb3J0IHsgUFJPSkVOX0RJUiwgUFJPSkVOX1JDIH0gZnJvbSAnLi4vY29tbW9uJztcbmltcG9ydCB7IENvbXBvbmVudCB9IGZyb20gJy4uL2NvbXBvbmVudCc7XG5pbXBvcnQgeyBFc2xpbnQsIEVzbGludE9wdGlvbnMsIE5vZGVQcm9qZWN0LCBOb2RlUHJvamVjdE9wdGlvbnMsIFR5cGVTY3JpcHRDb21waWxlck9wdGlvbnMsIFR5cGVzY3JpcHRDb25maWcsIFR5cGVzY3JpcHRDb25maWdPcHRpb25zIH0gZnJvbSAnLi4vamF2YXNjcmlwdCc7XG5pbXBvcnQgeyBTYW1wbGVEaXIgfSBmcm9tICcuLi9zYW1wbGUtZmlsZSc7XG5pbXBvcnQgeyBUYXNrIH0gZnJvbSAnLi4vdGFzayc7XG5pbXBvcnQgeyBUZXh0RmlsZSB9IGZyb20gJy4uL3RleHRmaWxlJztcbmltcG9ydCB7IFByb2plbnJjIGFzIFByb2plbnJjVHMsIFByb2plbnJjT3B0aW9ucyBhcyBQcm9qZW5yY1RzT3B0aW9ucywgVHlwZWRvY0RvY2dlbiB9IGZyb20gJy4uL3R5cGVzY3JpcHQnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFR5cGVTY3JpcHRQcm9qZWN0T3B0aW9ucyBleHRlbmRzIE5vZGVQcm9qZWN0T3B0aW9ucyB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICByZWFkb25seSBsaWJkaXI/OiBzdHJpbmc7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gIHJlYWRvbmx5IHNyY2Rpcj86IHN0cmluZztcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgcmVhZG9ubHkgdGVzdGRpcj86IHN0cmluZztcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gIHJlYWRvbmx5IGVzbGludD86IGJvb2xlYW47XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICByZWFkb25seSBlc2xpbnRPcHRpb25zPzogRXNsaW50T3B0aW9ucztcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICByZWFkb25seSB0eXBlc2NyaXB0VmVyc2lvbj86IHN0cmluZztcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgcmVhZG9ubHkgZG9jZ2VuPzogYm9vbGVhbjtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gIHJlYWRvbmx5IGRvY3NEaXJlY3Rvcnk/OiBzdHJpbmc7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgcmVhZG9ubHkgdHNjb25maWc/OiBUeXBlc2NyaXB0Q29uZmlnT3B0aW9ucztcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICByZWFkb25seSB0c2NvbmZpZ0Rldj86IFR5cGVzY3JpcHRDb25maWdPcHRpb25zO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gIHJlYWRvbmx5IHRzY29uZmlnRGV2RmlsZT86IHN0cmluZztcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgcmVhZG9ubHkgZGlzYWJsZVRzY29uZmlnPzogYm9vbGVhbjtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gIHJlYWRvbmx5IHNhbXBsZUNvZGU/OiBib29sZWFuO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgcmVhZG9ubHkgZW50cnlwb2ludFR5cGVzPzogc3RyaW5nO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gIHJlYWRvbmx5IHByb2plbnJjVHM/OiBib29sZWFuO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICByZWFkb25seSBwcm9qZW5yY1RzT3B0aW9ucz86IFByb2plbnJjVHNPcHRpb25zO1xufVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5leHBvcnQgY2xhc3MgVHlwZVNjcmlwdFByb2plY3QgZXh0ZW5kcyBOb2RlUHJvamVjdCB7XG4gIHB1YmxpYyByZWFkb25seSBkb2NnZW4/OiBib29sZWFuO1xuICBwdWJsaWMgcmVhZG9ubHkgZG9jc0RpcmVjdG9yeTogc3RyaW5nO1xuICBwdWJsaWMgcmVhZG9ubHkgZXNsaW50PzogRXNsaW50O1xuICBwdWJsaWMgcmVhZG9ubHkgdHNjb25maWdFc2xpbnQ/OiBUeXBlc2NyaXB0Q29uZmlnO1xuICBwdWJsaWMgcmVhZG9ubHkgdHNjb25maWc/OiBUeXBlc2NyaXB0Q29uZmlnO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gIHB1YmxpYyByZWFkb25seSB0c2NvbmZpZ0RldjogVHlwZXNjcmlwdENvbmZpZztcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gIHB1YmxpYyByZWFkb25seSBzcmNkaXI6IHN0cmluZztcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gIHB1YmxpYyByZWFkb25seSBsaWJkaXI6IHN0cmluZztcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgcHVibGljIHJlYWRvbmx5IHRlc3RkaXI6IHN0cmluZztcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICBwdWJsaWMgcmVhZG9ubHkgd2F0Y2hUYXNrOiBUYXNrO1xuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IFR5cGVTY3JpcHRQcm9qZWN0T3B0aW9ucykge1xuICAgIHN1cGVyKHtcbiAgICAgIC4uLm9wdGlvbnMsXG5cbiAgICAgIC8vIGRpc2FibGUgLnByb2plbnJjLmpzIGlmIHR5cGVzY3JpcHQgaXMgZW5hYmxlZFxuICAgICAgcHJvamVucmNKczogb3B0aW9ucy5wcm9qZW5yY1RzID8gZmFsc2UgOiBvcHRpb25zLnByb2plbnJjSnMsXG5cbiAgICAgIGplc3RPcHRpb25zOiB7XG4gICAgICAgIC4uLm9wdGlvbnMuamVzdE9wdGlvbnMsXG4gICAgICAgIGplc3RDb25maWc6IHtcbiAgICAgICAgICAuLi5vcHRpb25zLmplc3RPcHRpb25zPy5qZXN0Q29uZmlnLFxuICAgICAgICAgIHRlc3RNYXRjaDogW10sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgdGhpcy5zcmNkaXIgPSBvcHRpb25zLnNyY2RpciA/PyAnc3JjJztcbiAgICB0aGlzLmxpYmRpciA9IG9wdGlvbnMubGliZGlyID8/ICdsaWInO1xuXG4gICAgdGhpcy5kb2NnZW4gPSBvcHRpb25zLmRvY2dlbjtcbiAgICB0aGlzLmRvY3NEaXJlY3RvcnkgPSBvcHRpb25zLmRvY3NEaXJlY3RvcnkgPz8gJ2RvY3MvJztcblxuICAgIHRoaXMuY29tcGlsZVRhc2suZXhlYygndHNjIC0tYnVpbGQnKTtcblxuICAgIHRoaXMud2F0Y2hUYXNrID0gdGhpcy5hZGRUYXNrKCd3YXRjaCcsIHtcbiAgICAgIGRlc2NyaXB0aW9uOiAnV2F0Y2ggJiBjb21waWxlIGluIHRoZSBiYWNrZ3JvdW5kJyxcbiAgICAgIGV4ZWM6ICd0c2MgLS1idWlsZCAtdycsXG4gICAgfSk7XG5cbiAgICB0aGlzLnRlc3RkaXIgPSBvcHRpb25zLnRlc3RkaXIgPz8gJ3Rlc3QnO1xuICAgIHRoaXMuZ2l0aWdub3JlLmluY2x1ZGUoYC8ke3RoaXMudGVzdGRpcn0vYCk7XG4gICAgdGhpcy5ucG1pZ25vcmU/LmV4Y2x1ZGUoYC8ke3RoaXMudGVzdGRpcn0vYCk7XG5cbiAgICAvLyBpZiB0aGUgdGVzdCBkaXJlY3RvcnkgaXMgdW5kZXIgYHNyYy9gLCB0aGVuIHdlIHdpbGwgcnVuIG91ciB0ZXN0cyBhZ2FpbnN0XG4gICAgLy8gdGhlIGphdmFzY3JpcHQgZmlsZXMgYW5kIG5vdCBsZXQgamVzdCBjb21waWxlIGl0IGZvciB1cy5cbiAgICBjb25zdCBjb21waWxlZFRlc3RzID0gdGhpcy50ZXN0ZGlyLnN0YXJ0c1dpdGgodGhpcy5zcmNkaXIgKyBwYXRoLnBvc2l4LnNlcCk7XG5cblxuICAgIGlmIChvcHRpb25zLmVudHJ5cG9pbnRUeXBlcyB8fCB0aGlzLmVudHJ5cG9pbnQgIT09ICcnKSB7XG4gICAgICBjb25zdCBlbnRyeXBvaW50VHlwZXMgPSBvcHRpb25zLmVudHJ5cG9pbnRUeXBlcyA/PyBgJHtwYXRoLmpvaW4ocGF0aC5kaXJuYW1lKHRoaXMuZW50cnlwb2ludCksIHBhdGguYmFzZW5hbWUodGhpcy5lbnRyeXBvaW50LCAnLmpzJykpLnJlcGxhY2UoL1xcXFwvZywgJy8nKX0uZC50c2A7XG4gICAgICB0aGlzLnBhY2thZ2UuYWRkRmllbGQoJ3R5cGVzJywgZW50cnlwb2ludFR5cGVzKTtcbiAgICB9XG5cbiAgICBjb25zdCBjb21waWxlck9wdGlvbkRlZmF1bHRzOiBUeXBlU2NyaXB0Q29tcGlsZXJPcHRpb25zID0ge1xuICAgICAgYWx3YXlzU3RyaWN0OiB0cnVlLFxuICAgICAgZGVjbGFyYXRpb246IHRydWUsXG4gICAgICBlc01vZHVsZUludGVyb3A6IHRydWUsXG4gICAgICBleHBlcmltZW50YWxEZWNvcmF0b3JzOiB0cnVlLFxuICAgICAgaW5saW5lU291cmNlTWFwOiB0cnVlLFxuICAgICAgaW5saW5lU291cmNlczogdHJ1ZSxcbiAgICAgIGxpYjogWydlczIwMTknXSxcbiAgICAgIG1vZHVsZTogJ0NvbW1vbkpTJyxcbiAgICAgIG5vRW1pdE9uRXJyb3I6IGZhbHNlLFxuICAgICAgbm9GYWxsdGhyb3VnaENhc2VzSW5Td2l0Y2g6IHRydWUsXG4gICAgICBub0ltcGxpY2l0QW55OiB0cnVlLFxuICAgICAgbm9JbXBsaWNpdFJldHVybnM6IHRydWUsXG4gICAgICBub0ltcGxpY2l0VGhpczogdHJ1ZSxcbiAgICAgIG5vVW51c2VkTG9jYWxzOiB0cnVlLFxuICAgICAgbm9VbnVzZWRQYXJhbWV0ZXJzOiB0cnVlLFxuICAgICAgcmVzb2x2ZUpzb25Nb2R1bGU6IHRydWUsXG4gICAgICBzdHJpY3Q6IHRydWUsXG4gICAgICBzdHJpY3ROdWxsQ2hlY2tzOiB0cnVlLFxuICAgICAgc3RyaWN0UHJvcGVydHlJbml0aWFsaXphdGlvbjogdHJ1ZSxcbiAgICAgIHN0cmlwSW50ZXJuYWw6IHRydWUsXG4gICAgICB0YXJnZXQ6ICdFUzIwMTknLFxuICAgIH07XG5cbiAgICBpZiAoIW9wdGlvbnMuZGlzYWJsZVRzY29uZmlnKSB7XG4gICAgICB0aGlzLnRzY29uZmlnID0gbmV3IFR5cGVzY3JpcHRDb25maWcodGhpcywgbWVyZ2VUc2NvbmZpZ09wdGlvbnMoe1xuICAgICAgICBpbmNsdWRlOiBbYCR7dGhpcy5zcmNkaXJ9LyoqLyoudHNgXSxcbiAgICAgICAgLy8gZXhjbHVkZTogWydub2RlX21vZHVsZXMnXSwgLy8gVE9ETzogc2hvdWxkbid0IHdlIGV4Y2x1ZGUgbm9kZV9tb2R1bGVzP1xuICAgICAgICBjb21waWxlck9wdGlvbnM6IHtcbiAgICAgICAgICByb290RGlyOiB0aGlzLnNyY2RpcixcbiAgICAgICAgICBvdXREaXI6IHRoaXMubGliZGlyLFxuICAgICAgICAgIC4uLmNvbXBpbGVyT3B0aW9uRGVmYXVsdHMsXG4gICAgICAgIH0sXG4gICAgICB9LCBvcHRpb25zLnRzY29uZmlnKSk7XG4gICAgfVxuXG4gICAgY29uc3QgdHNjb25maWdEZXZGaWxlID0gb3B0aW9ucy50c2NvbmZpZ0RldkZpbGUgPz8gJ3RzY29uZmlnLmRldi5qc29uJztcbiAgICB0aGlzLnRzY29uZmlnRGV2ID0gbmV3IFR5cGVzY3JpcHRDb25maWcodGhpcywgbWVyZ2VUc2NvbmZpZ09wdGlvbnMoe1xuICAgICAgZmlsZU5hbWU6IHRzY29uZmlnRGV2RmlsZSxcbiAgICAgIGluY2x1ZGU6IFtcbiAgICAgICAgUFJPSkVOX1JDLFxuICAgICAgICBgJHt0aGlzLnNyY2Rpcn0vKiovKi50c2AsXG4gICAgICAgIGAke3RoaXMudGVzdGRpcn0vKiovKi50c2AsXG4gICAgICBdLFxuICAgICAgZXhjbHVkZTogWydub2RlX21vZHVsZXMnXSxcbiAgICAgIGNvbXBpbGVyT3B0aW9uczogY29tcGlsZXJPcHRpb25EZWZhdWx0cyxcbiAgICB9LCBvcHRpb25zLnRzY29uZmlnLCBvcHRpb25zLnRzY29uZmlnRGV2KSk7XG5cbiAgICB0aGlzLmdpdGlnbm9yZS5pbmNsdWRlKGAvJHt0aGlzLnNyY2Rpcn0vYCk7XG4gICAgdGhpcy5ucG1pZ25vcmU/LmV4Y2x1ZGUoYC8ke3RoaXMuc3JjZGlyfS9gKTtcblxuICAgIGlmICh0aGlzLnNyY2RpciAhPT0gdGhpcy5saWJkaXIpIHtcbiAgICAgIC8vIHNlcGFyYXRlZCwgY2FuIGlnbm9yZSB0aGUgZW50aXJlIGxpYmRpclxuICAgICAgdGhpcy5naXRpZ25vcmUuZXhjbHVkZShgLyR7dGhpcy5saWJkaXJ9YCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGNvbGxvY2F0ZWQsIGNhbiBvbmx5IGlnbm9yZSB0aGUgY29tcGlsZWQgb3V0cHV0XG4gICAgICB0aGlzLmdpdGlnbm9yZS5leGNsdWRlKGAvJHt0aGlzLmxpYmRpcn0vKiovKi5qc2ApO1xuICAgICAgdGhpcy5naXRpZ25vcmUuZXhjbHVkZShgLyR7dGhpcy5saWJkaXJ9LyoqLyouZC50c2ApO1xuICAgIH1cblxuICAgIHRoaXMubnBtaWdub3JlPy5pbmNsdWRlKGAvJHt0aGlzLmxpYmRpcn0vYCk7XG5cbiAgICB0aGlzLm5wbWlnbm9yZT8uaW5jbHVkZShgLyR7dGhpcy5saWJkaXJ9LyoqLyouanNgKTtcbiAgICB0aGlzLm5wbWlnbm9yZT8uaW5jbHVkZShgLyR7dGhpcy5saWJkaXJ9LyoqLyouZC50c2ApO1xuXG4gICAgdGhpcy5naXRpZ25vcmUuZXhjbHVkZSgnL2Rpc3QvJyk7XG4gICAgdGhpcy5ucG1pZ25vcmU/LmV4Y2x1ZGUoJ2Rpc3QnKTsgLy8ganNpaS1wYWNtYWsgZXhwZWN0cyB0aGlzIHRvIGJlIFwiZGlzdFwiIGFuZCBub3QgXCIvZGlzdFwiLiBvdGhlcndpc2UgaXQgd2lsbCB0YW1wZXIgd2l0aCBpdFxuXG4gICAgdGhpcy5ucG1pZ25vcmU/LmV4Y2x1ZGUoJy90c2NvbmZpZy5qc29uJyk7XG4gICAgdGhpcy5ucG1pZ25vcmU/LmV4Y2x1ZGUoJy8uZ2l0aHViLycpO1xuICAgIHRoaXMubnBtaWdub3JlPy5leGNsdWRlKCcvLnZzY29kZS8nKTtcbiAgICB0aGlzLm5wbWlnbm9yZT8uZXhjbHVkZSgnLy5pZGVhLycpO1xuICAgIHRoaXMubnBtaWdub3JlPy5leGNsdWRlKCcvLnByb2plbnJjLmpzJyk7XG4gICAgdGhpcy5ucG1pZ25vcmU/LmV4Y2x1ZGUoJ3RzY29uZmlnLnRzYnVpbGRpbmZvJyk7XG5cbiAgICAvLyB0ZXN0cyBhcmUgY29tcGlsZWQgdG8gYGxpYi9URVNURElSYCwgc28gd2UgZG9uJ3QgbmVlZCBqZXN0IHRvIGNvbXBpbGUgdGhlbSBmb3IgdXMuXG4gICAgLy8ganVzdCBydW4gdGhlbSBkaXJlY3RseSBmcm9tIGphdmFzY3JpcHQuXG4gICAgaWYgKHRoaXMuamVzdCAmJiBjb21waWxlZFRlc3RzKSB7XG4gICAgICB0aGlzLmFkZERldkRlcHMoJ0B0eXBlcy9qZXN0Jyk7XG5cbiAgICAgIGNvbnN0IHRlc3RvdXQgPSBwYXRoLnBvc2l4LnJlbGF0aXZlKHRoaXMuc3JjZGlyLCB0aGlzLnRlc3RkaXIpO1xuICAgICAgY29uc3QgbGlidGVzdCA9IHBhdGgucG9zaXguam9pbih0aGlzLmxpYmRpciwgdGVzdG91dCk7XG4gICAgICBjb25zdCBzcmN0ZXN0ID0gdGhpcy50ZXN0ZGlyO1xuXG4gICAgICB0aGlzLm5wbWlnbm9yZT8uZXhjbHVkZShgLyR7bGlidGVzdH0vYCk7XG4gICAgICB0aGlzLmplc3QuYWRkVGVzdE1hdGNoKGAqKi8ke2xpYnRlc3R9LyoqLz8oKi4pKyhzcGVjfHRlc3QpLmpzPyh4KWApO1xuICAgICAgdGhpcy5qZXN0LmFkZFdhdGNoSWdub3JlUGF0dGVybihgLyR7dGhpcy5zcmNkaXJ9L2ApO1xuXG4gICAgICBjb25zdCByZXNvbHZlU25hcHNob3RQYXRoID0gKHRlc3Q6IHN0cmluZywgZXh0OiBzdHJpbmcpID0+IHtcbiAgICAgICAgY29uc3QgZnVsbHBhdGggPSB0ZXN0LnJlcGxhY2UobGlidGVzdCwgc3JjdGVzdCk7XG4gICAgICAgIHJldHVybiBwYXRoLmpvaW4ocGF0aC5kaXJuYW1lKGZ1bGxwYXRoKSwgJ19fc25hcHNob3RzX18nLCBwYXRoLmJhc2VuYW1lKGZ1bGxwYXRoLCAnLmpzJykgKyAnLnRzJyArIGV4dCk7XG4gICAgICB9O1xuXG4gICAgICBjb25zdCByZXNvbHZlVGVzdFBhdGggPSAoc25hcDogc3RyaW5nLCBleHQ6IHN0cmluZykgPT4ge1xuICAgICAgICBjb25zdCBmaWxlbmFtZSA9IHBhdGguYmFzZW5hbWUoc25hcCwgJy50cycgKyBleHQpICsgJy5qcyc7XG4gICAgICAgIGNvbnN0IGRpciA9IHBhdGguZGlybmFtZShwYXRoLmRpcm5hbWUoc25hcCkpLnJlcGxhY2Uoc3JjdGVzdCwgbGlidGVzdCk7XG4gICAgICAgIHJldHVybiBwYXRoLmpvaW4oZGlyLCBmaWxlbmFtZSk7XG4gICAgICB9O1xuXG4gICAgICBjb25zdCByZXNvbHZlciA9IG5ldyBUZXh0RmlsZSh0aGlzLCBwYXRoLnBvc2l4LmpvaW4oUFJPSkVOX0RJUiwgJ2plc3Qtc25hcHNob3QtcmVzb2x2ZXIuanMnKSk7XG4gICAgICByZXNvbHZlci5hZGRMaW5lKGAvLyAke1RleHRGaWxlLlBST0pFTl9NQVJLRVJ9YCk7XG4gICAgICByZXNvbHZlci5hZGRMaW5lKCdjb25zdCBwYXRoID0gcmVxdWlyZShcInBhdGhcIik7Jyk7XG4gICAgICByZXNvbHZlci5hZGRMaW5lKGBjb25zdCBsaWJ0ZXN0ID0gXCIke2xpYnRlc3R9XCI7YCk7XG4gICAgICByZXNvbHZlci5hZGRMaW5lKGBjb25zdCBzcmN0ZXN0PSBcIiR7c3JjdGVzdH1cIjtgKTtcbiAgICAgIHJlc29sdmVyLmFkZExpbmUoJ21vZHVsZS5leHBvcnRzID0geycpO1xuICAgICAgcmVzb2x2ZXIuYWRkTGluZShgICByZXNvbHZlU25hcHNob3RQYXRoOiAke3Jlc29sdmVTbmFwc2hvdFBhdGgudG9TdHJpbmcoKX0sYCk7XG4gICAgICByZXNvbHZlci5hZGRMaW5lKGAgIHJlc29sdmVUZXN0UGF0aDogJHtyZXNvbHZlVGVzdFBhdGgudG9TdHJpbmcoKX0sYCk7XG4gICAgICByZXNvbHZlci5hZGRMaW5lKCcgIHRlc3RQYXRoRm9yQ29uc2lzdGVuY3lDaGVjazogcGF0aC5qb2luKFxcJ3NvbWVcXCcsIFxcJ19fdGVzdHNfX1xcJywgXFwnZXhhbXBsZS50ZXN0LmpzXFwnKScpO1xuICAgICAgcmVzb2x2ZXIuYWRkTGluZSgnfTsnKTtcblxuICAgICAgdGhpcy5qZXN0LmFkZFNuYXBzaG90UmVzb2x2ZXIoYC4vJHtyZXNvbHZlci5wYXRofWApO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmplc3QgJiYgIWNvbXBpbGVkVGVzdHMpIHtcbiAgICAgIHRoaXMuamVzdC5hZGRUZXN0TWF0Y2goJyoqXFwvX190ZXN0c19fLyoqXFwvKi50cz8oeCknKTtcbiAgICAgIHRoaXMuamVzdC5hZGRUZXN0TWF0Y2goJyoqXFwvPygqLikrKHNwZWN8dGVzdCkudHM/KHgpJyk7XG5cbiAgICAgIC8vIGNyZWF0ZSBhIHRzY29uZmlnIGZvciBqZXN0IHRoYXQgZG9lcyBOT1QgaW5jbHVkZSBvdXREaXIgYW5kIHJvb3REaXIgYW5kXG4gICAgICAvLyBpbmNsdWRlcyBib3RoIFwic3JjXCIgYW5kIFwidGVzdFwiIGFzIGlucHV0cy5cbiAgICAgIHRoaXMuamVzdC5hZGRUeXBlU2NyaXB0U3VwcG9ydCh0aGlzLnRzY29uZmlnRGV2KTtcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5lc2xpbnQgPz8gdHJ1ZSkge1xuICAgICAgdGhpcy5lc2xpbnQgPSBuZXcgRXNsaW50KHRoaXMsIHtcbiAgICAgICAgdHNjb25maWdQYXRoOiBgLi8ke3RoaXMudHNjb25maWdEZXYuZmlsZU5hbWV9YCxcbiAgICAgICAgZGlyczogW3RoaXMuc3JjZGlyXSxcbiAgICAgICAgZGV2ZGlyczogW3RoaXMudGVzdGRpciwgJ2J1aWxkLXRvb2xzJ10sXG4gICAgICAgIGZpbGVFeHRlbnNpb25zOiBbJy50cycsICcudHN4J10sXG4gICAgICAgIC4uLm9wdGlvbnMuZXNsaW50T3B0aW9ucyxcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLnRzY29uZmlnRXNsaW50ID0gdGhpcy50c2NvbmZpZ0RldjtcbiAgICB9XG5cbiAgICBjb25zdCB0c3ZlciA9IG9wdGlvbnMudHlwZXNjcmlwdFZlcnNpb24gPyBgQCR7b3B0aW9ucy50eXBlc2NyaXB0VmVyc2lvbn1gIDogJyc7XG5cbiAgICB0aGlzLmFkZERldkRlcHMoXG4gICAgICBgdHlwZXNjcmlwdCR7dHN2ZXJ9YCxcbiAgICAgIC8vIEB0eXBlcy9ub2RlIHZlcnNpb25zIG51bWJlcnMgbWF0Y2ggdGhlIG5vZGUgcnVudGltZSB2ZXJzaW9ucycgbWFqb3IubWlub3IsIGhvd2V2ZXIsIG5ld1xuICAgICAgLy8gcmVsZWFzZXMgYXJlIG9ubHkgY3JlYXRlZCB3aGVuIEFQSSBjaGFuZ2VzIGFyZSBpbmNsdWRlZCBpbiBhIG5vZGUgcmVsZWFzZS4uLiBXZSBtaWdodCBmb3JcbiAgICAgIC8vIGV4YW1wbGUgaGF2ZSBkZXBlbmRlbmNpZXMgdGhhdCByZXF1aXJlIGBub2RlID49IDEyLjIyYCwgYnV0IGFzIDEyLjIxIGFuZCAxMi4yMiBkaWQgbm90XG4gICAgICAvLyBpbmNsdWRlIEFQSSBjaGFuZ2VzLCBgQHR5cGVzL25vZGVAMTIuMjAueGAgaXMgdGhlIFwiY29ycmVjdFwiIHZlcnNpb24gdG8gdXNlLiBBcyBpdCBpcyBub3RcbiAgICAgIC8vIHBvc3NpYmxlIHRvIGVhc2lseSBkZXRlcm1pbmUgdGhlIGNvcnJlY3QgdmVyc2lvbiB0byB1c2UsIHdlIHBpY2sgdXAgdGhlIGxhdGVzdCB2ZXJzaW9uLlxuICAgICAgLy9cbiAgICAgIC8vIEFkZGl0aW9uYWxseSwgd2UgZGVmYXVsdCB0byB0cmFja2luZyB0aGUgMTIueCBsaW5lLCBhcyB0aGUgY3VycmVudCBlYXJsaWVzdCBMVFMgcmVsZWFzZSBvZlxuICAgICAgLy8gbm9kZSBpcyAxMi54LCBzbyB0aGlzIGlzIHdoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGJyb2FkZXN0IGNvbXBhdGliaWxpdHkgd2l0aCBzdXBwb3J0ZWQgbm9kZVxuICAgICAgLy8gcnVudGltZXMuXG4gICAgICBgQHR5cGVzL25vZGVAXiR7c2VtdmVyLm1ham9yKHRoaXMucGFja2FnZS5taW5Ob2RlVmVyc2lvbiA/PyAnMTIuMC4wJyl9YCxcbiAgICApO1xuXG4gICAgLy8gZ2VuZXJhdGUgc2FtcGxlIGNvZGUgaW4gYHNyY2AgYW5kIGBsaWJgIGlmIHRoZXNlIGRpcmVjdG9yaWVzIGFyZSBlbXB0eSBvciBub24tZXhpc3RlbnQuXG4gICAgaWYgKG9wdGlvbnMuc2FtcGxlQ29kZSA/PyB0cnVlKSB7XG4gICAgICBuZXcgU2FtcGxlQ29kZSh0aGlzKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5kb2NnZW4pIHtcbiAgICAgIG5ldyBUeXBlZG9jRG9jZ2VuKHRoaXMpO1xuICAgIH1cblxuICAgIGNvbnN0IHByb2plbnJjVHlwZVNjcmlwdCA9IG9wdGlvbnMucHJvamVucmNUcyA/PyBmYWxzZTtcbiAgICBpZiAocHJvamVucmNUeXBlU2NyaXB0KSB7XG4gICAgICBuZXcgUHJvamVucmNUcyh0aGlzLCBvcHRpb25zLnByb2plbnJjVHNPcHRpb25zKTtcbiAgICB9XG4gIH1cbn1cblxuY2xhc3MgU2FtcGxlQ29kZSBleHRlbmRzIENvbXBvbmVudCB7XG4gIGNvbnN0cnVjdG9yKHByb2plY3Q6IFR5cGVTY3JpcHRQcm9qZWN0KSB7XG4gICAgc3VwZXIocHJvamVjdCk7XG4gICAgY29uc3Qgc3JjQ29kZSA9IFtcbiAgICAgICdleHBvcnQgY2xhc3MgSGVsbG8geycsXG4gICAgICAnICBwdWJsaWMgc2F5SGVsbG8oKSB7JyxcbiAgICAgICcgICAgcmV0dXJuIFxcJ2hlbGxvLCB3b3JsZCFcXCc7JyxcbiAgICAgICcgIH0nLFxuICAgICAgJ30nLFxuICAgIF0uam9pbignXFxuJyk7XG5cbiAgICBjb25zdCB0ZXN0Q29kZSA9IFtcbiAgICAgIFwiaW1wb3J0IHsgSGVsbG8gfSBmcm9tICcuLi9zcmMnO1wiLFxuICAgICAgJycsXG4gICAgICBcInRlc3QoJ2hlbGxvJywgKCkgPT4ge1wiLFxuICAgICAgXCIgIGV4cGVjdChuZXcgSGVsbG8oKS5zYXlIZWxsbygpKS50b0JlKCdoZWxsbywgd29ybGQhJyk7XCIsXG4gICAgICAnfSk7JyxcbiAgICBdLmpvaW4oJ1xcbicpO1xuXG4gICAgbmV3IFNhbXBsZURpcihwcm9qZWN0LCBwcm9qZWN0LnNyY2Rpciwge1xuICAgICAgZmlsZXM6IHtcbiAgICAgICAgJ2luZGV4LnRzJzogc3JjQ29kZSxcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBuZXcgU2FtcGxlRGlyKHByb2plY3QsIHByb2plY3QudGVzdGRpciwge1xuICAgICAgZmlsZXM6IHtcbiAgICAgICAgJ2hlbGxvLnRlc3QudHMnOiB0ZXN0Q29kZSxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cbn1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbmV4cG9ydCBjbGFzcyBUeXBlU2NyaXB0QXBwUHJvamVjdCBleHRlbmRzIFR5cGVTY3JpcHRQcm9qZWN0IHtcbiAgY29uc3RydWN0b3Iob3B0aW9uczogVHlwZVNjcmlwdFByb2plY3RPcHRpb25zKSB7XG4gICAgc3VwZXIoe1xuICAgICAgYWxsb3dMaWJyYXJ5RGVwZW5kZW5jaWVzOiBmYWxzZSxcbiAgICAgIHJlbGVhc2VXb3JrZmxvdzogZmFsc2UsXG4gICAgICBlbnRyeXBvaW50OiAnJywgLy8gXCJtYWluXCIgaXMgbm90IG5lZWRlZCBpbiB0eXBlc2NyaXB0IGFwcHNcbiAgICAgIHBhY2thZ2U6IGZhbHNlLFxuICAgICAgLi4ub3B0aW9ucyxcbiAgICB9KTtcbiAgfVxufVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5leHBvcnQgY2xhc3MgVHlwZVNjcmlwdExpYnJhcnlQcm9qZWN0IGV4dGVuZHMgVHlwZVNjcmlwdFByb2plY3Qge1xufTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5leHBvcnQgaW50ZXJmYWNlIFR5cGVTY3JpcHRMaWJyYXJ5UHJvamVjdE9wdGlvbnMgZXh0ZW5kcyBUeXBlU2NyaXB0UHJvamVjdE9wdGlvbnMge1xufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VUc2NvbmZpZ09wdGlvbnMoLi4ub3B0aW9uczogKFR5cGVzY3JpcHRDb25maWdPcHRpb25zIHwgdW5kZWZpbmVkKVtdKTogVHlwZXNjcmlwdENvbmZpZ09wdGlvbnMge1xuICBjb25zdCBkZWZpbmVkT3B0aW9ucyA9IG9wdGlvbnMuZmlsdGVyKEJvb2xlYW4pIGFzIFR5cGVzY3JpcHRDb25maWdPcHRpb25zW107XG4gIHJldHVybiBkZWZpbmVkT3B0aW9ucy5yZWR1Y2U8VHlwZXNjcmlwdENvbmZpZ09wdGlvbnM+KChwcmV2aW91cywgY3VycmVudCkgPT4gKHtcbiAgICAuLi5wcmV2aW91cyxcbiAgICAuLi5jdXJyZW50LFxuICAgIGluY2x1ZGU6IFtcbiAgICAgIC4uLnByZXZpb3VzLmluY2x1ZGUgPz8gW10sXG4gICAgICAuLi5jdXJyZW50LmluY2x1ZGUgPz8gW10sXG4gICAgXSxcbiAgICBleGNsdWRlOiBbXG4gICAgICAuLi5wcmV2aW91cy5leGNsdWRlID8/IFtdLFxuICAgICAgLi4uY3VycmVudC5leGNsdWRlID8/IFtdLFxuICAgIF0sXG4gICAgY29tcGlsZXJPcHRpb25zOiB7XG4gICAgICAuLi5wcmV2aW91cy5jb21waWxlck9wdGlvbnMsXG4gICAgICAuLi5jdXJyZW50LmNvbXBpbGVyT3B0aW9ucyxcbiAgICB9LFxuICB9KSwgeyBjb21waWxlck9wdGlvbnM6IHt9IH0pO1xufVxuIl19
300
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXNjcmlwdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90eXBlc2NyaXB0L3R5cGVzY3JpcHQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSw2QkFBNkI7QUFDN0IsaUNBQWlDO0FBQ2pDLHNDQUFrRDtBQUNsRCw0Q0FBeUM7QUFDekMsOENBU3VCO0FBQ3ZCLGdEQUEyQztBQUUzQywwQ0FBdUM7QUFDdkMsOENBSXVCOzs7Ozs7O0FBcUR2QixNQUFhLGlCQUFrQixTQUFRLHdCQUFXOzs7O0lBc0JoRCxZQUFZLE9BQWlDOztRQUMzQyxLQUFLLENBQUM7WUFDSixHQUFHLE9BQU87WUFFVixnREFBZ0Q7WUFDaEQsVUFBVSxFQUFFLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQVU7WUFFM0QsV0FBVyxFQUFFO2dCQUNYLEdBQUcsT0FBTyxDQUFDLFdBQVc7Z0JBQ3RCLFVBQVUsRUFBRTtvQkFDVixTQUFHLE9BQU8sQ0FBQyxXQUFXLDBDQUFFLFVBQVU7b0JBQ2xDLFNBQVMsRUFBRSxFQUFFO2lCQUNkO2FBQ0Y7U0FDRixDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsTUFBTSxTQUFHLE9BQU8sQ0FBQyxNQUFNLG1DQUFJLEtBQUssQ0FBQztRQUN0QyxJQUFJLENBQUMsTUFBTSxTQUFHLE9BQU8sQ0FBQyxNQUFNLG1DQUFJLEtBQUssQ0FBQztRQUV0QyxJQUFJLENBQUMsTUFBTSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUM7UUFDN0IsSUFBSSxDQUFDLGFBQWEsU0FBRyxPQUFPLENBQUMsYUFBYSxtQ0FBSSxPQUFPLENBQUM7UUFFdEQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7UUFFckMsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRTtZQUNyQyxXQUFXLEVBQUUsbUNB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RCxNQUFNLGNBQWMsR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBOEIsQ0FBQztJQUM1RSxPQUFPLGNBQWMsQ0FBQyxNQUFNLENBQzFCLENBQUMsUUFBUSxFQUFFLE9BQU8sRUFBRSxFQUFFOztRQUFDLE9BQUEsQ0FBQztZQUN0QixHQUFHLFFBQVE7WUFDWCxHQUFHLE9BQU87WUFDVixPQUFPLEVBQUUsQ0FBQyxHQUFHLE9BQUMsUUFBUSxDQUFDLE9BQU8sbUNBQUksRUFBRSxDQUFDLEVBQUUsR0FBRyxPQUFDLE9BQU8sQ0FBQyxPQUFPLG1DQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQ2xFLE9BQU8sRUFBRSxDQUFDLEdBQUcsT0FBQyxRQUFRLENBQUMsT0FBTyxtQ0FBSSxFQUFFLENBQUMsRUFBRSxHQUFHLE9BQUMsT0FBTyxDQUFDLE9BQU8sbUNBQUksRUFBRSxDQUFDLENBQUM7WUFDbEUsZUFBZSxFQUFFO2dCQUNmLEdBQUcsUUFBUSxDQUFDLGVBQWU7Z0JBQzNCLEdBQUcsT0FBTyxDQUFDLGVBQWU7YUFDM0I7U0FDRixDQUFDLENBQUE7S0FBQSxFQUNGLEVBQUUsZUFBZSxFQUFFLEVBQUUsRUFBRSxDQUN4QixDQUFDO0FBQ0osQ0FBQztBQWpCRCxvREFpQkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgKiBhcyBzZW12ZXIgZnJvbSBcInNlbXZlclwiO1xuaW1wb3J0IHsgUFJPSkVOX0RJUiwgUFJPSkVOX1JDIH0gZnJvbSBcIi4uL2NvbW1vblwiO1xuaW1wb3J0IHsgQ29tcG9uZW50IH0gZnJvbSBcIi4uL2NvbXBvbmVudFwiO1xuaW1wb3J0IHtcbiAgRXNsaW50LFxuICBFc2xpbnRPcHRpb25zLFxuICBKZXN0LFxuICBOb2RlUHJvamVjdCxcbiAgTm9kZVByb2plY3RPcHRpb25zLFxuICBUeXBlU2NyaXB0Q29tcGlsZXJPcHRpb25zLFxuICBUeXBlc2NyaXB0Q29uZmlnLFxuICBUeXBlc2NyaXB0Q29uZmlnT3B0aW9ucyxcbn0gZnJvbSBcIi4uL2phdmFzY3JpcHRcIjtcbmltcG9ydCB7IFNhbXBsZURpciB9IGZyb20gXCIuLi9zYW1wbGUtZmlsZVwiO1xuaW1wb3J0IHsgVGFzayB9IGZyb20gXCIuLi90YXNrXCI7XG5pbXBvcnQgeyBUZXh0RmlsZSB9IGZyb20gXCIuLi90ZXh0ZmlsZVwiO1xuaW1wb3J0IHtcbiAgUHJvamVucmMgYXMgUHJvamVucmNUcyxcbiAgUHJvamVucmNPcHRpb25zIGFzIFByb2plbnJjVHNPcHRpb25zLFxuICBUeXBlZG9jRG9jZ2VuLFxufSBmcm9tIFwiLi4vdHlwZXNjcmlwdFwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIFR5cGVTY3JpcHRQcm9qZWN0T3B0aW9ucyBleHRlbmRzIE5vZGVQcm9qZWN0T3B0aW9ucyB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICByZWFkb25seSBsaWJkaXI/OiBzdHJpbmc7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gIHJlYWRvbmx5IHNyY2Rpcj86IHN0cmluZztcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgcmVhZG9ubHkgdGVzdGRpcj86IHN0cmluZztcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gIHJlYWRvbmx5IGVzbGludD86IGJvb2xlYW47XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICByZWFkb25seSBlc2xpbnRPcHRpb25zPzogRXNsaW50T3B0aW9ucztcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICByZWFkb25seSB0eXBlc2NyaXB0VmVyc2lvbj86IHN0cmluZztcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgcmVhZG9ubHkgZG9jZ2VuPzogYm9vbGVhbjtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gIHJlYWRvbmx5IGRvY3NEaXJlY3Rvcnk/OiBzdHJpbmc7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgcmVhZG9ubHkgdHNjb25maWc/OiBUeXBlc2NyaXB0Q29uZmlnT3B0aW9ucztcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICByZWFkb25seSB0c2NvbmZpZ0Rldj86IFR5cGVzY3JpcHRDb25maWdPcHRpb25zO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gIHJlYWRvbmx5IHRzY29uZmlnRGV2RmlsZT86IHN0cmluZztcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgcmVhZG9ubHkgZGlzYWJsZVRzY29uZmlnPzogYm9vbGVhbjtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gIHJlYWRvbmx5IHNhbXBsZUNvZGU/OiBib29sZWFuO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgcmVhZG9ubHkgZW50cnlwb2ludFR5cGVzPzogc3RyaW5nO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gIHJlYWRvbmx5IHByb2plbnJjVHM/OiBib29sZWFuO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICByZWFkb25seSBwcm9qZW5yY1RzT3B0aW9ucz86IFByb2plbnJjVHNPcHRpb25zO1xufVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5leHBvcnQgY2xhc3MgVHlwZVNjcmlwdFByb2plY3QgZXh0ZW5kcyBOb2RlUHJvamVjdCB7XG4gIHB1YmxpYyByZWFkb25seSBkb2NnZW4/OiBib29sZWFuO1xuICBwdWJsaWMgcmVhZG9ubHkgZG9jc0RpcmVjdG9yeTogc3RyaW5nO1xuICBwdWJsaWMgcmVhZG9ubHkgZXNsaW50PzogRXNsaW50O1xuICBwdWJsaWMgcmVhZG9ubHkgdHNjb25maWdFc2xpbnQ/OiBUeXBlc2NyaXB0Q29uZmlnO1xuICBwdWJsaWMgcmVhZG9ubHkgdHNjb25maWc/OiBUeXBlc2NyaXB0Q29uZmlnO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gIHB1YmxpYyByZWFkb25seSB0c2NvbmZpZ0RldjogVHlwZXNjcmlwdENvbmZpZztcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gIHB1YmxpYyByZWFkb25seSBzcmNkaXI6IHN0cmluZztcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gIHB1YmxpYyByZWFkb25seSBsaWJkaXI6IHN0cmluZztcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgcHVibGljIHJlYWRvbmx5IHRlc3RkaXI6IHN0cmluZztcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICBwdWJsaWMgcmVhZG9ubHkgd2F0Y2hUYXNrOiBUYXNrO1xuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IFR5cGVTY3JpcHRQcm9qZWN0T3B0aW9ucykge1xuICAgIHN1cGVyKHtcbiAgICAgIC4uLm9wdGlvbnMsXG5cbiAgICAgIC8vIGRpc2FibGUgLnByb2plbnJjLmpzIGlmIHR5cGVzY3JpcHQgaXMgZW5hYmxlZFxuICAgICAgcHJvamVucmNKczogb3B0aW9ucy5wcm9qZW5yY1RzID8gZmFsc2UgOiBvcHRpb25zLnByb2plbnJjSnMsXG5cbiAgICAgIGplc3RPcHRpb25zOiB7XG4gICAgICAgIC4uLm9wdGlvbnMuamVzdE9wdGlvbnMsXG4gICAgICAgIGplc3RDb25maWc6IHtcbiAgICAgICAgICAuLi5vcHRpb25zLmplc3RPcHRpb25zPy5qZXN0Q29uZmlnLFxuICAgICAgICAgIHRlc3RNYXRjaDogW10sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgdGhpcy5zcmNkaXIgPSBvcHRpb25zLnNyY2RpciA/PyBcInNyY1wiO1xuICAgIHRoaXMubGliZGlyID0gb3B0aW9ucy5saWJkaXIgPz8gXCJsaWJcIjtcblxuICAgIHRoaXMuZG9jZ2VuID0gb3B0aW9ucy5kb2NnZW47XG4gICAgdGhpcy5kb2NzRGlyZWN0b3J5ID0gb3B0aW9ucy5kb2NzRGlyZWN0b3J5ID8/IFwiZG9jcy9cIjtcblxuICAgIHRoaXMuY29tcGlsZVRhc2suZXhlYyhcInRzYyAtLWJ1aWxkXCIpO1xuXG4gICAgdGhpcy53YXRjaFRhc2sgPSB0aGlzLmFkZFRhc2soXCJ3YXRjaFwiLCB7XG4gICAgICBkZXNjcmlwdGlvbjogXCJXYXRjaCAmIGNvbXBpbGUgaW4gdGhlIGJhY2tncm91bmRcIixcbiAgICAgIGV4ZWM6IFwidHNjIC0tYnVpbGQgLXdcIixcbiAgICB9KTtcblxuICAgIHRoaXMudGVzdGRpciA9IG9wdGlvbnMudGVzdGRpciA/PyBcInRlc3RcIjtcbiAgICB0aGlzLmdpdGlnbm9yZS5pbmNsdWRlKGAvJHt0aGlzLnRlc3RkaXJ9L2ApO1xuICAgIHRoaXMubnBtaWdub3JlPy5leGNsdWRlKGAvJHt0aGlzLnRlc3RkaXJ9L2ApO1xuXG4gICAgLy8gaWYgdGhlIHRlc3QgZGlyZWN0b3J5IGlzIHVuZGVyIGBzcmMvYCwgdGhlbiB3ZSB3aWxsIHJ1biBvdXIgdGVzdHMgYWdhaW5zdFxuICAgIC8vIHRoZSBqYXZhc2NyaXB0IGZpbGVzIGFuZCBub3QgbGV0IGplc3QgY29tcGlsZSBpdCBmb3IgdXMuXG4gICAgY29uc3QgY29tcGlsZWRUZXN0cyA9IHRoaXMudGVzdGRpci5zdGFydHNXaXRoKHRoaXMuc3JjZGlyICsgcGF0aC5wb3NpeC5zZXApO1xuXG4gICAgaWYgKG9wdGlvbnMuZW50cnlwb2ludFR5cGVzIHx8IHRoaXMuZW50cnlwb2ludCAhPT0gXCJcIikge1xuICAgICAgY29uc3QgZW50cnlwb2ludFR5cGVzID1cbiAgICAgICAgb3B0aW9ucy5lbnRyeXBvaW50VHlwZXMgPz9cbiAgICAgICAgYCR7cGF0aFxuICAgICAgICAgIC5qb2luKFxuICAgICAgICAgICAgcGF0aC5kaXJuYW1lKHRoaXMuZW50cnlwb2ludCksXG4gICAgICAgICAgICBwYXRoLmJhc2VuYW1lKHRoaXMuZW50cnlwb2ludCwgXCIuanNcIilcbiAgICAgICAgICApXG4gICAgICAgICAgLnJlcGxhY2UoL1xcXFwvZywgXCIvXCIpfS5kLnRzYDtcbiAgICAgIHRoaXMucGFja2FnZS5hZGRGaWVsZChcInR5cGVzXCIsIGVudHJ5cG9pbnRUeXBlcyk7XG4gICAgfVxuXG4gICAgY29uc3QgY29tcGlsZXJPcHRpb25EZWZhdWx0czogVHlwZVNjcmlwdENvbXBpbGVyT3B0aW9ucyA9IHtcbiAgICAgIGFsd2F5c1N0cmljdDogdHJ1ZSxcbiAgICAgIGRlY2xhcmF0aW9uOiB0cnVlLFxuICAgICAgZXNNb2R1bGVJbnRlcm9wOiB0cnVlLFxuICAgICAgZXhwZXJpbWVudGFsRGVjb3JhdG9yczogdHJ1ZSxcbiAgICAgIGlubGluZVNvdXJjZU1hcDogdHJ1ZSxcbiAgICAgIGlubGluZVNvdXJjZXM6IHRydWUsXG4gICAgICBsaWI6IFtcImVzMjAxOVwiXSxcbiAgICAgIG1vZHVsZTogXCJDb21tb25KU1wiLFxuICAgICAgbm9FbWl0T25FcnJvcjogZmFsc2UsXG4gICAgICBub0ZhbGx0aHJvdWdoQ2FzZXNJblN3aXRjaDogdHJ1ZSxcbiAgICAgIG5vSW1wbGljaXRBbnk6IHRydWUsXG4gICAgICBub0ltcGxpY2l0UmV0dXJuczogdHJ1ZSxcbiAgICAgIG5vSW1wbGljaXRUaGlzOiB0cnVlLFxuICAgICAgbm9VbnVzZWRMb2NhbHM6IHRydWUsXG4gICAgICBub1VudXNlZFBhcmFtZXRlcnM6IHRydWUsXG4gICAgICByZXNvbHZlSnNvbk1vZHVsZTogdHJ1ZSxcbiAgICAgIHN0cmljdDogdHJ1ZSxcbiAgICAgIHN0cmljdE51bGxDaGVja3M6IHRydWUsXG4gICAgICBzdHJpY3RQcm9wZXJ0eUluaXRpYWxpemF0aW9uOiB0cnVlLFxuICAgICAgc3RyaXBJbnRlcm5hbDogdHJ1ZSxcbiAgICAgIHRhcmdldDogXCJFUzIwMTlcIixcbiAgICB9O1xuXG4gICAgaWYgKCFvcHRpb25zLmRpc2FibGVUc2NvbmZpZykge1xuICAgICAgdGhpcy50c2NvbmZpZyA9IG5ldyBUeXBlc2NyaXB0Q29uZmlnKFxuICAgICAgICB0aGlzLFxuICAgICAgICBtZXJnZVRzY29uZmlnT3B0aW9ucyhcbiAgICAgICAgICB7XG4gICAgICAgICAgICBpbmNsdWRlOiBbYCR7dGhpcy5zcmNkaXJ9LyoqLyoudHNgXSxcbiAgICAgICAgICAgIC8vIGV4Y2x1ZGU6IFsnbm9kZV9tb2R1bGVzJ10sIC8vIFRPRE86IHNob3VsZG4ndCB3ZSBleGNsdWRlIG5vZGVfbW9kdWxlcz9cbiAgICAgICAgICAgIGNvbXBpbGVyT3B0aW9uczoge1xuICAgICAgICAgICAgICByb290RGlyOiB0aGlzLnNyY2RpcixcbiAgICAgICAgICAgICAgb3V0RGlyOiB0aGlzLmxpYmRpcixcbiAgICAgICAgICAgICAgLi4uY29tcGlsZXJPcHRpb25EZWZhdWx0cyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICBvcHRpb25zLnRzY29uZmlnXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgdHNjb25maWdEZXZGaWxlID0gb3B0aW9ucy50c2NvbmZpZ0RldkZpbGUgPz8gXCJ0c2NvbmZpZy5kZXYuanNvblwiO1xuICAgIHRoaXMudHNjb25maWdEZXYgPSBuZXcgVHlwZXNjcmlwdENvbmZpZyhcbiAgICAgIHRoaXMsXG4gICAgICBtZXJnZVRzY29uZmlnT3B0aW9ucyhcbiAgICAgICAge1xuICAgICAgICAgIGZpbGVOYW1lOiB0c2NvbmZpZ0RldkZpbGUsXG4gICAgICAgICAgaW5jbHVkZTogW1xuICAgICAgICAgICAgUFJPSkVOX1JDLFxuICAgICAgICAgICAgYCR7dGhpcy5zcmNkaXJ9LyoqLyoudHNgLFxuICAgICAgICAgICAgYCR7dGhpcy50ZXN0ZGlyfS8qKi8qLnRzYCxcbiAgICAgICAgICBdLFxuICAgICAgICAgIGV4Y2x1ZGU6IFtcIm5vZGVfbW9kdWxlc1wiXSxcbiAgICAgICAgICBjb21waWxlck9wdGlvbnM6IGNvbXBpbGVyT3B0aW9uRGVmYXVsdHMsXG4gICAgICAgIH0sXG4gICAgICAgIG9wdGlvbnMudHNjb25maWcsXG4gICAgICAgIG9wdGlvbnMudHNjb25maWdEZXZcbiAgICAgIClcbiAgICApO1xuXG4gICAgdGhpcy5naXRpZ25vcmUuaW5jbHVkZShgLyR7dGhpcy5zcmNkaXJ9L2ApO1xuICAgIHRoaXMubnBtaWdub3JlPy5leGNsdWRlKGAvJHt0aGlzLnNyY2Rpcn0vYCk7XG5cbiAgICBpZiAodGhpcy5zcmNkaXIgIT09IHRoaXMubGliZGlyKSB7XG4gICAgICAvLyBzZXBhcmF0ZWQsIGNhbiBpZ25vcmUgdGhlIGVudGlyZSBsaWJkaXJcbiAgICAgIHRoaXMuZ2l0aWdub3JlLmV4Y2x1ZGUoYC8ke3RoaXMubGliZGlyfWApO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBjb2xsb2NhdGVkLCBjYW4gb25seSBpZ25vcmUgdGhlIGNvbXBpbGVkIG91dHB1dFxuICAgICAgdGhpcy5naXRpZ25vcmUuZXhjbHVkZShgLyR7dGhpcy5saWJkaXJ9LyoqLyouanNgKTtcbiAgICAgIHRoaXMuZ2l0aWdub3JlLmV4Y2x1ZGUoYC8ke3RoaXMubGliZGlyfS8qKi8qLmQudHNgKTtcbiAgICB9XG5cbiAgICB0aGlzLm5wbWlnbm9yZT8uaW5jbHVkZShgLyR7dGhpcy5saWJkaXJ9L2ApO1xuXG4gICAgdGhpcy5ucG1pZ25vcmU/LmluY2x1ZGUoYC8ke3RoaXMubGliZGlyfS8qKi8qLmpzYCk7XG4gICAgdGhpcy5ucG1pZ25vcmU/LmluY2x1ZGUoYC8ke3RoaXMubGliZGlyfS8qKi8qLmQudHNgKTtcblxuICAgIHRoaXMuZ2l0aWdub3JlLmV4Y2x1ZGUoXCIvZGlzdC9cIik7XG4gICAgdGhpcy5ucG1pZ25vcmU/LmV4Y2x1ZGUoXCJkaXN0XCIpOyAvLyBqc2lpLXBhY21hayBleHBlY3RzIHRoaXMgdG8gYmUgXCJkaXN0XCIgYW5kIG5vdCBcIi9kaXN0XCIuIG90aGVyd2lzZSBpdCB3aWxsIHRhbXBlciB3aXRoIGl0XG5cbiAgICB0aGlzLm5wbWlnbm9yZT8uZXhjbHVkZShcIi90c2NvbmZpZy5qc29uXCIpO1xuICAgIHRoaXMubnBtaWdub3JlPy5leGNsdWRlKFwiLy5naXRodWIvXCIpO1xuICAgIHRoaXMubnBtaWdub3JlPy5leGNsdWRlKFwiLy52c2NvZGUvXCIpO1xuICAgIHRoaXMubnBtaWdub3JlPy5leGNsdWRlKFwiLy5pZGVhL1wiKTtcbiAgICB0aGlzLm5wbWlnbm9yZT8uZXhjbHVkZShcIi8ucHJvamVucmMuanNcIik7XG4gICAgdGhpcy5ucG1pZ25vcmU/LmV4Y2x1ZGUoXCJ0c2NvbmZpZy50c2J1aWxkaW5mb1wiKTtcblxuICAgIGlmICh0aGlzLmplc3QpIHtcbiAgICAgIGlmIChjb21waWxlZFRlc3RzKSB7XG4gICAgICAgIHRoaXMuYWRkSmVzdENvbXBpbGVkKHRoaXMuamVzdCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmFkZEplc3ROb0NvbXBpbGUodGhpcy5qZXN0KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5lc2xpbnQgPz8gdHJ1ZSkge1xuICAgICAgdGhpcy5lc2xpbnQgPSBuZXcgRXNsaW50KHRoaXMsIHtcbiAgICAgICAgdHNjb25maWdQYXRoOiBgLi8ke3RoaXMudHNjb25maWdEZXYuZmlsZU5hbWV9YCxcbiAgICAgICAgZGlyczogW3RoaXMuc3JjZGlyXSxcbiAgICAgICAgZGV2ZGlyczogW3RoaXMudGVzdGRpciwgXCJidWlsZC10b29sc1wiXSxcbiAgICAgICAgZmlsZUV4dGVuc2lvbnM6IFtcIi50c1wiLCBcIi50c3hcIl0sXG4gICAgICAgIC4uLm9wdGlvbnMuZXNsaW50T3B0aW9ucyxcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLnRzY29uZmlnRXNsaW50ID0gdGhpcy50c2NvbmZpZ0RldjtcbiAgICB9XG5cbiAgICBjb25zdCB0c3ZlciA9IG9wdGlvbnMudHlwZXNjcmlwdFZlcnNpb25cbiAgICAgID8gYEAke29wdGlvbnMudHlwZXNjcmlwdFZlcnNpb259YFxuICAgICAgOiBcIlwiO1xuXG4gICAgdGhpcy5hZGREZXZEZXBzKFxuICAgICAgYHR5cGVzY3JpcHQke3RzdmVyfWAsXG4gICAgICAvLyBAdHlwZXMvbm9kZSB2ZXJzaW9ucyBudW1iZXJzIG1hdGNoIHRoZSBub2RlIHJ1bnRpbWUgdmVyc2lvbnMnIG1ham9yLm1pbm9yLCBob3dldmVyLCBuZXdcbiAgICAgIC8vIHJlbGVhc2VzIGFyZSBvbmx5IGNyZWF0ZWQgd2hlbiBBUEkgY2hhbmdlcyBhcmUgaW5jbHVkZWQgaW4gYSBub2RlIHJlbGVhc2UuLi4gV2UgbWlnaHQgZm9yXG4gICAgICAvLyBleGFtcGxlIGhhdmUgZGVwZW5kZW5jaWVzIHRoYXQgcmVxdWlyZSBgbm9kZSA+PSAxMi4yMmAsIGJ1dCBhcyAxMi4yMSBhbmQgMTIuMjIgZGlkIG5vdFxuICAgICAgLy8gaW5jbHVkZSBBUEkgY2hhbmdlcywgYEB0eXBlcy9ub2RlQDEyLjIwLnhgIGlzIHRoZSBcImNvcnJlY3RcIiB2ZXJzaW9uIHRvIHVzZS4gQXMgaXQgaXMgbm90XG4gICAgICAvLyBwb3NzaWJsZSB0byBlYXNpbHkgZGV0ZXJtaW5lIHRoZSBjb3JyZWN0IHZlcnNpb24gdG8gdXNlLCB3ZSBwaWNrIHVwIHRoZSBsYXRlc3QgdmVyc2lvbi5cbiAgICAgIC8vXG4gICAgICAvLyBBZGRpdGlvbmFsbHksIHdlIGRlZmF1bHQgdG8gdHJhY2tpbmcgdGhlIDEyLnggbGluZSwgYXMgdGhlIGN1cnJlbnQgZWFybGllc3QgTFRTIHJlbGVhc2Ugb2ZcbiAgICAgIC8vIG5vZGUgaXMgMTIueCwgc28gdGhpcyBpcyB3aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBicm9hZGVzdCBjb21wYXRpYmlsaXR5IHdpdGggc3VwcG9ydGVkIG5vZGVcbiAgICAgIC8vIHJ1bnRpbWVzLlxuICAgICAgYEB0eXBlcy9ub2RlQF4ke3NlbXZlci5tYWpvcih0aGlzLnBhY2thZ2UubWluTm9kZVZlcnNpb24gPz8gXCIxMi4wLjBcIil9YFxuICAgICk7XG5cbiAgICAvLyBnZW5lcmF0ZSBzYW1wbGUgY29kZSBpbiBgc3JjYCBhbmQgYGxpYmAgaWYgdGhlc2UgZGlyZWN0b3JpZXMgYXJlIGVtcHR5IG9yIG5vbi1leGlzdGVudC5cbiAgICBpZiAob3B0aW9ucy5zYW1wbGVDb2RlID8/IHRydWUpIHtcbiAgICAgIG5ldyBTYW1wbGVDb2RlKHRoaXMpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmRvY2dlbikge1xuICAgICAgbmV3IFR5cGVkb2NEb2NnZW4odGhpcyk7XG4gICAgfVxuXG4gICAgY29uc3QgcHJvamVucmNUeXBlU2NyaXB0ID0gb3B0aW9ucy5wcm9qZW5yY1RzID8/IGZhbHNlO1xuICAgIGlmIChwcm9qZW5yY1R5cGVTY3JpcHQpIHtcbiAgICAgIG5ldyBQcm9qZW5yY1RzKHRoaXMsIG9wdGlvbnMucHJvamVucmNUc09wdGlvbnMpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUZXN0cyBhcmUgY29tcGlsZWQgdG8gYGxpYi9URVNURElSYCwgc28gd2UgZG9uJ3QgbmVlZCBqZXN0IHRvIGNvbXBpbGUgdGhlbVxuICAgKiBmb3IgdXMuIGp1c3QgcnVuIHRoZW0gZGlyZWN0bHkgZnJvbSBqYXZhc2NyaXB0LlxuICAgKi9cbiAgcHJpdmF0ZSBhZGRKZXN0Q29tcGlsZWQoamVzdDogSmVzdCkge1xuICAgIHRoaXMuYWRkRGV2RGVwcyhcIkB0eXBlcy9qZXN0XCIpO1xuXG4gICAgY29uc3QgdGVzdG91dCA9IHBhdGgucG9zaXgucmVsYXRpdmUodGhpcy5zcmNkaXIsIHRoaXMudGVzdGRpcik7XG4gICAgY29uc3QgbGlidGVzdCA9IHBhdGgucG9zaXguam9pbih0aGlzLmxpYmRpciwgdGVzdG91dCk7XG4gICAgY29uc3Qgc3JjdGVzdCA9IHRoaXMudGVzdGRpcjtcblxuICAgIHRoaXMubnBtaWdub3JlPy5leGNsdWRlKGAvJHtsaWJ0ZXN0fS9gKTtcbiAgICBqZXN0LmFkZFRlc3RNYXRjaChgKiovJHtsaWJ0ZXN0fS8qKi8/KCouKSsoc3BlY3x0ZXN0KS5qcz8oeClgKTtcbiAgICBqZXN0LmFkZFdhdGNoSWdub3JlUGF0dGVybihgLyR7dGhpcy5zcmNkaXJ9L2ApO1xuXG4gICAgY29uc3QgcmVzb2x2ZVNuYXBzaG90UGF0aCA9ICh0ZXN0OiBzdHJpbmcsIGV4dDogc3RyaW5nKSA9PiB7XG4gICAgICBjb25zdCBmdWxscGF0aCA9IHRlc3QucmVwbGFjZShsaWJ0ZXN0LCBzcmN0ZXN0KTtcbiAgICAgIHJldHVybiBwYXRoLmpvaW4oXG4gICAgICAgIHBhdGguZGlybmFtZShmdWxscGF0aCksXG4gICAgICAgIFwiX19zbmFwc2hvdHNfX1wiLFxuICAgICAgICBwYXRoLmJhc2VuYW1lKGZ1bGxwYXRoLCBcIi5qc1wiKSArIFwiLnRzXCIgKyBleHRcbiAgICAgICk7XG4gICAgfTtcblxuICAgIGNvbnN0IHJlc29sdmVUZXN0UGF0aCA9IChzbmFwOiBzdHJpbmcsIGV4dDogc3RyaW5nKSA9PiB7XG4gICAgICBjb25zdCBmaWxlbmFtZSA9IHBhdGguYmFzZW5hbWUoc25hcCwgXCIudHNcIiArIGV4dCkgKyBcIi5qc1wiO1xuICAgICAgY29uc3QgZGlyID0gcGF0aC5kaXJuYW1lKHBhdGguZGlybmFtZShzbmFwKSkucmVwbGFjZShzcmN0ZXN0LCBsaWJ0ZXN0KTtcbiAgICAgIHJldHVybiBwYXRoLmpvaW4oZGlyLCBmaWxlbmFtZSk7XG4gICAgfTtcblxuICAgIGNvbnN0IHJlc29sdmVyID0gbmV3IFRleHRGaWxlKFxuICAgICAgdGhpcyxcbiAgICAgIHBhdGgucG9zaXguam9pbihQUk9KRU5fRElSLCBcImplc3Qtc25hcHNob3QtcmVzb2x2ZXIuanNcIilcbiAgICApO1xuICAgIHJlc29sdmVyLmFkZExpbmUoYC8vICR7VGV4dEZpbGUuUFJPSkVOX01BUktFUn1gKTtcbiAgICByZXNvbHZlci5hZGRMaW5lKCdjb25zdCBwYXRoID0gcmVxdWlyZShcInBhdGhcIik7Jyk7XG4gICAgcmVzb2x2ZXIuYWRkTGluZShgY29uc3QgbGlidGVzdCA9IFwiJHtsaWJ0ZXN0fVwiO2ApO1xuICAgIHJlc29sdmVyLmFkZExpbmUoYGNvbnN0IHNyY3Rlc3Q9IFwiJHtzcmN0ZXN0fVwiO2ApO1xuICAgIHJlc29sdmVyLmFkZExpbmUoXCJtb2R1bGUuZXhwb3J0cyA9IHtcIik7XG4gICAgcmVzb2x2ZXIuYWRkTGluZShcbiAgICAgIGAgIHJlc29sdmVTbmFwc2hvdFBhdGg6ICR7cmVzb2x2ZVNuYXBzaG90UGF0aC50b1N0cmluZygpfSxgXG4gICAgKTtcbiAgICByZXNvbHZlci5hZGRMaW5lKGAgIHJlc29sdmVUZXN0UGF0aDogJHtyZXNvbHZlVGVzdFBhdGgudG9TdHJpbmcoKX0sYCk7XG4gICAgcmVzb2x2ZXIuYWRkTGluZShcbiAgICAgIFwiICB0ZXN0UGF0aEZvckNvbnNpc3RlbmN5Q2hlY2s6IHBhdGguam9pbignc29tZScsICdfX3Rlc3RzX18nLCAnZXhhbXBsZS50ZXN0LmpzJylcIlxuICAgICk7XG4gICAgcmVzb2x2ZXIuYWRkTGluZShcIn07XCIpO1xuXG4gICAgamVzdC5hZGRTbmFwc2hvdFJlc29sdmVyKGAuLyR7cmVzb2x2ZXIucGF0aH1gKTtcbiAgfVxuXG4gIHByaXZhdGUgYWRkSmVzdE5vQ29tcGlsZShqZXN0OiBKZXN0KSB7XG4gICAgdGhpcy5hZGREZXZEZXBzKFwiQHR5cGVzL2plc3RcIiwgXCJ0cy1qZXN0XCIpO1xuXG4gICAgamVzdC5hZGRUZXN0TWF0Y2goYDxyb290RGlyPi8ke3RoaXMuc3JjZGlyfS8qKi9fX3Rlc3RzX18vKiovKi50cz8oeClgKTtcbiAgICBqZXN0LmFkZFRlc3RNYXRjaChcbiAgICAgIGA8cm9vdERpcj4vKCR7dGhpcy50ZXN0ZGlyfXwke3RoaXMuc3JjZGlyfSkvKiovPygqLikrKHNwZWN8dGVzdCkudHM/KHgpYFxuICAgICk7XG5cbiAgICAvLyBhZGQgcmVsZXZhbnQgZGVwc1xuICAgIGplc3QuY29uZmlnLnByZXNldCA9IFwidHMtamVzdFwiO1xuICAgIGplc3QuY29uZmlnLmdsb2JhbHMgPSB7XG4gICAgICBcInRzLWplc3RcIjoge1xuICAgICAgICB0c2NvbmZpZzogdGhpcy50c2NvbmZpZ0Rldi5maWxlTmFtZSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxufVxuXG5jbGFzcyBTYW1wbGVDb2RlIGV4dGVuZHMgQ29tcG9uZW50IHtcbiAgY29uc3RydWN0b3IocHJvamVjdDogVHlwZVNjcmlwdFByb2plY3QpIHtcbiAgICBzdXBlcihwcm9qZWN0KTtcbiAgICBjb25zdCBzcmNDb2RlID0gW1xuICAgICAgXCJleHBvcnQgY2xhc3MgSGVsbG8ge1wiLFxuICAgICAgXCIgIHB1YmxpYyBzYXlIZWxsbygpIHtcIixcbiAgICAgIFwiICAgIHJldHVybiAnaGVsbG8sIHdvcmxkISc7XCIsXG4gICAgICBcIiAgfVwiLFxuICAgICAgXCJ9XCIsXG4gICAgXS5qb2luKFwiXFxuXCIpO1xuXG4gICAgY29uc3QgdGVzdENvZGUgPSBbXG4gICAgICBcImltcG9ydCB7IEhlbGxvIH0gZnJvbSAnLi4vc3JjJztcIixcbiAgICAgIFwiXCIsXG4gICAgICBcInRlc3QoJ2hlbGxvJywgKCkgPT4ge1wiLFxuICAgICAgXCIgIGV4cGVjdChuZXcgSGVsbG8oKS5zYXlIZWxsbygpKS50b0JlKCdoZWxsbywgd29ybGQhJyk7XCIsXG4gICAgICBcIn0pO1wiLFxuICAgIF0uam9pbihcIlxcblwiKTtcblxuICAgIG5ldyBTYW1wbGVEaXIocHJvamVjdCwgcHJvamVjdC5zcmNkaXIsIHtcbiAgICAgIGZpbGVzOiB7XG4gICAgICAgIFwiaW5kZXgudHNcIjogc3JjQ29kZSxcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBuZXcgU2FtcGxlRGlyKHByb2plY3QsIHByb2plY3QudGVzdGRpciwge1xuICAgICAgZmlsZXM6IHtcbiAgICAgICAgXCJoZWxsby50ZXN0LnRzXCI6IHRlc3RDb2RlLFxuICAgICAgfSxcbiAgICB9KTtcbiAgfVxufVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuZXhwb3J0IGNsYXNzIFR5cGVTY3JpcHRBcHBQcm9qZWN0IGV4dGVuZHMgVHlwZVNjcmlwdFByb2plY3Qge1xuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBUeXBlU2NyaXB0UHJvamVjdE9wdGlvbnMpIHtcbiAgICBzdXBlcih7XG4gICAgICBhbGxvd0xpYnJhcnlEZXBlbmRlbmNpZXM6IGZhbHNlLFxuICAgICAgcmVsZWFzZVdvcmtmbG93OiBmYWxzZSxcbiAgICAgIGVudHJ5cG9pbnQ6IFwiXCIsIC8vIFwibWFpblwiIGlzIG5vdCBuZWVkZWQgaW4gdHlwZXNjcmlwdCBhcHBzXG4gICAgICBwYWNrYWdlOiBmYWxzZSxcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgfSk7XG4gIH1cbn1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuZXhwb3J0IGNsYXNzIFR5cGVTY3JpcHRMaWJyYXJ5UHJvamVjdCBleHRlbmRzIFR5cGVTY3JpcHRQcm9qZWN0IHt9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuZXhwb3J0IGludGVyZmFjZSBUeXBlU2NyaXB0TGlicmFyeVByb2plY3RPcHRpb25zXG4gIGV4dGVuZHMgVHlwZVNjcmlwdFByb2plY3RPcHRpb25zIHt9XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZXJnZVRzY29uZmlnT3B0aW9ucyhcbiAgLi4ub3B0aW9uczogKFR5cGVzY3JpcHRDb25maWdPcHRpb25zIHwgdW5kZWZpbmVkKVtdXG4pOiBUeXBlc2NyaXB0Q29uZmlnT3B0aW9ucyB7XG4gIGNvbnN0IGRlZmluZWRPcHRpb25zID0gb3B0aW9ucy5maWx0ZXIoQm9vbGVhbikgYXMgVHlwZXNjcmlwdENvbmZpZ09wdGlvbnNbXTtcbiAgcmV0dXJuIGRlZmluZWRPcHRpb25zLnJlZHVjZTxUeXBlc2NyaXB0Q29uZmlnT3B0aW9ucz4oXG4gICAgKHByZXZpb3VzLCBjdXJyZW50KSA9PiAoe1xuICAgICAgLi4ucHJldmlvdXMsXG4gICAgICAuLi5jdXJyZW50LFxuICAgICAgaW5jbHVkZTogWy4uLihwcmV2aW91cy5pbmNsdWRlID8/IFtdKSwgLi4uKGN1cnJlbnQuaW5jbHVkZSA/PyBbXSldLFxuICAgICAgZXhjbHVkZTogWy4uLihwcmV2aW91cy5leGNsdWRlID8/IFtdKSwgLi4uKGN1cnJlbnQuZXhjbHVkZSA/PyBbXSldLFxuICAgICAgY29tcGlsZXJPcHRpb25zOiB7XG4gICAgICAgIC4uLnByZXZpb3VzLmNvbXBpbGVyT3B0aW9ucyxcbiAgICAgICAgLi4uY3VycmVudC5jb21waWxlck9wdGlvbnMsXG4gICAgICB9LFxuICAgIH0pLFxuICAgIHsgY29tcGlsZXJPcHRpb25zOiB7fSB9XG4gICk7XG59XG4iXX0=