@mnaoumov/typescript-dev-toolkit 5.0.0 → 5.2.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 (84) hide show
  1. package/bundlers/esbuild-impl/svelte-preprocessor/package.json +6 -0
  2. package/dist/lib/cjs/bulk-concurrency.cjs +49 -0
  3. package/dist/lib/cjs/bulk-concurrency.d.cts +14 -0
  4. package/dist/lib/cjs/bundlers/esbuild-impl/index.cjs +4 -1
  5. package/dist/lib/cjs/bundlers/esbuild-impl/index.d.cts +1 -0
  6. package/dist/lib/cjs/bundlers/esbuild-impl/svelte-preprocessor.cjs +152 -0
  7. package/dist/lib/cjs/bundlers/esbuild-impl/svelte-preprocessor.d.cts +95 -0
  8. package/dist/lib/cjs/bundlers/esbuild-impl/svelte-wrapper-plugin.cjs +4 -3
  9. package/dist/lib/cjs/bundlers/esbuild-impl/svelte-wrapper-plugin.d.cts +1 -1
  10. package/dist/lib/cjs/docs-site/docs-links.cjs +3 -2
  11. package/dist/lib/cjs/docs-site/og-images.cjs +3 -2
  12. package/dist/lib/cjs/index.cjs +4 -1
  13. package/dist/lib/cjs/index.d.cts +1 -0
  14. package/dist/lib/cjs/linters/eslint-config.cjs +2 -1
  15. package/dist/lib/cjs/linters/eslint-no-restricted-syntax.cjs +5 -1
  16. package/dist/lib/cjs/linters/eslint-rules/import-fix.cjs +116 -0
  17. package/dist/lib/cjs/linters/eslint-rules/import-fix.d.cts +49 -0
  18. package/dist/lib/cjs/linters/eslint-rules/in-house-plugin.cjs +5 -1
  19. package/dist/lib/cjs/linters/eslint-rules/index.cjs +10 -1
  20. package/dist/lib/cjs/linters/eslint-rules/index.d.cts +3 -0
  21. package/dist/lib/cjs/linters/eslint-rules/prefer-dedent.cjs +189 -0
  22. package/dist/lib/cjs/linters/eslint-rules/prefer-dedent.d.cts +10 -0
  23. package/dist/lib/cjs/linters/eslint-rules/prefer-noop-async.cjs +57 -3
  24. package/dist/lib/cjs/linters/eslint-rules/readonly-member-arrays.cjs +130 -0
  25. package/dist/lib/cjs/linters/eslint-rules/readonly-member-arrays.d.cts +6 -0
  26. package/dist/lib/cjs/linters/markdownlint.cjs +8 -2
  27. package/dist/lib/cjs/linters/over-exposure.cjs +14 -3
  28. package/dist/lib/cjs/linters/over-exposure.d.cts +3 -1
  29. package/dist/lib/cjs/nano-staged-config.cjs +24 -3
  30. package/dist/lib/cjs/nano-staged-config.d.cts +4 -0
  31. package/dist/lib/cjs/test-runners/auto.cjs +1 -1
  32. package/dist/lib/cjs/test-runners/auto.d.cts +5 -0
  33. package/dist/lib/cjs/test-runners/forwarded-arguments.cjs +50 -0
  34. package/dist/lib/cjs/test-runners/forwarded-arguments.d.cts +49 -0
  35. package/dist/lib/cjs/test-runners/index.cjs +4 -1
  36. package/dist/lib/cjs/test-runners/index.d.cts +1 -0
  37. package/dist/lib/cjs/test-runners/jest.cjs +16 -3
  38. package/dist/lib/cjs/test-runners/jest.d.cts +5 -0
  39. package/dist/lib/cjs/test-runners/vitest.cjs +111 -5
  40. package/dist/lib/cjs/test-runners/vitest.d.cts +5 -0
  41. package/dist/lib/esm/bulk-concurrency.d.mts +14 -0
  42. package/dist/lib/esm/bulk-concurrency.mjs +15 -0
  43. package/dist/lib/esm/bundlers/esbuild-impl/index.d.mts +1 -0
  44. package/dist/lib/esm/bundlers/esbuild-impl/index.mjs +3 -1
  45. package/dist/lib/esm/bundlers/esbuild-impl/svelte-preprocessor.d.mts +95 -0
  46. package/dist/lib/esm/bundlers/esbuild-impl/svelte-preprocessor.mjs +126 -0
  47. package/dist/lib/esm/bundlers/esbuild-impl/svelte-wrapper-plugin.d.mts +1 -1
  48. package/dist/lib/esm/bundlers/esbuild-impl/svelte-wrapper-plugin.mjs +4 -3
  49. package/dist/lib/esm/docs-site/docs-links.mjs +3 -2
  50. package/dist/lib/esm/docs-site/og-images.mjs +3 -2
  51. package/dist/lib/esm/index.d.mts +1 -0
  52. package/dist/lib/esm/index.mjs +3 -1
  53. package/dist/lib/esm/linters/eslint-config.mjs +2 -1
  54. package/dist/lib/esm/linters/eslint-no-restricted-syntax.mjs +5 -1
  55. package/dist/lib/esm/linters/eslint-rules/import-fix.d.mts +49 -0
  56. package/dist/lib/esm/linters/eslint-rules/import-fix.mjs +90 -0
  57. package/dist/lib/esm/linters/eslint-rules/in-house-plugin.mjs +5 -1
  58. package/dist/lib/esm/linters/eslint-rules/index.d.mts +3 -0
  59. package/dist/lib/esm/linters/eslint-rules/index.mjs +7 -1
  60. package/dist/lib/esm/linters/eslint-rules/prefer-dedent.d.mts +10 -0
  61. package/dist/lib/esm/linters/eslint-rules/prefer-dedent.mjs +168 -0
  62. package/dist/lib/esm/linters/eslint-rules/prefer-noop-async.mjs +61 -3
  63. package/dist/lib/esm/linters/eslint-rules/readonly-member-arrays.d.mts +6 -0
  64. package/dist/lib/esm/linters/eslint-rules/readonly-member-arrays.mjs +106 -0
  65. package/dist/lib/esm/linters/markdownlint.mjs +8 -2
  66. package/dist/lib/esm/linters/over-exposure.d.mts +3 -1
  67. package/dist/lib/esm/linters/over-exposure.mjs +16 -3
  68. package/dist/lib/esm/nano-staged-config.d.mts +4 -0
  69. package/dist/lib/esm/nano-staged-config.mjs +24 -3
  70. package/dist/lib/esm/test-runners/auto.d.mts +5 -0
  71. package/dist/lib/esm/test-runners/auto.mjs +1 -1
  72. package/dist/lib/esm/test-runners/forwarded-arguments.d.mts +49 -0
  73. package/dist/lib/esm/test-runners/forwarded-arguments.mjs +26 -0
  74. package/dist/lib/esm/test-runners/index.d.mts +1 -0
  75. package/dist/lib/esm/test-runners/index.mjs +3 -1
  76. package/dist/lib/esm/test-runners/jest.d.mts +5 -0
  77. package/dist/lib/esm/test-runners/jest.mjs +16 -3
  78. package/dist/lib/esm/test-runners/vitest.d.mts +5 -0
  79. package/dist/lib/esm/test-runners/vitest.mjs +105 -6
  80. package/linters/eslint-rules/import-fix/package.json +6 -0
  81. package/linters/eslint-rules/prefer-dedent/package.json +6 -0
  82. package/linters/eslint-rules/readonly-member-arrays/package.json +6 -0
  83. package/package.json +5 -2
  84. package/test-runners/forwarded-arguments/package.json +6 -0
@@ -41,14 +41,35 @@ function getNanoStagedConfig(options) {
41
41
  const hasAllSharedScripts = [SPELLCHECK_SCRIPT_NAME, ...Object.values(WRITER_SCRIPT_NAMES).flat()].every((scriptName) => scriptNames.has(scriptName));
42
42
  const additionalWriterTasks = options?.additionalWriterTasks ?? {};
43
43
  if (hasAllSharedScripts && Object.keys(additionalWriterTasks).length === 0) {
44
- return obsidianDevUtilsConfig;
44
+ return applyBulkBudget(obsidianDevUtilsConfig);
45
45
  }
46
46
  const writerTasks = toWriterTasks((scriptName) => scriptNames.has(scriptName));
47
47
  const duplicatePattern = Object.keys(additionalWriterTasks).find((pattern) => Object.hasOwn(writerTasks, pattern));
48
48
  if (duplicatePattern !== void 0) {
49
49
  throw new Error(`nano-staged writer pattern '${duplicatePattern}' is already a shared writer pattern.`);
50
50
  }
51
- return partitionSpellcheck({ ...writerTasks, ...additionalWriterTasks }, scriptNames.has(SPELLCHECK_SCRIPT_NAME));
51
+ return applyBulkBudget(partitionSpellcheck({ ...writerTasks, ...additionalWriterTasks }, scriptNames.has(SPELLCHECK_SCRIPT_NAME)));
52
+ }
53
+ function applyBulkBudget(config) {
54
+ const budget = process.env["BULK_CORES"]?.trim() ?? "";
55
+ if (!/^[1-9]\d*$/.test(budget)) {
56
+ return config;
57
+ }
58
+ const commands = [];
59
+ const serialConfig = {};
60
+ for (const [pattern, task] of Object.entries(config)) {
61
+ serialConfig[pattern] = (context) => {
62
+ commands.push(...task(context));
63
+ return [];
64
+ };
65
+ }
66
+ const collectAll = serialConfig["*"];
67
+ delete serialConfig["*"];
68
+ serialConfig["*"] = (context) => {
69
+ collectAll?.(context);
70
+ return commands.splice(0);
71
+ };
72
+ return serialConfig;
52
73
  }
53
74
  function batchCommandArguments(prefix, commandArguments) {
54
75
  const emptyLength = getEffectiveCommandLineLength("");
@@ -120,4 +141,4 @@ export {
120
141
  getNanoStagedConfig,
121
142
  obsidianDevUtilsConfig
122
143
  };
123
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL25hbm8tc3RhZ2VkLWNvbmZpZy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIFNoYXJlZCBuYW5vLXN0YWdlZCBjb25maWd1cmF0aW9uIGZvciBwcmUtY29tbWl0IGhvb2tzLlxuICovXG5cbmltcG9ydCB7XG4gIGlzQWJzb2x1dGUsXG4gIHJlbGF0aXZlXG59IGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgcHJvY2VzcyBmcm9tICdub2RlOnByb2Nlc3MnO1xuXG5pbXBvcnQge1xuICBpc0VudlZhcmlhYmxlT2ZmLFxuICBsb2FkRW52RmlsZUlmRXhpc3RzXG59IGZyb20gJy4vZW52LXRvZ2dsZS50cyc7XG5pbXBvcnQge1xuICBnZXRFZmZlY3RpdmVDb21tYW5kTGluZUxlbmd0aCxcbiAgZ2V0TWF4QmF0Y2hDb21tYW5kTGVuZ3RoXG59IGZyb20gJy4vZXhlYy50cyc7XG5pbXBvcnQgeyByZWFkUGFja2FnZUpzb25TeW5jIH0gZnJvbSAnLi9ucG0udHMnO1xuaW1wb3J0IHsgZ2V0UGFja2FnZU1hbmFnZXJSdW5Db21tYW5kIH0gZnJvbSAnLi9wYWNrYWdlLW1hbmFnZXIudHMnO1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayBnZXROYW5vU3RhZ2VkQ29uZmlnfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHZXROYW5vU3RhZ2VkQ29uZmlnT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBSZXBvLXNwZWNpZmljIGZpbGUtcmV3cml0aW5nIHRhc2tzLCBrZXllZCBieSB0aGUgbmFuby1zdGFnZWQgcGF0dGVybiB0aGF0IGNsYWltcyB0aGVpciBmaWxlcy5cbiAgICpcbiAgICogRWFjaCBnZXRzIHNwZWxsY2hlY2sgYXBwZW5kZWQgYW5kIGl0cyBmaWxlcyByZW1vdmVkIGZyb20gdGhlIHNwZWxsY2hlY2stb25seSBrZXksIGV4YWN0bHkgbGlrZSB0aGUgc2hhcmVkXG4gICAqIHdyaXRlcnMuIEEgcGF0dGVybiBtdXN0IG5vdCBjb250YWluIGAvYCwgYW5kIG11c3Qgbm90IHJlcGVhdCBhIHNoYXJlZCB3cml0ZXIgcGF0dGVybi4gRWFjaCBjb21tYW5kIGlzIGFcbiAgICogcHJlZml4IHRoZSBzdGFnZWQgcGF0aHMgYXJlIGFwcGVuZGVkIHRvLCBpbiBiYXRjaGVzLCBsaWtlIHRoZSBzaGFyZWQgb25lcyAoYG5wbSBydW4gbGludDpmaXggLS1gKS5cbiAgICovXG4gIHJlYWRvbmx5IGFkZGl0aW9uYWxXcml0ZXJUYXNrcz86IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHJlYWRvbmx5IHN0cmluZ1tdPj47XG59XG5cbi8qKlxuICogQSBuYW5vLXN0YWdlZCBjb25maWd1cmF0aW9uIHdob3NlIGV2ZXJ5IGtleSBpcyBhIHtAbGluayBOYW5vU3RhZ2VkVGFza30uXG4gKi9cbmV4cG9ydCB0eXBlIE5hbm9TdGFnZWRDb25maWcgPSBSZWNvcmQ8c3RyaW5nLCBOYW5vU3RhZ2VkVGFzaz47XG5cbi8qKlxuICogQSBmdW5jdGlvbi12YWx1ZWQgbmFuby1zdGFnZWQgdGFzazogaXQgcmVjZWl2ZXMgdGhlIHN0YWdlZCBmaWxlcyBpdHMgcGF0dGVybiBjbGFpbXMgYW5kIHJldHVybnMgdGhlXG4gKiBjb21tYW5kcyB0byBydW4gb3ZlciB0aGVtLCBpbiBvcmRlci5cbiAqL1xuZXhwb3J0IHR5cGUgTmFub1N0YWdlZFRhc2sgPSAoY29udGV4dDogTmFub1N0YWdlZFRhc2tDb250ZXh0KSA9PiBzdHJpbmdbXTtcblxuLyoqXG4gKiBXaGF0IG5hbm8tc3RhZ2VkIHBhc3NlcyB0byBhIGZ1bmN0aW9uLXZhbHVlZCB0YXNrLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE5hbm9TdGFnZWRUYXNrQ29udGV4dCB7XG4gIC8qKlxuICAgKiBUaGUgYWJzb2x1dGUgcGF0aHMgb2YgdGhlIHN0YWdlZCBmaWxlcyB0aGUgdGFzaydzIHBhdHRlcm4gY2xhaW1zLlxuICAgKi9cbiAgcmVhZG9ubHkgZmlsZW5hbWVzOiByZWFkb25seSBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBUaGUgYDxtYW5hZ2VyPiBydW5gIHByZWZpeCBldmVyeSB0YXNrIGJlbG93IGlzIGJ1aWx0IG9uLCByZXNvbHZlZCBvbmNlIGZvciB0aGUgcHJvY2Vzcy5cbiAqXG4gKiBEZXRlY3Rpb24gcHJvYmVzIGZvciBhIGxvY2tmaWxlIGJlc2lkZSBgcGFja2FnZS5qc29uYCwgc28gaXQgaXMgYSBoYW5kZnVsIG9mIGBleGlzdHNTeW5jYCBjYWxscyBhbmRcbiAqIG5vdGhpbmcgbW9yZSBcdTIwMTQgbm8gYC5lbnZgIHJlYWQgYW5kIG5vIGBwcm9jZXNzLmV4aXRgLCB3aGljaCBpcyB3aGF0IGxldHMgaXQgc2l0IGF0IG1vZHVsZSBzY29wZS5cbiAqL1xuY29uc3QgUEFDS0FHRV9NQU5BR0VSX1JVTl9DT01NQU5EID0gZ2V0UGFja2FnZU1hbmFnZXJSdW5Db21tYW5kKCkuam9pbignICcpO1xuXG5jb25zdCBTUEVMTENIRUNLX1NDUklQVF9OQU1FID0gJ3NwZWxsY2hlY2snO1xuXG5jb25zdCBTUEVMTENIRUNLX0NPTU1BTkQgPSB0b1NjcmlwdENvbW1hbmQoU1BFTExDSEVDS19TQ1JJUFRfTkFNRSk7XG5cbi8qKlxuICogUm9vbSBsZWZ0IGluIGV2ZXJ5IGJhdGNoIGZvciB0aGUgcmVzb2x2ZWQgcGF0aCBvZiB0aGUgcGFja2FnZSBtYW5hZ2VyJ3MgZXhlY3V0YWJsZS5cbiAqXG4gKiBuYW5vLXN0YWdlZCBydW5zIGBucG1gIGFzIHRoZSBhYnNvbHV0ZSBwYXRoIG9mIGBucG0uY21kYCAoYDxjb21zcGVjPiAvRCAvUyAvQyBcIjxwYXRoPlwiIFwiPGFyZz5cIiBcdTIwMjZgKSwgd2hpY2hcbiAqIHRoZSBiYXRjaCBjYW5ub3Qgc2VlLCBzbyBhIGZ1bGwgV2luZG93cyBgTUFYX1BBVEhgIGlzIHNldCBhc2lkZSBmb3IgaXQuXG4gKi9cbmNvbnN0IEVYRUNVVEFCTEVfUEFUSF9SRVNFUlZFID0gMjYwO1xuXG4vKipcbiAqIFRoZSBjaGFyYWN0ZXJzIG5hbm8tc3RhZ2VkJ3MgY29tbWFuZCB0b2tlbml6ZXIgY2Fubm90IGNhcnJ5IGluc2lkZSBhbiBhcmd1bWVudC5cbiAqXG4gKiBBIGZ1bmN0aW9uLXZhbHVlZCB0YXNrIHJldHVybnMgaXRzIGNvbW1hbmRzIGFzIFNUUklOR1MsIGFuZCBuYW5vLXN0YWdlZCBzcGxpdHMgZWFjaCBvbmUgd2l0aFxuICogYHN0cmluZ0FyZ3ZUb0FycmF5YCwgd2hpY2ggZW1pdHMgYSBxdW90ZWQgdG9rZW4gdHdpY2UgKG9uY2UgYmFyZSwgb25jZSB3aXRoIGl0cyBxdW90ZXMpIGFuZCBoYXMgbm8gZXNjYXBlLlxuICogU28gYSBwYXRoIGhvbGRpbmcgd2hpdGVzcGFjZSBvciBhIHF1b3RlIGNhbm5vdCBiZSBwYXNzZWQgYXMgaXRzZWxmLlxuICovXG5jb25zdCBUT0tFTklaRVJfVU5TQUZFX0NIQVJBQ1RFUlNfUkVHX0VYUCA9IC9bXFxzXCInXS9nO1xuXG4vKipcbiAqIFRoZSBucG0gc2NyaXB0cyB0aGF0IFJFV1JJVEUgYSBzdGFnZWQgZmlsZSwgaW4gdGhlIG9yZGVyIHRoZXkgcnVuLCBrZXllZCBieSB0aGUgbmFuby1zdGFnZWQgcGF0dGVybiB0aGF0XG4gKiBjbGFpbXMgaXQuXG4gKlxuICogYGxpbnQ6Zml4YCBhbmQgYGZvcm1hdGAgYm90aCByZXdyaXRlIHRoZSBmaWxlLCBzbyB0aGV5IGhhdmUgdG8gc2hhcmUgb25lIGtleTogbmFuby1zdGFnZWQgcnVucyBpdHNcbiAqIHBlci1wYXR0ZXJuIGdyb3VwcyB1bmRlciBgUHJvbWlzZS5hbGxgIChgcnVuKClgIGluIGBuYW5vLXN0YWdlZC9saWIvY21kLXJ1bm5lci5qc2ApLCBhbmQgc2VxdWVuY2VzIG9ubHlcbiAqIHRoZSBjb21tYW5kcyBJTlNJREUgYSBzaW5nbGUga2V5J3MgYXJyYXkgKGBydW5UYXNrKClgLCBhIGBmb3IgLi4uIG9mIGF3YWl0YCkuIFNwbGl0IGFjcm9zcyB0d28ga2V5cyB0aGV5XG4gKiByYWNlLCB3aGljaGV2ZXIgZmluaXNoZXMgbGFzdCB3aW5zLCBhbmQgdGhlIGNvbW1pdCBzdGFnZXMgYnl0ZXMgdGhhdCBuZWl0aGVyIHRvb2wgd291bGQgaGF2ZSBwcm9kdWNlZCBvblxuICogaXRzIG93bi5cbiAqXG4gKiBTbyBkbyBOT1QgZXhwcmVzcyBhIGRpcmVjdG9yeSBleGNsdXNpb24gYnkgZ2l2aW5nIG9uZSBvZiB0aGVzZSB0d28gaXRzIG93biBuZWdhdGVkIGtleSAtLSB0aGF0IHNpbGVudGx5XG4gKiB0YWtlcyB0aGUgb3JkZXJpbmcgYXdheS4gQW4gZXhjbHVzaW9uIGJlbG9uZ3MgaW4gdGhlIGV4Y2x1ZGVkIHRvb2wncyBvd24gY29uZmlnLCB3aGVyZSBFU0xpbnQnc1xuICogYGdsb2JhbElnbm9yZXNgIGFscmVhZHkgcHV0cyBpdDogYSBwYXRoIEVTTGludCBpZ25vcmVzIGlzIHJlcG9ydGVkIGFzIGEgd2FybmluZyBhbmQgZXhpdHMgMCB3aGVuIGl0IGlzXG4gKiBwYXNzZWQgZXhwbGljaXRseSwgc28gaXQgY29zdHMgYSBjb25zb2xlIGxpbmUgcmF0aGVyIHRoYW4gYSBmYWlsZWQgY29tbWl0IGFuZCBuZWVkcyBubyBrZXkgaGVyZS5cbiAqL1xuY29uc3QgV1JJVEVSX1NDUklQVF9OQU1FUzogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgcmVhZG9ubHkgc3RyaW5nW10+PiA9IHtcbiAgJyoue3RzLHRzeCxtdHN9JzogWydsaW50OmZpeCcsICdmb3JtYXQnXSxcbiAgJyoubWQnOiBbJ2xpbnQ6bWQ6Zml4J11cbn07XG5cbmNvbnN0IFdSSVRFUl9UQVNLUzogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgcmVhZG9ubHkgc3RyaW5nW10+PiA9IHRvV3JpdGVyVGFza3MoKCkgPT4gdHJ1ZSk7XG5cbi8qKlxuICogTmFuby1zdGFnZWQgY29uZmlndXJhdGlvbiB0aGF0IHJ1bnMgZmlsZS1iYXNlZCBsaW50LCBmb3JtYXQsIGFuZCBzcGVsbGNoZWNrIG9uIHN0YWdlZCBmaWxlcy5cbiAqXG4gKiBPbmx5IGluY2x1ZGVzIHRvb2xzIHRoYXQgY2FuIG9wZXJhdGUgb24gaW5kaXZpZHVhbCBmaWxlcy4gV2hvbGUtcHJvamVjdCBjaGVja3NcbiAqIChUeXBlU2NyaXB0IGNvbXBpbGF0aW9uLCB1bml0IHRlc3RzKSBhcmUgbGVmdCB0byBDSS5cbiAqXG4gKiBDb21tYW5kcyBydW4gdGhyb3VnaCB0aGUgcGFja2FnZSBtYW5hZ2VyIHRoYXQgb3ducyB0aGUgdHJlZSBcdTIwMTQgYG5wbSBydW4gLi4uIC0tYCwgYGJ1biBydW4gLi4uIC0tYCwgYW5kXG4gKiBzbyBvbiBcdTIwMTQgc28gbmFuby1zdGFnZWQgZmlsZSBwYXRocyBhcmUgZm9yd2FyZGVkIGFzIENMSSBhcmd1bWVudHMsIGJhdGNoZWQgdG8gZml0IHRoZSBjb21tYW5kIGxpbmUgKHNlZVxuICogYHRvQmF0Y2hlZFRhc2tgKS5cbiAqXG4gKiBTcGVsbGNoZWNrIGlzIHBhcnRpdGlvbmVkIGFjcm9zcyB0aGUga2V5cyByYXRoZXIgdGhhbiBnaXZlbiBhIGNhdGNoLWFsbCBgJyonYCBrZXkgKHNlZVxuICogYHBhcnRpdGlvblNwZWxsY2hlY2tgKS4gQSByZXBvIGFkZGluZyBhIGZpbGUtcmV3cml0aW5nIHRhc2sgb2YgaXRzIG93biBwYXNzZXMgaXQgdG9cbiAqIHtAbGluayBnZXROYW5vU3RhZ2VkQ29uZmlnfSBhcyBgYWRkaXRpb25hbFdyaXRlclRhc2tzYCByYXRoZXIgdGhhbiBzcHJlYWRpbmcgdGhpcyBvYmplY3QgYW5kIGFkZGluZyBhIGtleSxcbiAqIHdoaWNoIHdvdWxkIHJlaW50cm9kdWNlIHRoZSBvdmVybGFwIGZvciB0aGF0IGtleSdzIGZpbGVzLlxuICovXG5leHBvcnQgY29uc3Qgb2JzaWRpYW5EZXZVdGlsc0NvbmZpZzogTmFub1N0YWdlZENvbmZpZyA9IHBhcnRpdGlvblNwZWxsY2hlY2soV1JJVEVSX1RBU0tTLCB0cnVlKTtcblxuY29uc3QgTkFOT19TVEFHRURfRU5WX1ZBUklBQkxFID0gJ05BTk9fU1RBR0VEJztcblxuLyoqXG4gKiBSZXNvbHZlcyB0aGUgbmFuby1zdGFnZWQgY29uZmlndXJhdGlvbiB0byB1c2UsIGhvbm9yaW5nIGEgcGVyLWRldmVsb3BlciBvcHQtb3V0LlxuICpcbiAqIExvYWRzIGEgZ2l0aWdub3JlZCBgLmVudmAgaWYgcHJlc2VudCwgdGhlbiBcdTIwMTQgd2hlbiBgTkFOT19TVEFHRURgIGlzIHNldCB0byBhbiBvZmYgdmFsdWUgKGAwYCwgYGZhbHNlYCxcbiAqIGBvZmZgLCBvciBgbm9gKSBcdTIwMTQgcHJpbnRzIGEgbm90aWNlIGFuZCBleGl0cyB0aGUgcHJvY2VzcyBzdWNjZXNzZnVsbHkgc28gdGhlIHByZS1jb21taXQgY2hlY2tzIGFyZVxuICogc2tpcHBlZC4gVGhpcyBtaXJyb3JzIGh1c2t5J3Mgb3duIGBIVVNLWT0wYCBzd2l0Y2gsIGJ1dCBzY29wZWQgdG8gdGhlIG5hbm8tc3RhZ2VkIHN0ZXAgKHNvIHRoZVxuICogY29tbWl0LW1zZyBob29rIHN0aWxsIHJ1bnMpLiBPdGhlcndpc2UgaXQgcmV0dXJucyB7QGxpbmsgb2JzaWRpYW5EZXZVdGlsc0NvbmZpZ30sIG9yIFx1MjAxNCB3aGVuXG4gKiBgYWRkaXRpb25hbFdyaXRlclRhc2tzYCBhcmUgZ2l2ZW4gXHUyMDE0IHRoZSBzYW1lIGNvbmZpZ3VyYXRpb24gcmUtcGFydGl0aW9uZWQgd2l0aCB0aG9zZSB3cml0ZXJzIGFkZGVkLlxuICpcbiAqIEEgc2hhcmVkIHRhc2sgd2hvc2UgbnBtIHNjcmlwdCB0aGUgcHJvamVjdCdzIGBwYWNrYWdlLmpzb25gIGRvZXMgbm90IGRlY2xhcmUgaXMgbGVmdCBvdXQsIHNvIGEgcHJvamVjdFxuICogd2l0aG91dCwgc2F5LCBtYXJrZG93bmxpbnQgZG9lcyBub3QgZmFpbCBpdHMgZmlyc3QgY29tbWl0IHRoYXQgc3RhZ2VzIGEgYC5tZGAgZmlsZSBvbiBhIG1pc3Npbmcgc2NyaXB0LiBBXG4gKiB3cml0ZXIgcGF0dGVybiBsZWZ0IHdpdGggbm8gd3JpdGVyIGlzIGRyb3BwZWQsIGFuZCBzcGVsbGNoZWNrIHJ1bnMgb25seSB3aGVuIGBzcGVsbGNoZWNrYCBpcyBkZWNsYXJlZCwgaW5cbiAqIHdoaWNoIGNhc2UgaXRzIGZpbGVzIGZhbGwgdG8gdGhlIHNwZWxsY2hlY2stb25seSBrZXkuIFRoZSBgYWRkaXRpb25hbFdyaXRlclRhc2tzYCBhcmUgdGhlIGNhbGxlcidzIG93biBhbmRcbiAqIGFyZSBrZXB0IGFzIGdpdmVuLlxuICpcbiAqIGBOQU5PX1NUQUdFRGAgaXMgbm90IGFuIG5wbSBzY3JpcHQsIHNvIGl0IGNhcnJpZXMgaXRzIG93biBzd2l0Y2ggcmF0aGVyIHRoYW4gdGhlIHNjcmlwdC1uYW1lLWRlcml2ZWQgb25lXG4gKiBldmVyeSBucG0gc2NyaXB0IGdldHMgXHUyMDE0IGJ1dCBib3RoIHNoYXJlIHRoZSBzYW1lIG5vdGlvbiBvZiBhbiBvZmYgdmFsdWUsIHZpYSB7QGxpbmsgaXNFbnZWYXJpYWJsZU9mZn0uXG4gKlxuICogVGhpcyBpcyBhIGZ1bmN0aW9uIHJhdGhlciB0aGFuIG1vZHVsZS1sZXZlbCBjb2RlIHNvIGltcG9ydGluZyB0aGUgcGFja2FnZSBiYXJyZWwgbmV2ZXIgdHJpZ2dlcnMgdGhlXG4gKiBgLmVudmAgcmVhZCBvciB0aGUgcHJvY2VzcyBleGl0OyBjYWxsIGl0IGZyb20gdGhlIHRoaW4gYHNjcmlwdHMvbmFuby1zdGFnZWQtY29uZmlnLnRzYCBlbnRyeS4gUmVzb2x2aW5nIHRoZVxuICogcGFja2FnZSBtYW5hZ2VyIGlzIHRoZSBvbmUgdGhpbmcgdGhhdCBkb2VzIHJ1biBhdCBtb2R1bGUgc2NvcGUsIGFuZCBpdCBkb2VzIG5laXRoZXIgb2YgdGhvc2UgdHdvXG4gKiB0aGluZ3MgXHUyMDE0IGl0IG9ubHkgcHJvYmVzIGZvciBhIGxvY2tmaWxlLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIG9wdGlvbmFsIG9wdGlvbnMuXG4gKiBAcmV0dXJucyBUaGUgbmFuby1zdGFnZWQgdGFzayBjb25maWd1cmF0aW9uLiBEb2VzIG5vdCByZXR1cm4gd2hlbiB0aGUgb3B0LW91dCBpcyBhY3RpdmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXROYW5vU3RhZ2VkQ29uZmlnKG9wdGlvbnM/OiBHZXROYW5vU3RhZ2VkQ29uZmlnT3B0aW9ucyk6IE5hbm9TdGFnZWRDb25maWcge1xuICBsb2FkRW52RmlsZUlmRXhpc3RzKCk7XG5cbiAgaWYgKGlzRW52VmFyaWFibGVPZmYoTkFOT19TVEFHRURfRU5WX1ZBUklBQkxFKSkge1xuICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKGBuYW5vLXN0YWdlZDogc2tpcHBlZCAoJHtOQU5PX1NUQUdFRF9FTlZfVkFSSUFCTEV9IGlzIG9mZikuXFxuYCk7XG4gICAgcHJvY2Vzcy5leGl0KDApO1xuICB9XG5cbiAgY29uc3Qgc2NyaXB0TmFtZXMgPSBuZXcgU2V0KE9iamVjdC5rZXlzKHJlYWRQYWNrYWdlSnNvblN5bmMoKS5zY3JpcHRzID8/IHt9KSk7XG4gIGNvbnN0IGhhc0FsbFNoYXJlZFNjcmlwdHMgPSBbU1BFTExDSEVDS19TQ1JJUFRfTkFNRSwgLi4uT2JqZWN0LnZhbHVlcyhXUklURVJfU0NSSVBUX05BTUVTKS5mbGF0KCldXG4gICAgLmV2ZXJ5KChzY3JpcHROYW1lKSA9PiBzY3JpcHROYW1lcy5oYXMoc2NyaXB0TmFtZSkpO1xuICBjb25zdCBhZGRpdGlvbmFsV3JpdGVyVGFza3MgPSBvcHRpb25zPy5hZGRpdGlvbmFsV3JpdGVyVGFza3MgPz8ge307XG4gIGlmIChoYXNBbGxTaGFyZWRTY3JpcHRzICYmIE9iamVjdC5rZXlzKGFkZGl0aW9uYWxXcml0ZXJUYXNrcykubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIG9ic2lkaWFuRGV2VXRpbHNDb25maWc7XG4gIH1cblxuICBjb25zdCB3cml0ZXJUYXNrcyA9IHRvV3JpdGVyVGFza3MoKHNjcmlwdE5hbWUpID0+IHNjcmlwdE5hbWVzLmhhcyhzY3JpcHROYW1lKSk7XG4gIGNvbnN0IGR1cGxpY2F0ZVBhdHRlcm4gPSBPYmplY3Qua2V5cyhhZGRpdGlvbmFsV3JpdGVyVGFza3MpLmZpbmQoKHBhdHRlcm4pID0+IE9iamVjdC5oYXNPd24od3JpdGVyVGFza3MsIHBhdHRlcm4pKTtcbiAgaWYgKGR1cGxpY2F0ZVBhdHRlcm4gIT09IHVuZGVmaW5lZCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgbmFuby1zdGFnZWQgd3JpdGVyIHBhdHRlcm4gJyR7ZHVwbGljYXRlUGF0dGVybn0nIGlzIGFscmVhZHkgYSBzaGFyZWQgd3JpdGVyIHBhdHRlcm4uYCk7XG4gIH1cblxuICByZXR1cm4gcGFydGl0aW9uU3BlbGxjaGVjayh7IC4uLndyaXRlclRhc2tzLCAuLi5hZGRpdGlvbmFsV3JpdGVyVGFza3MgfSwgc2NyaXB0TmFtZXMuaGFzKFNQRUxMQ0hFQ0tfU0NSSVBUX05BTUUpKTtcbn1cblxuLyoqXG4gKiBTcGxpdHMgY29tbWFuZCBhcmd1bWVudHMgaW50byBiYXRjaGVzIHRoYXQgZWFjaCBmaXQgb25lIGNvbW1hbmQgbGluZSBhZnRlciBhIGdpdmVuIHByZWZpeC5cbiAqXG4gKiBFYWNoIGFyZ3VtZW50IGlzIGNvc3RlZCBhcyBuYW5vLXN0YWdlZCBwYXNzZXMgaXQgb24gV2luZG93cyBcdTIwMTQgcXVvdGVkLCB0aGVuIGBeYC1lc2NhcGVkIGJ5IGBjbWQuZXhlYCdzXG4gKiBydWxlcyBcdTIwMTQgdGhyb3VnaCB7QGxpbmsgZ2V0RWZmZWN0aXZlQ29tbWFuZExpbmVMZW5ndGh9LCBhbmQgdGhlIGJ1ZGdldCBpcyB7QGxpbmsgZ2V0TWF4QmF0Y2hDb21tYW5kTGVuZ3RofSxcbiAqIHdoaWNoIGFscmVhZHkgaG9sZHMgYmFjayB0aGUgcmVzZXJ2ZSBmb3IgdGhlIGBucG1gIFx1MjE5MiBgY21kLmV4ZWAgXHUyMTkyIGAuYmluYCBzaGltIGNoYWluIHJlLWV4cGFuZGluZyB0aGVcbiAqIGFyZ3VtZW50cy4gQW4gYXJndW1lbnQgdG9vIGxvbmcgZm9yIGFueSBiYXRjaCBzdGlsbCBnZXRzIGEgYmF0Y2ggb2YgaXRzIG93bjogaXQgZmFpbHMgbG91ZGx5IHRoZXJlLCB3aGljaFxuICogZHJvcHBpbmcgaXQgd291bGQgbm90LlxuICpcbiAqIEBwYXJhbSBwcmVmaXggLSBUaGUgY29tbWFuZCB0aGUgYXJndW1lbnRzIGFyZSBhcHBlbmRlZCB0by5cbiAqIEBwYXJhbSBjb21tYW5kQXJndW1lbnRzIC0gVGhlIGFyZ3VtZW50cyB0byBzcGxpdC5cbiAqIEByZXR1cm5zIFRoZSBiYXRjaGVzLCBpbiBvcmRlciwgdG9nZXRoZXIgaG9sZGluZyBldmVyeSBhcmd1bWVudCBvbmNlLlxuICovXG5mdW5jdGlvbiBiYXRjaENvbW1hbmRBcmd1bWVudHMocHJlZml4OiBzdHJpbmcsIGNvbW1hbmRBcmd1bWVudHM6IHJlYWRvbmx5IHN0cmluZ1tdKTogc3RyaW5nW11bXSB7XG4gIGNvbnN0IGVtcHR5TGVuZ3RoID0gZ2V0RWZmZWN0aXZlQ29tbWFuZExpbmVMZW5ndGgoJycpO1xuICBjb25zdCBidWRnZXQgPSBnZXRNYXhCYXRjaENvbW1hbmRMZW5ndGgoKSAtIEVYRUNVVEFCTEVfUEFUSF9SRVNFUlZFIC0gZ2V0RWZmZWN0aXZlQ29tbWFuZExpbmVMZW5ndGgocHJlZml4KTtcbiAgY29uc3QgYmF0Y2hlczogc3RyaW5nW11bXSA9IFtdO1xuICBsZXQgYmF0Y2g6IHN0cmluZ1tdID0gW107XG4gIGxldCBiYXRjaExlbmd0aCA9IDA7XG5cbiAgZm9yIChjb25zdCBjb21tYW5kQXJndW1lbnQgb2YgY29tbWFuZEFyZ3VtZW50cykge1xuICAgIGNvbnN0IGFyZ3VtZW50TGVuZ3RoID0gZ2V0RWZmZWN0aXZlQ29tbWFuZExpbmVMZW5ndGgoYCBcIiR7Y29tbWFuZEFyZ3VtZW50fVwiYCkgLSBlbXB0eUxlbmd0aDtcbiAgICBpZiAoYmF0Y2gubGVuZ3RoID4gMCAmJiBiYXRjaExlbmd0aCArIGFyZ3VtZW50TGVuZ3RoID4gYnVkZ2V0KSB7XG4gICAgICBiYXRjaGVzLnB1c2goYmF0Y2gpO1xuICAgICAgYmF0Y2ggPSBbXTtcbiAgICAgIGJhdGNoTGVuZ3RoID0gMDtcbiAgICB9XG4gICAgYmF0Y2gucHVzaChjb21tYW5kQXJndW1lbnQpO1xuICAgIGJhdGNoTGVuZ3RoICs9IGFyZ3VtZW50TGVuZ3RoO1xuICB9XG5cbiAgaWYgKGJhdGNoLmxlbmd0aCA+IDApIHtcbiAgICBiYXRjaGVzLnB1c2goYmF0Y2gpO1xuICB9XG5cbiAgcmV0dXJuIGJhdGNoZXM7XG59XG5cbi8qKlxuICogQnVpbGRzIGEgbmFuby1zdGFnZWQgY29uZmlndXJhdGlvbiBpbiB3aGljaCBzcGVsbGNoZWNrIG5ldmVyIHJlYWRzIGEgZmlsZSB3aGlsZSBhbm90aGVyIHRhc2sgcmV3cml0ZXMgaXQuXG4gKlxuICogVGhlIHNhbWUgYFByb21pc2UuYWxsYCB0aGF0IGZvcmNlcyB0d28gd3JpdGVycyBpbnRvIG9uZSBrZXkgbWFrZXMgYSBjYXRjaC1hbGwgYCcqJ2Agc3BlbGxjaGVjayBrZXkgcnVuXG4gKiBDT05DVVJSRU5UTFkgd2l0aCBldmVyeSB3cml0ZXIga2V5LCBzbyBjc3BlbGwgd291bGQgcmVhZCBhIGZpbGUgdGhhdCBFU0xpbnQgb3IgZHByaW50IGlzIHJld3JpdGluZyBpblxuICogcGxhY2UgLS0gYSBzcHVyaW91cyBmaW5kaW5nIG9uIGEgaGFsZi13cml0dGVuIGZpbGUsIG9yIGEgcGFzcyBvdmVyIGNvbnRlbnQgdGhhdCBpcyBub3Qgd2hhdCBnZXRzXG4gKiBjb21taXR0ZWQuIFNvIHRoZSBzdGFnZWQgZmlsZXMgYXJlIFBBUlRJVElPTkVEIGluc3RlYWQ6XG4gKlxuICogLSBldmVyeSB3cml0ZXIga2V5IGdldHMgc3BlbGxjaGVjayBhcHBlbmRlZCBhcyBpdHMgTEFTVCBjb21tYW5kLCBzbyBpdCByZWFkcyB0aGF0IGtleSdzIGZpbGVzIGFmdGVyIHRoZXlcbiAqICAgaGF2ZSBiZWVuIHJld3JpdHRlbjtcbiAqIC0gb25lIGNvbXBsZW1lbnQga2V5IHNwZWxsY2hlY2tzIGV4YWN0bHkgdGhlIGZpbGVzIG5vIHdyaXRlciBrZXkgY2xhaW1zLlxuICpcbiAqIFRoZSBjb21wbGVtZW50IGlzIHdyaXR0ZW4gaW4gbmFuby1zdGFnZWQncyBvd24gZ2xvYiBkaWFsZWN0LCB3aGljaCBjb21waWxlcyBgISguLi4pYCB0byBhIGxvb2thaGVhZCB0aGF0XG4gKiBpcyBOT1QgYW5jaG9yZWQgYXQgdGhlIGVuZCBvZiB0aGUgcGF0aDogYCEoKi5tZCkqYCB3b3VsZCBleGNsdWRlIGBub3Rlcy5tZC5iYWtgIHRvby4gQSBuZXN0ZWQgYCEoPylgXG4gKiBjb21waWxlcyB0byBgKD8hLilgLCB3aGljaCBJUyBhbiBlbmQgYW5jaG9yLCBzbyBlYWNoIGFsdGVybmF0aXZlIGlzIHN1ZmZpeGVkIHdpdGggaXQuIEEgd3JpdGVyIHBhdHRlcm5cbiAqIGNvbnRhaW5pbmcgYC9gIHdvdWxkIHN3aXRjaCBuYW5vLXN0YWdlZCBpbnRvIGdsb2JzdGFyIG1vZGUsIHdoZXJlIGAqYCBzdG9wcyBjcm9zc2luZyBkaXJlY3RvcmllcyBhbmQgdGhlXG4gKiBjb25zdHJ1Y3Rpb24gbm8gbG9uZ2VyIGhvbGRzIC0tIGhlbmNlIHRoZSB0aHJvdy4gVGhlIHVuaXQgdGVzdCBwaW5zIHRoZSBwYXJ0aXRpb24gYWdhaW5zdCB0aGUgaW5zdGFsbGVkXG4gKiBuYW5vLXN0YWdlZCBjb21waWxlciwgc28gYSByZWxlYXNlIHRoYXQgY2hhbmdlcyBpdHMgZGlhbGVjdCBmYWlscyB0aGVyZSByYXRoZXIgdGhhbiBpbiBhIGNvbW1pdC5cbiAqXG4gKiBXaXRob3V0IHNwZWxsY2hlY2sgdGhlcmUgaXMgbm90aGluZyB0byBwYXJ0aXRpb246IGVhY2ggd3JpdGVyIGtleSBydW5zIGl0cyBvd24gY29tbWFuZHMsIGFuZCBubyBjb21wbGVtZW50XG4gKiBrZXkgaXMgZW1pdHRlZC5cbiAqXG4gKiBAcGFyYW0gd3JpdGVyVGFza3MgLSBUaGUgZmlsZS1yZXdyaXRpbmcgdGFza3MsIGtleWVkIGJ5IHRoZSBwYXR0ZXJuIHRoYXQgY2xhaW1zIHRoZWlyIGZpbGVzLlxuICogQHBhcmFtIHNob3VsZFNwZWxsY2hlY2sgLSBXaGV0aGVyIHRoZSBwcm9qZWN0IGhhcyBhIGBzcGVsbGNoZWNrYCBzY3JpcHQgdG8gcnVuLlxuICogQHJldHVybnMgVGhlIGNvbmZpZ3VyYXRpb24sIHdpdGggdGhlIHNwZWxsY2hlY2sgc3RlcCBwYXJ0aXRpb25lZCBhY3Jvc3MgdGhlIGtleXMuXG4gKi9cbmZ1bmN0aW9uIHBhcnRpdGlvblNwZWxsY2hlY2sod3JpdGVyVGFza3M6IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHJlYWRvbmx5IHN0cmluZ1tdPj4sIHNob3VsZFNwZWxsY2hlY2s6IGJvb2xlYW4pOiBOYW5vU3RhZ2VkQ29uZmlnIHtcbiAgaWYgKCFzaG91bGRTcGVsbGNoZWNrKSB7XG4gICAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyh3cml0ZXJUYXNrcykubWFwKChbcGF0dGVybiwgY29tbWFuZHNdKSA9PiBbcGF0dGVybiwgdG9CYXRjaGVkVGFzayhjb21tYW5kcyldKSk7XG4gIH1cblxuICBjb25zdCBwYXR0ZXJucyA9IE9iamVjdC5rZXlzKHdyaXRlclRhc2tzKTtcbiAgY29uc3QgcGF0dGVybldpdGhTbGFzaCA9IHBhdHRlcm5zLmZpbmQoKHBhdHRlcm4pID0+IHBhdHRlcm4uaW5jbHVkZXMoJy8nKSk7XG4gIGlmIChwYXR0ZXJuV2l0aFNsYXNoICE9PSB1bmRlZmluZWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYG5hbm8tc3RhZ2VkIHdyaXRlciBwYXR0ZXJuICcke3BhdHRlcm5XaXRoU2xhc2h9JyBjb250YWlucyAnLycsIHdoaWNoIHRoZSBzcGVsbGNoZWNrIHBhcnRpdGlvbiBjYW5ub3QgZXhwcmVzcy5gKTtcbiAgfVxuXG4gIC8vIGAhKCkqYCB3b3VsZCBjb21waWxlIHRvIGEgbG9va2FoZWFkIHRoYXQgcmVqZWN0cyBldmVyeSBwYXRoLCBzbyB3aXRoIG5vIHdyaXRlciB0aGUgY29tcGxlbWVudCBpcyBldmVyeXRoaW5nLlxuICBjb25zdCBjb21wbGVtZW50UGF0dGVybiA9IHBhdHRlcm5zLmxlbmd0aCA9PT0gMCA/ICcqJyA6IGAhKCR7cGF0dGVybnMubWFwKChwYXR0ZXJuKSA9PiBgJHtwYXR0ZXJufSEoPylgKS5qb2luKCd8Jyl9KSpgO1xuICBjb25zdCBjb25maWc6IE5hbm9TdGFnZWRDb25maWcgPSB7XG4gICAgW2NvbXBsZW1lbnRQYXR0ZXJuXTogdG9CYXRjaGVkVGFzayhbU1BFTExDSEVDS19DT01NQU5EXSlcbiAgfTtcblxuICBmb3IgKGNvbnN0IFtwYXR0ZXJuLCBjb21tYW5kc10gb2YgT2JqZWN0LmVudHJpZXMod3JpdGVyVGFza3MpKSB7XG4gICAgY29uZmlnW3BhdHRlcm5dID0gdG9CYXRjaGVkVGFzayhbLi4uY29tbWFuZHMsIFNQRUxMQ0hFQ0tfQ09NTUFORF0pO1xuICB9XG5cbiAgcmV0dXJuIGNvbmZpZztcbn1cblxuLyoqXG4gKiBCdWlsZHMgYSB0YXNrIHRoYXQgcnVucyBlYWNoIGNvbW1hbmQgb3ZlciBldmVyeSBzdGFnZWQgZmlsZSBpdCByZWNlaXZlcywgaW4gYXMgbWFueSBiYXRjaGVzIGFzIHRoZSBjb21tYW5kXG4gKiBsaW5lIG5lZWRzLlxuICpcbiAqIG5hbm8tc3RhZ2VkIGFwcGVuZHMgYSBzdHJpbmcgdGFzaydzIGZpbGVzIHRvIE9ORSBjb21tYW5kLCBzbyBhIGNvbW1pdCBzdGFnaW5nIGEgZmV3IGh1bmRyZWQgZmlsZXMgcmFuXG4gKiBgbnBtIHJ1biBsaW50OmZpeCAtLSA8ZXZlcnkgcGF0aD5gIGFuZCBmYWlsZWQgb24gV2luZG93cyB3aXRoIGBUaGUgY29tbWFuZCBsaW5lIGlzIHRvbyBsb25nLmAsIHJlZnVzaW5nXG4gKiBleGFjdGx5IHRoZSB3aG9sZS1yZXBvIGNvbW1pdHMgdGhhdCBtb3N0IG5lZWQgdGhlIGhvb2suIEEgZnVuY3Rpb24tdmFsdWVkIHRhc2sgYnVpbGRzIGl0cyBvd24gY29tbWFuZHNcbiAqIGluc3RlYWQsIGFuZCB0aGVzZSBhcmUgYmF0Y2hlZCBhZ2FpbnN0IHRoZSBzYW1lIGJ1ZGdldCBgZXhlYygpYCB1c2VzIChzZWUgYGJhdGNoQ29tbWFuZEFyZ3VtZW50c2ApLlxuICpcbiAqIFRoZSBjb21tYW5kcyBrZWVwIHRoZWlyIG9yZGVyOiBldmVyeSBiYXRjaCBvZiB0aGUgZmlyc3QgY29tbWFuZCBydW5zIGJlZm9yZSBhbnkgYmF0Y2ggb2YgdGhlIHNlY29uZCxcbiAqIGJlY2F1c2UgbmFuby1zdGFnZWQgcnVucyBvbmUga2V5J3MgY29tbWFuZHMgb25lIGFmdGVyIGFub3RoZXIsIHNvIGEgd3JpdGVyIHN0aWxsIGZpbmlzaGVzIGJlZm9yZSB0aGUgbmV4dFxuICogd3JpdGVyLCBhbmQgc3BlbGxjaGVjayBzdGlsbCByZWFkcyB0aGUgcmV3cml0dGVuIGZpbGVzLlxuICpcbiAqIEBwYXJhbSBjb21tYW5kcyAtIFRoZSBjb21tYW5kIHByZWZpeGVzLCBpbiB0aGUgb3JkZXIgdGhleSBydW4uXG4gKiBAcmV0dXJucyBUaGUgdGFzay5cbiAqL1xuZnVuY3Rpb24gdG9CYXRjaGVkVGFzayhjb21tYW5kczogcmVhZG9ubHkgc3RyaW5nW10pOiBOYW5vU3RhZ2VkVGFzayB7XG4gIHJldHVybiAoeyBmaWxlbmFtZXMgfSkgPT4ge1xuICAgIGNvbnN0IGNvbW1hbmRBcmd1bWVudHMgPSBmaWxlbmFtZXMubWFwKChmaWxlbmFtZSkgPT4gdG9Db21tYW5kQXJndW1lbnQoZmlsZW5hbWUpKTtcbiAgICByZXR1cm4gY29tbWFuZHMuZmxhdE1hcCgoY29tbWFuZCkgPT4gYmF0Y2hDb21tYW5kQXJndW1lbnRzKGNvbW1hbmQsIGNvbW1hbmRBcmd1bWVudHMpLm1hcCgoYmF0Y2gpID0+IGAke2NvbW1hbmR9ICR7YmF0Y2guam9pbignICcpfWApKTtcbiAgfTtcbn1cblxuLyoqXG4gKiBUdXJucyBhIHN0YWdlZCBmaWxlJ3MgYWJzb2x1dGUgcGF0aCBpbnRvIHRoZSBhcmd1bWVudCBhIGJhdGNoZWQgdGFzayBwYXNzZXMgZm9yIGl0LlxuICpcbiAqIFRoZSBwYXRoIGlzIG1hZGUgcmVsYXRpdmUgdG8gdGhlIHdvcmtpbmcgZGlyZWN0b3J5LCB3aGVyZSBuYW5vLXN0YWdlZCBhbmQgdGhlIHRhc2sgYm90aCBydW4sIHdoaWNoIHJvdWdobHlcbiAqIGhhbHZlcyBpdHMgbGVuZ3RoIGFuZCBzbyB0aGUgbnVtYmVyIG9mIGJhdGNoZXM7IGEgcGF0aCBvdXRzaWRlIGl0IHN0YXlzIGFic29sdXRlLiBBIHJlbGF0aXZlIHBhdGggc3RhcnRpbmdcbiAqIHdpdGggYC1gIGdldHMgYC4vYCwgc28gbm8gdG9vbCByZWFkcyBpdCBhcyBhbiBvcHRpb24uXG4gKlxuICogV2hpdGVzcGFjZSBhbmQgcXVvdGVzIGJlY29tZSBgP2AsIGJlY2F1c2UgbmFuby1zdGFnZWQncyB0b2tlbml6ZXIgY2Fubm90IGNhcnJ5IHRoZW0gKHNlZVxuICoge0BsaW5rIFRPS0VOSVpFUl9VTlNBRkVfQ0hBUkFDVEVSU19SRUdfRVhQfSkuIEV2ZXJ5IHRvb2wgdGhlIHRhc2tzIHJ1biAoRVNMaW50LCBkcHJpbnQsIGNzcGVsbCxcbiAqIG1hcmtkb3dubGludC1jbGkyKSB0YWtlcyBpdHMgcGF0aHMgYXMgZ2xvYnMsIGFuZCBgP2AgbWF0Y2hlcyBleGFjdGx5IHRoZSBvbmUgY2hhcmFjdGVyIGl0IHJlcGxhY2VkLCBzbyB0aGVcbiAqIGZpbGUgaXMgc3RpbGwgZm91bmQ7IGEgc2libGluZyBkaWZmZXJpbmcgb25seSBpbiB0aGF0IGNoYXJhY3RlciB3b3VsZCBtYXRjaCB0b28sIHdoaWNoIGNvc3RzIGEgbGludCBvZiBhblxuICogZXh0cmEgZmlsZSwgbm90IGEgbWlzc2VkIG9uZS5cbiAqXG4gKiBAcGFyYW0gZmlsZW5hbWUgLSBUaGUgYWJzb2x1dGUgcGF0aCBvZiB0aGUgc3RhZ2VkIGZpbGUuXG4gKiBAcmV0dXJucyBUaGUgYXJndW1lbnQuXG4gKi9cbmZ1bmN0aW9uIHRvQ29tbWFuZEFyZ3VtZW50KGZpbGVuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCByZWxhdGl2ZVBhdGggPSByZWxhdGl2ZShwcm9jZXNzLmN3ZCgpLCBmaWxlbmFtZSk7XG4gIGxldCBjb21tYW5kQXJndW1lbnQgPSAocmVsYXRpdmVQYXRoLnN0YXJ0c1dpdGgoJy4uJykgfHwgaXNBYnNvbHV0ZShyZWxhdGl2ZVBhdGgpID8gZmlsZW5hbWUgOiByZWxhdGl2ZVBhdGgpLnJlcGxhY2VBbGwoJ1xcXFwnLCAnLycpO1xuICBpZiAoY29tbWFuZEFyZ3VtZW50LnN0YXJ0c1dpdGgoJy0nKSkge1xuICAgIGNvbW1hbmRBcmd1bWVudCA9IGAuLyR7Y29tbWFuZEFyZ3VtZW50fWA7XG4gIH1cbiAgcmV0dXJuIGNvbW1hbmRBcmd1bWVudC5yZXBsYWNlQWxsKFRPS0VOSVpFUl9VTlNBRkVfQ0hBUkFDVEVSU19SRUdfRVhQLCAnPycpO1xufVxuXG4vKipcbiAqIEJ1aWxkcyB0aGUgY29tbWFuZCBwcmVmaXggdGhhdCBydW5zIGFuIG5wbSBzY3JpcHQgb3ZlciB0aGUgcGF0aHMgYXBwZW5kZWQgdG8gaXQuXG4gKlxuICogQHBhcmFtIHNjcmlwdE5hbWUgLSBUaGUgc2NyaXB0IG5hbWUuXG4gKiBAcmV0dXJucyBUaGUgY29tbWFuZCBwcmVmaXgsIHN1Y2ggYXMgYG5wbSBydW4gbGludDpmaXggLS1gLlxuICovXG5mdW5jdGlvbiB0b1NjcmlwdENvbW1hbmQoc2NyaXB0TmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGAke1BBQ0tBR0VfTUFOQUdFUl9SVU5fQ09NTUFORH0gJHtzY3JpcHROYW1lfSAtLWA7XG59XG5cbi8qKlxuICogQnVpbGRzIHRoZSBzaGFyZWQgd3JpdGVyIHRhc2tzIGZyb20ge0BsaW5rIFdSSVRFUl9TQ1JJUFRfTkFNRVN9LCBrZWVwaW5nIG9ubHkgdGhlIHNjcmlwdHMgYSBmaWx0ZXIgYWNjZXB0c1xuICogYW5kIGRyb3BwaW5nIGEgcGF0dGVybiBsZWZ0IHdpdGggbm9uZS5cbiAqXG4gKiBAcGFyYW0gc2hvdWxkSW5jbHVkZVNjcmlwdCAtIFdoZXRoZXIgdG8gcnVuIGEgZ2l2ZW4gc2NyaXB0LlxuICogQHJldHVybnMgVGhlIHdyaXRlciB0YXNrcywga2V5ZWQgYnkgdGhlIHBhdHRlcm4gdGhhdCBjbGFpbXMgdGhlaXIgZmlsZXMuXG4gKi9cbmZ1bmN0aW9uIHRvV3JpdGVyVGFza3Moc2hvdWxkSW5jbHVkZVNjcmlwdDogKHNjcmlwdE5hbWU6IHN0cmluZykgPT4gYm9vbGVhbik6IFJlY29yZDxzdHJpbmcsIHJlYWRvbmx5IHN0cmluZ1tdPiB7XG4gIGNvbnN0IHdyaXRlclRhc2tzOiBSZWNvcmQ8c3RyaW5nLCByZWFkb25seSBzdHJpbmdbXT4gPSB7fTtcbiAgZm9yIChjb25zdCBbcGF0dGVybiwgc2NyaXB0TmFtZXNdIG9mIE9iamVjdC5lbnRyaWVzKFdSSVRFUl9TQ1JJUFRfTkFNRVMpKSB7XG4gICAgY29uc3QgY29tbWFuZHMgPSBzY3JpcHROYW1lcy5maWx0ZXIoKHNjcmlwdE5hbWUpID0+IHNob3VsZEluY2x1ZGVTY3JpcHQoc2NyaXB0TmFtZSkpLm1hcCgoc2NyaXB0TmFtZSkgPT4gdG9TY3JpcHRDb21tYW5kKHNjcmlwdE5hbWUpKTtcbiAgICBpZiAoY29tbWFuZHMubGVuZ3RoID4gMCkge1xuICAgICAgd3JpdGVyVGFza3NbcGF0dGVybl0gPSBjb21tYW5kcztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHdyaXRlclRhc2tzO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7QUFNQTtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQLE9BQU8sYUFBYTtBQUVwQjtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1AsU0FBUywyQkFBMkI7QUFDcEMsU0FBUyxtQ0FBbUM7QUEyQzVDLE1BQU0sOEJBQThCLDRCQUE0QixFQUFFLEtBQUssR0FBRztBQUUxRSxNQUFNLHlCQUF5QjtBQUUvQixNQUFNLHFCQUFxQixnQkFBZ0Isc0JBQXNCO0FBUWpFLE1BQU0sMEJBQTBCO0FBU2hDLE1BQU0sc0NBQXNDO0FBaUI1QyxNQUFNLHNCQUFtRTtBQUFBLEVBQ3ZFLGtCQUFrQixDQUFDLFlBQVksUUFBUTtBQUFBLEVBQ3ZDLFFBQVEsQ0FBQyxhQUFhO0FBQ3hCO0FBRUEsTUFBTSxlQUE0RCxjQUFjLE1BQU0s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
144
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL25hbm8tc3RhZ2VkLWNvbmZpZy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIFNoYXJlZCBuYW5vLXN0YWdlZCBjb25maWd1cmF0aW9uIGZvciBwcmUtY29tbWl0IGhvb2tzLlxuICovXG5cbmltcG9ydCB7XG4gIGlzQWJzb2x1dGUsXG4gIHJlbGF0aXZlXG59IGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgcHJvY2VzcyBmcm9tICdub2RlOnByb2Nlc3MnO1xuXG5pbXBvcnQge1xuICBpc0VudlZhcmlhYmxlT2ZmLFxuICBsb2FkRW52RmlsZUlmRXhpc3RzXG59IGZyb20gJy4vZW52LXRvZ2dsZS50cyc7XG5pbXBvcnQge1xuICBnZXRFZmZlY3RpdmVDb21tYW5kTGluZUxlbmd0aCxcbiAgZ2V0TWF4QmF0Y2hDb21tYW5kTGVuZ3RoXG59IGZyb20gJy4vZXhlYy50cyc7XG5pbXBvcnQgeyByZWFkUGFja2FnZUpzb25TeW5jIH0gZnJvbSAnLi9ucG0udHMnO1xuaW1wb3J0IHsgZ2V0UGFja2FnZU1hbmFnZXJSdW5Db21tYW5kIH0gZnJvbSAnLi9wYWNrYWdlLW1hbmFnZXIudHMnO1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayBnZXROYW5vU3RhZ2VkQ29uZmlnfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHZXROYW5vU3RhZ2VkQ29uZmlnT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBSZXBvLXNwZWNpZmljIGZpbGUtcmV3cml0aW5nIHRhc2tzLCBrZXllZCBieSB0aGUgbmFuby1zdGFnZWQgcGF0dGVybiB0aGF0IGNsYWltcyB0aGVpciBmaWxlcy5cbiAgICpcbiAgICogRWFjaCBnZXRzIHNwZWxsY2hlY2sgYXBwZW5kZWQgYW5kIGl0cyBmaWxlcyByZW1vdmVkIGZyb20gdGhlIHNwZWxsY2hlY2stb25seSBrZXksIGV4YWN0bHkgbGlrZSB0aGUgc2hhcmVkXG4gICAqIHdyaXRlcnMuIEEgcGF0dGVybiBtdXN0IG5vdCBjb250YWluIGAvYCwgYW5kIG11c3Qgbm90IHJlcGVhdCBhIHNoYXJlZCB3cml0ZXIgcGF0dGVybi4gRWFjaCBjb21tYW5kIGlzIGFcbiAgICogcHJlZml4IHRoZSBzdGFnZWQgcGF0aHMgYXJlIGFwcGVuZGVkIHRvLCBpbiBiYXRjaGVzLCBsaWtlIHRoZSBzaGFyZWQgb25lcyAoYG5wbSBydW4gbGludDpmaXggLS1gKS5cbiAgICovXG4gIHJlYWRvbmx5IGFkZGl0aW9uYWxXcml0ZXJUYXNrcz86IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHJlYWRvbmx5IHN0cmluZ1tdPj47XG59XG5cbi8qKlxuICogQSBuYW5vLXN0YWdlZCBjb25maWd1cmF0aW9uIHdob3NlIGV2ZXJ5IGtleSBpcyBhIHtAbGluayBOYW5vU3RhZ2VkVGFza30uXG4gKi9cbmV4cG9ydCB0eXBlIE5hbm9TdGFnZWRDb25maWcgPSBSZWNvcmQ8c3RyaW5nLCBOYW5vU3RhZ2VkVGFzaz47XG5cbi8qKlxuICogQSBmdW5jdGlvbi12YWx1ZWQgbmFuby1zdGFnZWQgdGFzazogaXQgcmVjZWl2ZXMgdGhlIHN0YWdlZCBmaWxlcyBpdHMgcGF0dGVybiBjbGFpbXMgYW5kIHJldHVybnMgdGhlXG4gKiBjb21tYW5kcyB0byBydW4gb3ZlciB0aGVtLCBpbiBvcmRlci5cbiAqL1xuZXhwb3J0IHR5cGUgTmFub1N0YWdlZFRhc2sgPSAoY29udGV4dDogTmFub1N0YWdlZFRhc2tDb250ZXh0KSA9PiBzdHJpbmdbXTtcblxuLyoqXG4gKiBXaGF0IG5hbm8tc3RhZ2VkIHBhc3NlcyB0byBhIGZ1bmN0aW9uLXZhbHVlZCB0YXNrLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE5hbm9TdGFnZWRUYXNrQ29udGV4dCB7XG4gIC8qKlxuICAgKiBUaGUgYWJzb2x1dGUgcGF0aHMgb2YgdGhlIHN0YWdlZCBmaWxlcyB0aGUgdGFzaydzIHBhdHRlcm4gY2xhaW1zLlxuICAgKi9cbiAgcmVhZG9ubHkgZmlsZW5hbWVzOiByZWFkb25seSBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBUaGUgYDxtYW5hZ2VyPiBydW5gIHByZWZpeCBldmVyeSB0YXNrIGJlbG93IGlzIGJ1aWx0IG9uLCByZXNvbHZlZCBvbmNlIGZvciB0aGUgcHJvY2Vzcy5cbiAqXG4gKiBEZXRlY3Rpb24gcHJvYmVzIGZvciBhIGxvY2tmaWxlIGJlc2lkZSBgcGFja2FnZS5qc29uYCwgc28gaXQgaXMgYSBoYW5kZnVsIG9mIGBleGlzdHNTeW5jYCBjYWxscyBhbmRcbiAqIG5vdGhpbmcgbW9yZSBcdTIwMTQgbm8gYC5lbnZgIHJlYWQgYW5kIG5vIGBwcm9jZXNzLmV4aXRgLCB3aGljaCBpcyB3aGF0IGxldHMgaXQgc2l0IGF0IG1vZHVsZSBzY29wZS5cbiAqL1xuY29uc3QgUEFDS0FHRV9NQU5BR0VSX1JVTl9DT01NQU5EID0gZ2V0UGFja2FnZU1hbmFnZXJSdW5Db21tYW5kKCkuam9pbignICcpO1xuXG5jb25zdCBTUEVMTENIRUNLX1NDUklQVF9OQU1FID0gJ3NwZWxsY2hlY2snO1xuXG5jb25zdCBTUEVMTENIRUNLX0NPTU1BTkQgPSB0b1NjcmlwdENvbW1hbmQoU1BFTExDSEVDS19TQ1JJUFRfTkFNRSk7XG5cbi8qKlxuICogUm9vbSBsZWZ0IGluIGV2ZXJ5IGJhdGNoIGZvciB0aGUgcmVzb2x2ZWQgcGF0aCBvZiB0aGUgcGFja2FnZSBtYW5hZ2VyJ3MgZXhlY3V0YWJsZS5cbiAqXG4gKiBuYW5vLXN0YWdlZCBydW5zIGBucG1gIGFzIHRoZSBhYnNvbHV0ZSBwYXRoIG9mIGBucG0uY21kYCAoYDxjb21zcGVjPiAvRCAvUyAvQyBcIjxwYXRoPlwiIFwiPGFyZz5cIiBcdTIwMjZgKSwgd2hpY2hcbiAqIHRoZSBiYXRjaCBjYW5ub3Qgc2VlLCBzbyBhIGZ1bGwgV2luZG93cyBgTUFYX1BBVEhgIGlzIHNldCBhc2lkZSBmb3IgaXQuXG4gKi9cbmNvbnN0IEVYRUNVVEFCTEVfUEFUSF9SRVNFUlZFID0gMjYwO1xuXG4vKipcbiAqIFRoZSBjaGFyYWN0ZXJzIG5hbm8tc3RhZ2VkJ3MgY29tbWFuZCB0b2tlbml6ZXIgY2Fubm90IGNhcnJ5IGluc2lkZSBhbiBhcmd1bWVudC5cbiAqXG4gKiBBIGZ1bmN0aW9uLXZhbHVlZCB0YXNrIHJldHVybnMgaXRzIGNvbW1hbmRzIGFzIFNUUklOR1MsIGFuZCBuYW5vLXN0YWdlZCBzcGxpdHMgZWFjaCBvbmUgd2l0aFxuICogYHN0cmluZ0FyZ3ZUb0FycmF5YCwgd2hpY2ggZW1pdHMgYSBxdW90ZWQgdG9rZW4gdHdpY2UgKG9uY2UgYmFyZSwgb25jZSB3aXRoIGl0cyBxdW90ZXMpIGFuZCBoYXMgbm8gZXNjYXBlLlxuICogU28gYSBwYXRoIGhvbGRpbmcgd2hpdGVzcGFjZSBvciBhIHF1b3RlIGNhbm5vdCBiZSBwYXNzZWQgYXMgaXRzZWxmLlxuICovXG5jb25zdCBUT0tFTklaRVJfVU5TQUZFX0NIQVJBQ1RFUlNfUkVHX0VYUCA9IC9bXFxzXCInXS9nO1xuXG4vKipcbiAqIFRoZSBucG0gc2NyaXB0cyB0aGF0IFJFV1JJVEUgYSBzdGFnZWQgZmlsZSwgaW4gdGhlIG9yZGVyIHRoZXkgcnVuLCBrZXllZCBieSB0aGUgbmFuby1zdGFnZWQgcGF0dGVybiB0aGF0XG4gKiBjbGFpbXMgaXQuXG4gKlxuICogYGxpbnQ6Zml4YCBhbmQgYGZvcm1hdGAgYm90aCByZXdyaXRlIHRoZSBmaWxlLCBzbyB0aGV5IGhhdmUgdG8gc2hhcmUgb25lIGtleTogbmFuby1zdGFnZWQgcnVucyBpdHNcbiAqIHBlci1wYXR0ZXJuIGdyb3VwcyB1bmRlciBgUHJvbWlzZS5hbGxgIChgcnVuKClgIGluIGBuYW5vLXN0YWdlZC9saWIvY21kLXJ1bm5lci5qc2ApLCBhbmQgc2VxdWVuY2VzIG9ubHlcbiAqIHRoZSBjb21tYW5kcyBJTlNJREUgYSBzaW5nbGUga2V5J3MgYXJyYXkgKGBydW5UYXNrKClgLCBhIGBmb3IgLi4uIG9mIGF3YWl0YCkuIFNwbGl0IGFjcm9zcyB0d28ga2V5cyB0aGV5XG4gKiByYWNlLCB3aGljaGV2ZXIgZmluaXNoZXMgbGFzdCB3aW5zLCBhbmQgdGhlIGNvbW1pdCBzdGFnZXMgYnl0ZXMgdGhhdCBuZWl0aGVyIHRvb2wgd291bGQgaGF2ZSBwcm9kdWNlZCBvblxuICogaXRzIG93bi5cbiAqXG4gKiBTbyBkbyBOT1QgZXhwcmVzcyBhIGRpcmVjdG9yeSBleGNsdXNpb24gYnkgZ2l2aW5nIG9uZSBvZiB0aGVzZSB0d28gaXRzIG93biBuZWdhdGVkIGtleSAtLSB0aGF0IHNpbGVudGx5XG4gKiB0YWtlcyB0aGUgb3JkZXJpbmcgYXdheS4gQW4gZXhjbHVzaW9uIGJlbG9uZ3MgaW4gdGhlIGV4Y2x1ZGVkIHRvb2wncyBvd24gY29uZmlnLCB3aGVyZSBFU0xpbnQnc1xuICogYGdsb2JhbElnbm9yZXNgIGFscmVhZHkgcHV0cyBpdDogYSBwYXRoIEVTTGludCBpZ25vcmVzIGlzIHJlcG9ydGVkIGFzIGEgd2FybmluZyBhbmQgZXhpdHMgMCB3aGVuIGl0IGlzXG4gKiBwYXNzZWQgZXhwbGljaXRseSwgc28gaXQgY29zdHMgYSBjb25zb2xlIGxpbmUgcmF0aGVyIHRoYW4gYSBmYWlsZWQgY29tbWl0IGFuZCBuZWVkcyBubyBrZXkgaGVyZS5cbiAqL1xuY29uc3QgV1JJVEVSX1NDUklQVF9OQU1FUzogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgcmVhZG9ubHkgc3RyaW5nW10+PiA9IHtcbiAgJyoue3RzLHRzeCxtdHN9JzogWydsaW50OmZpeCcsICdmb3JtYXQnXSxcbiAgJyoubWQnOiBbJ2xpbnQ6bWQ6Zml4J11cbn07XG5cbmNvbnN0IFdSSVRFUl9UQVNLUzogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgcmVhZG9ubHkgc3RyaW5nW10+PiA9IHRvV3JpdGVyVGFza3MoKCkgPT4gdHJ1ZSk7XG5cbi8qKlxuICogTmFuby1zdGFnZWQgY29uZmlndXJhdGlvbiB0aGF0IHJ1bnMgZmlsZS1iYXNlZCBsaW50LCBmb3JtYXQsIGFuZCBzcGVsbGNoZWNrIG9uIHN0YWdlZCBmaWxlcy5cbiAqXG4gKiBPbmx5IGluY2x1ZGVzIHRvb2xzIHRoYXQgY2FuIG9wZXJhdGUgb24gaW5kaXZpZHVhbCBmaWxlcy4gV2hvbGUtcHJvamVjdCBjaGVja3NcbiAqIChUeXBlU2NyaXB0IGNvbXBpbGF0aW9uLCB1bml0IHRlc3RzKSBhcmUgbGVmdCB0byBDSS5cbiAqXG4gKiBDb21tYW5kcyBydW4gdGhyb3VnaCB0aGUgcGFja2FnZSBtYW5hZ2VyIHRoYXQgb3ducyB0aGUgdHJlZSBcdTIwMTQgYG5wbSBydW4gLi4uIC0tYCwgYGJ1biBydW4gLi4uIC0tYCwgYW5kXG4gKiBzbyBvbiBcdTIwMTQgc28gbmFuby1zdGFnZWQgZmlsZSBwYXRocyBhcmUgZm9yd2FyZGVkIGFzIENMSSBhcmd1bWVudHMsIGJhdGNoZWQgdG8gZml0IHRoZSBjb21tYW5kIGxpbmUgKHNlZVxuICogYHRvQmF0Y2hlZFRhc2tgKS5cbiAqXG4gKiBTcGVsbGNoZWNrIGlzIHBhcnRpdGlvbmVkIGFjcm9zcyB0aGUga2V5cyByYXRoZXIgdGhhbiBnaXZlbiBhIGNhdGNoLWFsbCBgJyonYCBrZXkgKHNlZVxuICogYHBhcnRpdGlvblNwZWxsY2hlY2tgKS4gQSByZXBvIGFkZGluZyBhIGZpbGUtcmV3cml0aW5nIHRhc2sgb2YgaXRzIG93biBwYXNzZXMgaXQgdG9cbiAqIHtAbGluayBnZXROYW5vU3RhZ2VkQ29uZmlnfSBhcyBgYWRkaXRpb25hbFdyaXRlclRhc2tzYCByYXRoZXIgdGhhbiBzcHJlYWRpbmcgdGhpcyBvYmplY3QgYW5kIGFkZGluZyBhIGtleSxcbiAqIHdoaWNoIHdvdWxkIHJlaW50cm9kdWNlIHRoZSBvdmVybGFwIGZvciB0aGF0IGtleSdzIGZpbGVzLlxuICovXG5leHBvcnQgY29uc3Qgb2JzaWRpYW5EZXZVdGlsc0NvbmZpZzogTmFub1N0YWdlZENvbmZpZyA9IHBhcnRpdGlvblNwZWxsY2hlY2soV1JJVEVSX1RBU0tTLCB0cnVlKTtcblxuY29uc3QgTkFOT19TVEFHRURfRU5WX1ZBUklBQkxFID0gJ05BTk9fU1RBR0VEJztcblxuLyoqXG4gKiBSZXNvbHZlcyB0aGUgbmFuby1zdGFnZWQgY29uZmlndXJhdGlvbiB0byB1c2UsIGhvbm9yaW5nIGEgcGVyLWRldmVsb3BlciBvcHQtb3V0LlxuICpcbiAqIExvYWRzIGEgZ2l0aWdub3JlZCBgLmVudmAgaWYgcHJlc2VudCwgdGhlbiBcdTIwMTQgd2hlbiBgTkFOT19TVEFHRURgIGlzIHNldCB0byBhbiBvZmYgdmFsdWUgKGAwYCwgYGZhbHNlYCxcbiAqIGBvZmZgLCBvciBgbm9gKSBcdTIwMTQgcHJpbnRzIGEgbm90aWNlIGFuZCBleGl0cyB0aGUgcHJvY2VzcyBzdWNjZXNzZnVsbHkgc28gdGhlIHByZS1jb21taXQgY2hlY2tzIGFyZVxuICogc2tpcHBlZC4gVGhpcyBtaXJyb3JzIGh1c2t5J3Mgb3duIGBIVVNLWT0wYCBzd2l0Y2gsIGJ1dCBzY29wZWQgdG8gdGhlIG5hbm8tc3RhZ2VkIHN0ZXAgKHNvIHRoZVxuICogY29tbWl0LW1zZyBob29rIHN0aWxsIHJ1bnMpLiBPdGhlcndpc2UgaXQgcmV0dXJucyB7QGxpbmsgb2JzaWRpYW5EZXZVdGlsc0NvbmZpZ30sIG9yIFx1MjAxNCB3aGVuXG4gKiBgYWRkaXRpb25hbFdyaXRlclRhc2tzYCBhcmUgZ2l2ZW4gXHUyMDE0IHRoZSBzYW1lIGNvbmZpZ3VyYXRpb24gcmUtcGFydGl0aW9uZWQgd2l0aCB0aG9zZSB3cml0ZXJzIGFkZGVkLlxuICpcbiAqIEEgc2hhcmVkIHRhc2sgd2hvc2UgbnBtIHNjcmlwdCB0aGUgcHJvamVjdCdzIGBwYWNrYWdlLmpzb25gIGRvZXMgbm90IGRlY2xhcmUgaXMgbGVmdCBvdXQsIHNvIGEgcHJvamVjdFxuICogd2l0aG91dCwgc2F5LCBtYXJrZG93bmxpbnQgZG9lcyBub3QgZmFpbCBpdHMgZmlyc3QgY29tbWl0IHRoYXQgc3RhZ2VzIGEgYC5tZGAgZmlsZSBvbiBhIG1pc3Npbmcgc2NyaXB0LiBBXG4gKiB3cml0ZXIgcGF0dGVybiBsZWZ0IHdpdGggbm8gd3JpdGVyIGlzIGRyb3BwZWQsIGFuZCBzcGVsbGNoZWNrIHJ1bnMgb25seSB3aGVuIGBzcGVsbGNoZWNrYCBpcyBkZWNsYXJlZCwgaW5cbiAqIHdoaWNoIGNhc2UgaXRzIGZpbGVzIGZhbGwgdG8gdGhlIHNwZWxsY2hlY2stb25seSBrZXkuIFRoZSBgYWRkaXRpb25hbFdyaXRlclRhc2tzYCBhcmUgdGhlIGNhbGxlcidzIG93biBhbmRcbiAqIGFyZSBrZXB0IGFzIGdpdmVuLlxuICpcbiAqIEEgcG9zaXRpdmUgaW50ZWdlciBgQlVMS19DT1JFU2AgYnVkZ2V0IHNlcmlhbGl6ZXMgdGhlIGdlbmVyYXRlZCBjb21tYW5kcyBpbnRvIG9uZSBncm91cC4gbmFuby1zdGFnZWRcbiAqIGhhcyBubyBjb25jdXJyZW5jeSBvcHRpb24sIHNvIHRoaXMga2VlcHMgaXRzIHByb2Nlc3NlcyB3aXRoaW4gZXZlbiBhIG9uZS1jb3JlIGJ1ZGdldC4gV2l0aG91dCBhIHZhbGlkXG4gKiBidWRnZXQgdGhlIHVzdWFsIHBhcmFsbGVsIGdyb3VwcyBhcmUgcmV0YWluZWQuXG4gKlxuICogYE5BTk9fU1RBR0VEYCBpcyBub3QgYW4gbnBtIHNjcmlwdCwgc28gaXQgY2FycmllcyBpdHMgb3duIHN3aXRjaCByYXRoZXIgdGhhbiB0aGUgc2NyaXB0LW5hbWUtZGVyaXZlZCBvbmVcbiAqIGV2ZXJ5IG5wbSBzY3JpcHQgZ2V0cyBcdTIwMTQgYnV0IGJvdGggc2hhcmUgdGhlIHNhbWUgbm90aW9uIG9mIGFuIG9mZiB2YWx1ZSwgdmlhIHtAbGluayBpc0VudlZhcmlhYmxlT2ZmfS5cbiAqXG4gKiBUaGlzIGlzIGEgZnVuY3Rpb24gcmF0aGVyIHRoYW4gbW9kdWxlLWxldmVsIGNvZGUgc28gaW1wb3J0aW5nIHRoZSBwYWNrYWdlIGJhcnJlbCBuZXZlciB0cmlnZ2VycyB0aGVcbiAqIGAuZW52YCByZWFkIG9yIHRoZSBwcm9jZXNzIGV4aXQ7IGNhbGwgaXQgZnJvbSB0aGUgdGhpbiBgc2NyaXB0cy9uYW5vLXN0YWdlZC1jb25maWcudHNgIGVudHJ5LiBSZXNvbHZpbmcgdGhlXG4gKiBwYWNrYWdlIG1hbmFnZXIgaXMgdGhlIG9uZSB0aGluZyB0aGF0IGRvZXMgcnVuIGF0IG1vZHVsZSBzY29wZSwgYW5kIGl0IGRvZXMgbmVpdGhlciBvZiB0aG9zZSB0d29cbiAqIHRoaW5ncyBcdTIwMTQgaXQgb25seSBwcm9iZXMgZm9yIGEgbG9ja2ZpbGUuXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgb3B0aW9uYWwgb3B0aW9ucy5cbiAqIEByZXR1cm5zIFRoZSBuYW5vLXN0YWdlZCB0YXNrIGNvbmZpZ3VyYXRpb24uIERvZXMgbm90IHJldHVybiB3aGVuIHRoZSBvcHQtb3V0IGlzIGFjdGl2ZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE5hbm9TdGFnZWRDb25maWcob3B0aW9ucz86IEdldE5hbm9TdGFnZWRDb25maWdPcHRpb25zKTogTmFub1N0YWdlZENvbmZpZyB7XG4gIGxvYWRFbnZGaWxlSWZFeGlzdHMoKTtcblxuICBpZiAoaXNFbnZWYXJpYWJsZU9mZihOQU5PX1NUQUdFRF9FTlZfVkFSSUFCTEUpKSB7XG4gICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoYG5hbm8tc3RhZ2VkOiBza2lwcGVkICgke05BTk9fU1RBR0VEX0VOVl9WQVJJQUJMRX0gaXMgb2ZmKS5cXG5gKTtcbiAgICBwcm9jZXNzLmV4aXQoMCk7XG4gIH1cblxuICBjb25zdCBzY3JpcHROYW1lcyA9IG5ldyBTZXQoT2JqZWN0LmtleXMocmVhZFBhY2thZ2VKc29uU3luYygpLnNjcmlwdHMgPz8ge30pKTtcbiAgY29uc3QgaGFzQWxsU2hhcmVkU2NyaXB0cyA9IFtTUEVMTENIRUNLX1NDUklQVF9OQU1FLCAuLi5PYmplY3QudmFsdWVzKFdSSVRFUl9TQ1JJUFRfTkFNRVMpLmZsYXQoKV1cbiAgICAuZXZlcnkoKHNjcmlwdE5hbWUpID0+IHNjcmlwdE5hbWVzLmhhcyhzY3JpcHROYW1lKSk7XG4gIGNvbnN0IGFkZGl0aW9uYWxXcml0ZXJUYXNrcyA9IG9wdGlvbnM/LmFkZGl0aW9uYWxXcml0ZXJUYXNrcyA/PyB7fTtcbiAgaWYgKGhhc0FsbFNoYXJlZFNjcmlwdHMgJiYgT2JqZWN0LmtleXMoYWRkaXRpb25hbFdyaXRlclRhc2tzKS5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gYXBwbHlCdWxrQnVkZ2V0KG9ic2lkaWFuRGV2VXRpbHNDb25maWcpO1xuICB9XG5cbiAgY29uc3Qgd3JpdGVyVGFza3MgPSB0b1dyaXRlclRhc2tzKChzY3JpcHROYW1lKSA9PiBzY3JpcHROYW1lcy5oYXMoc2NyaXB0TmFtZSkpO1xuICBjb25zdCBkdXBsaWNhdGVQYXR0ZXJuID0gT2JqZWN0LmtleXMoYWRkaXRpb25hbFdyaXRlclRhc2tzKS5maW5kKChwYXR0ZXJuKSA9PiBPYmplY3QuaGFzT3duKHdyaXRlclRhc2tzLCBwYXR0ZXJuKSk7XG4gIGlmIChkdXBsaWNhdGVQYXR0ZXJuICE9PSB1bmRlZmluZWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYG5hbm8tc3RhZ2VkIHdyaXRlciBwYXR0ZXJuICcke2R1cGxpY2F0ZVBhdHRlcm59JyBpcyBhbHJlYWR5IGEgc2hhcmVkIHdyaXRlciBwYXR0ZXJuLmApO1xuICB9XG5cbiAgcmV0dXJuIGFwcGx5QnVsa0J1ZGdldChwYXJ0aXRpb25TcGVsbGNoZWNrKHsgLi4ud3JpdGVyVGFza3MsIC4uLmFkZGl0aW9uYWxXcml0ZXJUYXNrcyB9LCBzY3JpcHROYW1lcy5oYXMoU1BFTExDSEVDS19TQ1JJUFRfTkFNRSkpKTtcbn1cblxuLyoqXG4gKiBDb2xsZWN0cyBjb21tYW5kcyB1c2luZyBuYW5vLXN0YWdlZCdzIG93biBwYXR0ZXJuIG1hdGNoaW5nLCB0aGVuIHJ1bnMgdGhlbSBpbiBvbmUgc2VyaWFsIGdyb3VwLlxuICpcbiAqIG5hbm8tc3RhZ2VkJ3MgYGdlbmVyYXRlQ21kVGFza3NgIHZpc2l0cyBjb25maWd1cmF0aW9uIGVudHJpZXMgaW4gaW5zZXJ0aW9uIG9yZGVyIGJlZm9yZSBleGVjdXRpbmcgYW55XG4gKiBjb21tYW5kcy4gVGhlIG9yaWdpbmFsIHBhdHRlcm4gY2FsbGJhY2tzIGNvbGxlY3QgdGhlaXIgY29tbWFuZHMgYW5kIHJldHVybiBub25lOyB0aGUgZmluYWwgY2F0Y2gtYWxsXG4gKiBkcmFpbnMgdGhlbS4gVGhpcyBwcmVzZXJ2ZXMgaXRzIGdsb2IgZGlhbGVjdCwgY3VzdG9tIHdyaXRlcnMsIGJhdGNoaW5nIGFuZCBwZXItZmlsZSB3cml0ZXIgb3JkZXIgd2l0aG91dFxuICogZGVwZW5kaW5nIG9uIGl0cyBwcml2YXRlIGNvbXBpbGVyLiBUaGUgaW5zdGFsbGVkIHJ1bm5lcidzIGdlbmVyYXRpb24gb3JkZXIgaXMgcGlubmVkIGJ5IHRoZSB0ZXN0cy5cbiAqXG4gKiBAcGFyYW0gY29uZmlnIC0gVGhlIGNvbmZpZ3VyYXRpb24gd2hvc2UgZXhlY3V0aW9uIHNob3VsZCByZXNwZWN0IHRoZSBidWxrIGJ1ZGdldC5cbiAqIEByZXR1cm5zIFRoZSBzZXJpYWwgY29uZmlndXJhdGlvbiB3aGVuIGEgYnVkZ2V0IGlzIHByZXNlbnQsIG90aGVyd2lzZSB0aGUgb3JpZ2luYWwgY29uZmlndXJhdGlvbi5cbiAqL1xuZnVuY3Rpb24gYXBwbHlCdWxrQnVkZ2V0KGNvbmZpZzogTmFub1N0YWdlZENvbmZpZyk6IE5hbm9TdGFnZWRDb25maWcge1xuICBjb25zdCBidWRnZXQgPSBwcm9jZXNzLmVudlsnQlVMS19DT1JFUyddPy50cmltKCkgPz8gJyc7XG4gIGlmICghL15bMS05XVxcZCokLy50ZXN0KGJ1ZGdldCkpIHtcbiAgICByZXR1cm4gY29uZmlnO1xuICB9XG5cbiAgY29uc3QgY29tbWFuZHM6IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IHNlcmlhbENvbmZpZzogTmFub1N0YWdlZENvbmZpZyA9IHt9O1xuICBmb3IgKGNvbnN0IFtwYXR0ZXJuLCB0YXNrXSBvZiBPYmplY3QuZW50cmllcyhjb25maWcpKSB7XG4gICAgc2VyaWFsQ29uZmlnW3BhdHRlcm5dID0gKGNvbnRleHQpOiBzdHJpbmdbXSA9PiB7XG4gICAgICBjb21tYW5kcy5wdXNoKC4uLnRhc2soY29udGV4dCkpO1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH07XG4gIH1cblxuICAvLyBBIHNwZWxsY2hlY2stb25seSBjb25maWd1cmF0aW9uIGNhbiBhbHJlYWR5IG93biBgKmA7IG1vdmUgaXRzIGNvbGxlY3RvciBpbnRvIHRoZSBmaW5hbCBjYWxsYmFjay5cbiAgY29uc3QgY29sbGVjdEFsbCA9IHNlcmlhbENvbmZpZ1snKiddO1xuICBkZWxldGUgc2VyaWFsQ29uZmlnWycqJ107XG4gIHNlcmlhbENvbmZpZ1snKiddID0gKGNvbnRleHQpOiBzdHJpbmdbXSA9PiB7XG4gICAgY29sbGVjdEFsbD8uKGNvbnRleHQpO1xuICAgIHJldHVybiBjb21tYW5kcy5zcGxpY2UoMCk7XG4gIH07XG4gIHJldHVybiBzZXJpYWxDb25maWc7XG59XG5cbi8qKlxuICogU3BsaXRzIGNvbW1hbmQgYXJndW1lbnRzIGludG8gYmF0Y2hlcyB0aGF0IGVhY2ggZml0IG9uZSBjb21tYW5kIGxpbmUgYWZ0ZXIgYSBnaXZlbiBwcmVmaXguXG4gKlxuICogRWFjaCBhcmd1bWVudCBpcyBjb3N0ZWQgYXMgbmFuby1zdGFnZWQgcGFzc2VzIGl0IG9uIFdpbmRvd3MgXHUyMDE0IHF1b3RlZCwgdGhlbiBgXmAtZXNjYXBlZCBieSBgY21kLmV4ZWAnc1xuICogcnVsZXMgXHUyMDE0IHRocm91Z2gge0BsaW5rIGdldEVmZmVjdGl2ZUNvbW1hbmRMaW5lTGVuZ3RofSwgYW5kIHRoZSBidWRnZXQgaXMge0BsaW5rIGdldE1heEJhdGNoQ29tbWFuZExlbmd0aH0sXG4gKiB3aGljaCBhbHJlYWR5IGhvbGRzIGJhY2sgdGhlIHJlc2VydmUgZm9yIHRoZSBgbnBtYCBcdTIxOTIgYGNtZC5leGVgIFx1MjE5MiBgLmJpbmAgc2hpbSBjaGFpbiByZS1leHBhbmRpbmcgdGhlXG4gKiBhcmd1bWVudHMuIEFuIGFyZ3VtZW50IHRvbyBsb25nIGZvciBhbnkgYmF0Y2ggc3RpbGwgZ2V0cyBhIGJhdGNoIG9mIGl0cyBvd246IGl0IGZhaWxzIGxvdWRseSB0aGVyZSwgd2hpY2hcbiAqIGRyb3BwaW5nIGl0IHdvdWxkIG5vdC5cbiAqXG4gKiBAcGFyYW0gcHJlZml4IC0gVGhlIGNvbW1hbmQgdGhlIGFyZ3VtZW50cyBhcmUgYXBwZW5kZWQgdG8uXG4gKiBAcGFyYW0gY29tbWFuZEFyZ3VtZW50cyAtIFRoZSBhcmd1bWVudHMgdG8gc3BsaXQuXG4gKiBAcmV0dXJucyBUaGUgYmF0Y2hlcywgaW4gb3JkZXIsIHRvZ2V0aGVyIGhvbGRpbmcgZXZlcnkgYXJndW1lbnQgb25jZS5cbiAqL1xuZnVuY3Rpb24gYmF0Y2hDb21tYW5kQXJndW1lbnRzKHByZWZpeDogc3RyaW5nLCBjb21tYW5kQXJndW1lbnRzOiByZWFkb25seSBzdHJpbmdbXSk6IHN0cmluZ1tdW10ge1xuICBjb25zdCBlbXB0eUxlbmd0aCA9IGdldEVmZmVjdGl2ZUNvbW1hbmRMaW5lTGVuZ3RoKCcnKTtcbiAgY29uc3QgYnVkZ2V0ID0gZ2V0TWF4QmF0Y2hDb21tYW5kTGVuZ3RoKCkgLSBFWEVDVVRBQkxFX1BBVEhfUkVTRVJWRSAtIGdldEVmZmVjdGl2ZUNvbW1hbmRMaW5lTGVuZ3RoKHByZWZpeCk7XG4gIGNvbnN0IGJhdGNoZXM6IHN0cmluZ1tdW10gPSBbXTtcbiAgbGV0IGJhdGNoOiBzdHJpbmdbXSA9IFtdO1xuICBsZXQgYmF0Y2hMZW5ndGggPSAwO1xuXG4gIGZvciAoY29uc3QgY29tbWFuZEFyZ3VtZW50IG9mIGNvbW1hbmRBcmd1bWVudHMpIHtcbiAgICBjb25zdCBhcmd1bWVudExlbmd0aCA9IGdldEVmZmVjdGl2ZUNvbW1hbmRMaW5lTGVuZ3RoKGAgXCIke2NvbW1hbmRBcmd1bWVudH1cImApIC0gZW1wdHlMZW5ndGg7XG4gICAgaWYgKGJhdGNoLmxlbmd0aCA+IDAgJiYgYmF0Y2hMZW5ndGggKyBhcmd1bWVudExlbmd0aCA+IGJ1ZGdldCkge1xuICAgICAgYmF0Y2hlcy5wdXNoKGJhdGNoKTtcbiAgICAgIGJhdGNoID0gW107XG4gICAgICBiYXRjaExlbmd0aCA9IDA7XG4gICAgfVxuICAgIGJhdGNoLnB1c2goY29tbWFuZEFyZ3VtZW50KTtcbiAgICBiYXRjaExlbmd0aCArPSBhcmd1bWVudExlbmd0aDtcbiAgfVxuXG4gIGlmIChiYXRjaC5sZW5ndGggPiAwKSB7XG4gICAgYmF0Y2hlcy5wdXNoKGJhdGNoKTtcbiAgfVxuXG4gIHJldHVybiBiYXRjaGVzO1xufVxuXG4vKipcbiAqIEJ1aWxkcyBhIG5hbm8tc3RhZ2VkIGNvbmZpZ3VyYXRpb24gaW4gd2hpY2ggc3BlbGxjaGVjayBuZXZlciByZWFkcyBhIGZpbGUgd2hpbGUgYW5vdGhlciB0YXNrIHJld3JpdGVzIGl0LlxuICpcbiAqIFRoZSBzYW1lIGBQcm9taXNlLmFsbGAgdGhhdCBmb3JjZXMgdHdvIHdyaXRlcnMgaW50byBvbmUga2V5IG1ha2VzIGEgY2F0Y2gtYWxsIGAnKidgIHNwZWxsY2hlY2sga2V5IHJ1blxuICogQ09OQ1VSUkVOVExZIHdpdGggZXZlcnkgd3JpdGVyIGtleSwgc28gY3NwZWxsIHdvdWxkIHJlYWQgYSBmaWxlIHRoYXQgRVNMaW50IG9yIGRwcmludCBpcyByZXdyaXRpbmcgaW5cbiAqIHBsYWNlIC0tIGEgc3B1cmlvdXMgZmluZGluZyBvbiBhIGhhbGYtd3JpdHRlbiBmaWxlLCBvciBhIHBhc3Mgb3ZlciBjb250ZW50IHRoYXQgaXMgbm90IHdoYXQgZ2V0c1xuICogY29tbWl0dGVkLiBTbyB0aGUgc3RhZ2VkIGZpbGVzIGFyZSBQQVJUSVRJT05FRCBpbnN0ZWFkOlxuICpcbiAqIC0gZXZlcnkgd3JpdGVyIGtleSBnZXRzIHNwZWxsY2hlY2sgYXBwZW5kZWQgYXMgaXRzIExBU1QgY29tbWFuZCwgc28gaXQgcmVhZHMgdGhhdCBrZXkncyBmaWxlcyBhZnRlciB0aGV5XG4gKiAgIGhhdmUgYmVlbiByZXdyaXR0ZW47XG4gKiAtIG9uZSBjb21wbGVtZW50IGtleSBzcGVsbGNoZWNrcyBleGFjdGx5IHRoZSBmaWxlcyBubyB3cml0ZXIga2V5IGNsYWltcy5cbiAqXG4gKiBUaGUgY29tcGxlbWVudCBpcyB3cml0dGVuIGluIG5hbm8tc3RhZ2VkJ3Mgb3duIGdsb2IgZGlhbGVjdCwgd2hpY2ggY29tcGlsZXMgYCEoLi4uKWAgdG8gYSBsb29rYWhlYWQgdGhhdFxuICogaXMgTk9UIGFuY2hvcmVkIGF0IHRoZSBlbmQgb2YgdGhlIHBhdGg6IGAhKCoubWQpKmAgd291bGQgZXhjbHVkZSBgbm90ZXMubWQuYmFrYCB0b28uIEEgbmVzdGVkIGAhKD8pYFxuICogY29tcGlsZXMgdG8gYCg/IS4pYCwgd2hpY2ggSVMgYW4gZW5kIGFuY2hvciwgc28gZWFjaCBhbHRlcm5hdGl2ZSBpcyBzdWZmaXhlZCB3aXRoIGl0LiBBIHdyaXRlciBwYXR0ZXJuXG4gKiBjb250YWluaW5nIGAvYCB3b3VsZCBzd2l0Y2ggbmFuby1zdGFnZWQgaW50byBnbG9ic3RhciBtb2RlLCB3aGVyZSBgKmAgc3RvcHMgY3Jvc3NpbmcgZGlyZWN0b3JpZXMgYW5kIHRoZVxuICogY29uc3RydWN0aW9uIG5vIGxvbmdlciBob2xkcyAtLSBoZW5jZSB0aGUgdGhyb3cuIFRoZSB1bml0IHRlc3QgcGlucyB0aGUgcGFydGl0aW9uIGFnYWluc3QgdGhlIGluc3RhbGxlZFxuICogbmFuby1zdGFnZWQgY29tcGlsZXIsIHNvIGEgcmVsZWFzZSB0aGF0IGNoYW5nZXMgaXRzIGRpYWxlY3QgZmFpbHMgdGhlcmUgcmF0aGVyIHRoYW4gaW4gYSBjb21taXQuXG4gKlxuICogV2l0aG91dCBzcGVsbGNoZWNrIHRoZXJlIGlzIG5vdGhpbmcgdG8gcGFydGl0aW9uOiBlYWNoIHdyaXRlciBrZXkgcnVucyBpdHMgb3duIGNvbW1hbmRzLCBhbmQgbm8gY29tcGxlbWVudFxuICoga2V5IGlzIGVtaXR0ZWQuXG4gKlxuICogQHBhcmFtIHdyaXRlclRhc2tzIC0gVGhlIGZpbGUtcmV3cml0aW5nIHRhc2tzLCBrZXllZCBieSB0aGUgcGF0dGVybiB0aGF0IGNsYWltcyB0aGVpciBmaWxlcy5cbiAqIEBwYXJhbSBzaG91bGRTcGVsbGNoZWNrIC0gV2hldGhlciB0aGUgcHJvamVjdCBoYXMgYSBgc3BlbGxjaGVja2Agc2NyaXB0IHRvIHJ1bi5cbiAqIEByZXR1cm5zIFRoZSBjb25maWd1cmF0aW9uLCB3aXRoIHRoZSBzcGVsbGNoZWNrIHN0ZXAgcGFydGl0aW9uZWQgYWNyb3NzIHRoZSBrZXlzLlxuICovXG5mdW5jdGlvbiBwYXJ0aXRpb25TcGVsbGNoZWNrKHdyaXRlclRhc2tzOiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCByZWFkb25seSBzdHJpbmdbXT4+LCBzaG91bGRTcGVsbGNoZWNrOiBib29sZWFuKTogTmFub1N0YWdlZENvbmZpZyB7XG4gIGlmICghc2hvdWxkU3BlbGxjaGVjaykge1xuICAgIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXMod3JpdGVyVGFza3MpLm1hcCgoW3BhdHRlcm4sIGNvbW1hbmRzXSkgPT4gW3BhdHRlcm4sIHRvQmF0Y2hlZFRhc2soY29tbWFuZHMpXSkpO1xuICB9XG5cbiAgY29uc3QgcGF0dGVybnMgPSBPYmplY3Qua2V5cyh3cml0ZXJUYXNrcyk7XG4gIGNvbnN0IHBhdHRlcm5XaXRoU2xhc2ggPSBwYXR0ZXJucy5maW5kKChwYXR0ZXJuKSA9PiBwYXR0ZXJuLmluY2x1ZGVzKCcvJykpO1xuICBpZiAocGF0dGVybldpdGhTbGFzaCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBuYW5vLXN0YWdlZCB3cml0ZXIgcGF0dGVybiAnJHtwYXR0ZXJuV2l0aFNsYXNofScgY29udGFpbnMgJy8nLCB3aGljaCB0aGUgc3BlbGxjaGVjayBwYXJ0aXRpb24gY2Fubm90IGV4cHJlc3MuYCk7XG4gIH1cblxuICAvLyBgISgpKmAgd291bGQgY29tcGlsZSB0byBhIGxvb2thaGVhZCB0aGF0IHJlamVjdHMgZXZlcnkgcGF0aCwgc28gd2l0aCBubyB3cml0ZXIgdGhlIGNvbXBsZW1lbnQgaXMgZXZlcnl0aGluZy5cbiAgY29uc3QgY29tcGxlbWVudFBhdHRlcm4gPSBwYXR0ZXJucy5sZW5ndGggPT09IDAgPyAnKicgOiBgISgke3BhdHRlcm5zLm1hcCgocGF0dGVybikgPT4gYCR7cGF0dGVybn0hKD8pYCkuam9pbignfCcpfSkqYDtcbiAgY29uc3QgY29uZmlnOiBOYW5vU3RhZ2VkQ29uZmlnID0ge1xuICAgIFtjb21wbGVtZW50UGF0dGVybl06IHRvQmF0Y2hlZFRhc2soW1NQRUxMQ0hFQ0tfQ09NTUFORF0pXG4gIH07XG5cbiAgZm9yIChjb25zdCBbcGF0dGVybiwgY29tbWFuZHNdIG9mIE9iamVjdC5lbnRyaWVzKHdyaXRlclRhc2tzKSkge1xuICAgIGNvbmZpZ1twYXR0ZXJuXSA9IHRvQmF0Y2hlZFRhc2soWy4uLmNvbW1hbmRzLCBTUEVMTENIRUNLX0NPTU1BTkRdKTtcbiAgfVxuXG4gIHJldHVybiBjb25maWc7XG59XG5cbi8qKlxuICogQnVpbGRzIGEgdGFzayB0aGF0IHJ1bnMgZWFjaCBjb21tYW5kIG92ZXIgZXZlcnkgc3RhZ2VkIGZpbGUgaXQgcmVjZWl2ZXMsIGluIGFzIG1hbnkgYmF0Y2hlcyBhcyB0aGUgY29tbWFuZFxuICogbGluZSBuZWVkcy5cbiAqXG4gKiBuYW5vLXN0YWdlZCBhcHBlbmRzIGEgc3RyaW5nIHRhc2sncyBmaWxlcyB0byBPTkUgY29tbWFuZCwgc28gYSBjb21taXQgc3RhZ2luZyBhIGZldyBodW5kcmVkIGZpbGVzIHJhblxuICogYG5wbSBydW4gbGludDpmaXggLS0gPGV2ZXJ5IHBhdGg+YCBhbmQgZmFpbGVkIG9uIFdpbmRvd3Mgd2l0aCBgVGhlIGNvbW1hbmQgbGluZSBpcyB0b28gbG9uZy5gLCByZWZ1c2luZ1xuICogZXhhY3RseSB0aGUgd2hvbGUtcmVwbyBjb21taXRzIHRoYXQgbW9zdCBuZWVkIHRoZSBob29rLiBBIGZ1bmN0aW9uLXZhbHVlZCB0YXNrIGJ1aWxkcyBpdHMgb3duIGNvbW1hbmRzXG4gKiBpbnN0ZWFkLCBhbmQgdGhlc2UgYXJlIGJhdGNoZWQgYWdhaW5zdCB0aGUgc2FtZSBidWRnZXQgYGV4ZWMoKWAgdXNlcyAoc2VlIGBiYXRjaENvbW1hbmRBcmd1bWVudHNgKS5cbiAqXG4gKiBUaGUgY29tbWFuZHMga2VlcCB0aGVpciBvcmRlcjogZXZlcnkgYmF0Y2ggb2YgdGhlIGZpcnN0IGNvbW1hbmQgcnVucyBiZWZvcmUgYW55IGJhdGNoIG9mIHRoZSBzZWNvbmQsXG4gKiBiZWNhdXNlIG5hbm8tc3RhZ2VkIHJ1bnMgb25lIGtleSdzIGNvbW1hbmRzIG9uZSBhZnRlciBhbm90aGVyLCBzbyBhIHdyaXRlciBzdGlsbCBmaW5pc2hlcyBiZWZvcmUgdGhlIG5leHRcbiAqIHdyaXRlciwgYW5kIHNwZWxsY2hlY2sgc3RpbGwgcmVhZHMgdGhlIHJld3JpdHRlbiBmaWxlcy5cbiAqXG4gKiBAcGFyYW0gY29tbWFuZHMgLSBUaGUgY29tbWFuZCBwcmVmaXhlcywgaW4gdGhlIG9yZGVyIHRoZXkgcnVuLlxuICogQHJldHVybnMgVGhlIHRhc2suXG4gKi9cbmZ1bmN0aW9uIHRvQmF0Y2hlZFRhc2soY29tbWFuZHM6IHJlYWRvbmx5IHN0cmluZ1tdKTogTmFub1N0YWdlZFRhc2sge1xuICByZXR1cm4gKHsgZmlsZW5hbWVzIH0pID0+IHtcbiAgICBjb25zdCBjb21tYW5kQXJndW1lbnRzID0gZmlsZW5hbWVzLm1hcCgoZmlsZW5hbWUpID0+IHRvQ29tbWFuZEFyZ3VtZW50KGZpbGVuYW1lKSk7XG4gICAgcmV0dXJuIGNvbW1hbmRzLmZsYXRNYXAoKGNvbW1hbmQpID0+IGJhdGNoQ29tbWFuZEFyZ3VtZW50cyhjb21tYW5kLCBjb21tYW5kQXJndW1lbnRzKS5tYXAoKGJhdGNoKSA9PiBgJHtjb21tYW5kfSAke2JhdGNoLmpvaW4oJyAnKX1gKSk7XG4gIH07XG59XG5cbi8qKlxuICogVHVybnMgYSBzdGFnZWQgZmlsZSdzIGFic29sdXRlIHBhdGggaW50byB0aGUgYXJndW1lbnQgYSBiYXRjaGVkIHRhc2sgcGFzc2VzIGZvciBpdC5cbiAqXG4gKiBUaGUgcGF0aCBpcyBtYWRlIHJlbGF0aXZlIHRvIHRoZSB3b3JraW5nIGRpcmVjdG9yeSwgd2hlcmUgbmFuby1zdGFnZWQgYW5kIHRoZSB0YXNrIGJvdGggcnVuLCB3aGljaCByb3VnaGx5XG4gKiBoYWx2ZXMgaXRzIGxlbmd0aCBhbmQgc28gdGhlIG51bWJlciBvZiBiYXRjaGVzOyBhIHBhdGggb3V0c2lkZSBpdCBzdGF5cyBhYnNvbHV0ZS4gQSByZWxhdGl2ZSBwYXRoIHN0YXJ0aW5nXG4gKiB3aXRoIGAtYCBnZXRzIGAuL2AsIHNvIG5vIHRvb2wgcmVhZHMgaXQgYXMgYW4gb3B0aW9uLlxuICpcbiAqIFdoaXRlc3BhY2UgYW5kIHF1b3RlcyBiZWNvbWUgYD9gLCBiZWNhdXNlIG5hbm8tc3RhZ2VkJ3MgdG9rZW5pemVyIGNhbm5vdCBjYXJyeSB0aGVtIChzZWVcbiAqIHtAbGluayBUT0tFTklaRVJfVU5TQUZFX0NIQVJBQ1RFUlNfUkVHX0VYUH0pLiBFdmVyeSB0b29sIHRoZSB0YXNrcyBydW4gKEVTTGludCwgZHByaW50LCBjc3BlbGwsXG4gKiBtYXJrZG93bmxpbnQtY2xpMikgdGFrZXMgaXRzIHBhdGhzIGFzIGdsb2JzLCBhbmQgYD9gIG1hdGNoZXMgZXhhY3RseSB0aGUgb25lIGNoYXJhY3RlciBpdCByZXBsYWNlZCwgc28gdGhlXG4gKiBmaWxlIGlzIHN0aWxsIGZvdW5kOyBhIHNpYmxpbmcgZGlmZmVyaW5nIG9ubHkgaW4gdGhhdCBjaGFyYWN0ZXIgd291bGQgbWF0Y2ggdG9vLCB3aGljaCBjb3N0cyBhIGxpbnQgb2YgYW5cbiAqIGV4dHJhIGZpbGUsIG5vdCBhIG1pc3NlZCBvbmUuXG4gKlxuICogQHBhcmFtIGZpbGVuYW1lIC0gVGhlIGFic29sdXRlIHBhdGggb2YgdGhlIHN0YWdlZCBmaWxlLlxuICogQHJldHVybnMgVGhlIGFyZ3VtZW50LlxuICovXG5mdW5jdGlvbiB0b0NvbW1hbmRBcmd1bWVudChmaWxlbmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgcmVsYXRpdmVQYXRoID0gcmVsYXRpdmUocHJvY2Vzcy5jd2QoKSwgZmlsZW5hbWUpO1xuICBsZXQgY29tbWFuZEFyZ3VtZW50ID0gKHJlbGF0aXZlUGF0aC5zdGFydHNXaXRoKCcuLicpIHx8IGlzQWJzb2x1dGUocmVsYXRpdmVQYXRoKSA/IGZpbGVuYW1lIDogcmVsYXRpdmVQYXRoKS5yZXBsYWNlQWxsKCdcXFxcJywgJy8nKTtcbiAgaWYgKGNvbW1hbmRBcmd1bWVudC5zdGFydHNXaXRoKCctJykpIHtcbiAgICBjb21tYW5kQXJndW1lbnQgPSBgLi8ke2NvbW1hbmRBcmd1bWVudH1gO1xuICB9XG4gIHJldHVybiBjb21tYW5kQXJndW1lbnQucmVwbGFjZUFsbChUT0tFTklaRVJfVU5TQUZFX0NIQVJBQ1RFUlNfUkVHX0VYUCwgJz8nKTtcbn1cblxuLyoqXG4gKiBCdWlsZHMgdGhlIGNvbW1hbmQgcHJlZml4IHRoYXQgcnVucyBhbiBucG0gc2NyaXB0IG92ZXIgdGhlIHBhdGhzIGFwcGVuZGVkIHRvIGl0LlxuICpcbiAqIEBwYXJhbSBzY3JpcHROYW1lIC0gVGhlIHNjcmlwdCBuYW1lLlxuICogQHJldHVybnMgVGhlIGNvbW1hbmQgcHJlZml4LCBzdWNoIGFzIGBucG0gcnVuIGxpbnQ6Zml4IC0tYC5cbiAqL1xuZnVuY3Rpb24gdG9TY3JpcHRDb21tYW5kKHNjcmlwdE5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgJHtQQUNLQUdFX01BTkFHRVJfUlVOX0NPTU1BTkR9ICR7c2NyaXB0TmFtZX0gLS1gO1xufVxuXG4vKipcbiAqIEJ1aWxkcyB0aGUgc2hhcmVkIHdyaXRlciB0YXNrcyBmcm9tIHtAbGluayBXUklURVJfU0NSSVBUX05BTUVTfSwga2VlcGluZyBvbmx5IHRoZSBzY3JpcHRzIGEgZmlsdGVyIGFjY2VwdHNcbiAqIGFuZCBkcm9wcGluZyBhIHBhdHRlcm4gbGVmdCB3aXRoIG5vbmUuXG4gKlxuICogQHBhcmFtIHNob3VsZEluY2x1ZGVTY3JpcHQgLSBXaGV0aGVyIHRvIHJ1biBhIGdpdmVuIHNjcmlwdC5cbiAqIEByZXR1cm5zIFRoZSB3cml0ZXIgdGFza3MsIGtleWVkIGJ5IHRoZSBwYXR0ZXJuIHRoYXQgY2xhaW1zIHRoZWlyIGZpbGVzLlxuICovXG5mdW5jdGlvbiB0b1dyaXRlclRhc2tzKHNob3VsZEluY2x1ZGVTY3JpcHQ6IChzY3JpcHROYW1lOiBzdHJpbmcpID0+IGJvb2xlYW4pOiBSZWNvcmQ8c3RyaW5nLCByZWFkb25seSBzdHJpbmdbXT4ge1xuICBjb25zdCB3cml0ZXJUYXNrczogUmVjb3JkPHN0cmluZywgcmVhZG9ubHkgc3RyaW5nW10+ID0ge307XG4gIGZvciAoY29uc3QgW3BhdHRlcm4sIHNjcmlwdE5hbWVzXSBvZiBPYmplY3QuZW50cmllcyhXUklURVJfU0NSSVBUX05BTUVTKSkge1xuICAgIGNvbnN0IGNvbW1hbmRzID0gc2NyaXB0TmFtZXMuZmlsdGVyKChzY3JpcHROYW1lKSA9PiBzaG91bGRJbmNsdWRlU2NyaXB0KHNjcmlwdE5hbWUpKS5tYXAoKHNjcmlwdE5hbWUpID0+IHRvU2NyaXB0Q29tbWFuZChzY3JpcHROYW1lKSk7XG4gICAgaWYgKGNvbW1hbmRzLmxlbmd0aCA+IDApIHtcbiAgICAgIHdyaXRlclRhc2tzW3BhdHRlcm5dID0gY29tbWFuZHM7XG4gICAgfVxuICB9XG4gIHJldHVybiB3cml0ZXJUYXNrcztcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7O0FBTUE7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUCxPQUFPLGFBQWE7QUFFcEI7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUDtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQLFNBQVMsMkJBQTJCO0FBQ3BDLFNBQVMsbUNBQW1DO0FBMkM1QyxNQUFNLDhCQUE4Qiw0QkFBNEIsRUFBRSxLQUFLLEdBQUc7QUFFMUUsTUFBTSx5QkFBeUI7QUFFL0IsTUFBTSxxQkFBcUIsZ0JBQWdCLHNCQUFzQjtBQVFqRSxNQUFNLDBCQUEwQjtBQVNoQyxNQUFNLHNDQUFzQztBQWlCNUMsTUFBTSxzQkFBbUU7QUFBQSxFQUN2RSxrQkFBa0IsQ0FBQyxZQUFZLFFBQVE7QUFBQSxFQUN2QyxRQUFRLENBQUMsYUFBYTtBQUN4QjtBQUVBLE1BQU0sZUFBNEQsY0FB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
@@ -31,6 +31,11 @@ export interface TestCoverageOptions extends TestOptions {
31
31
  * Options for running tests.
32
32
  */
33
33
  export interface TestOptions {
34
+ /**
35
+ * Further CLI arguments for the runner, appended after the wrapper's own: file filters, `-t`, `--maxWorkers`. An
36
+ * argument naming an option the wrapper sets itself (projects, coverage, watch mode) throws.
37
+ */
38
+ readonly additionalArguments?: readonly string[];
34
39
  /**
35
40
  * Whether jest runs the suite as ES modules. Vitest ignores it.
36
41
  *
@@ -61,4 +61,4 @@ export {
61
61
  testCoverage,
62
62
  testWatch
63
63
  };
64
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL3Rlc3QtcnVubmVycy9hdXRvLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogUnVucyB0aGUgdGVzdHMgd2l0aCB3aGljaGV2ZXIgcnVubmVyIHRoZSBwcm9qZWN0IGNvbmZpZ3VyZXM6IHZpdGVzdCBvciBqZXN0LlxuICovXG5cbmltcG9ydCB7IGV4aXN0c1N5bmMgfSBmcm9tICdub2RlOmZzJztcblxuaW1wb3J0IHsgcmVzb2x2ZVBhdGhGcm9tUm9vdFNhZmUgfSBmcm9tICcuLi9yb290LnRzJztcbmltcG9ydCB7XG4gIGhhc0plc3RDb25maWcsXG4gIHRlc3QgYXMgamVzdFRlc3QsXG4gIHRlc3RDb3ZlcmFnZSBhcyBqZXN0VGVzdENvdmVyYWdlLFxuICB0ZXN0V2F0Y2ggYXMgamVzdFRlc3RXYXRjaFxufSBmcm9tICcuL2plc3QudHMnO1xuaW1wb3J0IHtcbiAgdGVzdCBhcyB2aXRlc3RUZXN0LFxuICB0ZXN0Q292ZXJhZ2UgYXMgdml0ZXN0VGVzdENvdmVyYWdlLFxuICB0ZXN0V2F0Y2ggYXMgdml0ZXN0VGVzdFdhdGNoXG59IGZyb20gJy4vdml0ZXN0LnRzJztcblxuLyoqXG4gKiBBIHRlc3QgcnVubmVyIHRoZSB0b29sa2l0IHJ1bnMuXG4gKi9cbmV4cG9ydCB0eXBlIFRlc3RSdW5uZXIgPSAnamVzdCcgfCAndml0ZXN0JztcblxuLyoqXG4gKiBFdmVyeSBmaWxlIHZpdGVzdCByZWFkcyBpdHMgY29uZmlndXJhdGlvbiBmcm9tLlxuICpcbiAqIGB2aXRlLmNvbmZpZy4qYCBpcyBkZWxpYmVyYXRlbHkgbm90IGFtb25nIHRoZW06IGEgcHJvamVjdCB0aGF0IGJ1bmRsZXMgd2l0aCB2aXRlIGFuZCB0ZXN0cyB3aXRoIGplc3QgaGFzIG9uZS5cbiAqXG4gKiBAc2VlIHtAbGluayBodHRwczovL3ZpdGVzdC5kZXYvY29uZmlnL31cbiAqL1xuZXhwb3J0IGNvbnN0IFZJVEVTVF9DT05GSUdfRklMRV9OQU1FUzogcmVhZG9ubHkgc3RyaW5nW10gPSBbXG4gICd2aXRlc3QuY29uZmlnLmNqcycsXG4gICd2aXRlc3QuY29uZmlnLmN0cycsXG4gICd2aXRlc3QuY29uZmlnLmpzJyxcbiAgJ3ZpdGVzdC5jb25maWcubWpzJyxcbiAgJ3ZpdGVzdC5jb25maWcubXRzJyxcbiAgJ3ZpdGVzdC5jb25maWcudHMnXG5dO1xuXG5pbnRlcmZhY2UgUnVubmVyRnVuY3Rpb25zIHtcbiAgcmVhZG9ubHkgdGVzdDogKG9wdGlvbnM6IFRlc3RPcHRpb25zKSA9PiBQcm9taXNlPHZvaWQ+O1xuICByZWFkb25seSB0ZXN0Q292ZXJhZ2U6IChvcHRpb25zOiBUZXN0Q292ZXJhZ2VPcHRpb25zKSA9PiBQcm9taXNlPHZvaWQ+O1xuICByZWFkb25seSB0ZXN0V2F0Y2g6IChvcHRpb25zOiBUZXN0V2F0Y2hPcHRpb25zKSA9PiBQcm9taXNlPHZvaWQ+O1xufVxuXG5jb25zdCBSVU5ORVJTOiBSZWFkb25seTxSZWNvcmQ8VGVzdFJ1bm5lciwgUnVubmVyRnVuY3Rpb25zPj4gPSB7XG4gIGplc3Q6IHtcbiAgICB0ZXN0OiBqZXN0VGVzdCxcbiAgICB0ZXN0Q292ZXJhZ2U6IGplc3RUZXN0Q292ZXJhZ2UsXG4gICAgdGVzdFdhdGNoOiBqZXN0VGVzdFdhdGNoXG4gIH0sXG4gIHZpdGVzdDoge1xuICAgIHRlc3Q6IHZpdGVzdFRlc3QsXG4gICAgdGVzdENvdmVyYWdlOiB2aXRlc3RUZXN0Q292ZXJhZ2UsXG4gICAgdGVzdFdhdGNoOiB2aXRlc3RUZXN0V2F0Y2hcbiAgfVxufTtcblxuLyoqXG4gKiBPcHRpb25zIGZvciBydW5uaW5nIHRlc3RzIHdpdGggY292ZXJhZ2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVGVzdENvdmVyYWdlT3B0aW9ucyBleHRlbmRzIFRlc3RPcHRpb25zIHtcbiAgLyoqXG4gICAqIE1pbmltdW0gY292ZXJhZ2UgcGVyY2VudGFnZSByZXF1aXJlZCwgZm9yIGxpbmVzLCBmdW5jdGlvbnMsIGJyYW5jaGVzIGFuZCBzdGF0ZW1lbnRzIGFsaWtlLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgMGBcbiAgICovXG4gIHJlYWRvbmx5IG1pbkNvdmVyYWdlSW5QZXJjZW50cz86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciBydW5uaW5nIHRlc3RzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRlc3RPcHRpb25zIHtcbiAgLyoqXG4gICAqIFdoZXRoZXIgamVzdCBydW5zIHRoZSBzdWl0ZSBhcyBFUyBtb2R1bGVzLiBWaXRlc3QgaWdub3JlcyBpdC5cbiAgICpcbiAgICogQGRlZmF1bHQgYHRydWVgIHdoZW4gYHBhY2thZ2UuanNvbmAgZGVjbGFyZXMgYFwidHlwZVwiOiBcIm1vZHVsZVwiYFxuICAgKi9cbiAgcmVhZG9ubHkgZXNtPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIHByb2plY3RzIHRvIHJ1bi4gVml0ZXN0IGFsc28gcnVucyBlYWNoIG9uZSdzIGBuYW1lOipgIHN1Yi1wcm9qZWN0czsgamVzdCBtYXRjaGVzIGEgYGRpc3BsYXlOYW1lYCBleGFjdGx5LlxuICAgKi9cbiAgcmVhZG9ubHkgcHJvamVjdHM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogVGhlIHJ1bm5lciB0byB1c2UuIE9taXR0ZWQsIHtAbGluayBkZXRlY3RUZXN0UnVubmVyfSBjaG9vc2VzIGl0LlxuICAgKi9cbiAgcmVhZG9ubHkgcnVubmVyPzogVGVzdFJ1bm5lcjtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciBydW5uaW5nIHRlc3RzIGluIHdhdGNoIG1vZGUuXG4gKi9cbmV4cG9ydCB0eXBlIFRlc3RXYXRjaE9wdGlvbnMgPSBUZXN0T3B0aW9ucztcblxuLyoqXG4gKiBDaG9vc2VzIHRoZSB0ZXN0IHJ1bm5lciBmcm9tIHRoZSBjb25maWd1cmF0aW9uIGZpbGVzIGF0IHRoZSBwcm9qZWN0IHJvb3QuXG4gKlxuICogVGhlIG9yZGVyIGlzIGEgdml0ZXN0IGNvbmZpZ3VyYXRpb24sIHRoZW4gYSBqZXN0IG9uZSAoYSBmaWxlLCBvciBhIGBqZXN0YCBrZXkgaW4gYHBhY2thZ2UuanNvbmApLiBBIHByb2plY3Qgd2l0aFxuICogbmVpdGhlciBnZXRzIHZpdGVzdCwgdGhlIHJ1bm5lciBldmVyeSBwYWNrYWdlIG9uIHRoaXMgdG9vbGNoYWluIHVzZWQgYmVmb3JlIGplc3Qgd2FzIHN1cHBvcnRlZC5cbiAqXG4gKiBAcmV0dXJucyBUaGUgcnVubmVyIHRvIHVzZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRldGVjdFRlc3RSdW5uZXIoKTogUHJvbWlzZTxUZXN0UnVubmVyPiB7XG4gIGlmIChWSVRFU1RfQ09ORklHX0ZJTEVfTkFNRVMuc29tZSgoZmlsZU5hbWUpID0+IGV4aXN0c1N5bmMocmVzb2x2ZVBhdGhGcm9tUm9vdFNhZmUoeyBwYXRoOiBmaWxlTmFtZSB9KSkpKSB7XG4gICAgcmV0dXJuICd2aXRlc3QnO1xuICB9XG5cbiAgcmV0dXJuIGF3YWl0IGhhc0plc3RDb25maWcoKSA/ICdqZXN0JyA6ICd2aXRlc3QnO1xufVxuXG4vKipcbiAqIFJ1bnMgdGhlIHRlc3Qgc3VpdGUgd2l0aCB0aGUgcHJvamVjdCdzIHJ1bm5lci5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSB7QGxpbmsgVGVzdE9wdGlvbnN9LlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSB0ZXN0cyBoYXZlIGNvbXBsZXRlZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHRlc3Qob3B0aW9uczogVGVzdE9wdGlvbnMgPSB7fSk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB7IHJ1bm5lciA9IGF3YWl0IGRldGVjdFRlc3RSdW5uZXIoKSwgLi4ucnVubmVyT3B0aW9ucyB9ID0gb3B0aW9ucztcbiAgYXdhaXQgUlVOTkVSU1tydW5uZXJdLnRlc3QocnVubmVyT3B0aW9ucyk7XG59XG5cbi8qKlxuICogUnVucyB0aGUgdGVzdCBzdWl0ZSB3aXRoIGNvdmVyYWdlLCB3aXRoIHRoZSBwcm9qZWN0J3MgcnVubmVyLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHtAbGluayBUZXN0Q292ZXJhZ2VPcHRpb25zfS5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgdGVzdHMgaGF2ZSBjb21wbGV0ZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB0ZXN0Q292ZXJhZ2Uob3B0aW9uczogVGVzdENvdmVyYWdlT3B0aW9ucyA9IHt9KTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHsgcnVubmVyID0gYXdhaXQgZGV0ZWN0VGVzdFJ1bm5lcigpLCAuLi5ydW5uZXJPcHRpb25zIH0gPSBvcHRpb25zO1xuICBhd2FpdCBSVU5ORVJTW3J1bm5lcl0udGVzdENvdmVyYWdlKHJ1bm5lck9wdGlvbnMpO1xufVxuXG4vKipcbiAqIFJ1bnMgdGhlIHRlc3Qgc3VpdGUgaW4gd2F0Y2ggbW9kZSwgd2l0aCB0aGUgcHJvamVjdCdzIHJ1bm5lci5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSB7QGxpbmsgVGVzdFdhdGNoT3B0aW9uc30uXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIHdhdGNoZXIgZXhpdHMuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB0ZXN0V2F0Y2gob3B0aW9uczogVGVzdFdhdGNoT3B0aW9ucyA9IHt9KTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHsgcnVubmVyID0gYXdhaXQgZGV0ZWN0VGVzdFJ1bm5lcigpLCAuLi5ydW5uZXJPcHRpb25zIH0gPSBvcHRpb25zO1xuICBhd2FpdCBSVU5ORVJTW3J1bm5lcl0udGVzdFdhdGNoKHJ1bm5lck9wdGlvbnMpO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7QUFNQSxTQUFTLGtCQUFrQjtBQUUzQixTQUFTLCtCQUErQjtBQUN4QztBQUFBLEVBQ0U7QUFBQSxFQUNBLFFBQVE7QUFBQSxFQUNSLGdCQUFnQjtBQUFBLEVBQ2hCLGFBQWE7QUFBQSxPQUNSO0FBQ1A7QUFBQSxFQUNFLFFBQVE7QUFBQSxFQUNSLGdCQUFnQjtBQUFBLEVBQ2hCLGFBQWE7QUFBQSxPQUNSO0FBY0EsTUFBTSwyQkFBOEM7QUFBQSxFQUN6RDtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQ0Y7QUFRQSxNQUFNLFVBQXlEO0FBQUEsRUFDN0QsTUFBTTtBQUFBLElBQ0osTUFBTTtBQUFBLElBQ04sY0FBYztBQUFBLElBQ2QsV0FBVztBQUFBLEVBQ2I7QUFBQSxFQUNBLFFBQVE7QUFBQSxJQUNOLE1BQU07QUFBQSxJQUNOLGNBQWM7QUFBQSxJQUNkLFdBQVc7QUFBQSxFQUNiO0FBQ0Y7QUFpREEsZUFBc0IsbUJBQXdDO0FBQzVELE1BQUkseUJBQXlCLEtBQUssQ0FBQyxhQUFhLFdBQVcsd0JBQXdCLEVBQUUsTUFBTSxTQUFTLENBQUMsQ0FBQyxDQUFDLEdBQUc7QUFDeEcsV0FBTztBQUFBLEVBQ1Q7QUFFQSxTQUFPLE1BQU0sY0FBYyxJQUFJLFNBQVM7QUFDMUM7QUFRQSxlQUFzQixLQUFLLFVBQXVCLENBQUMsR0FBa0I7QUFDbkUsUUFBTSxFQUFFLFNBQVMsTUFBTSxpQkFBaUIsR0FBRyxHQUFHLGNBQWMsSUFBSTtBQUNoRSxRQUFNLFFBQVEsTUFBTSxFQUFFLEtBQUssYUFBYTtBQUMxQztBQVFBLGVBQXNCLGFBQWEsVUFBK0IsQ0FBQyxHQUFrQjtBQUNuRixRQUFNLEVBQUUsU0FBUyxNQUFNLGlCQUFpQixHQUFHLEdBQUcsY0FBYyxJQUFJO0FBQ2hFLFFBQU0sUUFBUSxNQUFNLEVBQUUsYUFBYSxhQUFhO0FBQ2xEO0FBUUEsZUFBc0IsVUFBVSxVQUE0QixDQUFDLEdBQWtCO0FBQzdFLFFBQU0sRUFBRSxTQUFTLE1BQU0saUJBQWlCLEdBQUcsR0FBRyxjQUFjLElBQUk7QUFDaEUsUUFBTSxRQUFRLE1BQU0sRUFBRSxVQUFVLGFBQWE7QUFDL0M7IiwKICAibmFtZXMiOiBbXQp9Cg==
64
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL3Rlc3QtcnVubmVycy9hdXRvLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogUnVucyB0aGUgdGVzdHMgd2l0aCB3aGljaGV2ZXIgcnVubmVyIHRoZSBwcm9qZWN0IGNvbmZpZ3VyZXM6IHZpdGVzdCBvciBqZXN0LlxuICovXG5cbmltcG9ydCB7IGV4aXN0c1N5bmMgfSBmcm9tICdub2RlOmZzJztcblxuaW1wb3J0IHsgcmVzb2x2ZVBhdGhGcm9tUm9vdFNhZmUgfSBmcm9tICcuLi9yb290LnRzJztcbmltcG9ydCB7XG4gIGhhc0plc3RDb25maWcsXG4gIHRlc3QgYXMgamVzdFRlc3QsXG4gIHRlc3RDb3ZlcmFnZSBhcyBqZXN0VGVzdENvdmVyYWdlLFxuICB0ZXN0V2F0Y2ggYXMgamVzdFRlc3RXYXRjaFxufSBmcm9tICcuL2plc3QudHMnO1xuaW1wb3J0IHtcbiAgdGVzdCBhcyB2aXRlc3RUZXN0LFxuICB0ZXN0Q292ZXJhZ2UgYXMgdml0ZXN0VGVzdENvdmVyYWdlLFxuICB0ZXN0V2F0Y2ggYXMgdml0ZXN0VGVzdFdhdGNoXG59IGZyb20gJy4vdml0ZXN0LnRzJztcblxuLyoqXG4gKiBBIHRlc3QgcnVubmVyIHRoZSB0b29sa2l0IHJ1bnMuXG4gKi9cbmV4cG9ydCB0eXBlIFRlc3RSdW5uZXIgPSAnamVzdCcgfCAndml0ZXN0JztcblxuLyoqXG4gKiBFdmVyeSBmaWxlIHZpdGVzdCByZWFkcyBpdHMgY29uZmlndXJhdGlvbiBmcm9tLlxuICpcbiAqIGB2aXRlLmNvbmZpZy4qYCBpcyBkZWxpYmVyYXRlbHkgbm90IGFtb25nIHRoZW06IGEgcHJvamVjdCB0aGF0IGJ1bmRsZXMgd2l0aCB2aXRlIGFuZCB0ZXN0cyB3aXRoIGplc3QgaGFzIG9uZS5cbiAqXG4gKiBAc2VlIHtAbGluayBodHRwczovL3ZpdGVzdC5kZXYvY29uZmlnL31cbiAqL1xuZXhwb3J0IGNvbnN0IFZJVEVTVF9DT05GSUdfRklMRV9OQU1FUzogcmVhZG9ubHkgc3RyaW5nW10gPSBbXG4gICd2aXRlc3QuY29uZmlnLmNqcycsXG4gICd2aXRlc3QuY29uZmlnLmN0cycsXG4gICd2aXRlc3QuY29uZmlnLmpzJyxcbiAgJ3ZpdGVzdC5jb25maWcubWpzJyxcbiAgJ3ZpdGVzdC5jb25maWcubXRzJyxcbiAgJ3ZpdGVzdC5jb25maWcudHMnXG5dO1xuXG5pbnRlcmZhY2UgUnVubmVyRnVuY3Rpb25zIHtcbiAgcmVhZG9ubHkgdGVzdDogKG9wdGlvbnM6IFRlc3RPcHRpb25zKSA9PiBQcm9taXNlPHZvaWQ+O1xuICByZWFkb25seSB0ZXN0Q292ZXJhZ2U6IChvcHRpb25zOiBUZXN0Q292ZXJhZ2VPcHRpb25zKSA9PiBQcm9taXNlPHZvaWQ+O1xuICByZWFkb25seSB0ZXN0V2F0Y2g6IChvcHRpb25zOiBUZXN0V2F0Y2hPcHRpb25zKSA9PiBQcm9taXNlPHZvaWQ+O1xufVxuXG5jb25zdCBSVU5ORVJTOiBSZWFkb25seTxSZWNvcmQ8VGVzdFJ1bm5lciwgUnVubmVyRnVuY3Rpb25zPj4gPSB7XG4gIGplc3Q6IHtcbiAgICB0ZXN0OiBqZXN0VGVzdCxcbiAgICB0ZXN0Q292ZXJhZ2U6IGplc3RUZXN0Q292ZXJhZ2UsXG4gICAgdGVzdFdhdGNoOiBqZXN0VGVzdFdhdGNoXG4gIH0sXG4gIHZpdGVzdDoge1xuICAgIHRlc3Q6IHZpdGVzdFRlc3QsXG4gICAgdGVzdENvdmVyYWdlOiB2aXRlc3RUZXN0Q292ZXJhZ2UsXG4gICAgdGVzdFdhdGNoOiB2aXRlc3RUZXN0V2F0Y2hcbiAgfVxufTtcblxuLyoqXG4gKiBPcHRpb25zIGZvciBydW5uaW5nIHRlc3RzIHdpdGggY292ZXJhZ2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVGVzdENvdmVyYWdlT3B0aW9ucyBleHRlbmRzIFRlc3RPcHRpb25zIHtcbiAgLyoqXG4gICAqIE1pbmltdW0gY292ZXJhZ2UgcGVyY2VudGFnZSByZXF1aXJlZCwgZm9yIGxpbmVzLCBmdW5jdGlvbnMsIGJyYW5jaGVzIGFuZCBzdGF0ZW1lbnRzIGFsaWtlLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgMGBcbiAgICovXG4gIHJlYWRvbmx5IG1pbkNvdmVyYWdlSW5QZXJjZW50cz86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciBydW5uaW5nIHRlc3RzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRlc3RPcHRpb25zIHtcbiAgLyoqXG4gICAqIEZ1cnRoZXIgQ0xJIGFyZ3VtZW50cyBmb3IgdGhlIHJ1bm5lciwgYXBwZW5kZWQgYWZ0ZXIgdGhlIHdyYXBwZXIncyBvd246IGZpbGUgZmlsdGVycywgYC10YCwgYC0tbWF4V29ya2Vyc2AuIEFuXG4gICAqIGFyZ3VtZW50IG5hbWluZyBhbiBvcHRpb24gdGhlIHdyYXBwZXIgc2V0cyBpdHNlbGYgKHByb2plY3RzLCBjb3ZlcmFnZSwgd2F0Y2ggbW9kZSkgdGhyb3dzLlxuICAgKi9cbiAgcmVhZG9ubHkgYWRkaXRpb25hbEFyZ3VtZW50cz86IHJlYWRvbmx5IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIGplc3QgcnVucyB0aGUgc3VpdGUgYXMgRVMgbW9kdWxlcy4gVml0ZXN0IGlnbm9yZXMgaXQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYCB3aGVuIGBwYWNrYWdlLmpzb25gIGRlY2xhcmVzIGBcInR5cGVcIjogXCJtb2R1bGVcImBcbiAgICovXG4gIHJlYWRvbmx5IGVzbT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoZSBwcm9qZWN0cyB0byBydW4uIFZpdGVzdCBhbHNvIHJ1bnMgZWFjaCBvbmUncyBgbmFtZToqYCBzdWItcHJvamVjdHM7IGplc3QgbWF0Y2hlcyBhIGBkaXNwbGF5TmFtZWAgZXhhY3RseS5cbiAgICovXG4gIHJlYWRvbmx5IHByb2plY3RzPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIFRoZSBydW5uZXIgdG8gdXNlLiBPbWl0dGVkLCB7QGxpbmsgZGV0ZWN0VGVzdFJ1bm5lcn0gY2hvb3NlcyBpdC5cbiAgICovXG4gIHJlYWRvbmx5IHJ1bm5lcj86IFRlc3RSdW5uZXI7XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgcnVubmluZyB0ZXN0cyBpbiB3YXRjaCBtb2RlLlxuICovXG5leHBvcnQgdHlwZSBUZXN0V2F0Y2hPcHRpb25zID0gVGVzdE9wdGlvbnM7XG5cbi8qKlxuICogQ2hvb3NlcyB0aGUgdGVzdCBydW5uZXIgZnJvbSB0aGUgY29uZmlndXJhdGlvbiBmaWxlcyBhdCB0aGUgcHJvamVjdCByb290LlxuICpcbiAqIFRoZSBvcmRlciBpcyBhIHZpdGVzdCBjb25maWd1cmF0aW9uLCB0aGVuIGEgamVzdCBvbmUgKGEgZmlsZSwgb3IgYSBgamVzdGAga2V5IGluIGBwYWNrYWdlLmpzb25gKS4gQSBwcm9qZWN0IHdpdGhcbiAqIG5laXRoZXIgZ2V0cyB2aXRlc3QsIHRoZSBydW5uZXIgZXZlcnkgcGFja2FnZSBvbiB0aGlzIHRvb2xjaGFpbiB1c2VkIGJlZm9yZSBqZXN0IHdhcyBzdXBwb3J0ZWQuXG4gKlxuICogQHJldHVybnMgVGhlIHJ1bm5lciB0byB1c2UuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZXRlY3RUZXN0UnVubmVyKCk6IFByb21pc2U8VGVzdFJ1bm5lcj4ge1xuICBpZiAoVklURVNUX0NPTkZJR19GSUxFX05BTUVTLnNvbWUoKGZpbGVOYW1lKSA9PiBleGlzdHNTeW5jKHJlc29sdmVQYXRoRnJvbVJvb3RTYWZlKHsgcGF0aDogZmlsZU5hbWUgfSkpKSkge1xuICAgIHJldHVybiAndml0ZXN0JztcbiAgfVxuXG4gIHJldHVybiBhd2FpdCBoYXNKZXN0Q29uZmlnKCkgPyAnamVzdCcgOiAndml0ZXN0Jztcbn1cblxuLyoqXG4gKiBSdW5zIHRoZSB0ZXN0IHN1aXRlIHdpdGggdGhlIHByb2plY3QncyBydW5uZXIuXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBUaGUge0BsaW5rIFRlc3RPcHRpb25zfS5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgdGVzdHMgaGF2ZSBjb21wbGV0ZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB0ZXN0KG9wdGlvbnM6IFRlc3RPcHRpb25zID0ge30pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgeyBydW5uZXIgPSBhd2FpdCBkZXRlY3RUZXN0UnVubmVyKCksIC4uLnJ1bm5lck9wdGlvbnMgfSA9IG9wdGlvbnM7XG4gIGF3YWl0IFJVTk5FUlNbcnVubmVyXS50ZXN0KHJ1bm5lck9wdGlvbnMpO1xufVxuXG4vKipcbiAqIFJ1bnMgdGhlIHRlc3Qgc3VpdGUgd2l0aCBjb3ZlcmFnZSwgd2l0aCB0aGUgcHJvamVjdCdzIHJ1bm5lci5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSB7QGxpbmsgVGVzdENvdmVyYWdlT3B0aW9uc30uXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIHRlc3RzIGhhdmUgY29tcGxldGVkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdGVzdENvdmVyYWdlKG9wdGlvbnM6IFRlc3RDb3ZlcmFnZU9wdGlvbnMgPSB7fSk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB7IHJ1bm5lciA9IGF3YWl0IGRldGVjdFRlc3RSdW5uZXIoKSwgLi4ucnVubmVyT3B0aW9ucyB9ID0gb3B0aW9ucztcbiAgYXdhaXQgUlVOTkVSU1tydW5uZXJdLnRlc3RDb3ZlcmFnZShydW5uZXJPcHRpb25zKTtcbn1cblxuLyoqXG4gKiBSdW5zIHRoZSB0ZXN0IHN1aXRlIGluIHdhdGNoIG1vZGUsIHdpdGggdGhlIHByb2plY3QncyBydW5uZXIuXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBUaGUge0BsaW5rIFRlc3RXYXRjaE9wdGlvbnN9LlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSB3YXRjaGVyIGV4aXRzLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdGVzdFdhdGNoKG9wdGlvbnM6IFRlc3RXYXRjaE9wdGlvbnMgPSB7fSk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB7IHJ1bm5lciA9IGF3YWl0IGRldGVjdFRlc3RSdW5uZXIoKSwgLi4ucnVubmVyT3B0aW9ucyB9ID0gb3B0aW9ucztcbiAgYXdhaXQgUlVOTkVSU1tydW5uZXJdLnRlc3RXYXRjaChydW5uZXJPcHRpb25zKTtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7O0FBTUEsU0FBUyxrQkFBa0I7QUFFM0IsU0FBUywrQkFBK0I7QUFDeEM7QUFBQSxFQUNFO0FBQUEsRUFDQSxRQUFRO0FBQUEsRUFDUixnQkFBZ0I7QUFBQSxFQUNoQixhQUFhO0FBQUEsT0FDUjtBQUNQO0FBQUEsRUFDRSxRQUFRO0FBQUEsRUFDUixnQkFBZ0I7QUFBQSxFQUNoQixhQUFhO0FBQUEsT0FDUjtBQWNBLE1BQU0sMkJBQThDO0FBQUEsRUFDekQ7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUNGO0FBUUEsTUFBTSxVQUF5RDtBQUFBLEVBQzdELE1BQU07QUFBQSxJQUNKLE1BQU07QUFBQSxJQUNOLGNBQWM7QUFBQSxJQUNkLFdBQVc7QUFBQSxFQUNiO0FBQUEsRUFDQSxRQUFRO0FBQUEsSUFDTixNQUFNO0FBQUEsSUFDTixjQUFjO0FBQUEsSUFDZCxXQUFXO0FBQUEsRUFDYjtBQUNGO0FBdURBLGVBQXNCLG1CQUF3QztBQUM1RCxNQUFJLHlCQUF5QixLQUFLLENBQUMsYUFBYSxXQUFXLHdCQUF3QixFQUFFLE1BQU0sU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHO0FBQ3hHLFdBQU87QUFBQSxFQUNUO0FBRUEsU0FBTyxNQUFNLGNBQWMsSUFBSSxTQUFTO0FBQzFDO0FBUUEsZUFBc0IsS0FBSyxVQUF1QixDQUFDLEdBQWtCO0FBQ25FLFFBQU0sRUFBRSxTQUFTLE1BQU0saUJBQWlCLEdBQUcsR0FBRyxjQUFjLElBQUk7QUFDaEUsUUFBTSxRQUFRLE1BQU0sRUFBRSxLQUFLLGFBQWE7QUFDMUM7QUFRQSxlQUFzQixhQUFhLFVBQStCLENBQUMsR0FBa0I7QUFDbkYsUUFBTSxFQUFFLFNBQVMsTUFBTSxpQkFBaUIsR0FBRyxHQUFHLGNBQWMsSUFBSTtBQUNoRSxRQUFNLFFBQVEsTUFBTSxFQUFFLGFBQWEsYUFBYTtBQUNsRDtBQVFBLGVBQXNCLFVBQVUsVUFBNEIsQ0FBQyxHQUFrQjtBQUM3RSxRQUFNLEVBQUUsU0FBUyxNQUFNLGlCQUFpQixHQUFHLEdBQUcsY0FBYyxJQUFJO0FBQ2hFLFFBQU0sUUFBUSxNQUFNLEVBQUUsVUFBVSxhQUFhO0FBQy9DOyIsCiAgIm5hbWVzIjogW10KfQo=
@@ -0,0 +1,49 @@
1
+ /// <reference path="../library-references.d.mts" />
2
+ /**
3
+ * @file
4
+ *
5
+ * Guards the CLI arguments a test wrapper forwards to its runner against the options the wrapper sets itself.
6
+ */
7
+ /**
8
+ * Params for {@link assertNoOwnedArguments}.
9
+ */
10
+ export interface AssertNoOwnedArgumentsParams {
11
+ /**
12
+ * The arguments the caller forwards.
13
+ */
14
+ readonly forwardedArguments: readonly string[];
15
+ /**
16
+ * The options the wrapper sets itself.
17
+ */
18
+ readonly ownedOptions: readonly OwnedOption[];
19
+ /**
20
+ * The runner's name, shown in the error.
21
+ */
22
+ readonly runnerName: string;
23
+ }
24
+ /**
25
+ * An option a test wrapper sets itself, so a forwarded argument may not name it.
26
+ */
27
+ export interface OwnedOption {
28
+ /**
29
+ * The spellings that name the option, each matched alone (`--project`) or with a value (`--project=x`).
30
+ */
31
+ readonly names: readonly string[];
32
+ /**
33
+ * Prefixes that name the option's sub-options, such as `--coverage.`.
34
+ */
35
+ readonly prefixes?: readonly string[];
36
+ /**
37
+ * What to use instead, shown in the error.
38
+ */
39
+ readonly replacement: string;
40
+ }
41
+ /**
42
+ * Throws when a forwarded argument names an option the wrapper sets itself.
43
+ *
44
+ * Letting it through would not override the wrapper reliably: vitest adds every `--project` to the wrapper's own, and a
45
+ * later `--coverage.thresholds.lines` would quietly lower a coverage gate.
46
+ *
47
+ * @param params - The {@link AssertNoOwnedArgumentsParams}.
48
+ */
49
+ export declare function assertNoOwnedArguments(params: AssertNoOwnedArgumentsParams): void;
@@ -0,0 +1,26 @@
1
+ /*
2
+ THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
3
+ if you want to view the source, please visit the github repository of this plugin
4
+ */
5
+
6
+ function assertNoOwnedArguments(params) {
7
+ const { forwardedArguments, ownedOptions, runnerName } = params;
8
+ const problems = [];
9
+ for (const argument of forwardedArguments) {
10
+ const option = ownedOptions.find((candidate) => isOwnedArgument(argument, candidate));
11
+ if (option) {
12
+ problems.push(`${argument} (use ${option.replacement} instead)`);
13
+ }
14
+ }
15
+ if (problems.length > 0) {
16
+ throw new Error(`The ${runnerName} wrapper sets these options itself, so they cannot be forwarded: ${problems.join(", ")}.`);
17
+ }
18
+ }
19
+ function isOwnedArgument(argument, option) {
20
+ const name = argument.replace(/[=].*$/su, "");
21
+ return option.names.includes(name) || (option.prefixes ?? []).some((prefix) => argument.startsWith(prefix));
22
+ }
23
+ export {
24
+ assertNoOwnedArguments
25
+ };
26
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL3Rlc3QtcnVubmVycy9mb3J3YXJkZWQtYXJndW1lbnRzLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogR3VhcmRzIHRoZSBDTEkgYXJndW1lbnRzIGEgdGVzdCB3cmFwcGVyIGZvcndhcmRzIHRvIGl0cyBydW5uZXIgYWdhaW5zdCB0aGUgb3B0aW9ucyB0aGUgd3JhcHBlciBzZXRzIGl0c2VsZi5cbiAqL1xuXG4vKipcbiAqIFBhcmFtcyBmb3Ige0BsaW5rIGFzc2VydE5vT3duZWRBcmd1bWVudHN9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFzc2VydE5vT3duZWRBcmd1bWVudHNQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGFyZ3VtZW50cyB0aGUgY2FsbGVyIGZvcndhcmRzLlxuICAgKi9cbiAgcmVhZG9ubHkgZm9yd2FyZGVkQXJndW1lbnRzOiByZWFkb25seSBzdHJpbmdbXTtcblxuICAvKipcbiAgICogVGhlIG9wdGlvbnMgdGhlIHdyYXBwZXIgc2V0cyBpdHNlbGYuXG4gICAqL1xuICByZWFkb25seSBvd25lZE9wdGlvbnM6IHJlYWRvbmx5IE93bmVkT3B0aW9uW107XG5cbiAgLyoqXG4gICAqIFRoZSBydW5uZXIncyBuYW1lLCBzaG93biBpbiB0aGUgZXJyb3IuXG4gICAqL1xuICByZWFkb25seSBydW5uZXJOYW1lOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQW4gb3B0aW9uIGEgdGVzdCB3cmFwcGVyIHNldHMgaXRzZWxmLCBzbyBhIGZvcndhcmRlZCBhcmd1bWVudCBtYXkgbm90IG5hbWUgaXQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgT3duZWRPcHRpb24ge1xuICAvKipcbiAgICogVGhlIHNwZWxsaW5ncyB0aGF0IG5hbWUgdGhlIG9wdGlvbiwgZWFjaCBtYXRjaGVkIGFsb25lIChgLS1wcm9qZWN0YCkgb3Igd2l0aCBhIHZhbHVlIChgLS1wcm9qZWN0PXhgKS5cbiAgICovXG4gIHJlYWRvbmx5IG5hbWVzOiByZWFkb25seSBzdHJpbmdbXTtcblxuICAvKipcbiAgICogUHJlZml4ZXMgdGhhdCBuYW1lIHRoZSBvcHRpb24ncyBzdWItb3B0aW9ucywgc3VjaCBhcyBgLS1jb3ZlcmFnZS5gLlxuICAgKi9cbiAgcmVhZG9ubHkgcHJlZml4ZXM/OiByZWFkb25seSBzdHJpbmdbXTtcblxuICAvKipcbiAgICogV2hhdCB0byB1c2UgaW5zdGVhZCwgc2hvd24gaW4gdGhlIGVycm9yLlxuICAgKi9cbiAgcmVhZG9ubHkgcmVwbGFjZW1lbnQ6IHN0cmluZztcbn1cblxuLyoqXG4gKiBUaHJvd3Mgd2hlbiBhIGZvcndhcmRlZCBhcmd1bWVudCBuYW1lcyBhbiBvcHRpb24gdGhlIHdyYXBwZXIgc2V0cyBpdHNlbGYuXG4gKlxuICogTGV0dGluZyBpdCB0aHJvdWdoIHdvdWxkIG5vdCBvdmVycmlkZSB0aGUgd3JhcHBlciByZWxpYWJseTogdml0ZXN0IGFkZHMgZXZlcnkgYC0tcHJvamVjdGAgdG8gdGhlIHdyYXBwZXIncyBvd24sIGFuZCBhXG4gKiBsYXRlciBgLS1jb3ZlcmFnZS50aHJlc2hvbGRzLmxpbmVzYCB3b3VsZCBxdWlldGx5IGxvd2VyIGEgY292ZXJhZ2UgZ2F0ZS5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHtAbGluayBBc3NlcnROb093bmVkQXJndW1lbnRzUGFyYW1zfS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydE5vT3duZWRBcmd1bWVudHMocGFyYW1zOiBBc3NlcnROb093bmVkQXJndW1lbnRzUGFyYW1zKTogdm9pZCB7XG4gIGNvbnN0IHsgZm9yd2FyZGVkQXJndW1lbnRzLCBvd25lZE9wdGlvbnMsIHJ1bm5lck5hbWUgfSA9IHBhcmFtcztcbiAgY29uc3QgcHJvYmxlbXM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgYXJndW1lbnQgb2YgZm9yd2FyZGVkQXJndW1lbnRzKSB7XG4gICAgY29uc3Qgb3B0aW9uID0gb3duZWRPcHRpb25zLmZpbmQoKGNhbmRpZGF0ZSkgPT4gaXNPd25lZEFyZ3VtZW50KGFyZ3VtZW50LCBjYW5kaWRhdGUpKTtcbiAgICBpZiAob3B0aW9uKSB7XG4gICAgICBwcm9ibGVtcy5wdXNoKGAke2FyZ3VtZW50fSAodXNlICR7b3B0aW9uLnJlcGxhY2VtZW50fSBpbnN0ZWFkKWApO1xuICAgIH1cbiAgfVxuXG4gIGlmIChwcm9ibGVtcy5sZW5ndGggPiAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgJHtydW5uZXJOYW1lfSB3cmFwcGVyIHNldHMgdGhlc2Ugb3B0aW9ucyBpdHNlbGYsIHNvIHRoZXkgY2Fubm90IGJlIGZvcndhcmRlZDogJHtwcm9ibGVtcy5qb2luKCcsICcpfS5gKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpc093bmVkQXJndW1lbnQoYXJndW1lbnQ6IHN0cmluZywgb3B0aW9uOiBPd25lZE9wdGlvbik6IGJvb2xlYW4ge1xuICBjb25zdCBuYW1lID0gYXJndW1lbnQucmVwbGFjZSgvWz1dLiokL3N1LCAnJyk7XG4gIHJldHVybiBvcHRpb24ubmFtZXMuaW5jbHVkZXMobmFtZSkgfHwgKG9wdGlvbi5wcmVmaXhlcyA/PyBbXSkuc29tZSgocHJlZml4KSA9PiBhcmd1bWVudC5zdGFydHNXaXRoKHByZWZpeCkpO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7QUFzRE8sU0FBUyx1QkFBdUIsUUFBNEM7QUFDakYsUUFBTSxFQUFFLG9CQUFvQixjQUFjLFdBQVcsSUFBSTtBQUN6RCxRQUFNLFdBQXFCLENBQUM7QUFDNUIsYUFBVyxZQUFZLG9CQUFvQjtBQUN6QyxVQUFNLFNBQVMsYUFBYSxLQUFLLENBQUMsY0FBYyxnQkFBZ0IsVUFBVSxTQUFTLENBQUM7QUFDcEYsUUFBSSxRQUFRO0FBQ1YsZUFBUyxLQUFLLEdBQUcsUUFBUSxTQUFTLE9BQU8sV0FBVyxXQUFXO0FBQUEsSUFDakU7QUFBQSxFQUNGO0FBRUEsTUFBSSxTQUFTLFNBQVMsR0FBRztBQUN2QixVQUFNLElBQUksTUFBTSxPQUFPLFVBQVUsb0VBQW9FLFNBQVMsS0FBSyxJQUFJLENBQUMsR0FBRztBQUFBLEVBQzdIO0FBQ0Y7QUFFQSxTQUFTLGdCQUFnQixVQUFrQixRQUE4QjtBQUN2RSxRQUFNLE9BQU8sU0FBUyxRQUFRLFlBQVksRUFBRTtBQUM1QyxTQUFPLE9BQU8sTUFBTSxTQUFTLElBQUksTUFBTSxPQUFPLFlBQVksQ0FBQyxHQUFHLEtBQUssQ0FBQyxXQUFXLFNBQVMsV0FBVyxNQUFNLENBQUM7QUFDNUc7IiwKICAibmFtZXMiOiBbXQp9Cg==
@@ -1,5 +1,6 @@
1
1
  /// <reference path="../library-references.d.mts" />
2
2
  export * as 'auto' from './auto.mjs';
3
+ export * as 'forwarded-arguments' from './forwarded-arguments.mjs';
3
4
  export * as 'jest-config' from './jest-config.mjs';
4
5
  export * as 'jest' from './jest.mjs';
5
6
  export * as 'stryker-config' from './stryker-config.mjs';
@@ -4,6 +4,7 @@ if you want to view the source, please visit the github repository of this plugi
4
4
  */
5
5
 
6
6
  import * as auto from "./auto.mjs";
7
+ import * as forwarded_arguments from "./forwarded-arguments.mjs";
7
8
  import * as jest_config from "./jest-config.mjs";
8
9
  import * as jest from "./jest.mjs";
9
10
  import * as stryker_config from "./stryker-config.mjs";
@@ -12,6 +13,7 @@ import * as vitest_config from "./vitest-config.mjs";
12
13
  import * as vitest from "./vitest.mjs";
13
14
  export {
14
15
  auto,
16
+ forwarded_arguments as "forwarded-arguments",
15
17
  jest,
16
18
  jest_config as "jest-config",
17
19
  stryker,
@@ -19,4 +21,4 @@ export {
19
21
  vitest,
20
22
  vitest_config as "vitest-config"
21
23
  };
22
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL3Rlc3QtcnVubmVycy9pbmRleC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyogVEhJUyBJUyBBIEdFTkVSQVRFRC9CVU5ETEVEIEZJTEUgQlkgQlVJTEQgU0NSSVBUICovXG5cbmV4cG9ydCAqIGFzICdhdXRvJyBmcm9tICcuL2F1dG8udHMnO1xuZXhwb3J0ICogYXMgJ2plc3QtY29uZmlnJyBmcm9tICcuL2plc3QtY29uZmlnLnRzJztcbmV4cG9ydCAqIGFzICdqZXN0JyBmcm9tICcuL2plc3QudHMnO1xuZXhwb3J0ICogYXMgJ3N0cnlrZXItY29uZmlnJyBmcm9tICcuL3N0cnlrZXItY29uZmlnLnRzJztcbmV4cG9ydCAqIGFzICdzdHJ5a2VyJyBmcm9tICcuL3N0cnlrZXIudHMnO1xuZXhwb3J0ICogYXMgJ3ZpdGVzdC1jb25maWcnIGZyb20gJy4vdml0ZXN0LWNvbmZpZy50cyc7XG5leHBvcnQgKiBhcyAndml0ZXN0JyBmcm9tICcuL3ZpdGVzdC50cyc7XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7OztBQUVBLFlBQVksVUFBWTtBQUN4QixZQUFZQSxpQkFBbUI7QUFDL0IsWUFBWSxVQUFZO0FBQ3hCLFlBQVlDLG9CQUFzQjtBQUNsQyxZQUFZLGFBQWU7QUFDM0IsWUFBWUMsbUJBQXFCO0FBQ2pDLFlBQVksWUFBYzsiLAogICJuYW1lcyI6IFsiamVzdC1jb25maWciLCAic3RyeWtlci1jb25maWciLCAidml0ZXN0LWNvbmZpZyJdCn0K
24
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL3Rlc3QtcnVubmVycy9pbmRleC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyogVEhJUyBJUyBBIEdFTkVSQVRFRC9CVU5ETEVEIEZJTEUgQlkgQlVJTEQgU0NSSVBUICovXG5cbmV4cG9ydCAqIGFzICdhdXRvJyBmcm9tICcuL2F1dG8udHMnO1xuZXhwb3J0ICogYXMgJ2ZvcndhcmRlZC1hcmd1bWVudHMnIGZyb20gJy4vZm9yd2FyZGVkLWFyZ3VtZW50cy50cyc7XG5leHBvcnQgKiBhcyAnamVzdC1jb25maWcnIGZyb20gJy4vamVzdC1jb25maWcudHMnO1xuZXhwb3J0ICogYXMgJ2plc3QnIGZyb20gJy4vamVzdC50cyc7XG5leHBvcnQgKiBhcyAnc3RyeWtlci1jb25maWcnIGZyb20gJy4vc3RyeWtlci1jb25maWcudHMnO1xuZXhwb3J0ICogYXMgJ3N0cnlrZXInIGZyb20gJy4vc3RyeWtlci50cyc7XG5leHBvcnQgKiBhcyAndml0ZXN0LWNvbmZpZycgZnJvbSAnLi92aXRlc3QtY29uZmlnLnRzJztcbmV4cG9ydCAqIGFzICd2aXRlc3QnIGZyb20gJy4vdml0ZXN0LnRzJztcbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7O0FBRUEsWUFBWSxVQUFZO0FBQ3hCLFlBQVlBLHlCQUEyQjtBQUN2QyxZQUFZQyxpQkFBbUI7QUFDL0IsWUFBWSxVQUFZO0FBQ3hCLFlBQVlDLG9CQUFzQjtBQUNsQyxZQUFZLGFBQWU7QUFDM0IsWUFBWUMsbUJBQXFCO0FBQ2pDLFlBQVksWUFBYzsiLAogICJuYW1lcyI6IFsiZm9yd2FyZGVkLWFyZ3VtZW50cyIsICJqZXN0LWNvbmZpZyIsICJzdHJ5a2VyLWNvbmZpZyIsICJ2aXRlc3QtY29uZmlnIl0KfQo=
@@ -31,6 +31,11 @@ export interface TestCoverageOptions extends TestOptions {
31
31
  * Options for running tests.
32
32
  */
33
33
  export interface TestOptions {
34
+ /**
35
+ * Further jest CLI arguments, appended after the wrapper's own: test path patterns, `-t`, `--maxWorkers`, `--bail`.
36
+ * An argument naming an option the wrapper sets itself (`--selectProjects`, `--coverage*`, `--watch*`) throws.
37
+ */
38
+ readonly additionalArguments?: readonly string[];
34
39
  /**
35
40
  * Whether jest runs the suite as ES modules, which adds {@link EXPERIMENTAL_VM_MODULES_FLAG} to `NODE_OPTIONS`.
36
41
  *
@@ -12,7 +12,16 @@ import {
12
12
  execFromRoot,
13
13
  resolvePathFromRootSafe
14
14
  } from "../root.mjs";
15
+ import { assertNoOwnedArguments } from "./forwarded-arguments.mjs";
15
16
  import { isEsmPackage } from "./jest-config.mjs";
17
+ const OWNED_OPTIONS = [
18
+ { names: ["--selectProjects", "--select-projects"], replacement: "the `projects` option" },
19
+ { names: ["--watch", "--watchAll", "--watch-all"], replacement: "the `testWatch` wrapper" },
20
+ {
21
+ names: ["--coverage", "--no-coverage", "--collectCoverage", "--collect-coverage", "--no-collectCoverage", "--coverageThreshold", "--coverage-threshold"],
22
+ replacement: "the `testCoverage` wrapper and its `minCoverageInPercents` option"
23
+ }
24
+ ];
16
25
  const JEST_CONFIG_FILE_NAMES = [
17
26
  "jest.config.cjs",
18
27
  "jest.config.cts",
@@ -59,10 +68,14 @@ function addExperimentalVmModulesFlag(nodeOptions) {
59
68
  return flags.join(" ");
60
69
  }
61
70
  async function runJest(runArguments, options, isInteractive = false) {
62
- const { esm = isEsmPackage(), projects = [] } = options;
71
+ const { additionalArguments = [], esm = isEsmPackage(), projects = [] } = options;
72
+ assertNoOwnedArguments({ forwardedArguments: additionalArguments, ownedOptions: OWNED_OPTIONS, runnerName: "jest" });
63
73
  const projectArguments = projects.length > 0 ? ["--selectProjects", ...projects] : [];
64
74
  const env = esm ? { NODE_OPTIONS: addExperimentalVmModulesFlag(process.env["NODE_OPTIONS"]) } : {};
65
- await execFromRoot([...resolveToolCommand({ tool: "jest" }), ...runArguments, ...projectArguments], { env, isInteractive });
75
+ await execFromRoot([...resolveToolCommand({ tool: "jest" }), ...runArguments, ...projectArguments, ...additionalArguments], {
76
+ env,
77
+ isInteractive
78
+ });
66
79
  }
67
80
  export {
68
81
  EXPERIMENTAL_VM_MODULES_FLAG,
@@ -72,4 +85,4 @@ export {
72
85
  testCoverage,
73
86
  testWatch
74
87
  };
75
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL3Rlc3QtcnVubmVycy9qZXN0LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogVGhpcyBtb2R1bGUgcHJvdmlkZXMgZnVuY3Rpb25zIGZvciBydW5uaW5nIHRlc3RzIHVzaW5nIHRoZSBKZXN0IGZyYW1ld29yay5cbiAqL1xuXG5pbXBvcnQgeyBleGlzdHNTeW5jIH0gZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcHJvY2VzcyBmcm9tICdub2RlOnByb2Nlc3MnO1xuXG5pbXBvcnQgeyByZWFkUGFja2FnZUpzb24gfSBmcm9tICcuLi9ucG0udHMnO1xuaW1wb3J0IHsgcmVzb2x2ZVRvb2xDb21tYW5kIH0gZnJvbSAnLi4vcGFja2FnZS1tYW5hZ2VyLnRzJztcbmltcG9ydCB7IFJlcG9QYXRocyB9IGZyb20gJy4uL3JlcG8tcGF0aHMudHMnO1xuaW1wb3J0IHtcbiAgZXhlY0Zyb21Sb290LFxuICByZXNvbHZlUGF0aEZyb21Sb290U2FmZVxufSBmcm9tICcuLi9yb290LnRzJztcbmltcG9ydCB7IGlzRXNtUGFja2FnZSB9IGZyb20gJy4vamVzdC1jb25maWcudHMnO1xuXG4vKipcbiAqIEV2ZXJ5IGZpbGUgamVzdCByZWFkcyBpdHMgY29uZmlndXJhdGlvbiBmcm9tLCBiZXNpZGVzIHRoZSBgamVzdGAga2V5IG9mIGBwYWNrYWdlLmpzb25gLlxuICpcbiAqIEBzZWUge0BsaW5rIGh0dHBzOi8vamVzdGpzLmlvL2RvY3MvY29uZmlndXJhdGlvbn1cbiAqL1xuZXhwb3J0IGNvbnN0IEpFU1RfQ09ORklHX0ZJTEVfTkFNRVM6IHJlYWRvbmx5IHN0cmluZ1tdID0gW1xuICAnamVzdC5jb25maWcuY2pzJyxcbiAgJ2plc3QuY29uZmlnLmN0cycsXG4gICdqZXN0LmNvbmZpZy5qcycsXG4gICdqZXN0LmNvbmZpZy5qc29uJyxcbiAgJ2plc3QuY29uZmlnLm1qcycsXG4gICdqZXN0LmNvbmZpZy5tdHMnLFxuICAnamVzdC5jb25maWcudHMnXG5dO1xuXG4vKipcbiAqIFRoZSBOb2RlIGZsYWcgamVzdCdzIEVTTSBsb2FkZXIgbmVlZHM6IGl0IGlzIGJ1aWx0IG9uIGB2bS5TeW50aGV0aWNNb2R1bGVgLCB3aGljaCBOb2RlIG9ubHkgZXhwb3NlcyB1bmRlciBpdC5cbiAqIFdpdGhvdXQgaXQgZXZlcnkgRVNNIHN1aXRlIGZhaWxzIHRvIGxvYWQgd2l0aCBgTXVzdCB1c2UgaW1wb3J0IHRvIGxvYWQgRVMgTW9kdWxlYC5cbiAqL1xuZXhwb3J0IGNvbnN0IEVYUEVSSU1FTlRBTF9WTV9NT0RVTEVTX0ZMQUcgPSAnLS1leHBlcmltZW50YWwtdm0tbW9kdWxlcyc7XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgcnVubmluZyB0ZXN0cyB3aXRoIGNvdmVyYWdlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRlc3RDb3ZlcmFnZU9wdGlvbnMgZXh0ZW5kcyBUZXN0T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBNaW5pbXVtIGNvdmVyYWdlIHBlcmNlbnRhZ2UgcmVxdWlyZWQsIGZvciBsaW5lcywgZnVuY3Rpb25zLCBicmFuY2hlcyBhbmQgc3RhdGVtZW50cyBhbGlrZS4gSWYgdGhlIGFjdHVhbCBjb3ZlcmFnZVxuICAgKiBmYWxscyBiZWxvdyBpdCwgamVzdCBleGl0cyB3aXRoIGEgbm9uLXplcm8gY29kZS5cbiAgICpcbiAgICogQGRlZmF1bHQgYDBgXG4gICAqL1xuICByZWFkb25seSBtaW5Db3ZlcmFnZUluUGVyY2VudHM/OiBudW1iZXI7XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgcnVubmluZyB0ZXN0cy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUZXN0T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBXaGV0aGVyIGplc3QgcnVucyB0aGUgc3VpdGUgYXMgRVMgbW9kdWxlcywgd2hpY2ggYWRkcyB7QGxpbmsgRVhQRVJJTUVOVEFMX1ZNX01PRFVMRVNfRkxBR30gdG8gYE5PREVfT1BUSU9OU2AuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYCB3aGVuIGBwYWNrYWdlLmpzb25gIGRlY2xhcmVzIGBcInR5cGVcIjogXCJtb2R1bGVcImAsIHRoZSBydWxlIGBkZWZpbmVKZXN0Q29uZmlnYCBmb2xsb3dzIHRvb1xuICAgKi9cbiAgcmVhZG9ubHkgZXNtPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIHByb2plY3RzIHRvIHJ1biwgYnkgdGhlaXIgYGRpc3BsYXlOYW1lYCwgcGFzc2VkIHRvIGplc3QncyBgLS1zZWxlY3RQcm9qZWN0c2AuIFVubGlrZSB2aXRlc3QncyBydW5uZXIsIGEgbmFtZVxuICAgKiBtYXRjaGVzIG9ubHkgaXRzZWxmOiBqZXN0IGhhcyBubyBgbmFtZToqYCBmb3JtLlxuICAgKi9cbiAgcmVhZG9ubHkgcHJvamVjdHM/OiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciBydW5uaW5nIHRlc3RzIGluIHdhdGNoIG1vZGUuXG4gKi9cbmV4cG9ydCB0eXBlIFRlc3RXYXRjaE9wdGlvbnMgPSBUZXN0T3B0aW9ucztcblxuLyoqXG4gKiBTYXlzIHdoZXRoZXIgdGhlIHByb2plY3QgY29uZmlndXJlcyBqZXN0LlxuICpcbiAqIEByZXR1cm5zIFdoZXRoZXIgYSBqZXN0IGNvbmZpZ3VyYXRpb24gZmlsZSwgb3IgYSBgamVzdGAga2V5IGluIGBwYWNrYWdlLmpzb25gLCBleGlzdHMgYXQgdGhlIHByb2plY3Qgcm9vdC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGhhc0plc3RDb25maWcoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGlmIChKRVNUX0NPTkZJR19GSUxFX05BTUVTLnNvbWUoKGZpbGVOYW1lKSA9PiBleGlzdHNTeW5jKHJlc29sdmVQYXRoRnJvbVJvb3RTYWZlKHsgcGF0aDogZmlsZU5hbWUgfSkpKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKCFleGlzdHNTeW5jKHJlc29sdmVQYXRoRnJvbVJvb3RTYWZlKHsgcGF0aDogUmVwb1BhdGhzLlBhY2thZ2VKc29uIH0pKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IHBhY2thZ2VKc29uID0gYXdhaXQgcmVhZFBhY2thZ2VKc29uKCk7XG4gIHJldHVybiBPYmplY3QuaGFzT3duKHBhY2thZ2VKc29uLCAnamVzdCcpO1xufVxuXG4vKipcbiAqIFJ1bnMgdGhlIHRlc3Qgc3VpdGUuXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgb3B0aW9ucyBmb3IgdGhlIHRlc3QuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIHRlc3RzIGhhdmUgY29tcGxldGVkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdGVzdChvcHRpb25zOiBUZXN0T3B0aW9ucyA9IHt9KTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IHJ1bkplc3QoW10sIG9wdGlvbnMpO1xufVxuXG4vKipcbiAqIFJ1bnMgdGhlIHRlc3Qgc3VpdGUgd2l0aCBjb3ZlcmFnZS5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbmFsIGNvdmVyYWdlIGNvbmZpZ3VyYXRpb24uXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIHRlc3RzIGhhdmUgY29tcGxldGVkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdGVzdENvdmVyYWdlKG9wdGlvbnM6IFRlc3RDb3ZlcmFnZU9wdGlvbnMgPSB7fSk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB0aHJlc2hvbGQgPSBvcHRpb25zLm1pbkNvdmVyYWdlSW5QZXJjZW50cyA/PyAwO1xuICBjb25zdCBjb3ZlcmFnZVRocmVzaG9sZCA9IHtcbiAgICBnbG9iYWw6IHtcbiAgICAgIGJyYW5jaGVzOiB0aHJlc2hvbGQsXG4gICAgICBmdW5jdGlvbnM6IHRocmVzaG9sZCxcbiAgICAgIGxpbmVzOiB0aHJlc2hvbGQsXG4gICAgICBzdGF0ZW1lbnRzOiB0aHJlc2hvbGRcbiAgICB9XG4gIH07XG4gIGF3YWl0IHJ1bkplc3QoWyctLWNvdmVyYWdlJywgYC0tY292ZXJhZ2VUaHJlc2hvbGQ9JHtKU09OLnN0cmluZ2lmeShjb3ZlcmFnZVRocmVzaG9sZCl9YF0sIG9wdGlvbnMpO1xufVxuXG4vKipcbiAqIFJ1bnMgdGhlIHRlc3Qgc3VpdGUgaW4gd2F0Y2ggbW9kZSwgcmUtcnVubmluZyB0aGUgdGVzdHMgdGhlIGNoYW5nZWQgZmlsZXMgYWZmZWN0LiBKZXN0IG5lZWRzIGEgZ2l0IG9yIE1lcmN1cmlhbFxuICogcmVwb3NpdG9yeSBmb3IgdGhhdC5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBvcHRpb25zIGZvciB0aGUgdGVzdC5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgd2F0Y2hlciBleGl0cy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHRlc3RXYXRjaChvcHRpb25zOiBUZXN0V2F0Y2hPcHRpb25zID0ge30pOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgcnVuSmVzdChbJy0td2F0Y2gnXSwgb3B0aW9ucywgdHJ1ZSk7XG59XG5cbi8qKlxuICogQXBwZW5kcyB7QGxpbmsgRVhQRVJJTUVOVEFMX1ZNX01PRFVMRVNfRkxBR30gdG8gYSBgTk9ERV9PUFRJT05TYCB2YWx1ZSwga2VlcGluZyB3aGF0ZXZlciBpdCBhbHJlYWR5IGhvbGRzLlxuICpcbiAqIEBwYXJhbSBub2RlT3B0aW9ucyAtIFRoZSBpbmhlcml0ZWQgYE5PREVfT1BUSU9OU2AuXG4gKiBAcmV0dXJucyBUaGUgYE5PREVfT1BUSU9OU2AgamVzdCBydW5zIHdpdGguXG4gKi9cbmZ1bmN0aW9uIGFkZEV4cGVyaW1lbnRhbFZtTW9kdWxlc0ZsYWcobm9kZU9wdGlvbnM6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHN0cmluZyB7XG4gIGNvbnN0IGZsYWdzID0gKG5vZGVPcHRpb25zID8/ICcnKS5zcGxpdCgvXFxzKy8pLmZpbHRlcihCb29sZWFuKTtcbiAgaWYgKCFmbGFncy5pbmNsdWRlcyhFWFBFUklNRU5UQUxfVk1fTU9EVUxFU19GTEFHKSkge1xuICAgIGZsYWdzLnB1c2goRVhQRVJJTUVOVEFMX1ZNX01PRFVMRVNfRkxBRyk7XG4gIH1cblxuICByZXR1cm4gZmxhZ3Muam9pbignICcpO1xufVxuXG4vKipcbiAqIFJ1bnMgdGhlIGplc3QgQ0xJIGZyb20gdGhlIHByb2plY3Qgcm9vdC5cbiAqXG4gKiBAcGFyYW0gcnVuQXJndW1lbnRzIC0gVGhlIGFyZ3VtZW50cyB0aGF0IHNlbGVjdCB3aGF0IGplc3QgZG9lcy5cbiAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHtAbGluayBUZXN0T3B0aW9uc30uXG4gKiBAcGFyYW0gaXNJbnRlcmFjdGl2ZSAtIFdoZXRoZXIgamVzdCBnZXRzIHRoZSB0ZXJtaW5hbCwgYXMgaXRzIHdhdGNoIG1vZGUgbmVlZHMgdG8gcmVhZCBrZXlzLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIGplc3QgZXhpdHMuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJ1bkplc3QocnVuQXJndW1lbnRzOiBzdHJpbmdbXSwgb3B0aW9uczogVGVzdE9wdGlvbnMsIGlzSW50ZXJhY3RpdmUgPSBmYWxzZSk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB7IGVzbSA9IGlzRXNtUGFja2FnZSgpLCBwcm9qZWN0cyA9IFtdIH0gPSBvcHRpb25zO1xuICBjb25zdCBwcm9qZWN0QXJndW1lbnRzID0gcHJvamVjdHMubGVuZ3RoID4gMCA/IFsnLS1zZWxlY3RQcm9qZWN0cycsIC4uLnByb2plY3RzXSA6IFtdO1xuICBjb25zdCBlbnYgPSBlc20gPyB7IE5PREVfT1BUSU9OUzogYWRkRXhwZXJpbWVudGFsVm1Nb2R1bGVzRmxhZyhwcm9jZXNzLmVudlsnTk9ERV9PUFRJT05TJ10pIH0gOiB7fTtcblxuICBhd2FpdCBleGVjRnJvbVJvb3QoWy4uLnJlc29sdmVUb29sQ29tbWFuZCh7IHRvb2w6ICdqZXN0JyB9KSwgLi4ucnVuQXJndW1lbnRzLCAuLi5wcm9qZWN0QXJndW1lbnRzXSwgeyBlbnYsIGlzSW50ZXJhY3RpdmUgfSk7XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7OztBQU1BLFNBQVMsa0JBQWtCO0FBQzNCLE9BQU8sYUFBYTtBQUVwQixTQUFTLHVCQUF1QjtBQUNoQyxTQUFTLDBCQUEwQjtBQUNuQyxTQUFTLGlCQUFpQjtBQUMxQjtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQLFNBQVMsb0JBQW9CO0FBT3RCLE1BQU0seUJBQTRDO0FBQUEsRUFDdkQ7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFDRjtBQU1PLE1BQU0sK0JBQStCO0FBMkM1QyxlQUFzQixnQkFBa0M7QUFDdEQsTUFBSSx1QkFBdUIsS0FBSyxDQUFDLGFBQWEsV0FBVyx3QkFBd0IsRUFBRSxNQUFNLFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBRztBQUN0RyxXQUFPO0FBQUEsRUFDVDtBQUVBLE1BQUksQ0FBQyxXQUFXLHdCQUF3QixFQUFFLE1BQU0sVUFBVSxZQUFZLENBQUMsQ0FBQyxHQUFHO0FBQ3pFLFdBQU87QUFBQSxFQUNUO0FBRUEsUUFBTSxjQUFjLE1BQU0sZ0JBQWdCO0FBQzFDLFNBQU8sT0FBTyxPQUFPLGFBQWEsTUFBTTtBQUMxQztBQVFBLGVBQXNCLEtBQUssVUFBdUIsQ0FBQyxHQUFrQjtBQUNuRSxRQUFNLFFBQVEsQ0FBQyxHQUFHLE9BQU87QUFDM0I7QUFRQSxlQUFzQixhQUFhLFVBQStCLENBQUMsR0FBa0I7QUFDbkYsUUFBTSxZQUFZLFFBQVEseUJBQXlCO0FBQ25ELFFBQU0sb0JBQW9CO0FBQUEsSUFDeEIsUUFBUTtBQUFBLE1BQ04sVUFBVTtBQUFBLE1BQ1YsV0FBVztBQUFBLE1BQ1gsT0FBTztBQUFBLE1BQ1AsWUFBWTtBQUFBLElBQ2Q7QUFBQSxFQUNGO0FBQ0EsUUFBTSxRQUFRLENBQUMsY0FBYyx1QkFBdUIsS0FBSyxVQUFVLGlCQUFpQixDQUFDLEVBQUUsR0FBRyxPQUFPO0FBQ25HO0FBU0EsZUFBc0IsVUFBVSxVQUE0QixDQUFDLEdBQWtCO0FBQzdFLFFBQU0sUUFBUSxDQUFDLFNBQVMsR0FBRyxTQUFTLElBQUk7QUFDMUM7QUFRQSxTQUFTLDZCQUE2QixhQUF5QztBQUM3RSxRQUFNLFNBQVMsZUFBZSxJQUFJLE1BQU0sS0FBSyxFQUFFLE9BQU8sT0FBTztBQUM3RCxNQUFJLENBQUMsTUFBTSxTQUFTLDRCQUE0QixHQUFHO0FBQ2pELFVBQU0sS0FBSyw0QkFBNEI7QUFBQSxFQUN6QztBQUVBLFNBQU8sTUFBTSxLQUFLLEdBQUc7QUFDdkI7QUFVQSxlQUFlLFFBQVEsY0FBd0IsU0FBc0IsZ0JBQWdCLE9BQXNCO0FBQ3pHLFFBQU0sRUFBRSxNQUFNLGFBQWEsR0FBRyxXQUFXLENBQUMsRUFBRSxJQUFJO0FBQ2hELFFBQU0sbUJBQW1CLFNBQVMsU0FBUyxJQUFJLENBQUMsb0JBQW9CLEdBQUcsUUFBUSxJQUFJLENBQUM7QUFDcEYsUUFBTSxNQUFNLE1BQU0sRUFBRSxjQUFjLDZCQUE2QixRQUFRLElBQUksY0FBYyxDQUFDLEVBQUUsSUFBSSxDQUFDO0FBRWpHLFFBQU0sYUFBYSxDQUFDLEdBQUcsbUJBQW1CLEVBQUUsTUFBTSxPQUFPLENBQUMsR0FBRyxHQUFHLGNBQWMsR0FBRyxnQkFBZ0IsR0FBRyxFQUFFLEtBQUssY0FBYyxDQUFDO0FBQzVIOyIsCiAgIm5hbWVzIjogW10KfQo=
88
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL3Rlc3QtcnVubmVycy9qZXN0LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogVGhpcyBtb2R1bGUgcHJvdmlkZXMgZnVuY3Rpb25zIGZvciBydW5uaW5nIHRlc3RzIHVzaW5nIHRoZSBKZXN0IGZyYW1ld29yay5cbiAqL1xuXG5pbXBvcnQgeyBleGlzdHNTeW5jIH0gZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcHJvY2VzcyBmcm9tICdub2RlOnByb2Nlc3MnO1xuXG5pbXBvcnQgdHlwZSB7IE93bmVkT3B0aW9uIH0gZnJvbSAnLi9mb3J3YXJkZWQtYXJndW1lbnRzLnRzJztcblxuaW1wb3J0IHsgcmVhZFBhY2thZ2VKc29uIH0gZnJvbSAnLi4vbnBtLnRzJztcbmltcG9ydCB7IHJlc29sdmVUb29sQ29tbWFuZCB9IGZyb20gJy4uL3BhY2thZ2UtbWFuYWdlci50cyc7XG5pbXBvcnQgeyBSZXBvUGF0aHMgfSBmcm9tICcuLi9yZXBvLXBhdGhzLnRzJztcbmltcG9ydCB7XG4gIGV4ZWNGcm9tUm9vdCxcbiAgcmVzb2x2ZVBhdGhGcm9tUm9vdFNhZmVcbn0gZnJvbSAnLi4vcm9vdC50cyc7XG5pbXBvcnQgeyBhc3NlcnROb093bmVkQXJndW1lbnRzIH0gZnJvbSAnLi9mb3J3YXJkZWQtYXJndW1lbnRzLnRzJztcbmltcG9ydCB7IGlzRXNtUGFja2FnZSB9IGZyb20gJy4vamVzdC1jb25maWcudHMnO1xuXG5jb25zdCBPV05FRF9PUFRJT05TOiByZWFkb25seSBPd25lZE9wdGlvbltdID0gW1xuICB7IG5hbWVzOiBbJy0tc2VsZWN0UHJvamVjdHMnLCAnLS1zZWxlY3QtcHJvamVjdHMnXSwgcmVwbGFjZW1lbnQ6ICd0aGUgYHByb2plY3RzYCBvcHRpb24nIH0sXG4gIHsgbmFtZXM6IFsnLS13YXRjaCcsICctLXdhdGNoQWxsJywgJy0td2F0Y2gtYWxsJ10sIHJlcGxhY2VtZW50OiAndGhlIGB0ZXN0V2F0Y2hgIHdyYXBwZXInIH0sXG4gIHtcbiAgICBuYW1lczogWyctLWNvdmVyYWdlJywgJy0tbm8tY292ZXJhZ2UnLCAnLS1jb2xsZWN0Q292ZXJhZ2UnLCAnLS1jb2xsZWN0LWNvdmVyYWdlJywgJy0tbm8tY29sbGVjdENvdmVyYWdlJywgJy0tY292ZXJhZ2VUaHJlc2hvbGQnLCAnLS1jb3ZlcmFnZS10aHJlc2hvbGQnXSxcbiAgICByZXBsYWNlbWVudDogJ3RoZSBgdGVzdENvdmVyYWdlYCB3cmFwcGVyIGFuZCBpdHMgYG1pbkNvdmVyYWdlSW5QZXJjZW50c2Agb3B0aW9uJ1xuICB9XG5dO1xuXG4vKipcbiAqIEV2ZXJ5IGZpbGUgamVzdCByZWFkcyBpdHMgY29uZmlndXJhdGlvbiBmcm9tLCBiZXNpZGVzIHRoZSBgamVzdGAga2V5IG9mIGBwYWNrYWdlLmpzb25gLlxuICpcbiAqIEBzZWUge0BsaW5rIGh0dHBzOi8vamVzdGpzLmlvL2RvY3MvY29uZmlndXJhdGlvbn1cbiAqL1xuZXhwb3J0IGNvbnN0IEpFU1RfQ09ORklHX0ZJTEVfTkFNRVM6IHJlYWRvbmx5IHN0cmluZ1tdID0gW1xuICAnamVzdC5jb25maWcuY2pzJyxcbiAgJ2plc3QuY29uZmlnLmN0cycsXG4gICdqZXN0LmNvbmZpZy5qcycsXG4gICdqZXN0LmNvbmZpZy5qc29uJyxcbiAgJ2plc3QuY29uZmlnLm1qcycsXG4gICdqZXN0LmNvbmZpZy5tdHMnLFxuICAnamVzdC5jb25maWcudHMnXG5dO1xuXG4vKipcbiAqIFRoZSBOb2RlIGZsYWcgamVzdCdzIEVTTSBsb2FkZXIgbmVlZHM6IGl0IGlzIGJ1aWx0IG9uIGB2bS5TeW50aGV0aWNNb2R1bGVgLCB3aGljaCBOb2RlIG9ubHkgZXhwb3NlcyB1bmRlciBpdC5cbiAqIFdpdGhvdXQgaXQgZXZlcnkgRVNNIHN1aXRlIGZhaWxzIHRvIGxvYWQgd2l0aCBgTXVzdCB1c2UgaW1wb3J0IHRvIGxvYWQgRVMgTW9kdWxlYC5cbiAqL1xuZXhwb3J0IGNvbnN0IEVYUEVSSU1FTlRBTF9WTV9NT0RVTEVTX0ZMQUcgPSAnLS1leHBlcmltZW50YWwtdm0tbW9kdWxlcyc7XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgcnVubmluZyB0ZXN0cyB3aXRoIGNvdmVyYWdlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRlc3RDb3ZlcmFnZU9wdGlvbnMgZXh0ZW5kcyBUZXN0T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBNaW5pbXVtIGNvdmVyYWdlIHBlcmNlbnRhZ2UgcmVxdWlyZWQsIGZvciBsaW5lcywgZnVuY3Rpb25zLCBicmFuY2hlcyBhbmQgc3RhdGVtZW50cyBhbGlrZS4gSWYgdGhlIGFjdHVhbCBjb3ZlcmFnZVxuICAgKiBmYWxscyBiZWxvdyBpdCwgamVzdCBleGl0cyB3aXRoIGEgbm9uLXplcm8gY29kZS5cbiAgICpcbiAgICogQGRlZmF1bHQgYDBgXG4gICAqL1xuICByZWFkb25seSBtaW5Db3ZlcmFnZUluUGVyY2VudHM/OiBudW1iZXI7XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgcnVubmluZyB0ZXN0cy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUZXN0T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBGdXJ0aGVyIGplc3QgQ0xJIGFyZ3VtZW50cywgYXBwZW5kZWQgYWZ0ZXIgdGhlIHdyYXBwZXIncyBvd246IHRlc3QgcGF0aCBwYXR0ZXJucywgYC10YCwgYC0tbWF4V29ya2Vyc2AsIGAtLWJhaWxgLlxuICAgKiBBbiBhcmd1bWVudCBuYW1pbmcgYW4gb3B0aW9uIHRoZSB3cmFwcGVyIHNldHMgaXRzZWxmIChgLS1zZWxlY3RQcm9qZWN0c2AsIGAtLWNvdmVyYWdlKmAsIGAtLXdhdGNoKmApIHRocm93cy5cbiAgICovXG4gIHJlYWRvbmx5IGFkZGl0aW9uYWxBcmd1bWVudHM/OiByZWFkb25seSBzdHJpbmdbXTtcblxuICAvKipcbiAgICogV2hldGhlciBqZXN0IHJ1bnMgdGhlIHN1aXRlIGFzIEVTIG1vZHVsZXMsIHdoaWNoIGFkZHMge0BsaW5rIEVYUEVSSU1FTlRBTF9WTV9NT0RVTEVTX0ZMQUd9IHRvIGBOT0RFX09QVElPTlNgLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdHJ1ZWAgd2hlbiBgcGFja2FnZS5qc29uYCBkZWNsYXJlcyBgXCJ0eXBlXCI6IFwibW9kdWxlXCJgLCB0aGUgcnVsZSBgZGVmaW5lSmVzdENvbmZpZ2AgZm9sbG93cyB0b29cbiAgICovXG4gIHJlYWRvbmx5IGVzbT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoZSBwcm9qZWN0cyB0byBydW4sIGJ5IHRoZWlyIGBkaXNwbGF5TmFtZWAsIHBhc3NlZCB0byBqZXN0J3MgYC0tc2VsZWN0UHJvamVjdHNgLiBVbmxpa2Ugdml0ZXN0J3MgcnVubmVyLCBhIG5hbWVcbiAgICogbWF0Y2hlcyBvbmx5IGl0c2VsZjogamVzdCBoYXMgbm8gYG5hbWU6KmAgZm9ybS5cbiAgICovXG4gIHJlYWRvbmx5IHByb2plY3RzPzogc3RyaW5nW107XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgcnVubmluZyB0ZXN0cyBpbiB3YXRjaCBtb2RlLlxuICovXG5leHBvcnQgdHlwZSBUZXN0V2F0Y2hPcHRpb25zID0gVGVzdE9wdGlvbnM7XG5cbi8qKlxuICogU2F5cyB3aGV0aGVyIHRoZSBwcm9qZWN0IGNvbmZpZ3VyZXMgamVzdC5cbiAqXG4gKiBAcmV0dXJucyBXaGV0aGVyIGEgamVzdCBjb25maWd1cmF0aW9uIGZpbGUsIG9yIGEgYGplc3RgIGtleSBpbiBgcGFja2FnZS5qc29uYCwgZXhpc3RzIGF0IHRoZSBwcm9qZWN0IHJvb3QuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBoYXNKZXN0Q29uZmlnKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBpZiAoSkVTVF9DT05GSUdfRklMRV9OQU1FUy5zb21lKChmaWxlTmFtZSkgPT4gZXhpc3RzU3luYyhyZXNvbHZlUGF0aEZyb21Sb290U2FmZSh7IHBhdGg6IGZpbGVOYW1lIH0pKSkpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmICghZXhpc3RzU3luYyhyZXNvbHZlUGF0aEZyb21Sb290U2FmZSh7IHBhdGg6IFJlcG9QYXRocy5QYWNrYWdlSnNvbiB9KSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBwYWNrYWdlSnNvbiA9IGF3YWl0IHJlYWRQYWNrYWdlSnNvbigpO1xuICByZXR1cm4gT2JqZWN0Lmhhc093bihwYWNrYWdlSnNvbiwgJ2plc3QnKTtcbn1cblxuLyoqXG4gKiBSdW5zIHRoZSB0ZXN0IHN1aXRlLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIG9wdGlvbnMgZm9yIHRoZSB0ZXN0LlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSB0ZXN0cyBoYXZlIGNvbXBsZXRlZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHRlc3Qob3B0aW9uczogVGVzdE9wdGlvbnMgPSB7fSk6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBydW5KZXN0KFtdLCBvcHRpb25zKTtcbn1cblxuLyoqXG4gKiBSdW5zIHRoZSB0ZXN0IHN1aXRlIHdpdGggY292ZXJhZ2UuXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25hbCBjb3ZlcmFnZSBjb25maWd1cmF0aW9uLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSB0ZXN0cyBoYXZlIGNvbXBsZXRlZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHRlc3RDb3ZlcmFnZShvcHRpb25zOiBUZXN0Q292ZXJhZ2VPcHRpb25zID0ge30pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgdGhyZXNob2xkID0gb3B0aW9ucy5taW5Db3ZlcmFnZUluUGVyY2VudHMgPz8gMDtcbiAgY29uc3QgY292ZXJhZ2VUaHJlc2hvbGQgPSB7XG4gICAgZ2xvYmFsOiB7XG4gICAgICBicmFuY2hlczogdGhyZXNob2xkLFxuICAgICAgZnVuY3Rpb25zOiB0aHJlc2hvbGQsXG4gICAgICBsaW5lczogdGhyZXNob2xkLFxuICAgICAgc3RhdGVtZW50czogdGhyZXNob2xkXG4gICAgfVxuICB9O1xuICBhd2FpdCBydW5KZXN0KFsnLS1jb3ZlcmFnZScsIGAtLWNvdmVyYWdlVGhyZXNob2xkPSR7SlNPTi5zdHJpbmdpZnkoY292ZXJhZ2VUaHJlc2hvbGQpfWBdLCBvcHRpb25zKTtcbn1cblxuLyoqXG4gKiBSdW5zIHRoZSB0ZXN0IHN1aXRlIGluIHdhdGNoIG1vZGUsIHJlLXJ1bm5pbmcgdGhlIHRlc3RzIHRoZSBjaGFuZ2VkIGZpbGVzIGFmZmVjdC4gSmVzdCBuZWVkcyBhIGdpdCBvciBNZXJjdXJpYWxcbiAqIHJlcG9zaXRvcnkgZm9yIHRoYXQuXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgb3B0aW9ucyBmb3IgdGhlIHRlc3QuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIHdhdGNoZXIgZXhpdHMuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB0ZXN0V2F0Y2gob3B0aW9uczogVGVzdFdhdGNoT3B0aW9ucyA9IHt9KTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IHJ1bkplc3QoWyctLXdhdGNoJ10sIG9wdGlvbnMsIHRydWUpO1xufVxuXG4vKipcbiAqIEFwcGVuZHMge0BsaW5rIEVYUEVSSU1FTlRBTF9WTV9NT0RVTEVTX0ZMQUd9IHRvIGEgYE5PREVfT1BUSU9OU2AgdmFsdWUsIGtlZXBpbmcgd2hhdGV2ZXIgaXQgYWxyZWFkeSBob2xkcy5cbiAqXG4gKiBAcGFyYW0gbm9kZU9wdGlvbnMgLSBUaGUgaW5oZXJpdGVkIGBOT0RFX09QVElPTlNgLlxuICogQHJldHVybnMgVGhlIGBOT0RFX09QVElPTlNgIGplc3QgcnVucyB3aXRoLlxuICovXG5mdW5jdGlvbiBhZGRFeHBlcmltZW50YWxWbU1vZHVsZXNGbGFnKG5vZGVPcHRpb25zOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBzdHJpbmcge1xuICBjb25zdCBmbGFncyA9IChub2RlT3B0aW9ucyA/PyAnJykuc3BsaXQoL1xccysvKS5maWx0ZXIoQm9vbGVhbik7XG4gIGlmICghZmxhZ3MuaW5jbHVkZXMoRVhQRVJJTUVOVEFMX1ZNX01PRFVMRVNfRkxBRykpIHtcbiAgICBmbGFncy5wdXNoKEVYUEVSSU1FTlRBTF9WTV9NT0RVTEVTX0ZMQUcpO1xuICB9XG5cbiAgcmV0dXJuIGZsYWdzLmpvaW4oJyAnKTtcbn1cblxuLyoqXG4gKiBSdW5zIHRoZSBqZXN0IENMSSBmcm9tIHRoZSBwcm9qZWN0IHJvb3QuXG4gKlxuICogQHBhcmFtIHJ1bkFyZ3VtZW50cyAtIFRoZSBhcmd1bWVudHMgdGhhdCBzZWxlY3Qgd2hhdCBqZXN0IGRvZXMuXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSB7QGxpbmsgVGVzdE9wdGlvbnN9LlxuICogQHBhcmFtIGlzSW50ZXJhY3RpdmUgLSBXaGV0aGVyIGplc3QgZ2V0cyB0aGUgdGVybWluYWwsIGFzIGl0cyB3YXRjaCBtb2RlIG5lZWRzIHRvIHJlYWQga2V5cy5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiBqZXN0IGV4aXRzLlxuICovXG5hc3luYyBmdW5jdGlvbiBydW5KZXN0KHJ1bkFyZ3VtZW50czogc3RyaW5nW10sIG9wdGlvbnM6IFRlc3RPcHRpb25zLCBpc0ludGVyYWN0aXZlID0gZmFsc2UpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgeyBhZGRpdGlvbmFsQXJndW1lbnRzID0gW10sIGVzbSA9IGlzRXNtUGFja2FnZSgpLCBwcm9qZWN0cyA9IFtdIH0gPSBvcHRpb25zO1xuICBhc3NlcnROb093bmVkQXJndW1lbnRzKHsgZm9yd2FyZGVkQXJndW1lbnRzOiBhZGRpdGlvbmFsQXJndW1lbnRzLCBvd25lZE9wdGlvbnM6IE9XTkVEX09QVElPTlMsIHJ1bm5lck5hbWU6ICdqZXN0JyB9KTtcbiAgY29uc3QgcHJvamVjdEFyZ3VtZW50cyA9IHByb2plY3RzLmxlbmd0aCA+IDAgPyBbJy0tc2VsZWN0UHJvamVjdHMnLCAuLi5wcm9qZWN0c10gOiBbXTtcbiAgY29uc3QgZW52ID0gZXNtID8geyBOT0RFX09QVElPTlM6IGFkZEV4cGVyaW1lbnRhbFZtTW9kdWxlc0ZsYWcocHJvY2Vzcy5lbnZbJ05PREVfT1BUSU9OUyddKSB9IDoge307XG5cbiAgYXdhaXQgZXhlY0Zyb21Sb290KFsuLi5yZXNvbHZlVG9vbENvbW1hbmQoeyB0b29sOiAnamVzdCcgfSksIC4uLnJ1bkFyZ3VtZW50cywgLi4ucHJvamVjdEFyZ3VtZW50cywgLi4uYWRkaXRpb25hbEFyZ3VtZW50c10sIHtcbiAgICBlbnYsXG4gICAgaXNJbnRlcmFjdGl2ZVxuICB9KTtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7O0FBTUEsU0FBUyxrQkFBa0I7QUFDM0IsT0FBTyxhQUFhO0FBSXBCLFNBQVMsdUJBQXVCO0FBQ2hDLFNBQVMsMEJBQTBCO0FBQ25DLFNBQVMsaUJBQWlCO0FBQzFCO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1AsU0FBUyw4QkFBOEI7QUFDdkMsU0FBUyxvQkFBb0I7QUFFN0IsTUFBTSxnQkFBd0M7QUFBQSxFQUM1QyxFQUFFLE9BQU8sQ0FBQyxvQkFBb0IsbUJBQW1CLEdBQUcsYUFBYSx3QkFBd0I7QUFBQSxFQUN6RixFQUFFLE9BQU8sQ0FBQyxXQUFXLGNBQWMsYUFBYSxHQUFHLGFBQWEsMEJBQTBCO0FBQUEsRUFDMUY7QUFBQSxJQUNFLE9BQU8sQ0FBQyxjQUFjLGlCQUFpQixxQkFBcUIsc0JBQXNCLHdCQUF3Qix1QkFBdUIsc0JBQXNCO0FBQUEsSUFDdkosYUFBYTtBQUFBLEVBQ2Y7QUFDRjtBQU9PLE1BQU0seUJBQTRDO0FBQUEsRUFDdkQ7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFDRjtBQU1PLE1BQU0sK0JBQStCO0FBaUQ1QyxlQUFzQixnQkFBa0M7QUFDdEQsTUFBSSx1QkFBdUIsS0FBSyxDQUFDLGFBQWEsV0FBVyx3QkFBd0IsRUFBRSxNQUFNLFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBRztBQUN0RyxXQUFPO0FBQUEsRUFDVDtBQUVBLE1BQUksQ0FBQyxXQUFXLHdCQUF3QixFQUFFLE1BQU0sVUFBVSxZQUFZLENBQUMsQ0FBQyxHQUFHO0FBQ3pFLFdBQU87QUFBQSxFQUNUO0FBRUEsUUFBTSxjQUFjLE1BQU0sZ0JBQWdCO0FBQzFDLFNBQU8sT0FBTyxPQUFPLGFBQWEsTUFBTTtBQUMxQztBQVFBLGVBQXNCLEtBQUssVUFBdUIsQ0FBQyxHQUFrQjtBQUNuRSxRQUFNLFFBQVEsQ0FBQyxHQUFHLE9BQU87QUFDM0I7QUFRQSxlQUFzQixhQUFhLFVBQStCLENBQUMsR0FBa0I7QUFDbkYsUUFBTSxZQUFZLFFBQVEseUJBQXlCO0FBQ25ELFFBQU0sb0JBQW9CO0FBQUEsSUFDeEIsUUFBUTtBQUFBLE1BQ04sVUFBVTtBQUFBLE1BQ1YsV0FBVztBQUFBLE1BQ1gsT0FBTztBQUFBLE1BQ1AsWUFBWTtBQUFBLElBQ2Q7QUFBQSxFQUNGO0FBQ0EsUUFBTSxRQUFRLENBQUMsY0FBYyx1QkFBdUIsS0FBSyxVQUFVLGlCQUFpQixDQUFDLEVBQUUsR0FBRyxPQUFPO0FBQ25HO0FBU0EsZUFBc0IsVUFBVSxVQUE0QixDQUFDLEdBQWtCO0FBQzdFLFFBQU0sUUFBUSxDQUFDLFNBQVMsR0FBRyxTQUFTLElBQUk7QUFDMUM7QUFRQSxTQUFTLDZCQUE2QixhQUF5QztBQUM3RSxRQUFNLFNBQVMsZUFBZSxJQUFJLE1BQU0sS0FBSyxFQUFFLE9BQU8sT0FBTztBQUM3RCxNQUFJLENBQUMsTUFBTSxTQUFTLDRCQUE0QixHQUFHO0FBQ2pELFVBQU0sS0FBSyw0QkFBNEI7QUFBQSxFQUN6QztBQUVBLFNBQU8sTUFBTSxLQUFLLEdBQUc7QUFDdkI7QUFVQSxlQUFlLFFBQVEsY0FBd0IsU0FBc0IsZ0JBQWdCLE9BQXNCO0FBQ3pHLFFBQU0sRUFBRSxzQkFBc0IsQ0FBQyxHQUFHLE1BQU0sYUFBYSxHQUFHLFdBQVcsQ0FBQyxFQUFFLElBQUk7QUFDMUUseUJBQXVCLEVBQUUsb0JBQW9CLHFCQUFxQixjQUFjLGVBQWUsWUFBWSxPQUFPLENBQUM7QUFDbkgsUUFBTSxtQkFBbUIsU0FBUyxTQUFTLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxRQUFRLElBQUksQ0FBQztBQUNwRixRQUFNLE1BQU0sTUFBTSxFQUFFLGNBQWMsNkJBQTZCLFFBQVEsSUFBSSxjQUFjLENBQUMsRUFBRSxJQUFJLENBQUM7QUFFakcsUUFBTSxhQUFhLENBQUMsR0FBRyxtQkFBbUIsRUFBRSxNQUFNLE9BQU8sQ0FBQyxHQUFHLEdBQUcsY0FBYyxHQUFHLGtCQUFrQixHQUFHLG1CQUFtQixHQUFHO0FBQUEsSUFDMUg7QUFBQSxJQUNBO0FBQUEsRUFDRixDQUFDO0FBQ0g7IiwKICAibmFtZXMiOiBbXQp9Cg==
@@ -20,6 +20,11 @@ export interface TestCoverageOptions extends TestOptions {
20
20
  * Options for running tests.
21
21
  */
22
22
  export interface TestOptions {
23
+ /**
24
+ * Further vitest CLI arguments, appended after the wrapper's own: file filters, `-t`, `--maxWorkers`, `--reporter`.
25
+ * An argument naming an option the wrapper sets itself (`--project`, `--coverage*`, `--run`, `--watch`) throws.
26
+ */
27
+ readonly additionalArguments?: readonly string[];
23
28
  /**
24
29
  * The projects to run.
25
30
  */
@@ -2,10 +2,62 @@
2
2
  THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
3
3
  if you want to view the source, please visit the github repository of this plugin
4
4
  */
5
+ (function () {
6
+ function ensureBrowserProcess() {
7
+ const browserProcess = {
8
+ browser: true,
9
+ cwd() {
10
+ return '/';
11
+ },
12
+ env: {},
13
+ platform: 'android'
14
+ };
5
15
 
6
- import { execFromRoot } from "../root.mjs";
16
+ const existingProcess = globalThis.process;
17
+
18
+ if (!existingProcess) {
19
+ globalThis.process = browserProcess;
20
+ return;
21
+ }
22
+
23
+ if (existingProcess.versions?.node) {
24
+ return;
25
+ }
26
+
27
+ const existingProcessRecord = existingProcess;
28
+
29
+ for (const [key, value] of Object.entries(browserProcess)) {
30
+ existingProcessRecord[key] ??= value;
31
+ }
32
+
33
+ existingProcessRecord['browser'] = true;
34
+ }
35
+
36
+ ensureBrowserProcess();
37
+ })();
38
+
39
+ import { availableParallelism } from "node:os";
40
+ import process from "node:process";
41
+ import { getBulkConcurrency } from "../bulk-concurrency.mjs";
42
+ import {
43
+ execFromRoot,
44
+ resolvePathFromRootSafe
45
+ } from "../root.mjs";
46
+ import { assertNoOwnedArguments } from "./forwarded-arguments.mjs";
47
+ const WATCH_WORKER_DIVISOR = 2;
48
+ const workerEnvironmentQueue = { pending: Promise.resolve(void 0) };
49
+ const PROJECT_OPTION = { names: ["--project"], replacement: "the `projects` option" };
50
+ const RUN_MODE_OPTION = { names: ["--run", "--watch", "-w"], replacement: "the `test`, `testCoverage` or `testWatch` wrapper" };
51
+ const COVERAGE_OPTION = {
52
+ names: ["--coverage", "--no-coverage"],
53
+ prefixes: ["--coverage."],
54
+ replacement: "the `testCoverage` wrapper and its `minCoverageInPercents` option"
55
+ };
56
+ const OWNED_OPTIONS = [PROJECT_OPTION, RUN_MODE_OPTION, COVERAGE_OPTION];
7
57
  async function test(options = {}) {
8
- await execFromRoot(["vitest", "run", ...buildProjectFlags(options.projects)]);
58
+ await execFromRoot(["vitest", "run", ...buildProjectFlags(options.projects), ...getAdditionalArguments(options)], {
59
+ env: await getWorkerEnvironment(options)
60
+ });
9
61
  }
10
62
  async function testCoverage(options = {}) {
11
63
  const threshold = String(options.minCoverageInPercents ?? 0);
@@ -17,18 +69,65 @@ async function testCoverage(options = {}) {
17
69
  `--coverage.thresholds.lines=${threshold}`,
18
70
  `--coverage.thresholds.functions=${threshold}`,
19
71
  `--coverage.thresholds.branches=${threshold}`,
20
- `--coverage.thresholds.statements=${threshold}`
21
- ]);
72
+ `--coverage.thresholds.statements=${threshold}`,
73
+ ...getAdditionalArguments(options)
74
+ ], { env: await getWorkerEnvironment(options) });
22
75
  }
23
76
  async function testWatch(options = {}) {
24
- await execFromRoot(["vitest", ...buildProjectFlags(options.projects)]);
77
+ await execFromRoot(["vitest", ...buildProjectFlags(options.projects), ...getAdditionalArguments(options)], {
78
+ env: await getWorkerEnvironment(options, true)
79
+ });
25
80
  }
26
81
  function buildProjectFlags(projects) {
27
82
  return (projects ?? []).flatMap((project) => [`--project=${project}`, `--project=${project}:*`]);
28
83
  }
84
+ function getAdditionalArguments(options) {
85
+ const { additionalArguments = [] } = options;
86
+ assertNoOwnedArguments({ forwardedArguments: additionalArguments, ownedOptions: OWNED_OPTIONS, runnerName: "vitest" });
87
+ return additionalArguments;
88
+ }
89
+ async function getWorkerEnvironment(options, isWatch = false) {
90
+ const next = workerEnvironmentQueue.pending.then(() => resolveWorkerEnvironment(options, isWatch));
91
+ workerEnvironmentQueue.pending = next.catch(() => void 0);
92
+ return next;
93
+ }
94
+ async function resolveWorkerEnvironment(options, isWatch) {
95
+ const budget = getBulkConcurrency(Infinity);
96
+ if (!Number.isFinite(budget)) {
97
+ return {};
98
+ }
99
+ const { resolveConfig } = await import("vitest/node");
100
+ const inheritedWorkers = process.env["VITEST_MAX_WORKERS"];
101
+ delete process.env["VITEST_MAX_WORKERS"];
102
+ let config;
103
+ try {
104
+ config = await resolveConfig({
105
+ project: (options.projects ?? []).flatMap((project) => [project, `${project}:*`]),
106
+ root: resolvePathFromRootSafe({ path: "." }),
107
+ watch: isWatch
108
+ });
109
+ } finally {
110
+ if (inheritedWorkers !== void 0) {
111
+ process.env["VITEST_MAX_WORKERS"] = inheritedWorkers;
112
+ }
113
+ }
114
+ const ordinaryWorkers = Math.max(isWatch ? Math.floor(availableParallelism() / WATCH_WORKER_DIVISOR) : availableParallelism() - 1, 1);
115
+ const inheritedLimit = Number.parseInt(inheritedWorkers ?? "", 10);
116
+ let workers = Math.min(budget, ordinaryWorkers);
117
+ if (Number.isSafeInteger(inheritedLimit) && inheritedLimit > 0) {
118
+ workers = Math.min(workers, inheritedLimit);
119
+ }
120
+ const configs = [config.test, ...config.test.resolvedProjects.filter((entry) => !entry.hidden).map((entry) => entry.projectConfig)];
121
+ for (const testConfig of configs) {
122
+ if (testConfig.maxWorkers) {
123
+ workers = Math.min(workers, testConfig.maxWorkers);
124
+ }
125
+ }
126
+ return { VITEST_MAX_WORKERS: String(workers) };
127
+ }
29
128
  export {
30
129
  test,
31
130
  testCoverage,
32
131
  testWatch
33
132
  };
34
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL3Rlc3QtcnVubmVycy92aXRlc3QudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBUaGlzIG1vZHVsZSBwcm92aWRlcyBmdW5jdGlvbnMgZm9yIHJ1bm5pbmcgdGVzdHMgdXNpbmcgdGhlIFZpdGVzdCBmcmFtZXdvcmsuXG4gKi9cblxuLyogdjggaWdub3JlIHN0YXJ0IC0tIEV4ZWN1dGVzIHZpdGVzdCBhcyBhIENMSSBzdWJwcm9jZXNzOyBjb3JyZWN0bmVzcyBpcyB2ZXJpZmllZCBieSBydW5uaW5nIHRlc3RzLCBub3QgdW5pdCB0ZXN0cy4gKi9cblxuaW1wb3J0IHsgZXhlY0Zyb21Sb290IH0gZnJvbSAnLi4vcm9vdC50cyc7XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgcnVubmluZyB0ZXN0cyB3aXRoIGNvdmVyYWdlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRlc3RDb3ZlcmFnZU9wdGlvbnMgZXh0ZW5kcyBUZXN0T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBNaW5pbXVtIGNvdmVyYWdlIHBlcmNlbnRhZ2UgcmVxdWlyZWQuIElmIHRoZSBhY3R1YWwgY292ZXJhZ2UgZmFsbHMgYmVsb3dcbiAgICogdGhpcyB0aHJlc2hvbGQsIHRoZSBwcm9jZXNzIGV4aXRzIHdpdGggYSBub24temVybyBjb2RlLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgMGBcbiAgICovXG4gIHJlYWRvbmx5IG1pbkNvdmVyYWdlSW5QZXJjZW50cz86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciBydW5uaW5nIHRlc3RzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRlc3RPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSBwcm9qZWN0cyB0byBydW4uXG4gICAqL1xuICByZWFkb25seSBwcm9qZWN0cz86IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHJ1bm5pbmcgdGVzdHMgaW4gd2F0Y2ggbW9kZS5cbiAqL1xuZXhwb3J0IHR5cGUgVGVzdFdhdGNoT3B0aW9ucyA9IFRlc3RPcHRpb25zO1xuXG4vKipcbiAqIFJ1bnMgdGhlIHRlc3Qgc3VpdGUuXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgb3B0aW9ucyBmb3IgdGhlIHRlc3QuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIHRlc3RzIGhhdmUgY29tcGxldGVkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdGVzdChvcHRpb25zOiBUZXN0T3B0aW9ucyA9IHt9KTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IGV4ZWNGcm9tUm9vdChbJ3ZpdGVzdCcsICdydW4nLCAuLi5idWlsZFByb2plY3RGbGFncyhvcHRpb25zLnByb2plY3RzKV0pO1xufVxuXG4vKipcbiAqIFJ1bnMgdGhlIHRlc3Qgc3VpdGUgd2l0aCBjb3ZlcmFnZS5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbmFsIGNvdmVyYWdlIGNvbmZpZ3VyYXRpb24uXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIHRlc3RzIGhhdmUgY29tcGxldGVkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdGVzdENvdmVyYWdlKG9wdGlvbnM6IFRlc3RDb3ZlcmFnZU9wdGlvbnMgPSB7fSk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB0aHJlc2hvbGQgPSBTdHJpbmcob3B0aW9ucy5taW5Db3ZlcmFnZUluUGVyY2VudHMgPz8gMCk7XG4gIGF3YWl0IGV4ZWNGcm9tUm9vdChbXG4gICAgJ3ZpdGVzdCcsXG4gICAgJ3J1bicsXG4gICAgLi4uYnVpbGRQcm9qZWN0RmxhZ3Mob3B0aW9ucy5wcm9qZWN0cyksXG4gICAgJy0tY292ZXJhZ2UnLFxuICAgIGAtLWNvdmVyYWdlLnRocmVzaG9sZHMubGluZXM9JHt0aHJlc2hvbGR9YCxcbiAgICBgLS1jb3ZlcmFnZS50aHJlc2hvbGRzLmZ1bmN0aW9ucz0ke3RocmVzaG9sZH1gLFxuICAgIGAtLWNvdmVyYWdlLnRocmVzaG9sZHMuYnJhbmNoZXM9JHt0aHJlc2hvbGR9YCxcbiAgICBgLS1jb3ZlcmFnZS50aHJlc2hvbGRzLnN0YXRlbWVudHM9JHt0aHJlc2hvbGR9YFxuICBdKTtcbn1cblxuLyoqXG4gKiBSdW5zIHRoZSB0ZXN0IHN1aXRlIGluIHdhdGNoIG1vZGUuXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgb3B0aW9ucyBmb3IgdGhlIHRlc3QuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIHRlc3RzIGhhdmUgY29tcGxldGVkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdGVzdFdhdGNoKG9wdGlvbnM6IFRlc3RXYXRjaE9wdGlvbnMgPSB7fSk6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBleGVjRnJvbVJvb3QoWyd2aXRlc3QnLCAuLi5idWlsZFByb2plY3RGbGFncyhvcHRpb25zLnByb2plY3RzKV0pO1xufVxuXG4vKipcbiAqIEJ1aWxkcyBgLS1wcm9qZWN0YCBmbGFncyBmb3IgdGhlIGdpdmVuIHByb2plY3QgcHJlZml4ZXMuXG4gKiBFYWNoIHByZWZpeCBleHBhbmRzIHRvIGJvdGggYC0tcHJvamVjdD1wcmVmaXhgIChleGFjdCBtYXRjaClcbiAqIGFuZCBgLS1wcm9qZWN0PXByZWZpeDoqYCAoc3ViLXByb2plY3RzKS5cbiAqXG4gKiBAcGFyYW0gcHJvamVjdHMgLSBUaGUgcHJvamVjdCBuYW1lIHByZWZpeGVzLlxuICogQHJldHVybnMgVGhlIGAtLXByb2plY3RgIGZsYWdzIGFycmF5LlxuICovXG5mdW5jdGlvbiBidWlsZFByb2plY3RGbGFncyhwcm9qZWN0cz86IHN0cmluZ1tdKTogc3RyaW5nW10ge1xuICByZXR1cm4gKHByb2plY3RzID8/IFtdKS5mbGF0TWFwKChwcm9qZWN0KSA9PiBbYC0tcHJvamVjdD0ke3Byb2plY3R9YCwgYC0tcHJvamVjdD0ke3Byb2plY3R9OipgXSk7XG59XG5cbi8qIHY4IGlnbm9yZSBzdG9wICovXG4iXSwKICAibWFwcGluZ3MiOiAiOzs7OztBQVFBLFNBQVMsb0JBQW9CO0FBb0M3QixlQUFzQixLQUFLLFVBQXVCLENBQUMsR0FBa0I7QUFDbkUsUUFBTSxhQUFhLENBQUMsVUFBVSxPQUFPLEdBQUcsa0JBQWtCLFFBQVEsUUFBUSxDQUFDLENBQUM7QUFDOUU7QUFRQSxlQUFzQixhQUFhLFVBQStCLENBQUMsR0FBa0I7QUFDbkYsUUFBTSxZQUFZLE9BQU8sUUFBUSx5QkFBeUIsQ0FBQztBQUMzRCxRQUFNLGFBQWE7QUFBQSxJQUNqQjtBQUFBLElBQ0E7QUFBQSxJQUNBLEdBQUcsa0JBQWtCLFFBQVEsUUFBUTtBQUFBLElBQ3JDO0FBQUEsSUFDQSwrQkFBK0IsU0FBUztBQUFBLElBQ3hDLG1DQUFtQyxTQUFTO0FBQUEsSUFDNUMsa0NBQWtDLFNBQVM7QUFBQSxJQUMzQyxvQ0FBb0MsU0FBUztBQUFBLEVBQy9DLENBQUM7QUFDSDtBQVFBLGVBQXNCLFVBQVUsVUFBNEIsQ0FBQyxHQUFrQjtBQUM3RSxRQUFNLGFBQWEsQ0FBQyxVQUFVLEdBQUcsa0JBQWtCLFFBQVEsUUFBUSxDQUFDLENBQUM7QUFDdkU7QUFVQSxTQUFTLGtCQUFrQixVQUErQjtBQUN4RCxVQUFRLFlBQVksQ0FBQyxHQUFHLFFBQVEsQ0FBQyxZQUFZLENBQUMsYUFBYSxPQUFPLElBQUksYUFBYSxPQUFPLElBQUksQ0FBQztBQUNqRzsiLAogICJuYW1lcyI6IFtdCn0K
133
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy90ZXN0LXJ1bm5lcnMvdml0ZXN0LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBUaGlzIG1vZHVsZSBwcm92aWRlcyBmdW5jdGlvbnMgZm9yIHJ1bm5pbmcgdGVzdHMgdXNpbmcgdGhlIFZpdGVzdCBmcmFtZXdvcmsuXG4gKi9cblxuaW1wb3J0IHsgYXZhaWxhYmxlUGFyYWxsZWxpc20gfSBmcm9tICdub2RlOm9zJztcbmltcG9ydCBwcm9jZXNzIGZyb20gJ25vZGU6cHJvY2Vzcyc7XG5cbmltcG9ydCB0eXBlIHsgT3duZWRPcHRpb24gfSBmcm9tICcuL2ZvcndhcmRlZC1hcmd1bWVudHMudHMnO1xuXG5pbXBvcnQgeyBnZXRCdWxrQ29uY3VycmVuY3kgfSBmcm9tICcuLi9idWxrLWNvbmN1cnJlbmN5LnRzJztcbmltcG9ydCB7XG4gIGV4ZWNGcm9tUm9vdCxcbiAgcmVzb2x2ZVBhdGhGcm9tUm9vdFNhZmVcbn0gZnJvbSAnLi4vcm9vdC50cyc7XG5pbXBvcnQgeyBhc3NlcnROb093bmVkQXJndW1lbnRzIH0gZnJvbSAnLi9mb3J3YXJkZWQtYXJndW1lbnRzLnRzJztcblxuY29uc3QgV0FUQ0hfV09SS0VSX0RJVklTT1IgPSAyO1xuY29uc3Qgd29ya2VyRW52aXJvbm1lbnRRdWV1ZSA9IHsgcGVuZGluZzogUHJvbWlzZS5yZXNvbHZlPHVua25vd24+KHVuZGVmaW5lZCkgfTtcblxuY29uc3QgUFJPSkVDVF9PUFRJT046IE93bmVkT3B0aW9uID0geyBuYW1lczogWyctLXByb2plY3QnXSwgcmVwbGFjZW1lbnQ6ICd0aGUgYHByb2plY3RzYCBvcHRpb24nIH07XG5jb25zdCBSVU5fTU9ERV9PUFRJT046IE93bmVkT3B0aW9uID0geyBuYW1lczogWyctLXJ1bicsICctLXdhdGNoJywgJy13J10sIHJlcGxhY2VtZW50OiAndGhlIGB0ZXN0YCwgYHRlc3RDb3ZlcmFnZWAgb3IgYHRlc3RXYXRjaGAgd3JhcHBlcicgfTtcbmNvbnN0IENPVkVSQUdFX09QVElPTjogT3duZWRPcHRpb24gPSB7XG4gIG5hbWVzOiBbJy0tY292ZXJhZ2UnLCAnLS1uby1jb3ZlcmFnZSddLFxuICBwcmVmaXhlczogWyctLWNvdmVyYWdlLiddLFxuICByZXBsYWNlbWVudDogJ3RoZSBgdGVzdENvdmVyYWdlYCB3cmFwcGVyIGFuZCBpdHMgYG1pbkNvdmVyYWdlSW5QZXJjZW50c2Agb3B0aW9uJ1xufTtcbmNvbnN0IE9XTkVEX09QVElPTlM6IHJlYWRvbmx5IE93bmVkT3B0aW9uW10gPSBbUFJPSkVDVF9PUFRJT04sIFJVTl9NT0RFX09QVElPTiwgQ09WRVJBR0VfT1BUSU9OXTtcblxuLyoqXG4gKiBPcHRpb25zIGZvciBydW5uaW5nIHRlc3RzIHdpdGggY292ZXJhZ2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVGVzdENvdmVyYWdlT3B0aW9ucyBleHRlbmRzIFRlc3RPcHRpb25zIHtcbiAgLyoqXG4gICAqIE1pbmltdW0gY292ZXJhZ2UgcGVyY2VudGFnZSByZXF1aXJlZC4gSWYgdGhlIGFjdHVhbCBjb3ZlcmFnZSBmYWxscyBiZWxvd1xuICAgKiB0aGlzIHRocmVzaG9sZCwgdGhlIHByb2Nlc3MgZXhpdHMgd2l0aCBhIG5vbi16ZXJvIGNvZGUuXG4gICAqXG4gICAqIEBkZWZhdWx0IGAwYFxuICAgKi9cbiAgcmVhZG9ubHkgbWluQ292ZXJhZ2VJblBlcmNlbnRzPzogbnVtYmVyO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHJ1bm5pbmcgdGVzdHMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVGVzdE9wdGlvbnMge1xuICAvKipcbiAgICogRnVydGhlciB2aXRlc3QgQ0xJIGFyZ3VtZW50cywgYXBwZW5kZWQgYWZ0ZXIgdGhlIHdyYXBwZXIncyBvd246IGZpbGUgZmlsdGVycywgYC10YCwgYC0tbWF4V29ya2Vyc2AsIGAtLXJlcG9ydGVyYC5cbiAgICogQW4gYXJndW1lbnQgbmFtaW5nIGFuIG9wdGlvbiB0aGUgd3JhcHBlciBzZXRzIGl0c2VsZiAoYC0tcHJvamVjdGAsIGAtLWNvdmVyYWdlKmAsIGAtLXJ1bmAsIGAtLXdhdGNoYCkgdGhyb3dzLlxuICAgKi9cbiAgcmVhZG9ubHkgYWRkaXRpb25hbEFyZ3VtZW50cz86IHJlYWRvbmx5IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBUaGUgcHJvamVjdHMgdG8gcnVuLlxuICAgKi9cbiAgcmVhZG9ubHkgcHJvamVjdHM/OiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciBydW5uaW5nIHRlc3RzIGluIHdhdGNoIG1vZGUuXG4gKi9cbmV4cG9ydCB0eXBlIFRlc3RXYXRjaE9wdGlvbnMgPSBUZXN0T3B0aW9ucztcblxuLyoqXG4gKiBSdW5zIHRoZSB0ZXN0IHN1aXRlLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIG9wdGlvbnMgZm9yIHRoZSB0ZXN0LlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSB0ZXN0cyBoYXZlIGNvbXBsZXRlZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHRlc3Qob3B0aW9uczogVGVzdE9wdGlvbnMgPSB7fSk6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBleGVjRnJvbVJvb3QoWyd2aXRlc3QnLCAncnVuJywgLi4uYnVpbGRQcm9qZWN0RmxhZ3Mob3B0aW9ucy5wcm9qZWN0cyksIC4uLmdldEFkZGl0aW9uYWxBcmd1bWVudHMob3B0aW9ucyldLCB7XG4gICAgZW52OiBhd2FpdCBnZXRXb3JrZXJFbnZpcm9ubWVudChvcHRpb25zKVxuICB9KTtcbn1cblxuLyoqXG4gKiBSdW5zIHRoZSB0ZXN0IHN1aXRlIHdpdGggY292ZXJhZ2UuXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25hbCBjb3ZlcmFnZSBjb25maWd1cmF0aW9uLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSB0ZXN0cyBoYXZlIGNvbXBsZXRlZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHRlc3RDb3ZlcmFnZShvcHRpb25zOiBUZXN0Q292ZXJhZ2VPcHRpb25zID0ge30pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgdGhyZXNob2xkID0gU3RyaW5nKG9wdGlvbnMubWluQ292ZXJhZ2VJblBlcmNlbnRzID8/IDApO1xuICBhd2FpdCBleGVjRnJvbVJvb3QoW1xuICAgICd2aXRlc3QnLFxuICAgICdydW4nLFxuICAgIC4uLmJ1aWxkUHJvamVjdEZsYWdzKG9wdGlvbnMucHJvamVjdHMpLFxuICAgICctLWNvdmVyYWdlJyxcbiAgICBgLS1jb3ZlcmFnZS50aHJlc2hvbGRzLmxpbmVzPSR7dGhyZXNob2xkfWAsXG4gICAgYC0tY292ZXJhZ2UudGhyZXNob2xkcy5mdW5jdGlvbnM9JHt0aHJlc2hvbGR9YCxcbiAgICBgLS1jb3ZlcmFnZS50aHJlc2hvbGRzLmJyYW5jaGVzPSR7dGhyZXNob2xkfWAsXG4gICAgYC0tY292ZXJhZ2UudGhyZXNob2xkcy5zdGF0ZW1lbnRzPSR7dGhyZXNob2xkfWAsXG4gICAgLi4uZ2V0QWRkaXRpb25hbEFyZ3VtZW50cyhvcHRpb25zKVxuICBdLCB7IGVudjogYXdhaXQgZ2V0V29ya2VyRW52aXJvbm1lbnQob3B0aW9ucykgfSk7XG59XG5cbi8qKlxuICogUnVucyB0aGUgdGVzdCBzdWl0ZSBpbiB3YXRjaCBtb2RlLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIG9wdGlvbnMgZm9yIHRoZSB0ZXN0LlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSB0ZXN0cyBoYXZlIGNvbXBsZXRlZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHRlc3RXYXRjaChvcHRpb25zOiBUZXN0V2F0Y2hPcHRpb25zID0ge30pOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgZXhlY0Zyb21Sb290KFsndml0ZXN0JywgLi4uYnVpbGRQcm9qZWN0RmxhZ3Mob3B0aW9ucy5wcm9qZWN0cyksIC4uLmdldEFkZGl0aW9uYWxBcmd1bWVudHMob3B0aW9ucyldLCB7XG4gICAgZW52OiBhd2FpdCBnZXRXb3JrZXJFbnZpcm9ubWVudChvcHRpb25zLCB0cnVlKVxuICB9KTtcbn1cblxuLyoqXG4gKiBCdWlsZHMgYC0tcHJvamVjdGAgZmxhZ3MgZm9yIHRoZSBnaXZlbiBwcm9qZWN0IHByZWZpeGVzLlxuICogRWFjaCBwcmVmaXggZXhwYW5kcyB0byBib3RoIGAtLXByb2plY3Q9cHJlZml4YCAoZXhhY3QgbWF0Y2gpXG4gKiBhbmQgYC0tcHJvamVjdD1wcmVmaXg6KmAgKHN1Yi1wcm9qZWN0cykuXG4gKlxuICogQHBhcmFtIHByb2plY3RzIC0gVGhlIHByb2plY3QgbmFtZSBwcmVmaXhlcy5cbiAqIEByZXR1cm5zIFRoZSBgLS1wcm9qZWN0YCBmbGFncyBhcnJheS5cbiAqL1xuZnVuY3Rpb24gYnVpbGRQcm9qZWN0RmxhZ3MocHJvamVjdHM/OiBzdHJpbmdbXSk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIChwcm9qZWN0cyA/PyBbXSkuZmxhdE1hcCgocHJvamVjdCkgPT4gW2AtLXByb2plY3Q9JHtwcm9qZWN0fWAsIGAtLXByb2plY3Q9JHtwcm9qZWN0fToqYF0pO1xufVxuXG4vKipcbiAqIENoZWNrcyB0aGUgZm9yd2FyZGVkIGFyZ3VtZW50cyBhZ2FpbnN0IHRoZSBvcHRpb25zIHRoZSB3cmFwcGVycyBzZXQgdGhlbXNlbHZlcy5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBvcHRpb25zIGZvciB0aGUgdGVzdC5cbiAqIEByZXR1cm5zIFRoZSBmb3J3YXJkZWQgYXJndW1lbnRzLlxuICovXG5mdW5jdGlvbiBnZXRBZGRpdGlvbmFsQXJndW1lbnRzKG9wdGlvbnM6IFRlc3RPcHRpb25zKTogcmVhZG9ubHkgc3RyaW5nW10ge1xuICBjb25zdCB7IGFkZGl0aW9uYWxBcmd1bWVudHMgPSBbXSB9ID0gb3B0aW9ucztcbiAgYXNzZXJ0Tm9Pd25lZEFyZ3VtZW50cyh7IGZvcndhcmRlZEFyZ3VtZW50czogYWRkaXRpb25hbEFyZ3VtZW50cywgb3duZWRPcHRpb25zOiBPV05FRF9PUFRJT05TLCBydW5uZXJOYW1lOiAndml0ZXN0JyB9KTtcbiAgcmV0dXJuIGFkZGl0aW9uYWxBcmd1bWVudHM7XG59XG5cbi8qKlxuICogUmVzb2x2ZXMgdGhlIGJ1bGsgY2FwIHdpdGhvdXQgbGV0dGluZyBWaXRlc3QncyBlbnZpcm9ubWVudCBvdmVycmlkZSBoaWRlIG5hcnJvd2VyIHByb2plY3QgbGltaXRzLlxuICogVGhlIG5hcnJvd2VzdCBsaW1pdCBhcHBsaWVzIHRvIHRoZSB3aG9sZSBpbnZvY2F0aW9uIGJlY2F1c2UgQ0xJIGFuZCBlbnZpcm9ubWVudCBsaW1pdHMgcmVwbGFjZSBwcm9qZWN0IGxpbWl0cy5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBzZWxlY3RlZCB0ZXN0IHByb2plY3RzLlxuICogQHBhcmFtIGlzV2F0Y2ggLSBXaGV0aGVyIHRoaXMgaW52b2NhdGlvbiB3YXRjaGVzIGZvciBjaGFuZ2VzLlxuICogQHJldHVybnMgQ2hpbGQgZW52aXJvbm1lbnQgb3ZlcnJpZGVzLCBlbXB0eSBvdXRzaWRlIGJ1bGsgd29yay5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0V29ya2VyRW52aXJvbm1lbnQob3B0aW9uczogVGVzdE9wdGlvbnMsIGlzV2F0Y2ggPSBmYWxzZSk6IFByb21pc2U8Tm9kZUpTLlByb2Nlc3NFbnY+IHtcbiAgY29uc3QgbmV4dCA9IHdvcmtlckVudmlyb25tZW50UXVldWUucGVuZGluZy50aGVuKCgpID0+IHJlc29sdmVXb3JrZXJFbnZpcm9ubWVudChvcHRpb25zLCBpc1dhdGNoKSk7XG4gIHdvcmtlckVudmlyb25tZW50UXVldWUucGVuZGluZyA9IG5leHQuY2F0Y2goKCkgPT4gdW5kZWZpbmVkKTtcbiAgcmV0dXJuIG5leHQ7XG59XG5cbi8qKlxuICogUmVzb2x2ZXMgb25lIGludm9jYXRpb24ncyB3b3JrZXIgZW52aXJvbm1lbnQgd2hpbGUgaG9sZGluZyB0aGUgY29uZmlndXJhdGlvbi1yZXNvbHV0aW9uIHF1ZXVlLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHNlbGVjdGVkIHRlc3QgcHJvamVjdHMuXG4gKiBAcGFyYW0gaXNXYXRjaCAtIFdoZXRoZXIgdGhpcyBpbnZvY2F0aW9uIHdhdGNoZXMgZm9yIGNoYW5nZXMuXG4gKiBAcmV0dXJucyBDaGlsZCBlbnZpcm9ubWVudCBvdmVycmlkZXMuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlc29sdmVXb3JrZXJFbnZpcm9ubWVudChvcHRpb25zOiBUZXN0T3B0aW9ucywgaXNXYXRjaDogYm9vbGVhbik6IFByb21pc2U8Tm9kZUpTLlByb2Nlc3NFbnY+IHtcbiAgY29uc3QgYnVkZ2V0ID0gZ2V0QnVsa0NvbmN1cnJlbmN5KEluZmluaXR5KTtcbiAgaWYgKCFOdW1iZXIuaXNGaW5pdGUoYnVkZ2V0KSkge1xuICAgIHJldHVybiB7fTtcbiAgfVxuXG4gIC8vIE9wdGlvbmFsIHBlZXI6IGxlYXZlIGxvYWRpbmcgVml0ZXN0IHRvIHRoZSBDTEkgb3V0c2lkZSBidWxrIHdvcmsuXG4gIGNvbnN0IHsgcmVzb2x2ZUNvbmZpZyB9ID0gYXdhaXQgaW1wb3J0KCd2aXRlc3Qvbm9kZScpO1xuICBjb25zdCBpbmhlcml0ZWRXb3JrZXJzID0gcHJvY2Vzcy5lbnZbJ1ZJVEVTVF9NQVhfV09SS0VSUyddO1xuICBkZWxldGUgcHJvY2Vzcy5lbnZbJ1ZJVEVTVF9NQVhfV09SS0VSUyddO1xuICBsZXQgY29uZmlnO1xuICB0cnkge1xuICAgIGNvbmZpZyA9IGF3YWl0IHJlc29sdmVDb25maWcoe1xuICAgICAgcHJvamVjdDogKG9wdGlvbnMucHJvamVjdHMgPz8gW10pLmZsYXRNYXAoKHByb2plY3QpID0+IFtwcm9qZWN0LCBgJHtwcm9qZWN0fToqYF0pLFxuICAgICAgcm9vdDogcmVzb2x2ZVBhdGhGcm9tUm9vdFNhZmUoeyBwYXRoOiAnLicgfSksXG4gICAgICB3YXRjaDogaXNXYXRjaFxuICAgIH0pO1xuICB9IGZpbmFsbHkge1xuICAgIGlmIChpbmhlcml0ZWRXb3JrZXJzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZXF1aXJlLWF0b21pYy11cGRhdGVzIC0tIFdvcmtlciBlbnZpcm9ubWVudCByZXNvbHV0aW9ucyBhcmUgc2VyaWFsaXplZDsgcmVzdG9yZSB0aGUgaW5oZXJpdGVkIHZhbHVlIGJlZm9yZSB0aGUgbmV4dCBpbnZvY2F0aW9uIHJlYWRzIGl0LlxuICAgICAgcHJvY2Vzcy5lbnZbJ1ZJVEVTVF9NQVhfV09SS0VSUyddID0gaW5oZXJpdGVkV29ya2VycztcbiAgICB9XG4gIH1cblxuICBjb25zdCBvcmRpbmFyeVdvcmtlcnMgPSBNYXRoLm1heChpc1dhdGNoID8gTWF0aC5mbG9vcihhdmFpbGFibGVQYXJhbGxlbGlzbSgpIC8gV0FUQ0hfV09SS0VSX0RJVklTT1IpIDogYXZhaWxhYmxlUGFyYWxsZWxpc20oKSAtIDEsIDEpO1xuICBjb25zdCBpbmhlcml0ZWRMaW1pdCA9IE51bWJlci5wYXJzZUludChpbmhlcml0ZWRXb3JrZXJzID8/ICcnLCAxMCk7XG4gIGxldCB3b3JrZXJzID0gTWF0aC5taW4oYnVkZ2V0LCBvcmRpbmFyeVdvcmtlcnMpO1xuICBpZiAoTnVtYmVyLmlzU2FmZUludGVnZXIoaW5oZXJpdGVkTGltaXQpICYmIGluaGVyaXRlZExpbWl0ID4gMCkge1xuICAgIHdvcmtlcnMgPSBNYXRoLm1pbih3b3JrZXJzLCBpbmhlcml0ZWRMaW1pdCk7XG4gIH1cblxuICBjb25zdCBjb25maWdzID0gW2NvbmZpZy50ZXN0LCAuLi5jb25maWcudGVzdC5yZXNvbHZlZFByb2plY3RzLmZpbHRlcigoZW50cnkpID0+ICFlbnRyeS5oaWRkZW4pLm1hcCgoZW50cnkpID0+IGVudHJ5LnByb2plY3RDb25maWcpXTtcbiAgZm9yIChjb25zdCB0ZXN0Q29uZmlnIG9mIGNvbmZpZ3MpIHtcbiAgICBpZiAodGVzdENvbmZpZy5tYXhXb3JrZXJzKSB7XG4gICAgICB3b3JrZXJzID0gTWF0aC5taW4od29ya2VycywgdGVzdENvbmZpZy5tYXhXb3JrZXJzKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4geyBWSVRFU1RfTUFYX1dPUktFUlM6IFN0cmluZyh3b3JrZXJzKSB9O1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQU1BLFNBQVMsNEJBQTRCO0FBQ3JDLE9BQU8sYUFBYTtBQUlwQixTQUFTLDBCQUEwQjtBQUNuQztBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQLFNBQVMsOEJBQThCO0FBRXZDLE1BQU0sdUJBQXVCO0FBQzdCLE1BQU0seUJBQXlCLEVBQUUsU0FBUyxRQUFRLFFBQWlCLE1BQVMsRUFBRTtBQUU5RSxNQUFNLGlCQUE4QixFQUFFLE9BQU8sQ0FBQyxXQUFXLEdBQUcsYUFBYSx3QkFBd0I7QUFDakcsTUFBTSxrQkFBK0IsRUFBRSxPQUFPLENBQUMsU0FBUyxXQUFXLElBQUksR0FBRyxhQUFhLG9EQUFvRDtBQUMzSSxNQUFNLGtCQUErQjtBQUFBLEVBQ25DLE9BQU8sQ0FBQyxjQUFjLGVBQWU7QUFBQSxFQUNyQyxVQUFVLENBQUMsYUFBYTtBQUFBLEVBQ3hCLGFBQWE7QUFDZjtBQUNBLE1BQU0sZ0JBQXdDLENBQUMsZ0JBQWdCLGlCQUFpQixlQUFlO0FBMEMvRixlQUFzQixLQUFLLFVBQXVCLENBQUMsR0FBa0I7QUFDbkUsUUFBTSxhQUFhLENBQUMsVUFBVSxPQUFPLEdBQUcsa0JBQWtCLFFBQVEsUUFBUSxHQUFHLEdBQUcsdUJBQXVCLE9BQU8sQ0FBQyxHQUFHO0FBQUEsSUFDaEgsS0FBSyxNQUFNLHFCQUFxQixPQUFPO0FBQUEsRUFDekMsQ0FBQztBQUNIO0FBUUEsZUFBc0IsYUFBYSxVQUErQixDQUFDLEdBQWtCO0FBQ25GLFFBQU0sWUFBWSxPQUFPLFFBQVEseUJBQXlCLENBQUM7QUFDM0QsUUFBTSxhQUFhO0FBQUEsSUFDakI7QUFBQSxJQUNBO0FBQUEsSUFDQSxH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