@mnaoumov/typescript-dev-toolkit 3.1.0 → 3.3.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.
@@ -16,21 +16,19 @@ import {
16
16
  getEffectiveCommandLineLength,
17
17
  getMaxBatchCommandLength
18
18
  } from "./exec.mjs";
19
+ import { readPackageJsonSync } from "./npm.mjs";
19
20
  import { getPackageManagerRunCommand } from "./package-manager.mjs";
20
21
  const PACKAGE_MANAGER_RUN_COMMAND = getPackageManagerRunCommand().join(" ");
21
- const SPELLCHECK_COMMAND = `${PACKAGE_MANAGER_RUN_COMMAND} spellcheck --`;
22
+ const SPELLCHECK_SCRIPT_NAME = "spellcheck";
23
+ const SPELLCHECK_COMMAND = toScriptCommand(SPELLCHECK_SCRIPT_NAME);
22
24
  const EXECUTABLE_PATH_RESERVE = 260;
23
25
  const TOKENIZER_UNSAFE_CHARACTERS_REG_EXP = /[\s"']/g;
24
- const WRITER_TASKS = {
25
- "*.{ts,tsx,mts}": [
26
- `${PACKAGE_MANAGER_RUN_COMMAND} lint:fix --`,
27
- `${PACKAGE_MANAGER_RUN_COMMAND} format --`
28
- ],
29
- "*.md": [
30
- `${PACKAGE_MANAGER_RUN_COMMAND} lint:md:fix --`
31
- ]
26
+ const WRITER_SCRIPT_NAMES = {
27
+ "*.{ts,tsx,mts}": ["lint:fix", "format"],
28
+ "*.md": ["lint:md:fix"]
32
29
  };
33
- const obsidianDevUtilsConfig = partitionSpellcheck(WRITER_TASKS);
30
+ const WRITER_TASKS = toWriterTasks(() => true);
31
+ const obsidianDevUtilsConfig = partitionSpellcheck(WRITER_TASKS, true);
34
32
  const NANO_STAGED_ENV_VARIABLE = "NANO_STAGED";
35
33
  function getNanoStagedConfig(options) {
36
34
  loadEnvFileIfExists();
@@ -39,15 +37,18 @@ function getNanoStagedConfig(options) {
39
37
  `);
40
38
  process.exit(0);
41
39
  }
40
+ const scriptNames = new Set(Object.keys(readPackageJsonSync().scripts ?? {}));
41
+ const hasAllSharedScripts = [SPELLCHECK_SCRIPT_NAME, ...Object.values(WRITER_SCRIPT_NAMES).flat()].every((scriptName) => scriptNames.has(scriptName));
42
42
  const additionalWriterTasks = options?.additionalWriterTasks ?? {};
43
- if (Object.keys(additionalWriterTasks).length === 0) {
43
+ if (hasAllSharedScripts && Object.keys(additionalWriterTasks).length === 0) {
44
44
  return obsidianDevUtilsConfig;
45
45
  }
46
- const duplicatePattern = Object.keys(additionalWriterTasks).find((pattern) => Object.hasOwn(WRITER_TASKS, pattern));
46
+ const writerTasks = toWriterTasks((scriptName) => scriptNames.has(scriptName));
47
+ const duplicatePattern = Object.keys(additionalWriterTasks).find((pattern) => Object.hasOwn(writerTasks, pattern));
47
48
  if (duplicatePattern !== void 0) {
48
49
  throw new Error(`nano-staged writer pattern '${duplicatePattern}' is already a shared writer pattern.`);
49
50
  }
50
- return partitionSpellcheck({ ...WRITER_TASKS, ...additionalWriterTasks });
51
+ return partitionSpellcheck({ ...writerTasks, ...additionalWriterTasks }, scriptNames.has(SPELLCHECK_SCRIPT_NAME));
51
52
  }
52
53
  function batchCommandArguments(prefix, commandArguments) {
53
54
  const emptyLength = getEffectiveCommandLineLength("");
@@ -70,13 +71,16 @@ function batchCommandArguments(prefix, commandArguments) {
70
71
  }
71
72
  return batches;
72
73
  }
73
- function partitionSpellcheck(writerTasks) {
74
+ function partitionSpellcheck(writerTasks, shouldSpellcheck) {
75
+ if (!shouldSpellcheck) {
76
+ return Object.fromEntries(Object.entries(writerTasks).map(([pattern, commands]) => [pattern, toBatchedTask(commands)]));
77
+ }
74
78
  const patterns = Object.keys(writerTasks);
75
79
  const patternWithSlash = patterns.find((pattern) => pattern.includes("/"));
76
80
  if (patternWithSlash !== void 0) {
77
81
  throw new Error(`nano-staged writer pattern '${patternWithSlash}' contains '/', which the spellcheck partition cannot express.`);
78
82
  }
79
- const complementPattern = `!(${patterns.map((pattern) => `${pattern}!(?)`).join("|")})*`;
83
+ const complementPattern = patterns.length === 0 ? "*" : `!(${patterns.map((pattern) => `${pattern}!(?)`).join("|")})*`;
80
84
  const config = {
81
85
  [complementPattern]: toBatchedTask([SPELLCHECK_COMMAND])
82
86
  };
@@ -99,8 +103,21 @@ function toCommandArgument(filename) {
99
103
  }
100
104
  return commandArgument.replaceAll(TOKENIZER_UNSAFE_CHARACTERS_REG_EXP, "?");
101
105
  }
106
+ function toScriptCommand(scriptName) {
107
+ return `${PACKAGE_MANAGER_RUN_COMMAND} ${scriptName} --`;
108
+ }
109
+ function toWriterTasks(shouldIncludeScript) {
110
+ const writerTasks = {};
111
+ for (const [pattern, scriptNames] of Object.entries(WRITER_SCRIPT_NAMES)) {
112
+ const commands = scriptNames.filter((scriptName) => shouldIncludeScript(scriptName)).map((scriptName) => toScriptCommand(scriptName));
113
+ if (commands.length > 0) {
114
+ writerTasks[pattern] = commands;
115
+ }
116
+ }
117
+ return writerTasks;
118
+ }
102
119
  export {
103
120
  getNanoStagedConfig,
104
121
  obsidianDevUtilsConfig
105
122
  };
106
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL25hbm8tc3RhZ2VkLWNvbmZpZy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIFNoYXJlZCBuYW5vLXN0YWdlZCBjb25maWd1cmF0aW9uIGZvciBwcmUtY29tbWl0IGhvb2tzLlxuICovXG5cbmltcG9ydCB7XG4gIGlzQWJzb2x1dGUsXG4gIHJlbGF0aXZlXG59IGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgcHJvY2VzcyBmcm9tICdub2RlOnByb2Nlc3MnO1xuXG5pbXBvcnQge1xuICBpc0VudlZhcmlhYmxlT2ZmLFxuICBsb2FkRW52RmlsZUlmRXhpc3RzXG59IGZyb20gJy4vZW52LXRvZ2dsZS50cyc7XG5pbXBvcnQge1xuICBnZXRFZmZlY3RpdmVDb21tYW5kTGluZUxlbmd0aCxcbiAgZ2V0TWF4QmF0Y2hDb21tYW5kTGVuZ3RoXG59IGZyb20gJy4vZXhlYy50cyc7XG5pbXBvcnQgeyBnZXRQYWNrYWdlTWFuYWdlclJ1bkNvbW1hbmQgfSBmcm9tICcuL3BhY2thZ2UtbWFuYWdlci50cyc7XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIGdldE5hbm9TdGFnZWRDb25maWd9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEdldE5hbm9TdGFnZWRDb25maWdPcHRpb25zIHtcbiAgLyoqXG4gICAqIFJlcG8tc3BlY2lmaWMgZmlsZS1yZXdyaXRpbmcgdGFza3MsIGtleWVkIGJ5IHRoZSBuYW5vLXN0YWdlZCBwYXR0ZXJuIHRoYXQgY2xhaW1zIHRoZWlyIGZpbGVzLlxuICAgKlxuICAgKiBFYWNoIGdldHMgc3BlbGxjaGVjayBhcHBlbmRlZCBhbmQgaXRzIGZpbGVzIHJlbW92ZWQgZnJvbSB0aGUgc3BlbGxjaGVjay1vbmx5IGtleSwgZXhhY3RseSBsaWtlIHRoZSBzaGFyZWRcbiAgICogd3JpdGVycy4gQSBwYXR0ZXJuIG11c3Qgbm90IGNvbnRhaW4gYC9gLCBhbmQgbXVzdCBub3QgcmVwZWF0IGEgc2hhcmVkIHdyaXRlciBwYXR0ZXJuLiBFYWNoIGNvbW1hbmQgaXMgYVxuICAgKiBwcmVmaXggdGhlIHN0YWdlZCBwYXRocyBhcmUgYXBwZW5kZWQgdG8sIGluIGJhdGNoZXMsIGxpa2UgdGhlIHNoYXJlZCBvbmVzIChgbnBtIHJ1biBsaW50OmZpeCAtLWApLlxuICAgKi9cbiAgcmVhZG9ubHkgYWRkaXRpb25hbFdyaXRlclRhc2tzPzogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgcmVhZG9ubHkgc3RyaW5nW10+Pjtcbn1cblxuLyoqXG4gKiBBIG5hbm8tc3RhZ2VkIGNvbmZpZ3VyYXRpb24gd2hvc2UgZXZlcnkga2V5IGlzIGEge0BsaW5rIE5hbm9TdGFnZWRUYXNrfS5cbiAqL1xuZXhwb3J0IHR5cGUgTmFub1N0YWdlZENvbmZpZyA9IFJlY29yZDxzdHJpbmcsIE5hbm9TdGFnZWRUYXNrPjtcblxuLyoqXG4gKiBBIGZ1bmN0aW9uLXZhbHVlZCBuYW5vLXN0YWdlZCB0YXNrOiBpdCByZWNlaXZlcyB0aGUgc3RhZ2VkIGZpbGVzIGl0cyBwYXR0ZXJuIGNsYWltcyBhbmQgcmV0dXJucyB0aGVcbiAqIGNvbW1hbmRzIHRvIHJ1biBvdmVyIHRoZW0sIGluIG9yZGVyLlxuICovXG5leHBvcnQgdHlwZSBOYW5vU3RhZ2VkVGFzayA9IChjb250ZXh0OiBOYW5vU3RhZ2VkVGFza0NvbnRleHQpID0+IHN0cmluZ1tdO1xuXG4vKipcbiAqIFdoYXQgbmFuby1zdGFnZWQgcGFzc2VzIHRvIGEgZnVuY3Rpb24tdmFsdWVkIHRhc2suXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTmFub1N0YWdlZFRhc2tDb250ZXh0IHtcbiAgLyoqXG4gICAqIFRoZSBhYnNvbHV0ZSBwYXRocyBvZiB0aGUgc3RhZ2VkIGZpbGVzIHRoZSB0YXNrJ3MgcGF0dGVybiBjbGFpbXMuXG4gICAqL1xuICByZWFkb25seSBmaWxlbmFtZXM6IHJlYWRvbmx5IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIFRoZSBgPG1hbmFnZXI+IHJ1bmAgcHJlZml4IGV2ZXJ5IHRhc2sgYmVsb3cgaXMgYnVpbHQgb24sIHJlc29sdmVkIG9uY2UgZm9yIHRoZSBwcm9jZXNzLlxuICpcbiAqIERldGVjdGlvbiBwcm9iZXMgZm9yIGEgbG9ja2ZpbGUgYmVzaWRlIGBwYWNrYWdlLmpzb25gLCBzbyBpdCBpcyBhIGhhbmRmdWwgb2YgYGV4aXN0c1N5bmNgIGNhbGxzIGFuZFxuICogbm90aGluZyBtb3JlIFx1MjAxNCBubyBgLmVudmAgcmVhZCBhbmQgbm8gYHByb2Nlc3MuZXhpdGAsIHdoaWNoIGlzIHdoYXQgbGV0cyBpdCBzaXQgYXQgbW9kdWxlIHNjb3BlLlxuICovXG5jb25zdCBQQUNLQUdFX01BTkFHRVJfUlVOX0NPTU1BTkQgPSBnZXRQYWNrYWdlTWFuYWdlclJ1bkNvbW1hbmQoKS5qb2luKCcgJyk7XG5cbmNvbnN0IFNQRUxMQ0hFQ0tfQ09NTUFORCA9IGAke1BBQ0tBR0VfTUFOQUdFUl9SVU5fQ09NTUFORH0gc3BlbGxjaGVjayAtLWA7XG5cbi8qKlxuICogUm9vbSBsZWZ0IGluIGV2ZXJ5IGJhdGNoIGZvciB0aGUgcmVzb2x2ZWQgcGF0aCBvZiB0aGUgcGFja2FnZSBtYW5hZ2VyJ3MgZXhlY3V0YWJsZS5cbiAqXG4gKiBuYW5vLXN0YWdlZCBydW5zIGBucG1gIGFzIHRoZSBhYnNvbHV0ZSBwYXRoIG9mIGBucG0uY21kYCAoYDxjb21zcGVjPiAvRCAvUyAvQyBcIjxwYXRoPlwiIFwiPGFyZz5cIiBcdTIwMjZgKSwgd2hpY2hcbiAqIHRoZSBiYXRjaCBjYW5ub3Qgc2VlLCBzbyBhIGZ1bGwgV2luZG93cyBgTUFYX1BBVEhgIGlzIHNldCBhc2lkZSBmb3IgaXQuXG4gKi9cbmNvbnN0IEVYRUNVVEFCTEVfUEFUSF9SRVNFUlZFID0gMjYwO1xuXG4vKipcbiAqIFRoZSBjaGFyYWN0ZXJzIG5hbm8tc3RhZ2VkJ3MgY29tbWFuZCB0b2tlbml6ZXIgY2Fubm90IGNhcnJ5IGluc2lkZSBhbiBhcmd1bWVudC5cbiAqXG4gKiBBIGZ1bmN0aW9uLXZhbHVlZCB0YXNrIHJldHVybnMgaXRzIGNvbW1hbmRzIGFzIFNUUklOR1MsIGFuZCBuYW5vLXN0YWdlZCBzcGxpdHMgZWFjaCBvbmUgd2l0aFxuICogYHN0cmluZ0FyZ3ZUb0FycmF5YCwgd2hpY2ggZW1pdHMgYSBxdW90ZWQgdG9rZW4gdHdpY2UgKG9uY2UgYmFyZSwgb25jZSB3aXRoIGl0cyBxdW90ZXMpIGFuZCBoYXMgbm8gZXNjYXBlLlxuICogU28gYSBwYXRoIGhvbGRpbmcgd2hpdGVzcGFjZSBvciBhIHF1b3RlIGNhbm5vdCBiZSBwYXNzZWQgYXMgaXRzZWxmLlxuICovXG5jb25zdCBUT0tFTklaRVJfVU5TQUZFX0NIQVJBQ1RFUlNfUkVHX0VYUCA9IC9bXFxzXCInXS9nO1xuXG4vKipcbiAqIFRoZSB0YXNrcyB0aGF0IFJFV1JJVEUgYSBzdGFnZWQgZmlsZSwga2V5ZWQgYnkgdGhlIG5hbm8tc3RhZ2VkIHBhdHRlcm4gdGhhdCBjbGFpbXMgaXQuXG4gKlxuICogYGxpbnQ6Zml4YCBhbmQgYGZvcm1hdGAgYm90aCByZXdyaXRlIHRoZSBmaWxlLCBzbyB0aGV5IGhhdmUgdG8gc2hhcmUgb25lIGtleTogbmFuby1zdGFnZWQgcnVucyBpdHNcbiAqIHBlci1wYXR0ZXJuIGdyb3VwcyB1bmRlciBgUHJvbWlzZS5hbGxgIChgcnVuKClgIGluIGBuYW5vLXN0YWdlZC9saWIvY21kLXJ1bm5lci5qc2ApLCBhbmQgc2VxdWVuY2VzIG9ubHlcbiAqIHRoZSBjb21tYW5kcyBJTlNJREUgYSBzaW5nbGUga2V5J3MgYXJyYXkgKGBydW5UYXNrKClgLCBhIGBmb3IgLi4uIG9mIGF3YWl0YCkuIFNwbGl0IGFjcm9zcyB0d28ga2V5cyB0aGV5XG4gKiByYWNlLCB3aGljaGV2ZXIgZmluaXNoZXMgbGFzdCB3aW5zLCBhbmQgdGhlIGNvbW1pdCBzdGFnZXMgYnl0ZXMgdGhhdCBuZWl0aGVyIHRvb2wgd291bGQgaGF2ZSBwcm9kdWNlZCBvblxuICogaXRzIG93bi5cbiAqXG4gKiBTbyBkbyBOT1QgZXhwcmVzcyBhIGRpcmVjdG9yeSBleGNsdXNpb24gYnkgZ2l2aW5nIG9uZSBvZiB0aGVzZSB0d28gaXRzIG93biBuZWdhdGVkIGtleSAtLSB0aGF0IHNpbGVudGx5XG4gKiB0YWtlcyB0aGUgb3JkZXJpbmcgYXdheS4gQW4gZXhjbHVzaW9uIGJlbG9uZ3MgaW4gdGhlIGV4Y2x1ZGVkIHRvb2wncyBvd24gY29uZmlnLCB3aGVyZSBFU0xpbnQnc1xuICogYGdsb2JhbElnbm9yZXNgIGFscmVhZHkgcHV0cyBpdDogYSBwYXRoIEVTTGludCBpZ25vcmVzIGlzIHJlcG9ydGVkIGFzIGEgd2FybmluZyBhbmQgZXhpdHMgMCB3aGVuIGl0IGlzXG4gKiBwYXNzZWQgZXhwbGljaXRseSwgc28gaXQgY29zdHMgYSBjb25zb2xlIGxpbmUgcmF0aGVyIHRoYW4gYSBmYWlsZWQgY29tbWl0IGFuZCBuZWVkcyBubyBrZXkgaGVyZS5cbiAqL1xuY29uc3QgV1JJVEVSX1RBU0tTOiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCByZWFkb25seSBzdHJpbmdbXT4+ID0ge1xuICAnKi57dHMsdHN4LG10c30nOiBbXG4gICAgYCR7UEFDS0FHRV9NQU5BR0VSX1JVTl9DT01NQU5EfSBsaW50OmZpeCAtLWAsXG4gICAgYCR7UEFDS0FHRV9NQU5BR0VSX1JVTl9DT01NQU5EfSBmb3JtYXQgLS1gXG4gIF0sXG4gICcqLm1kJzogW1xuICAgIGAke1BBQ0tBR0VfTUFOQUdFUl9SVU5fQ09NTUFORH0gbGludDptZDpmaXggLS1gXG4gIF1cbn07XG5cbi8qKlxuICogTmFuby1zdGFnZWQgY29uZmlndXJhdGlvbiB0aGF0IHJ1bnMgZmlsZS1iYXNlZCBsaW50LCBmb3JtYXQsIGFuZCBzcGVsbGNoZWNrIG9uIHN0YWdlZCBmaWxlcy5cbiAqXG4gKiBPbmx5IGluY2x1ZGVzIHRvb2xzIHRoYXQgY2FuIG9wZXJhdGUgb24gaW5kaXZpZHVhbCBmaWxlcy4gV2hvbGUtcHJvamVjdCBjaGVja3NcbiAqIChUeXBlU2NyaXB0IGNvbXBpbGF0aW9uLCB1bml0IHRlc3RzKSBhcmUgbGVmdCB0byBDSS5cbiAqXG4gKiBDb21tYW5kcyBydW4gdGhyb3VnaCB0aGUgcGFja2FnZSBtYW5hZ2VyIHRoYXQgb3ducyB0aGUgdHJlZSBcdTIwMTQgYG5wbSBydW4gLi4uIC0tYCwgYGJ1biBydW4gLi4uIC0tYCwgYW5kXG4gKiBzbyBvbiBcdTIwMTQgc28gbmFuby1zdGFnZWQgZmlsZSBwYXRocyBhcmUgZm9yd2FyZGVkIGFzIENMSSBhcmd1bWVudHMsIGJhdGNoZWQgdG8gZml0IHRoZSBjb21tYW5kIGxpbmUgKHNlZVxuICogYHRvQmF0Y2hlZFRhc2tgKS5cbiAqXG4gKiBTcGVsbGNoZWNrIGlzIHBhcnRpdGlvbmVkIGFjcm9zcyB0aGUga2V5cyByYXRoZXIgdGhhbiBnaXZlbiBhIGNhdGNoLWFsbCBgJyonYCBrZXkgKHNlZVxuICogYHBhcnRpdGlvblNwZWxsY2hlY2tgKS4gQSByZXBvIGFkZGluZyBhIGZpbGUtcmV3cml0aW5nIHRhc2sgb2YgaXRzIG93biBwYXNzZXMgaXQgdG9cbiAqIHtAbGluayBnZXROYW5vU3RhZ2VkQ29uZmlnfSBhcyBgYWRkaXRpb25hbFdyaXRlclRhc2tzYCByYXRoZXIgdGhhbiBzcHJlYWRpbmcgdGhpcyBvYmplY3QgYW5kIGFkZGluZyBhIGtleSxcbiAqIHdoaWNoIHdvdWxkIHJlaW50cm9kdWNlIHRoZSBvdmVybGFwIGZvciB0aGF0IGtleSdzIGZpbGVzLlxuICovXG5leHBvcnQgY29uc3Qgb2JzaWRpYW5EZXZVdGlsc0NvbmZpZzogTmFub1N0YWdlZENvbmZpZyA9IHBhcnRpdGlvblNwZWxsY2hlY2soV1JJVEVSX1RBU0tTKTtcblxuY29uc3QgTkFOT19TVEFHRURfRU5WX1ZBUklBQkxFID0gJ05BTk9fU1RBR0VEJztcblxuLyoqXG4gKiBSZXNvbHZlcyB0aGUgbmFuby1zdGFnZWQgY29uZmlndXJhdGlvbiB0byB1c2UsIGhvbm9yaW5nIGEgcGVyLWRldmVsb3BlciBvcHQtb3V0LlxuICpcbiAqIExvYWRzIGEgZ2l0aWdub3JlZCBgLmVudmAgaWYgcHJlc2VudCwgdGhlbiBcdTIwMTQgd2hlbiBgTkFOT19TVEFHRURgIGlzIHNldCB0byBhbiBvZmYgdmFsdWUgKGAwYCwgYGZhbHNlYCxcbiAqIGBvZmZgLCBvciBgbm9gKSBcdTIwMTQgcHJpbnRzIGEgbm90aWNlIGFuZCBleGl0cyB0aGUgcHJvY2VzcyBzdWNjZXNzZnVsbHkgc28gdGhlIHByZS1jb21taXQgY2hlY2tzIGFyZVxuICogc2tpcHBlZC4gVGhpcyBtaXJyb3JzIGh1c2t5J3Mgb3duIGBIVVNLWT0wYCBzd2l0Y2gsIGJ1dCBzY29wZWQgdG8gdGhlIG5hbm8tc3RhZ2VkIHN0ZXAgKHNvIHRoZVxuICogY29tbWl0LW1zZyBob29rIHN0aWxsIHJ1bnMpLiBPdGhlcndpc2UgaXQgcmV0dXJucyB7QGxpbmsgb2JzaWRpYW5EZXZVdGlsc0NvbmZpZ30sIG9yIFx1MjAxNCB3aGVuXG4gKiBgYWRkaXRpb25hbFdyaXRlclRhc2tzYCBhcmUgZ2l2ZW4gXHUyMDE0IHRoZSBzYW1lIGNvbmZpZ3VyYXRpb24gcmUtcGFydGl0aW9uZWQgd2l0aCB0aG9zZSB3cml0ZXJzIGFkZGVkLlxuICpcbiAqIGBOQU5PX1NUQUdFRGAgaXMgbm90IGFuIG5wbSBzY3JpcHQsIHNvIGl0IGNhcnJpZXMgaXRzIG93biBzd2l0Y2ggcmF0aGVyIHRoYW4gdGhlIHNjcmlwdC1uYW1lLWRlcml2ZWQgb25lXG4gKiBldmVyeSBucG0gc2NyaXB0IGdldHMgXHUyMDE0IGJ1dCBib3RoIHNoYXJlIHRoZSBzYW1lIG5vdGlvbiBvZiBhbiBvZmYgdmFsdWUsIHZpYSB7QGxpbmsgaXNFbnZWYXJpYWJsZU9mZn0uXG4gKlxuICogVGhpcyBpcyBhIGZ1bmN0aW9uIHJhdGhlciB0aGFuIG1vZHVsZS1sZXZlbCBjb2RlIHNvIGltcG9ydGluZyB0aGUgcGFja2FnZSBiYXJyZWwgbmV2ZXIgdHJpZ2dlcnMgdGhlXG4gKiBgLmVudmAgcmVhZCBvciB0aGUgcHJvY2VzcyBleGl0OyBjYWxsIGl0IGZyb20gdGhlIHRoaW4gYHNjcmlwdHMvbmFuby1zdGFnZWQtY29uZmlnLnRzYCBlbnRyeS4gUmVzb2x2aW5nIHRoZVxuICogcGFja2FnZSBtYW5hZ2VyIGlzIHRoZSBvbmUgdGhpbmcgdGhhdCBkb2VzIHJ1biBhdCBtb2R1bGUgc2NvcGUsIGFuZCBpdCBkb2VzIG5laXRoZXIgb2YgdGhvc2UgdHdvXG4gKiB0aGluZ3MgXHUyMDE0IGl0IG9ubHkgcHJvYmVzIGZvciBhIGxvY2tmaWxlLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIG9wdGlvbmFsIG9wdGlvbnMuXG4gKiBAcmV0dXJucyBUaGUgbmFuby1zdGFnZWQgdGFzayBjb25maWd1cmF0aW9uLiBEb2VzIG5vdCByZXR1cm4gd2hlbiB0aGUgb3B0LW91dCBpcyBhY3RpdmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXROYW5vU3RhZ2VkQ29uZmlnKG9wdGlvbnM/OiBHZXROYW5vU3RhZ2VkQ29uZmlnT3B0aW9ucyk6IE5hbm9TdGFnZWRDb25maWcge1xuICBsb2FkRW52RmlsZUlmRXhpc3RzKCk7XG5cbiAgaWYgKGlzRW52VmFyaWFibGVPZmYoTkFOT19TVEFHRURfRU5WX1ZBUklBQkxFKSkge1xuICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKGBuYW5vLXN0YWdlZDogc2tpcHBlZCAoJHtOQU5PX1NUQUdFRF9FTlZfVkFSSUFCTEV9IGlzIG9mZikuXFxuYCk7XG4gICAgcHJvY2Vzcy5leGl0KDApO1xuICB9XG5cbiAgY29uc3QgYWRkaXRpb25hbFdyaXRlclRhc2tzID0gb3B0aW9ucz8uYWRkaXRpb25hbFdyaXRlclRhc2tzID8/IHt9O1xuICBpZiAoT2JqZWN0LmtleXMoYWRkaXRpb25hbFdyaXRlclRhc2tzKS5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gb2JzaWRpYW5EZXZVdGlsc0NvbmZpZztcbiAgfVxuXG4gIGNvbnN0IGR1cGxpY2F0ZVBhdHRlcm4gPSBPYmplY3Qua2V5cyhhZGRpdGlvbmFsV3JpdGVyVGFza3MpLmZpbmQoKHBhdHRlcm4pID0+IE9iamVjdC5oYXNPd24oV1JJVEVSX1RBU0tTLCBwYXR0ZXJuKSk7XG4gIGlmIChkdXBsaWNhdGVQYXR0ZXJuICE9PSB1bmRlZmluZWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYG5hbm8tc3RhZ2VkIHdyaXRlciBwYXR0ZXJuICcke2R1cGxpY2F0ZVBhdHRlcm59JyBpcyBhbHJlYWR5IGEgc2hhcmVkIHdyaXRlciBwYXR0ZXJuLmApO1xuICB9XG5cbiAgcmV0dXJuIHBhcnRpdGlvblNwZWxsY2hlY2soeyAuLi5XUklURVJfVEFTS1MsIC4uLmFkZGl0aW9uYWxXcml0ZXJUYXNrcyB9KTtcbn1cblxuLyoqXG4gKiBTcGxpdHMgY29tbWFuZCBhcmd1bWVudHMgaW50byBiYXRjaGVzIHRoYXQgZWFjaCBmaXQgb25lIGNvbW1hbmQgbGluZSBhZnRlciBhIGdpdmVuIHByZWZpeC5cbiAqXG4gKiBFYWNoIGFyZ3VtZW50IGlzIGNvc3RlZCBhcyBuYW5vLXN0YWdlZCBwYXNzZXMgaXQgb24gV2luZG93cyBcdTIwMTQgcXVvdGVkLCB0aGVuIGBeYC1lc2NhcGVkIGJ5IGBjbWQuZXhlYCdzXG4gKiBydWxlcyBcdTIwMTQgdGhyb3VnaCB7QGxpbmsgZ2V0RWZmZWN0aXZlQ29tbWFuZExpbmVMZW5ndGh9LCBhbmQgdGhlIGJ1ZGdldCBpcyB7QGxpbmsgZ2V0TWF4QmF0Y2hDb21tYW5kTGVuZ3RofSxcbiAqIHdoaWNoIGFscmVhZHkgaG9sZHMgYmFjayB0aGUgcmVzZXJ2ZSBmb3IgdGhlIGBucG1gIFx1MjE5MiBgY21kLmV4ZWAgXHUyMTkyIGAuYmluYCBzaGltIGNoYWluIHJlLWV4cGFuZGluZyB0aGVcbiAqIGFyZ3VtZW50cy4gQW4gYXJndW1lbnQgdG9vIGxvbmcgZm9yIGFueSBiYXRjaCBzdGlsbCBnZXRzIGEgYmF0Y2ggb2YgaXRzIG93bjogaXQgZmFpbHMgbG91ZGx5IHRoZXJlLCB3aGljaFxuICogZHJvcHBpbmcgaXQgd291bGQgbm90LlxuICpcbiAqIEBwYXJhbSBwcmVmaXggLSBUaGUgY29tbWFuZCB0aGUgYXJndW1lbnRzIGFyZSBhcHBlbmRlZCB0by5cbiAqIEBwYXJhbSBjb21tYW5kQXJndW1lbnRzIC0gVGhlIGFyZ3VtZW50cyB0byBzcGxpdC5cbiAqIEByZXR1cm5zIFRoZSBiYXRjaGVzLCBpbiBvcmRlciwgdG9nZXRoZXIgaG9sZGluZyBldmVyeSBhcmd1bWVudCBvbmNlLlxuICovXG5mdW5jdGlvbiBiYXRjaENvbW1hbmRBcmd1bWVudHMocHJlZml4OiBzdHJpbmcsIGNvbW1hbmRBcmd1bWVudHM6IHJlYWRvbmx5IHN0cmluZ1tdKTogc3RyaW5nW11bXSB7XG4gIGNvbnN0IGVtcHR5TGVuZ3RoID0gZ2V0RWZmZWN0aXZlQ29tbWFuZExpbmVMZW5ndGgoJycpO1xuICBjb25zdCBidWRnZXQgPSBnZXRNYXhCYXRjaENvbW1hbmRMZW5ndGgoKSAtIEVYRUNVVEFCTEVfUEFUSF9SRVNFUlZFIC0gZ2V0RWZmZWN0aXZlQ29tbWFuZExpbmVMZW5ndGgocHJlZml4KTtcbiAgY29uc3QgYmF0Y2hlczogc3RyaW5nW11bXSA9IFtdO1xuICBsZXQgYmF0Y2g6IHN0cmluZ1tdID0gW107XG4gIGxldCBiYXRjaExlbmd0aCA9IDA7XG5cbiAgZm9yIChjb25zdCBjb21tYW5kQXJndW1lbnQgb2YgY29tbWFuZEFyZ3VtZW50cykge1xuICAgIGNvbnN0IGFyZ3VtZW50TGVuZ3RoID0gZ2V0RWZmZWN0aXZlQ29tbWFuZExpbmVMZW5ndGgoYCBcIiR7Y29tbWFuZEFyZ3VtZW50fVwiYCkgLSBlbXB0eUxlbmd0aDtcbiAgICBpZiAoYmF0Y2gubGVuZ3RoID4gMCAmJiBiYXRjaExlbmd0aCArIGFyZ3VtZW50TGVuZ3RoID4gYnVkZ2V0KSB7XG4gICAgICBiYXRjaGVzLnB1c2goYmF0Y2gpO1xuICAgICAgYmF0Y2ggPSBbXTtcbiAgICAgIGJhdGNoTGVuZ3RoID0gMDtcbiAgICB9XG4gICAgYmF0Y2gucHVzaChjb21tYW5kQXJndW1lbnQpO1xuICAgIGJhdGNoTGVuZ3RoICs9IGFyZ3VtZW50TGVuZ3RoO1xuICB9XG5cbiAgaWYgKGJhdGNoLmxlbmd0aCA+IDApIHtcbiAgICBiYXRjaGVzLnB1c2goYmF0Y2gpO1xuICB9XG5cbiAgcmV0dXJuIGJhdGNoZXM7XG59XG5cbi8qKlxuICogQnVpbGRzIGEgbmFuby1zdGFnZWQgY29uZmlndXJhdGlvbiBpbiB3aGljaCBzcGVsbGNoZWNrIG5ldmVyIHJlYWRzIGEgZmlsZSB3aGlsZSBhbm90aGVyIHRhc2sgcmV3cml0ZXMgaXQuXG4gKlxuICogVGhlIHNhbWUgYFByb21pc2UuYWxsYCB0aGF0IGZvcmNlcyB0d28gd3JpdGVycyBpbnRvIG9uZSBrZXkgbWFrZXMgYSBjYXRjaC1hbGwgYCcqJ2Agc3BlbGxjaGVjayBrZXkgcnVuXG4gKiBDT05DVVJSRU5UTFkgd2l0aCBldmVyeSB3cml0ZXIga2V5LCBzbyBjc3BlbGwgd291bGQgcmVhZCBhIGZpbGUgdGhhdCBFU0xpbnQgb3IgZHByaW50IGlzIHJld3JpdGluZyBpblxuICogcGxhY2UgLS0gYSBzcHVyaW91cyBmaW5kaW5nIG9uIGEgaGFsZi13cml0dGVuIGZpbGUsIG9yIGEgcGFzcyBvdmVyIGNvbnRlbnQgdGhhdCBpcyBub3Qgd2hhdCBnZXRzXG4gKiBjb21taXR0ZWQuIFNvIHRoZSBzdGFnZWQgZmlsZXMgYXJlIFBBUlRJVElPTkVEIGluc3RlYWQ6XG4gKlxuICogLSBldmVyeSB3cml0ZXIga2V5IGdldHMgc3BlbGxjaGVjayBhcHBlbmRlZCBhcyBpdHMgTEFTVCBjb21tYW5kLCBzbyBpdCByZWFkcyB0aGF0IGtleSdzIGZpbGVzIGFmdGVyIHRoZXlcbiAqICAgaGF2ZSBiZWVuIHJld3JpdHRlbjtcbiAqIC0gb25lIGNvbXBsZW1lbnQga2V5IHNwZWxsY2hlY2tzIGV4YWN0bHkgdGhlIGZpbGVzIG5vIHdyaXRlciBrZXkgY2xhaW1zLlxuICpcbiAqIFRoZSBjb21wbGVtZW50IGlzIHdyaXR0ZW4gaW4gbmFuby1zdGFnZWQncyBvd24gZ2xvYiBkaWFsZWN0LCB3aGljaCBjb21waWxlcyBgISguLi4pYCB0byBhIGxvb2thaGVhZCB0aGF0XG4gKiBpcyBOT1QgYW5jaG9yZWQgYXQgdGhlIGVuZCBvZiB0aGUgcGF0aDogYCEoKi5tZCkqYCB3b3VsZCBleGNsdWRlIGBub3Rlcy5tZC5iYWtgIHRvby4gQSBuZXN0ZWQgYCEoPylgXG4gKiBjb21waWxlcyB0byBgKD8hLilgLCB3aGljaCBJUyBhbiBlbmQgYW5jaG9yLCBzbyBlYWNoIGFsdGVybmF0aXZlIGlzIHN1ZmZpeGVkIHdpdGggaXQuIEEgd3JpdGVyIHBhdHRlcm5cbiAqIGNvbnRhaW5pbmcgYC9gIHdvdWxkIHN3aXRjaCBuYW5vLXN0YWdlZCBpbnRvIGdsb2JzdGFyIG1vZGUsIHdoZXJlIGAqYCBzdG9wcyBjcm9zc2luZyBkaXJlY3RvcmllcyBhbmQgdGhlXG4gKiBjb25zdHJ1Y3Rpb24gbm8gbG9uZ2VyIGhvbGRzIC0tIGhlbmNlIHRoZSB0aHJvdy4gVGhlIHVuaXQgdGVzdCBwaW5zIHRoZSBwYXJ0aXRpb24gYWdhaW5zdCB0aGUgaW5zdGFsbGVkXG4gKiBuYW5vLXN0YWdlZCBjb21waWxlciwgc28gYSByZWxlYXNlIHRoYXQgY2hhbmdlcyBpdHMgZGlhbGVjdCBmYWlscyB0aGVyZSByYXRoZXIgdGhhbiBpbiBhIGNvbW1pdC5cbiAqXG4gKiBAcGFyYW0gd3JpdGVyVGFza3MgLSBUaGUgZmlsZS1yZXdyaXRpbmcgdGFza3MsIGtleWVkIGJ5IHRoZSBwYXR0ZXJuIHRoYXQgY2xhaW1zIHRoZWlyIGZpbGVzLlxuICogQHJldHVybnMgVGhlIGNvbmZpZ3VyYXRpb24sIHdpdGggdGhlIHNwZWxsY2hlY2sgc3RlcCBwYXJ0aXRpb25lZCBhY3Jvc3MgdGhlIGtleXMuXG4gKi9cbmZ1bmN0aW9uIHBhcnRpdGlvblNwZWxsY2hlY2sod3JpdGVyVGFza3M6IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHJlYWRvbmx5IHN0cmluZ1tdPj4pOiBOYW5vU3RhZ2VkQ29uZmlnIHtcbiAgY29uc3QgcGF0dGVybnMgPSBPYmplY3Qua2V5cyh3cml0ZXJUYXNrcyk7XG4gIGNvbnN0IHBhdHRlcm5XaXRoU2xhc2ggPSBwYXR0ZXJucy5maW5kKChwYXR0ZXJuKSA9PiBwYXR0ZXJuLmluY2x1ZGVzKCcvJykpO1xuICBpZiAocGF0dGVybldpdGhTbGFzaCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBuYW5vLXN0YWdlZCB3cml0ZXIgcGF0dGVybiAnJHtwYXR0ZXJuV2l0aFNsYXNofScgY29udGFpbnMgJy8nLCB3aGljaCB0aGUgc3BlbGxjaGVjayBwYXJ0aXRpb24gY2Fubm90IGV4cHJlc3MuYCk7XG4gIH1cblxuICBjb25zdCBjb21wbGVtZW50UGF0dGVybiA9IGAhKCR7cGF0dGVybnMubWFwKChwYXR0ZXJuKSA9PiBgJHtwYXR0ZXJufSEoPylgKS5qb2luKCd8Jyl9KSpgO1xuICBjb25zdCBjb25maWc6IE5hbm9TdGFnZWRDb25maWcgPSB7XG4gICAgW2NvbXBsZW1lbnRQYXR0ZXJuXTogdG9CYXRjaGVkVGFzayhbU1BFTExDSEVDS19DT01NQU5EXSlcbiAgfTtcblxuICBmb3IgKGNvbnN0IFtwYXR0ZXJuLCBjb21tYW5kc10gb2YgT2JqZWN0LmVudHJpZXMod3JpdGVyVGFza3MpKSB7XG4gICAgY29uZmlnW3BhdHRlcm5dID0gdG9CYXRjaGVkVGFzayhbLi4uY29tbWFuZHMsIFNQRUxMQ0hFQ0tfQ09NTUFORF0pO1xuICB9XG5cbiAgcmV0dXJuIGNvbmZpZztcbn1cblxuLyoqXG4gKiBCdWlsZHMgYSB0YXNrIHRoYXQgcnVucyBlYWNoIGNvbW1hbmQgb3ZlciBldmVyeSBzdGFnZWQgZmlsZSBpdCByZWNlaXZlcywgaW4gYXMgbWFueSBiYXRjaGVzIGFzIHRoZSBjb21tYW5kXG4gKiBsaW5lIG5lZWRzLlxuICpcbiAqIG5hbm8tc3RhZ2VkIGFwcGVuZHMgYSBzdHJpbmcgdGFzaydzIGZpbGVzIHRvIE9ORSBjb21tYW5kLCBzbyBhIGNvbW1pdCBzdGFnaW5nIGEgZmV3IGh1bmRyZWQgZmlsZXMgcmFuXG4gKiBgbnBtIHJ1biBsaW50OmZpeCAtLSA8ZXZlcnkgcGF0aD5gIGFuZCBmYWlsZWQgb24gV2luZG93cyB3aXRoIGBUaGUgY29tbWFuZCBsaW5lIGlzIHRvbyBsb25nLmAsIHJlZnVzaW5nXG4gKiBleGFjdGx5IHRoZSB3aG9sZS1yZXBvIGNvbW1pdHMgdGhhdCBtb3N0IG5lZWQgdGhlIGhvb2suIEEgZnVuY3Rpb24tdmFsdWVkIHRhc2sgYnVpbGRzIGl0cyBvd24gY29tbWFuZHNcbiAqIGluc3RlYWQsIGFuZCB0aGVzZSBhcmUgYmF0Y2hlZCBhZ2FpbnN0IHRoZSBzYW1lIGJ1ZGdldCBgZXhlYygpYCB1c2VzIChzZWUgYGJhdGNoQ29tbWFuZEFyZ3VtZW50c2ApLlxuICpcbiAqIFRoZSBjb21tYW5kcyBrZWVwIHRoZWlyIG9yZGVyOiBldmVyeSBiYXRjaCBvZiB0aGUgZmlyc3QgY29tbWFuZCBydW5zIGJlZm9yZSBhbnkgYmF0Y2ggb2YgdGhlIHNlY29uZCxcbiAqIGJlY2F1c2UgbmFuby1zdGFnZWQgcnVucyBvbmUga2V5J3MgY29tbWFuZHMgb25lIGFmdGVyIGFub3RoZXIsIHNvIGEgd3JpdGVyIHN0aWxsIGZpbmlzaGVzIGJlZm9yZSB0aGUgbmV4dFxuICogd3JpdGVyLCBhbmQgc3BlbGxjaGVjayBzdGlsbCByZWFkcyB0aGUgcmV3cml0dGVuIGZpbGVzLlxuICpcbiAqIEBwYXJhbSBjb21tYW5kcyAtIFRoZSBjb21tYW5kIHByZWZpeGVzLCBpbiB0aGUgb3JkZXIgdGhleSBydW4uXG4gKiBAcmV0dXJucyBUaGUgdGFzay5cbiAqL1xuZnVuY3Rpb24gdG9CYXRjaGVkVGFzayhjb21tYW5kczogcmVhZG9ubHkgc3RyaW5nW10pOiBOYW5vU3RhZ2VkVGFzayB7XG4gIHJldHVybiAoeyBmaWxlbmFtZXMgfSkgPT4ge1xuICAgIGNvbnN0IGNvbW1hbmRBcmd1bWVudHMgPSBmaWxlbmFtZXMubWFwKChmaWxlbmFtZSkgPT4gdG9Db21tYW5kQXJndW1lbnQoZmlsZW5hbWUpKTtcbiAgICByZXR1cm4gY29tbWFuZHMuZmxhdE1hcCgoY29tbWFuZCkgPT4gYmF0Y2hDb21tYW5kQXJndW1lbnRzKGNvbW1hbmQsIGNvbW1hbmRBcmd1bWVudHMpLm1hcCgoYmF0Y2gpID0+IGAke2NvbW1hbmR9ICR7YmF0Y2guam9pbignICcpfWApKTtcbiAgfTtcbn1cblxuLyoqXG4gKiBUdXJucyBhIHN0YWdlZCBmaWxlJ3MgYWJzb2x1dGUgcGF0aCBpbnRvIHRoZSBhcmd1bWVudCBhIGJhdGNoZWQgdGFzayBwYXNzZXMgZm9yIGl0LlxuICpcbiAqIFRoZSBwYXRoIGlzIG1hZGUgcmVsYXRpdmUgdG8gdGhlIHdvcmtpbmcgZGlyZWN0b3J5LCB3aGVyZSBuYW5vLXN0YWdlZCBhbmQgdGhlIHRhc2sgYm90aCBydW4sIHdoaWNoIHJvdWdobHlcbiAqIGhhbHZlcyBpdHMgbGVuZ3RoIGFuZCBzbyB0aGUgbnVtYmVyIG9mIGJhdGNoZXM7IGEgcGF0aCBvdXRzaWRlIGl0IHN0YXlzIGFic29sdXRlLiBBIHJlbGF0aXZlIHBhdGggc3RhcnRpbmdcbiAqIHdpdGggYC1gIGdldHMgYC4vYCwgc28gbm8gdG9vbCByZWFkcyBpdCBhcyBhbiBvcHRpb24uXG4gKlxuICogV2hpdGVzcGFjZSBhbmQgcXVvdGVzIGJlY29tZSBgP2AsIGJlY2F1c2UgbmFuby1zdGFnZWQncyB0b2tlbml6ZXIgY2Fubm90IGNhcnJ5IHRoZW0gKHNlZVxuICoge0BsaW5rIFRPS0VOSVpFUl9VTlNBRkVfQ0hBUkFDVEVSU19SRUdfRVhQfSkuIEV2ZXJ5IHRvb2wgdGhlIHRhc2tzIHJ1biAoRVNMaW50LCBkcHJpbnQsIGNzcGVsbCxcbiAqIG1hcmtkb3dubGludC1jbGkyKSB0YWtlcyBpdHMgcGF0aHMgYXMgZ2xvYnMsIGFuZCBgP2AgbWF0Y2hlcyBleGFjdGx5IHRoZSBvbmUgY2hhcmFjdGVyIGl0IHJlcGxhY2VkLCBzbyB0aGVcbiAqIGZpbGUgaXMgc3RpbGwgZm91bmQ7IGEgc2libGluZyBkaWZmZXJpbmcgb25seSBpbiB0aGF0IGNoYXJhY3RlciB3b3VsZCBtYXRjaCB0b28sIHdoaWNoIGNvc3RzIGEgbGludCBvZiBhblxuICogZXh0cmEgZmlsZSwgbm90IGEgbWlzc2VkIG9uZS5cbiAqXG4gKiBAcGFyYW0gZmlsZW5hbWUgLSBUaGUgYWJzb2x1dGUgcGF0aCBvZiB0aGUgc3RhZ2VkIGZpbGUuXG4gKiBAcmV0dXJucyBUaGUgYXJndW1lbnQuXG4gKi9cbmZ1bmN0aW9uIHRvQ29tbWFuZEFyZ3VtZW50KGZpbGVuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCByZWxhdGl2ZVBhdGggPSByZWxhdGl2ZShwcm9jZXNzLmN3ZCgpLCBmaWxlbmFtZSk7XG4gIGxldCBjb21tYW5kQXJndW1lbnQgPSAocmVsYXRpdmVQYXRoLnN0YXJ0c1dpdGgoJy4uJykgfHwgaXNBYnNvbHV0ZShyZWxhdGl2ZVBhdGgpID8gZmlsZW5hbWUgOiByZWxhdGl2ZVBhdGgpLnJlcGxhY2VBbGwoJ1xcXFwnLCAnLycpO1xuICBpZiAoY29tbWFuZEFyZ3VtZW50LnN0YXJ0c1dpdGgoJy0nKSkge1xuICAgIGNvbW1hbmRBcmd1bWVudCA9IGAuLyR7Y29tbWFuZEFyZ3VtZW50fWA7XG4gIH1cbiAgcmV0dXJuIGNvbW1hbmRBcmd1bWVudC5yZXBsYWNlQWxsKFRPS0VOSVpFUl9VTlNBRkVfQ0hBUkFDVEVSU19SRUdfRVhQLCAnPycpO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7QUFNQTtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQLE9BQU8sYUFBYTtBQUVwQjtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1AsU0FBUyxtQ0FBbUM7QUEyQzVDLE1BQU0sOEJBQThCLDRCQUE0QixFQUFFLEtBQUssR0FBRztBQUUxRSxNQUFNLHFCQUFxQixHQUFHLDJCQUEyQjtBQVF6RCxNQUFNLDBCQUEwQjtBQVNoQyxNQUFNLHNDQUFzQztBQWdCNUMsTUFBTSxlQUE0RDtBQUFBLEVBQ2hFLGtCQUFrQjtBQUFBLElBQ2hCLEdBQUcsMkJBQTJCO0FBQUEsSUFDOUIsR0FBRywyQkFBMkI7QUFBQSxFQUNoQztBQUFBLEVBQ0EsUUFBUTtBQUFBLElBQ04sR0FBRywyQkFBMkI7QUFBQSxFQUNoQztBQUNGO0FBaUJPLE1BQU0seUJBQTJDLG9CQUFvQixZQUFZO0FBRXhGLE1BQU0sMkJBQTJCO0FBc0IxQixTQUFTLG9CQUFvQixTQUF3RDtBQUMxRixzQkFBb0I7QUFFcEIsTUFBSSxpQkFBaUIsd0JBQXdCLEdBQUc7QUFDOUMsWUFBUSxPQUFPLE1BQU0seUJBQXlCLHdCQUF3QjtBQUFBLENBQWE7QUFDbkYsWUFBUSxLQUFLLENBQUM7QUFBQSxFQUNoQjtBQUVBLFFBQU0sd0JBQXdCLFNBQVMseUJBQXlCLENBQUM7QUFDakUsTUFBSSxPQUFPLEtBQUsscUJBQXFCLEVBQUUsV0FBVyxHQUFHO0FBQ25ELFdBQU87QUFBQSxFQUNUO0FBRUEsUUFBTSxtQkFBbUIsT0FBTyxLQUFLLHFCQUFxQixFQUFFLEtBQUssQ0FBQyxZQUFZLE9BQU8sT0FBTyxjQUFjLE9BQU8sQ0FBQztBQUNsSCxNQUFJLHFCQUFxQixRQUFXO0FBQ2xDLFVBQU0sSUFBSSxNQUFNLCtCQUErQixnQkFBZ0IsdUNBQXVDO0FBQUEsRUFDeEc7QUFFQSxTQUFPLG9CQUFvQixFQUFFLEdBQUcsY0FBYyxHQUFHLHNCQUFzQixDQUFDO0FBQzFFO0FBZUEsU0FBUyxzQkFBc0IsUUFBZ0Isa0JBQWlEO0FBQzlGLFFBQU0sY0FBYyw4QkFBOEIsRUFBRTtBQUNwRCxRQUFNLFNBQVMseUJBQXlCLElBQUksMEJBQTBCLDhCQUE4QixNQUFNO0FBQzFHLFFBQU0sVUFBc0IsQ0FBQztBQUM3QixNQUFJLFFBQWtCLENBQUM7QUFDdkIsTUFBSSxjQUFjO0FBRWxCLGFBQVcsbUJBQW1CLGtCQUFrQjtBQUM5QyxVQUFNLGlCQUFpQiw4QkFBOEIsS0FBSyxlQUFlLEdBQUcsSUFBSTtBQUNoRixRQUFJLE1BQU0sU0FBUyxLQUFLLGNBQWMsaUJBQWlCLFFBQVE7QUFDN0QsY0FBUSxLQUFLLEtBQUs7QUFDbEIsY0FBUSxDQUFDO0FBQ1Qsb0JBQWM7QUFBQSxJQUNoQjtBQUNBLFVBQU0sS0FBSyxlQUFlO0FBQzFCLG1CQUFlO0FBQUEsRUFDakI7QUFFQSxNQUFJLE1BQU0sU0FBUyxHQUFHO0FBQ3BCLFlBQVEsS0FBSyxLQUFLO0FBQUEsRUFDcEI7QUFFQSxTQUFPO0FBQ1Q7QUF3QkEsU0FBUyxvQkFBb0IsYUFBNEU7QUFDdkcsUUFBTSxXQUFXLE9BQU8sS0FBSyxXQUFXO0FBQ3hDLFFBQU0sbUJBQW1CLFNBQVMsS0FBSyxDQUFDLFlBQVksUUFBUSxTQUFTLEdBQUcsQ0FBQztBQUN6RSxNQUFJLHFCQUFxQixRQUFXO0FBQ2xDLFVBQU0sSUFBSSxNQUFNLCtCQUErQixnQkFBZ0IsZ0VBQWdFO0FBQUEsRUFDakk7QUFFQSxRQUFNLG9CQUFvQixLQUFLLFNBQVMsSUFBSSxDQUFDLFlBQVksR0FBRyxPQUFPLE1BQU0sRUFBRSxLQUFLLEdBQUcsQ0FBQztBQUNwRixRQUFNLFNBQTJCO0FBQUEsSUFDL0IsQ0FBQyxpQkFBaUIsR0FBRyxjQUFjLENBQUMsa0JBQWtCLENBQUM7QUFBQSxFQUN6RDtBQUVBLGFBQVcsQ0FBQyxTQUFTLFFBQVEsS0FBSyxPQUFPLFFBQVEsV0FBVyxHQUFHO0FBQzdELFdBQU8sT0FBTyxJQUFJLGNBQWMsQ0FBQyxHQUFHLFVBQVUsa0JBQWtCLENBQUM7QUFBQSxFQUNuRTtBQUVBLFNBQU87QUFDVDtBQWtCQSxTQUFTLGNBQWMsVUFBNkM7QUFDbEUsU0FBTyxDQUFDLEVBQUUsVUFBVSxNQUFNO0FBQ3hCLFVBQU0sbUJBQW1CLFVBQVUsSUFBSSxDQUFDLGFBQWEsa0JBQWtCLFFBQVEsQ0FBQztBQUNoRixXQUFPLFNBQVMsUUFBUSxDQUFDLFlBQVksc0JBQXNCLFNBQVMsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLFVBQVUsR0FBRyxPQUFPLElBQUksTUFBTSxLQUFLLEdBQUcsQ0FBQyxFQUFFLENBQUM7QUFBQSxFQUN2STtBQUNGO0FBa0JBLFNBQVMsa0JBQWtCLFVBQTBCO0FBQ25ELFFBQU0sZUFBZSxTQUFTLFFBQVEsSUFBSSxHQUFHLFFBQVE7QUFDckQsTUFBSSxtQkFBbUIsYUFBYSxXQUFXLElBQUksS0FBSyxXQUFXLFlBQVksSUFBSSxXQUFXLGNBQWMsV0FBVyxNQUFNLEdBQUc7QUFDaEksTUFBSSxnQkFBZ0IsV0FBVyxHQUFHLEdBQUc7QUFDbkMsc0JBQWtCLEtBQUssZUFBZTtBQUFBLEVBQ3hDO0FBQ0EsU0FBTyxnQkFBZ0IsV0FBVyxxQ0FBcUMsR0FBRztBQUM1RTsiLAogICJuYW1lcyI6IFtdCn0K
123
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL25hbm8tc3RhZ2VkLWNvbmZpZy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIFNoYXJlZCBuYW5vLXN0YWdlZCBjb25maWd1cmF0aW9uIGZvciBwcmUtY29tbWl0IGhvb2tzLlxuICovXG5cbmltcG9ydCB7XG4gIGlzQWJzb2x1dGUsXG4gIHJlbGF0aXZlXG59IGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgcHJvY2VzcyBmcm9tICdub2RlOnByb2Nlc3MnO1xuXG5pbXBvcnQge1xuICBpc0VudlZhcmlhYmxlT2ZmLFxuICBsb2FkRW52RmlsZUlmRXhpc3RzXG59IGZyb20gJy4vZW52LXRvZ2dsZS50cyc7XG5pbXBvcnQge1xuICBnZXRFZmZlY3RpdmVDb21tYW5kTGluZUxlbmd0aCxcbiAgZ2V0TWF4QmF0Y2hDb21tYW5kTGVuZ3RoXG59IGZyb20gJy4vZXhlYy50cyc7XG5pbXBvcnQgeyByZWFkUGFja2FnZUpzb25TeW5jIH0gZnJvbSAnLi9ucG0udHMnO1xuaW1wb3J0IHsgZ2V0UGFja2FnZU1hbmFnZXJSdW5Db21tYW5kIH0gZnJvbSAnLi9wYWNrYWdlLW1hbmFnZXIudHMnO1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayBnZXROYW5vU3RhZ2VkQ29uZmlnfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHZXROYW5vU3RhZ2VkQ29uZmlnT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBSZXBvLXNwZWNpZmljIGZpbGUtcmV3cml0aW5nIHRhc2tzLCBrZXllZCBieSB0aGUgbmFuby1zdGFnZWQgcGF0dGVybiB0aGF0IGNsYWltcyB0aGVpciBmaWxlcy5cbiAgICpcbiAgICogRWFjaCBnZXRzIHNwZWxsY2hlY2sgYXBwZW5kZWQgYW5kIGl0cyBmaWxlcyByZW1vdmVkIGZyb20gdGhlIHNwZWxsY2hlY2stb25seSBrZXksIGV4YWN0bHkgbGlrZSB0aGUgc2hhcmVkXG4gICAqIHdyaXRlcnMuIEEgcGF0dGVybiBtdXN0IG5vdCBjb250YWluIGAvYCwgYW5kIG11c3Qgbm90IHJlcGVhdCBhIHNoYXJlZCB3cml0ZXIgcGF0dGVybi4gRWFjaCBjb21tYW5kIGlzIGFcbiAgICogcHJlZml4IHRoZSBzdGFnZWQgcGF0aHMgYXJlIGFwcGVuZGVkIHRvLCBpbiBiYXRjaGVzLCBsaWtlIHRoZSBzaGFyZWQgb25lcyAoYG5wbSBydW4gbGludDpmaXggLS1gKS5cbiAgICovXG4gIHJlYWRvbmx5IGFkZGl0aW9uYWxXcml0ZXJUYXNrcz86IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHJlYWRvbmx5IHN0cmluZ1tdPj47XG59XG5cbi8qKlxuICogQSBuYW5vLXN0YWdlZCBjb25maWd1cmF0aW9uIHdob3NlIGV2ZXJ5IGtleSBpcyBhIHtAbGluayBOYW5vU3RhZ2VkVGFza30uXG4gKi9cbmV4cG9ydCB0eXBlIE5hbm9TdGFnZWRDb25maWcgPSBSZWNvcmQ8c3RyaW5nLCBOYW5vU3RhZ2VkVGFzaz47XG5cbi8qKlxuICogQSBmdW5jdGlvbi12YWx1ZWQgbmFuby1zdGFnZWQgdGFzazogaXQgcmVjZWl2ZXMgdGhlIHN0YWdlZCBmaWxlcyBpdHMgcGF0dGVybiBjbGFpbXMgYW5kIHJldHVybnMgdGhlXG4gKiBjb21tYW5kcyB0byBydW4gb3ZlciB0aGVtLCBpbiBvcmRlci5cbiAqL1xuZXhwb3J0IHR5cGUgTmFub1N0YWdlZFRhc2sgPSAoY29udGV4dDogTmFub1N0YWdlZFRhc2tDb250ZXh0KSA9PiBzdHJpbmdbXTtcblxuLyoqXG4gKiBXaGF0IG5hbm8tc3RhZ2VkIHBhc3NlcyB0byBhIGZ1bmN0aW9uLXZhbHVlZCB0YXNrLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE5hbm9TdGFnZWRUYXNrQ29udGV4dCB7XG4gIC8qKlxuICAgKiBUaGUgYWJzb2x1dGUgcGF0aHMgb2YgdGhlIHN0YWdlZCBmaWxlcyB0aGUgdGFzaydzIHBhdHRlcm4gY2xhaW1zLlxuICAgKi9cbiAgcmVhZG9ubHkgZmlsZW5hbWVzOiByZWFkb25seSBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBUaGUgYDxtYW5hZ2VyPiBydW5gIHByZWZpeCBldmVyeSB0YXNrIGJlbG93IGlzIGJ1aWx0IG9uLCByZXNvbHZlZCBvbmNlIGZvciB0aGUgcHJvY2Vzcy5cbiAqXG4gKiBEZXRlY3Rpb24gcHJvYmVzIGZvciBhIGxvY2tmaWxlIGJlc2lkZSBgcGFja2FnZS5qc29uYCwgc28gaXQgaXMgYSBoYW5kZnVsIG9mIGBleGlzdHNTeW5jYCBjYWxscyBhbmRcbiAqIG5vdGhpbmcgbW9yZSBcdTIwMTQgbm8gYC5lbnZgIHJlYWQgYW5kIG5vIGBwcm9jZXNzLmV4aXRgLCB3aGljaCBpcyB3aGF0IGxldHMgaXQgc2l0IGF0IG1vZHVsZSBzY29wZS5cbiAqL1xuY29uc3QgUEFDS0FHRV9NQU5BR0VSX1JVTl9DT01NQU5EID0gZ2V0UGFja2FnZU1hbmFnZXJSdW5Db21tYW5kKCkuam9pbignICcpO1xuXG5jb25zdCBTUEVMTENIRUNLX1NDUklQVF9OQU1FID0gJ3NwZWxsY2hlY2snO1xuXG5jb25zdCBTUEVMTENIRUNLX0NPTU1BTkQgPSB0b1NjcmlwdENvbW1hbmQoU1BFTExDSEVDS19TQ1JJUFRfTkFNRSk7XG5cbi8qKlxuICogUm9vbSBsZWZ0IGluIGV2ZXJ5IGJhdGNoIGZvciB0aGUgcmVzb2x2ZWQgcGF0aCBvZiB0aGUgcGFja2FnZSBtYW5hZ2VyJ3MgZXhlY3V0YWJsZS5cbiAqXG4gKiBuYW5vLXN0YWdlZCBydW5zIGBucG1gIGFzIHRoZSBhYnNvbHV0ZSBwYXRoIG9mIGBucG0uY21kYCAoYDxjb21zcGVjPiAvRCAvUyAvQyBcIjxwYXRoPlwiIFwiPGFyZz5cIiBcdTIwMjZgKSwgd2hpY2hcbiAqIHRoZSBiYXRjaCBjYW5ub3Qgc2VlLCBzbyBhIGZ1bGwgV2luZG93cyBgTUFYX1BBVEhgIGlzIHNldCBhc2lkZSBmb3IgaXQuXG4gKi9cbmNvbnN0IEVYRUNVVEFCTEVfUEFUSF9SRVNFUlZFID0gMjYwO1xuXG4vKipcbiAqIFRoZSBjaGFyYWN0ZXJzIG5hbm8tc3RhZ2VkJ3MgY29tbWFuZCB0b2tlbml6ZXIgY2Fubm90IGNhcnJ5IGluc2lkZSBhbiBhcmd1bWVudC5cbiAqXG4gKiBBIGZ1bmN0aW9uLXZhbHVlZCB0YXNrIHJldHVybnMgaXRzIGNvbW1hbmRzIGFzIFNUUklOR1MsIGFuZCBuYW5vLXN0YWdlZCBzcGxpdHMgZWFjaCBvbmUgd2l0aFxuICogYHN0cmluZ0FyZ3ZUb0FycmF5YCwgd2hpY2ggZW1pdHMgYSBxdW90ZWQgdG9rZW4gdHdpY2UgKG9uY2UgYmFyZSwgb25jZSB3aXRoIGl0cyBxdW90ZXMpIGFuZCBoYXMgbm8gZXNjYXBlLlxuICogU28gYSBwYXRoIGhvbGRpbmcgd2hpdGVzcGFjZSBvciBhIHF1b3RlIGNhbm5vdCBiZSBwYXNzZWQgYXMgaXRzZWxmLlxuICovXG5jb25zdCBUT0tFTklaRVJfVU5TQUZFX0NIQVJBQ1RFUlNfUkVHX0VYUCA9IC9bXFxzXCInXS9nO1xuXG4vKipcbiAqIFRoZSBucG0gc2NyaXB0cyB0aGF0IFJFV1JJVEUgYSBzdGFnZWQgZmlsZSwgaW4gdGhlIG9yZGVyIHRoZXkgcnVuLCBrZXllZCBieSB0aGUgbmFuby1zdGFnZWQgcGF0dGVybiB0aGF0XG4gKiBjbGFpbXMgaXQuXG4gKlxuICogYGxpbnQ6Zml4YCBhbmQgYGZvcm1hdGAgYm90aCByZXdyaXRlIHRoZSBmaWxlLCBzbyB0aGV5IGhhdmUgdG8gc2hhcmUgb25lIGtleTogbmFuby1zdGFnZWQgcnVucyBpdHNcbiAqIHBlci1wYXR0ZXJuIGdyb3VwcyB1bmRlciBgUHJvbWlzZS5hbGxgIChgcnVuKClgIGluIGBuYW5vLXN0YWdlZC9saWIvY21kLXJ1bm5lci5qc2ApLCBhbmQgc2VxdWVuY2VzIG9ubHlcbiAqIHRoZSBjb21tYW5kcyBJTlNJREUgYSBzaW5nbGUga2V5J3MgYXJyYXkgKGBydW5UYXNrKClgLCBhIGBmb3IgLi4uIG9mIGF3YWl0YCkuIFNwbGl0IGFjcm9zcyB0d28ga2V5cyB0aGV5XG4gKiByYWNlLCB3aGljaGV2ZXIgZmluaXNoZXMgbGFzdCB3aW5zLCBhbmQgdGhlIGNvbW1pdCBzdGFnZXMgYnl0ZXMgdGhhdCBuZWl0aGVyIHRvb2wgd291bGQgaGF2ZSBwcm9kdWNlZCBvblxuICogaXRzIG93bi5cbiAqXG4gKiBTbyBkbyBOT1QgZXhwcmVzcyBhIGRpcmVjdG9yeSBleGNsdXNpb24gYnkgZ2l2aW5nIG9uZSBvZiB0aGVzZSB0d28gaXRzIG93biBuZWdhdGVkIGtleSAtLSB0aGF0IHNpbGVudGx5XG4gKiB0YWtlcyB0aGUgb3JkZXJpbmcgYXdheS4gQW4gZXhjbHVzaW9uIGJlbG9uZ3MgaW4gdGhlIGV4Y2x1ZGVkIHRvb2wncyBvd24gY29uZmlnLCB3aGVyZSBFU0xpbnQnc1xuICogYGdsb2JhbElnbm9yZXNgIGFscmVhZHkgcHV0cyBpdDogYSBwYXRoIEVTTGludCBpZ25vcmVzIGlzIHJlcG9ydGVkIGFzIGEgd2FybmluZyBhbmQgZXhpdHMgMCB3aGVuIGl0IGlzXG4gKiBwYXNzZWQgZXhwbGljaXRseSwgc28gaXQgY29zdHMgYSBjb25zb2xlIGxpbmUgcmF0aGVyIHRoYW4gYSBmYWlsZWQgY29tbWl0IGFuZCBuZWVkcyBubyBrZXkgaGVyZS5cbiAqL1xuY29uc3QgV1JJVEVSX1NDUklQVF9OQU1FUzogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgcmVhZG9ubHkgc3RyaW5nW10+PiA9IHtcbiAgJyoue3RzLHRzeCxtdHN9JzogWydsaW50OmZpeCcsICdmb3JtYXQnXSxcbiAgJyoubWQnOiBbJ2xpbnQ6bWQ6Zml4J11cbn07XG5cbmNvbnN0IFdSSVRFUl9UQVNLUzogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgcmVhZG9ubHkgc3RyaW5nW10+PiA9IHRvV3JpdGVyVGFza3MoKCkgPT4gdHJ1ZSk7XG5cbi8qKlxuICogTmFuby1zdGFnZWQgY29uZmlndXJhdGlvbiB0aGF0IHJ1bnMgZmlsZS1iYXNlZCBsaW50LCBmb3JtYXQsIGFuZCBzcGVsbGNoZWNrIG9uIHN0YWdlZCBmaWxlcy5cbiAqXG4gKiBPbmx5IGluY2x1ZGVzIHRvb2xzIHRoYXQgY2FuIG9wZXJhdGUgb24gaW5kaXZpZHVhbCBmaWxlcy4gV2hvbGUtcHJvamVjdCBjaGVja3NcbiAqIChUeXBlU2NyaXB0IGNvbXBpbGF0aW9uLCB1bml0IHRlc3RzKSBhcmUgbGVmdCB0byBDSS5cbiAqXG4gKiBDb21tYW5kcyBydW4gdGhyb3VnaCB0aGUgcGFja2FnZSBtYW5hZ2VyIHRoYXQgb3ducyB0aGUgdHJlZSBcdTIwMTQgYG5wbSBydW4gLi4uIC0tYCwgYGJ1biBydW4gLi4uIC0tYCwgYW5kXG4gKiBzbyBvbiBcdTIwMTQgc28gbmFuby1zdGFnZWQgZmlsZSBwYXRocyBhcmUgZm9yd2FyZGVkIGFzIENMSSBhcmd1bWVudHMsIGJhdGNoZWQgdG8gZml0IHRoZSBjb21tYW5kIGxpbmUgKHNlZVxuICogYHRvQmF0Y2hlZFRhc2tgKS5cbiAqXG4gKiBTcGVsbGNoZWNrIGlzIHBhcnRpdGlvbmVkIGFjcm9zcyB0aGUga2V5cyByYXRoZXIgdGhhbiBnaXZlbiBhIGNhdGNoLWFsbCBgJyonYCBrZXkgKHNlZVxuICogYHBhcnRpdGlvblNwZWxsY2hlY2tgKS4gQSByZXBvIGFkZGluZyBhIGZpbGUtcmV3cml0aW5nIHRhc2sgb2YgaXRzIG93biBwYXNzZXMgaXQgdG9cbiAqIHtAbGluayBnZXROYW5vU3RhZ2VkQ29uZmlnfSBhcyBgYWRkaXRpb25hbFdyaXRlclRhc2tzYCByYXRoZXIgdGhhbiBzcHJlYWRpbmcgdGhpcyBvYmplY3QgYW5kIGFkZGluZyBhIGtleSxcbiAqIHdoaWNoIHdvdWxkIHJlaW50cm9kdWNlIHRoZSBvdmVybGFwIGZvciB0aGF0IGtleSdzIGZpbGVzLlxuICovXG5leHBvcnQgY29uc3Qgb2JzaWRpYW5EZXZVdGlsc0NvbmZpZzogTmFub1N0YWdlZENvbmZpZyA9IHBhcnRpdGlvblNwZWxsY2hlY2soV1JJVEVSX1RBU0tTLCB0cnVlKTtcblxuY29uc3QgTkFOT19TVEFHRURfRU5WX1ZBUklBQkxFID0gJ05BTk9fU1RBR0VEJztcblxuLyoqXG4gKiBSZXNvbHZlcyB0aGUgbmFuby1zdGFnZWQgY29uZmlndXJhdGlvbiB0byB1c2UsIGhvbm9yaW5nIGEgcGVyLWRldmVsb3BlciBvcHQtb3V0LlxuICpcbiAqIExvYWRzIGEgZ2l0aWdub3JlZCBgLmVudmAgaWYgcHJlc2VudCwgdGhlbiBcdTIwMTQgd2hlbiBgTkFOT19TVEFHRURgIGlzIHNldCB0byBhbiBvZmYgdmFsdWUgKGAwYCwgYGZhbHNlYCxcbiAqIGBvZmZgLCBvciBgbm9gKSBcdTIwMTQgcHJpbnRzIGEgbm90aWNlIGFuZCBleGl0cyB0aGUgcHJvY2VzcyBzdWNjZXNzZnVsbHkgc28gdGhlIHByZS1jb21taXQgY2hlY2tzIGFyZVxuICogc2tpcHBlZC4gVGhpcyBtaXJyb3JzIGh1c2t5J3Mgb3duIGBIVVNLWT0wYCBzd2l0Y2gsIGJ1dCBzY29wZWQgdG8gdGhlIG5hbm8tc3RhZ2VkIHN0ZXAgKHNvIHRoZVxuICogY29tbWl0LW1zZyBob29rIHN0aWxsIHJ1bnMpLiBPdGhlcndpc2UgaXQgcmV0dXJucyB7QGxpbmsgb2JzaWRpYW5EZXZVdGlsc0NvbmZpZ30sIG9yIFx1MjAxNCB3aGVuXG4gKiBgYWRkaXRpb25hbFdyaXRlclRhc2tzYCBhcmUgZ2l2ZW4gXHUyMDE0IHRoZSBzYW1lIGNvbmZpZ3VyYXRpb24gcmUtcGFydGl0aW9uZWQgd2l0aCB0aG9zZSB3cml0ZXJzIGFkZGVkLlxuICpcbiAqIEEgc2hhcmVkIHRhc2sgd2hvc2UgbnBtIHNjcmlwdCB0aGUgcHJvamVjdCdzIGBwYWNrYWdlLmpzb25gIGRvZXMgbm90IGRlY2xhcmUgaXMgbGVmdCBvdXQsIHNvIGEgcHJvamVjdFxuICogd2l0aG91dCwgc2F5LCBtYXJrZG93bmxpbnQgZG9lcyBub3QgZmFpbCBpdHMgZmlyc3QgY29tbWl0IHRoYXQgc3RhZ2VzIGEgYC5tZGAgZmlsZSBvbiBhIG1pc3Npbmcgc2NyaXB0LiBBXG4gKiB3cml0ZXIgcGF0dGVybiBsZWZ0IHdpdGggbm8gd3JpdGVyIGlzIGRyb3BwZWQsIGFuZCBzcGVsbGNoZWNrIHJ1bnMgb25seSB3aGVuIGBzcGVsbGNoZWNrYCBpcyBkZWNsYXJlZCwgaW5cbiAqIHdoaWNoIGNhc2UgaXRzIGZpbGVzIGZhbGwgdG8gdGhlIHNwZWxsY2hlY2stb25seSBrZXkuIFRoZSBgYWRkaXRpb25hbFdyaXRlclRhc2tzYCBhcmUgdGhlIGNhbGxlcidzIG93biBhbmRcbiAqIGFyZSBrZXB0IGFzIGdpdmVuLlxuICpcbiAqIGBOQU5PX1NUQUdFRGAgaXMgbm90IGFuIG5wbSBzY3JpcHQsIHNvIGl0IGNhcnJpZXMgaXRzIG93biBzd2l0Y2ggcmF0aGVyIHRoYW4gdGhlIHNjcmlwdC1uYW1lLWRlcml2ZWQgb25lXG4gKiBldmVyeSBucG0gc2NyaXB0IGdldHMgXHUyMDE0IGJ1dCBib3RoIHNoYXJlIHRoZSBzYW1lIG5vdGlvbiBvZiBhbiBvZmYgdmFsdWUsIHZpYSB7QGxpbmsgaXNFbnZWYXJpYWJsZU9mZn0uXG4gKlxuICogVGhpcyBpcyBhIGZ1bmN0aW9uIHJhdGhlciB0aGFuIG1vZHVsZS1sZXZlbCBjb2RlIHNvIGltcG9ydGluZyB0aGUgcGFja2FnZSBiYXJyZWwgbmV2ZXIgdHJpZ2dlcnMgdGhlXG4gKiBgLmVudmAgcmVhZCBvciB0aGUgcHJvY2VzcyBleGl0OyBjYWxsIGl0IGZyb20gdGhlIHRoaW4gYHNjcmlwdHMvbmFuby1zdGFnZWQtY29uZmlnLnRzYCBlbnRyeS4gUmVzb2x2aW5nIHRoZVxuICogcGFja2FnZSBtYW5hZ2VyIGlzIHRoZSBvbmUgdGhpbmcgdGhhdCBkb2VzIHJ1biBhdCBtb2R1bGUgc2NvcGUsIGFuZCBpdCBkb2VzIG5laXRoZXIgb2YgdGhvc2UgdHdvXG4gKiB0aGluZ3MgXHUyMDE0IGl0IG9ubHkgcHJvYmVzIGZvciBhIGxvY2tmaWxlLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIG9wdGlvbmFsIG9wdGlvbnMuXG4gKiBAcmV0dXJucyBUaGUgbmFuby1zdGFnZWQgdGFzayBjb25maWd1cmF0aW9uLiBEb2VzIG5vdCByZXR1cm4gd2hlbiB0aGUgb3B0LW91dCBpcyBhY3RpdmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXROYW5vU3RhZ2VkQ29uZmlnKG9wdGlvbnM/OiBHZXROYW5vU3RhZ2VkQ29uZmlnT3B0aW9ucyk6IE5hbm9TdGFnZWRDb25maWcge1xuICBsb2FkRW52RmlsZUlmRXhpc3RzKCk7XG5cbiAgaWYgKGlzRW52VmFyaWFibGVPZmYoTkFOT19TVEFHRURfRU5WX1ZBUklBQkxFKSkge1xuICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKGBuYW5vLXN0YWdlZDogc2tpcHBlZCAoJHtOQU5PX1NUQUdFRF9FTlZfVkFSSUFCTEV9IGlzIG9mZikuXFxuYCk7XG4gICAgcHJvY2Vzcy5leGl0KDApO1xuICB9XG5cbiAgY29uc3Qgc2NyaXB0TmFtZXMgPSBuZXcgU2V0KE9iamVjdC5rZXlzKHJlYWRQYWNrYWdlSnNvblN5bmMoKS5zY3JpcHRzID8/IHt9KSk7XG4gIGNvbnN0IGhhc0FsbFNoYXJlZFNjcmlwdHMgPSBbU1BFTExDSEVDS19TQ1JJUFRfTkFNRSwgLi4uT2JqZWN0LnZhbHVlcyhXUklURVJfU0NSSVBUX05BTUVTKS5mbGF0KCldXG4gICAgLmV2ZXJ5KChzY3JpcHROYW1lKSA9PiBzY3JpcHROYW1lcy5oYXMoc2NyaXB0TmFtZSkpO1xuICBjb25zdCBhZGRpdGlvbmFsV3JpdGVyVGFza3MgPSBvcHRpb25zPy5hZGRpdGlvbmFsV3JpdGVyVGFza3MgPz8ge307XG4gIGlmIChoYXNBbGxTaGFyZWRTY3JpcHRzICYmIE9iamVjdC5rZXlzKGFkZGl0aW9uYWxXcml0ZXJUYXNrcykubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIG9ic2lkaWFuRGV2VXRpbHNDb25maWc7XG4gIH1cblxuICBjb25zdCB3cml0ZXJUYXNrcyA9IHRvV3JpdGVyVGFza3MoKHNjcmlwdE5hbWUpID0+IHNjcmlwdE5hbWVzLmhhcyhzY3JpcHROYW1lKSk7XG4gIGNvbnN0IGR1cGxpY2F0ZVBhdHRlcm4gPSBPYmplY3Qua2V5cyhhZGRpdGlvbmFsV3JpdGVyVGFza3MpLmZpbmQoKHBhdHRlcm4pID0+IE9iamVjdC5oYXNPd24od3JpdGVyVGFza3MsIHBhdHRlcm4pKTtcbiAgaWYgKGR1cGxpY2F0ZVBhdHRlcm4gIT09IHVuZGVmaW5lZCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgbmFuby1zdGFnZWQgd3JpdGVyIHBhdHRlcm4gJyR7ZHVwbGljYXRlUGF0dGVybn0nIGlzIGFscmVhZHkgYSBzaGFyZWQgd3JpdGVyIHBhdHRlcm4uYCk7XG4gIH1cblxuICByZXR1cm4gcGFydGl0aW9uU3BlbGxjaGVjayh7IC4uLndyaXRlclRhc2tzLCAuLi5hZGRpdGlvbmFsV3JpdGVyVGFza3MgfSwgc2NyaXB0TmFtZXMuaGFzKFNQRUxMQ0hFQ0tfU0NSSVBUX05BTUUpKTtcbn1cblxuLyoqXG4gKiBTcGxpdHMgY29tbWFuZCBhcmd1bWVudHMgaW50byBiYXRjaGVzIHRoYXQgZWFjaCBmaXQgb25lIGNvbW1hbmQgbGluZSBhZnRlciBhIGdpdmVuIHByZWZpeC5cbiAqXG4gKiBFYWNoIGFyZ3VtZW50IGlzIGNvc3RlZCBhcyBuYW5vLXN0YWdlZCBwYXNzZXMgaXQgb24gV2luZG93cyBcdTIwMTQgcXVvdGVkLCB0aGVuIGBeYC1lc2NhcGVkIGJ5IGBjbWQuZXhlYCdzXG4gKiBydWxlcyBcdTIwMTQgdGhyb3VnaCB7QGxpbmsgZ2V0RWZmZWN0aXZlQ29tbWFuZExpbmVMZW5ndGh9LCBhbmQgdGhlIGJ1ZGdldCBpcyB7QGxpbmsgZ2V0TWF4QmF0Y2hDb21tYW5kTGVuZ3RofSxcbiAqIHdoaWNoIGFscmVhZHkgaG9sZHMgYmFjayB0aGUgcmVzZXJ2ZSBmb3IgdGhlIGBucG1gIFx1MjE5MiBgY21kLmV4ZWAgXHUyMTkyIGAuYmluYCBzaGltIGNoYWluIHJlLWV4cGFuZGluZyB0aGVcbiAqIGFyZ3VtZW50cy4gQW4gYXJndW1lbnQgdG9vIGxvbmcgZm9yIGFueSBiYXRjaCBzdGlsbCBnZXRzIGEgYmF0Y2ggb2YgaXRzIG93bjogaXQgZmFpbHMgbG91ZGx5IHRoZXJlLCB3aGljaFxuICogZHJvcHBpbmcgaXQgd291bGQgbm90LlxuICpcbiAqIEBwYXJhbSBwcmVmaXggLSBUaGUgY29tbWFuZCB0aGUgYXJndW1lbnRzIGFyZSBhcHBlbmRlZCB0by5cbiAqIEBwYXJhbSBjb21tYW5kQXJndW1lbnRzIC0gVGhlIGFyZ3VtZW50cyB0byBzcGxpdC5cbiAqIEByZXR1cm5zIFRoZSBiYXRjaGVzLCBpbiBvcmRlciwgdG9nZXRoZXIgaG9sZGluZyBldmVyeSBhcmd1bWVudCBvbmNlLlxuICovXG5mdW5jdGlvbiBiYXRjaENvbW1hbmRBcmd1bWVudHMocHJlZml4OiBzdHJpbmcsIGNvbW1hbmRBcmd1bWVudHM6IHJlYWRvbmx5IHN0cmluZ1tdKTogc3RyaW5nW11bXSB7XG4gIGNvbnN0IGVtcHR5TGVuZ3RoID0gZ2V0RWZmZWN0aXZlQ29tbWFuZExpbmVMZW5ndGgoJycpO1xuICBjb25zdCBidWRnZXQgPSBnZXRNYXhCYXRjaENvbW1hbmRMZW5ndGgoKSAtIEVYRUNVVEFCTEVfUEFUSF9SRVNFUlZFIC0gZ2V0RWZmZWN0aXZlQ29tbWFuZExpbmVMZW5ndGgocHJlZml4KTtcbiAgY29uc3QgYmF0Y2hlczogc3RyaW5nW11bXSA9IFtdO1xuICBsZXQgYmF0Y2g6IHN0cmluZ1tdID0gW107XG4gIGxldCBiYXRjaExlbmd0aCA9IDA7XG5cbiAgZm9yIChjb25zdCBjb21tYW5kQXJndW1lbnQgb2YgY29tbWFuZEFyZ3VtZW50cykge1xuICAgIGNvbnN0IGFyZ3VtZW50TGVuZ3RoID0gZ2V0RWZmZWN0aXZlQ29tbWFuZExpbmVMZW5ndGgoYCBcIiR7Y29tbWFuZEFyZ3VtZW50fVwiYCkgLSBlbXB0eUxlbmd0aDtcbiAgICBpZiAoYmF0Y2gubGVuZ3RoID4gMCAmJiBiYXRjaExlbmd0aCArIGFyZ3VtZW50TGVuZ3RoID4gYnVkZ2V0KSB7XG4gICAgICBiYXRjaGVzLnB1c2goYmF0Y2gpO1xuICAgICAgYmF0Y2ggPSBbXTtcbiAgICAgIGJhdGNoTGVuZ3RoID0gMDtcbiAgICB9XG4gICAgYmF0Y2gucHVzaChjb21tYW5kQXJndW1lbnQpO1xuICAgIGJhdGNoTGVuZ3RoICs9IGFyZ3VtZW50TGVuZ3RoO1xuICB9XG5cbiAgaWYgKGJhdGNoLmxlbmd0aCA+IDApIHtcbiAgICBiYXRjaGVzLnB1c2goYmF0Y2gpO1xuICB9XG5cbiAgcmV0dXJuIGJhdGNoZXM7XG59XG5cbi8qKlxuICogQnVpbGRzIGEgbmFuby1zdGFnZWQgY29uZmlndXJhdGlvbiBpbiB3aGljaCBzcGVsbGNoZWNrIG5ldmVyIHJlYWRzIGEgZmlsZSB3aGlsZSBhbm90aGVyIHRhc2sgcmV3cml0ZXMgaXQuXG4gKlxuICogVGhlIHNhbWUgYFByb21pc2UuYWxsYCB0aGF0IGZvcmNlcyB0d28gd3JpdGVycyBpbnRvIG9uZSBrZXkgbWFrZXMgYSBjYXRjaC1hbGwgYCcqJ2Agc3BlbGxjaGVjayBrZXkgcnVuXG4gKiBDT05DVVJSRU5UTFkgd2l0aCBldmVyeSB3cml0ZXIga2V5LCBzbyBjc3BlbGwgd291bGQgcmVhZCBhIGZpbGUgdGhhdCBFU0xpbnQgb3IgZHByaW50IGlzIHJld3JpdGluZyBpblxuICogcGxhY2UgLS0gYSBzcHVyaW91cyBmaW5kaW5nIG9uIGEgaGFsZi13cml0dGVuIGZpbGUsIG9yIGEgcGFzcyBvdmVyIGNvbnRlbnQgdGhhdCBpcyBub3Qgd2hhdCBnZXRzXG4gKiBjb21taXR0ZWQuIFNvIHRoZSBzdGFnZWQgZmlsZXMgYXJlIFBBUlRJVElPTkVEIGluc3RlYWQ6XG4gKlxuICogLSBldmVyeSB3cml0ZXIga2V5IGdldHMgc3BlbGxjaGVjayBhcHBlbmRlZCBhcyBpdHMgTEFTVCBjb21tYW5kLCBzbyBpdCByZWFkcyB0aGF0IGtleSdzIGZpbGVzIGFmdGVyIHRoZXlcbiAqICAgaGF2ZSBiZWVuIHJld3JpdHRlbjtcbiAqIC0gb25lIGNvbXBsZW1lbnQga2V5IHNwZWxsY2hlY2tzIGV4YWN0bHkgdGhlIGZpbGVzIG5vIHdyaXRlciBrZXkgY2xhaW1zLlxuICpcbiAqIFRoZSBjb21wbGVtZW50IGlzIHdyaXR0ZW4gaW4gbmFuby1zdGFnZWQncyBvd24gZ2xvYiBkaWFsZWN0LCB3aGljaCBjb21waWxlcyBgISguLi4pYCB0byBhIGxvb2thaGVhZCB0aGF0XG4gKiBpcyBOT1QgYW5jaG9yZWQgYXQgdGhlIGVuZCBvZiB0aGUgcGF0aDogYCEoKi5tZCkqYCB3b3VsZCBleGNsdWRlIGBub3Rlcy5tZC5iYWtgIHRvby4gQSBuZXN0ZWQgYCEoPylgXG4gKiBjb21waWxlcyB0byBgKD8hLilgLCB3aGljaCBJUyBhbiBlbmQgYW5jaG9yLCBzbyBlYWNoIGFsdGVybmF0aXZlIGlzIHN1ZmZpeGVkIHdpdGggaXQuIEEgd3JpdGVyIHBhdHRlcm5cbiAqIGNvbnRhaW5pbmcgYC9gIHdvdWxkIHN3aXRjaCBuYW5vLXN0YWdlZCBpbnRvIGdsb2JzdGFyIG1vZGUsIHdoZXJlIGAqYCBzdG9wcyBjcm9zc2luZyBkaXJlY3RvcmllcyBhbmQgdGhlXG4gKiBjb25zdHJ1Y3Rpb24gbm8gbG9uZ2VyIGhvbGRzIC0tIGhlbmNlIHRoZSB0aHJvdy4gVGhlIHVuaXQgdGVzdCBwaW5zIHRoZSBwYXJ0aXRpb24gYWdhaW5zdCB0aGUgaW5zdGFsbGVkXG4gKiBuYW5vLXN0YWdlZCBjb21waWxlciwgc28gYSByZWxlYXNlIHRoYXQgY2hhbmdlcyBpdHMgZGlhbGVjdCBmYWlscyB0aGVyZSByYXRoZXIgdGhhbiBpbiBhIGNvbW1pdC5cbiAqXG4gKiBXaXRob3V0IHNwZWxsY2hlY2sgdGhlcmUgaXMgbm90aGluZyB0byBwYXJ0aXRpb246IGVhY2ggd3JpdGVyIGtleSBydW5zIGl0cyBvd24gY29tbWFuZHMsIGFuZCBubyBjb21wbGVtZW50XG4gKiBrZXkgaXMgZW1pdHRlZC5cbiAqXG4gKiBAcGFyYW0gd3JpdGVyVGFza3MgLSBUaGUgZmlsZS1yZXdyaXRpbmcgdGFza3MsIGtleWVkIGJ5IHRoZSBwYXR0ZXJuIHRoYXQgY2xhaW1zIHRoZWlyIGZpbGVzLlxuICogQHBhcmFtIHNob3VsZFNwZWxsY2hlY2sgLSBXaGV0aGVyIHRoZSBwcm9qZWN0IGhhcyBhIGBzcGVsbGNoZWNrYCBzY3JpcHQgdG8gcnVuLlxuICogQHJldHVybnMgVGhlIGNvbmZpZ3VyYXRpb24sIHdpdGggdGhlIHNwZWxsY2hlY2sgc3RlcCBwYXJ0aXRpb25lZCBhY3Jvc3MgdGhlIGtleXMuXG4gKi9cbmZ1bmN0aW9uIHBhcnRpdGlvblNwZWxsY2hlY2sod3JpdGVyVGFza3M6IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHJlYWRvbmx5IHN0cmluZ1tdPj4sIHNob3VsZFNwZWxsY2hlY2s6IGJvb2xlYW4pOiBOYW5vU3RhZ2VkQ29uZmlnIHtcbiAgaWYgKCFzaG91bGRTcGVsbGNoZWNrKSB7XG4gICAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyh3cml0ZXJUYXNrcykubWFwKChbcGF0dGVybiwgY29tbWFuZHNdKSA9PiBbcGF0dGVybiwgdG9CYXRjaGVkVGFzayhjb21tYW5kcyldKSk7XG4gIH1cblxuICBjb25zdCBwYXR0ZXJucyA9IE9iamVjdC5rZXlzKHdyaXRlclRhc2tzKTtcbiAgY29uc3QgcGF0dGVybldpdGhTbGFzaCA9IHBhdHRlcm5zLmZpbmQoKHBhdHRlcm4pID0+IHBhdHRlcm4uaW5jbHVkZXMoJy8nKSk7XG4gIGlmIChwYXR0ZXJuV2l0aFNsYXNoICE9PSB1bmRlZmluZWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYG5hbm8tc3RhZ2VkIHdyaXRlciBwYXR0ZXJuICcke3BhdHRlcm5XaXRoU2xhc2h9JyBjb250YWlucyAnLycsIHdoaWNoIHRoZSBzcGVsbGNoZWNrIHBhcnRpdGlvbiBjYW5ub3QgZXhwcmVzcy5gKTtcbiAgfVxuXG4gIC8vIGAhKCkqYCB3b3VsZCBjb21waWxlIHRvIGEgbG9va2FoZWFkIHRoYXQgcmVqZWN0cyBldmVyeSBwYXRoLCBzbyB3aXRoIG5vIHdyaXRlciB0aGUgY29tcGxlbWVudCBpcyBldmVyeXRoaW5nLlxuICBjb25zdCBjb21wbGVtZW50UGF0dGVybiA9IHBhdHRlcm5zLmxlbmd0aCA9PT0gMCA/ICcqJyA6IGAhKCR7cGF0dGVybnMubWFwKChwYXR0ZXJuKSA9PiBgJHtwYXR0ZXJufSEoPylgKS5qb2luKCd8Jyl9KSpgO1xuICBjb25zdCBjb25maWc6IE5hbm9TdGFnZWRDb25maWcgPSB7XG4gICAgW2NvbXBsZW1lbnRQYXR0ZXJuXTogdG9CYXRjaGVkVGFzayhbU1BFTExDSEVDS19DT01NQU5EXSlcbiAgfTtcblxuICBmb3IgKGNvbnN0IFtwYXR0ZXJuLCBjb21tYW5kc10gb2YgT2JqZWN0LmVudHJpZXMod3JpdGVyVGFza3MpKSB7XG4gICAgY29uZmlnW3BhdHRlcm5dID0gdG9CYXRjaGVkVGFzayhbLi4uY29tbWFuZHMsIFNQRUxMQ0hFQ0tfQ09NTUFORF0pO1xuICB9XG5cbiAgcmV0dXJuIGNvbmZpZztcbn1cblxuLyoqXG4gKiBCdWlsZHMgYSB0YXNrIHRoYXQgcnVucyBlYWNoIGNvbW1hbmQgb3ZlciBldmVyeSBzdGFnZWQgZmlsZSBpdCByZWNlaXZlcywgaW4gYXMgbWFueSBiYXRjaGVzIGFzIHRoZSBjb21tYW5kXG4gKiBsaW5lIG5lZWRzLlxuICpcbiAqIG5hbm8tc3RhZ2VkIGFwcGVuZHMgYSBzdHJpbmcgdGFzaydzIGZpbGVzIHRvIE9ORSBjb21tYW5kLCBzbyBhIGNvbW1pdCBzdGFnaW5nIGEgZmV3IGh1bmRyZWQgZmlsZXMgcmFuXG4gKiBgbnBtIHJ1biBsaW50OmZpeCAtLSA8ZXZlcnkgcGF0aD5gIGFuZCBmYWlsZWQgb24gV2luZG93cyB3aXRoIGBUaGUgY29tbWFuZCBsaW5lIGlzIHRvbyBsb25nLmAsIHJlZnVzaW5nXG4gKiBleGFjdGx5IHRoZSB3aG9sZS1yZXBvIGNvbW1pdHMgdGhhdCBtb3N0IG5lZWQgdGhlIGhvb2suIEEgZnVuY3Rpb24tdmFsdWVkIHRhc2sgYnVpbGRzIGl0cyBvd24gY29tbWFuZHNcbiAqIGluc3RlYWQsIGFuZCB0aGVzZSBhcmUgYmF0Y2hlZCBhZ2FpbnN0IHRoZSBzYW1lIGJ1ZGdldCBgZXhlYygpYCB1c2VzIChzZWUgYGJhdGNoQ29tbWFuZEFyZ3VtZW50c2ApLlxuICpcbiAqIFRoZSBjb21tYW5kcyBrZWVwIHRoZWlyIG9yZGVyOiBldmVyeSBiYXRjaCBvZiB0aGUgZmlyc3QgY29tbWFuZCBydW5zIGJlZm9yZSBhbnkgYmF0Y2ggb2YgdGhlIHNlY29uZCxcbiAqIGJlY2F1c2UgbmFuby1zdGFnZWQgcnVucyBvbmUga2V5J3MgY29tbWFuZHMgb25lIGFmdGVyIGFub3RoZXIsIHNvIGEgd3JpdGVyIHN0aWxsIGZpbmlzaGVzIGJlZm9yZSB0aGUgbmV4dFxuICogd3JpdGVyLCBhbmQgc3BlbGxjaGVjayBzdGlsbCByZWFkcyB0aGUgcmV3cml0dGVuIGZpbGVzLlxuICpcbiAqIEBwYXJhbSBjb21tYW5kcyAtIFRoZSBjb21tYW5kIHByZWZpeGVzLCBpbiB0aGUgb3JkZXIgdGhleSBydW4uXG4gKiBAcmV0dXJucyBUaGUgdGFzay5cbiAqL1xuZnVuY3Rpb24gdG9CYXRjaGVkVGFzayhjb21tYW5kczogcmVhZG9ubHkgc3RyaW5nW10pOiBOYW5vU3RhZ2VkVGFzayB7XG4gIHJldHVybiAoeyBmaWxlbmFtZXMgfSkgPT4ge1xuICAgIGNvbnN0IGNvbW1hbmRBcmd1bWVudHMgPSBmaWxlbmFtZXMubWFwKChmaWxlbmFtZSkgPT4gdG9Db21tYW5kQXJndW1lbnQoZmlsZW5hbWUpKTtcbiAgICByZXR1cm4gY29tbWFuZHMuZmxhdE1hcCgoY29tbWFuZCkgPT4gYmF0Y2hDb21tYW5kQXJndW1lbnRzKGNvbW1hbmQsIGNvbW1hbmRBcmd1bWVudHMpLm1hcCgoYmF0Y2gpID0+IGAke2NvbW1hbmR9ICR7YmF0Y2guam9pbignICcpfWApKTtcbiAgfTtcbn1cblxuLyoqXG4gKiBUdXJucyBhIHN0YWdlZCBmaWxlJ3MgYWJzb2x1dGUgcGF0aCBpbnRvIHRoZSBhcmd1bWVudCBhIGJhdGNoZWQgdGFzayBwYXNzZXMgZm9yIGl0LlxuICpcbiAqIFRoZSBwYXRoIGlzIG1hZGUgcmVsYXRpdmUgdG8gdGhlIHdvcmtpbmcgZGlyZWN0b3J5LCB3aGVyZSBuYW5vLXN0YWdlZCBhbmQgdGhlIHRhc2sgYm90aCBydW4sIHdoaWNoIHJvdWdobHlcbiAqIGhhbHZlcyBpdHMgbGVuZ3RoIGFuZCBzbyB0aGUgbnVtYmVyIG9mIGJhdGNoZXM7IGEgcGF0aCBvdXRzaWRlIGl0IHN0YXlzIGFic29sdXRlLiBBIHJlbGF0aXZlIHBhdGggc3RhcnRpbmdcbiAqIHdpdGggYC1gIGdldHMgYC4vYCwgc28gbm8gdG9vbCByZWFkcyBpdCBhcyBhbiBvcHRpb24uXG4gKlxuICogV2hpdGVzcGFjZSBhbmQgcXVvdGVzIGJlY29tZSBgP2AsIGJlY2F1c2UgbmFuby1zdGFnZWQncyB0b2tlbml6ZXIgY2Fubm90IGNhcnJ5IHRoZW0gKHNlZVxuICoge0BsaW5rIFRPS0VOSVpFUl9VTlNBRkVfQ0hBUkFDVEVSU19SRUdfRVhQfSkuIEV2ZXJ5IHRvb2wgdGhlIHRhc2tzIHJ1biAoRVNMaW50LCBkcHJpbnQsIGNzcGVsbCxcbiAqIG1hcmtkb3dubGludC1jbGkyKSB0YWtlcyBpdHMgcGF0aHMgYXMgZ2xvYnMsIGFuZCBgP2AgbWF0Y2hlcyBleGFjdGx5IHRoZSBvbmUgY2hhcmFjdGVyIGl0IHJlcGxhY2VkLCBzbyB0aGVcbiAqIGZpbGUgaXMgc3RpbGwgZm91bmQ7IGEgc2libGluZyBkaWZmZXJpbmcgb25seSBpbiB0aGF0IGNoYXJhY3RlciB3b3VsZCBtYXRjaCB0b28sIHdoaWNoIGNvc3RzIGEgbGludCBvZiBhblxuICogZXh0cmEgZmlsZSwgbm90IGEgbWlzc2VkIG9uZS5cbiAqXG4gKiBAcGFyYW0gZmlsZW5hbWUgLSBUaGUgYWJzb2x1dGUgcGF0aCBvZiB0aGUgc3RhZ2VkIGZpbGUuXG4gKiBAcmV0dXJucyBUaGUgYXJndW1lbnQuXG4gKi9cbmZ1bmN0aW9uIHRvQ29tbWFuZEFyZ3VtZW50KGZpbGVuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCByZWxhdGl2ZVBhdGggPSByZWxhdGl2ZShwcm9jZXNzLmN3ZCgpLCBmaWxlbmFtZSk7XG4gIGxldCBjb21tYW5kQXJndW1lbnQgPSAocmVsYXRpdmVQYXRoLnN0YXJ0c1dpdGgoJy4uJykgfHwgaXNBYnNvbHV0ZShyZWxhdGl2ZVBhdGgpID8gZmlsZW5hbWUgOiByZWxhdGl2ZVBhdGgpLnJlcGxhY2VBbGwoJ1xcXFwnLCAnLycpO1xuICBpZiAoY29tbWFuZEFyZ3VtZW50LnN0YXJ0c1dpdGgoJy0nKSkge1xuICAgIGNvbW1hbmRBcmd1bWVudCA9IGAuLyR7Y29tbWFuZEFyZ3VtZW50fWA7XG4gIH1cbiAgcmV0dXJuIGNvbW1hbmRBcmd1bWVudC5yZXBsYWNlQWxsKFRPS0VOSVpFUl9VTlNBRkVfQ0hBUkFDVEVSU19SRUdfRVhQLCAnPycpO1xufVxuXG4vKipcbiAqIEJ1aWxkcyB0aGUgY29tbWFuZCBwcmVmaXggdGhhdCBydW5zIGFuIG5wbSBzY3JpcHQgb3ZlciB0aGUgcGF0aHMgYXBwZW5kZWQgdG8gaXQuXG4gKlxuICogQHBhcmFtIHNjcmlwdE5hbWUgLSBUaGUgc2NyaXB0IG5hbWUuXG4gKiBAcmV0dXJucyBUaGUgY29tbWFuZCBwcmVmaXgsIHN1Y2ggYXMgYG5wbSBydW4gbGludDpmaXggLS1gLlxuICovXG5mdW5jdGlvbiB0b1NjcmlwdENvbW1hbmQoc2NyaXB0TmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGAke1BBQ0tBR0VfTUFOQUdFUl9SVU5fQ09NTUFORH0gJHtzY3JpcHROYW1lfSAtLWA7XG59XG5cbi8qKlxuICogQnVpbGRzIHRoZSBzaGFyZWQgd3JpdGVyIHRhc2tzIGZyb20ge0BsaW5rIFdSSVRFUl9TQ1JJUFRfTkFNRVN9LCBrZWVwaW5nIG9ubHkgdGhlIHNjcmlwdHMgYSBmaWx0ZXIgYWNjZXB0c1xuICogYW5kIGRyb3BwaW5nIGEgcGF0dGVybiBsZWZ0IHdpdGggbm9uZS5cbiAqXG4gKiBAcGFyYW0gc2hvdWxkSW5jbHVkZVNjcmlwdCAtIFdoZXRoZXIgdG8gcnVuIGEgZ2l2ZW4gc2NyaXB0LlxuICogQHJldHVybnMgVGhlIHdyaXRlciB0YXNrcywga2V5ZWQgYnkgdGhlIHBhdHRlcm4gdGhhdCBjbGFpbXMgdGhlaXIgZmlsZXMuXG4gKi9cbmZ1bmN0aW9uIHRvV3JpdGVyVGFza3Moc2hvdWxkSW5jbHVkZVNjcmlwdDogKHNjcmlwdE5hbWU6IHN0cmluZykgPT4gYm9vbGVhbik6IFJlY29yZDxzdHJpbmcsIHJlYWRvbmx5IHN0cmluZ1tdPiB7XG4gIGNvbnN0IHdyaXRlclRhc2tzOiBSZWNvcmQ8c3RyaW5nLCByZWFkb25seSBzdHJpbmdbXT4gPSB7fTtcbiAgZm9yIChjb25zdCBbcGF0dGVybiwgc2NyaXB0TmFtZXNdIG9mIE9iamVjdC5lbnRyaWVzKFdSSVRFUl9TQ1JJUFRfTkFNRVMpKSB7XG4gICAgY29uc3QgY29tbWFuZHMgPSBzY3JpcHROYW1lcy5maWx0ZXIoKHNjcmlwdE5hbWUpID0+IHNob3VsZEluY2x1ZGVTY3JpcHQoc2NyaXB0TmFtZSkpLm1hcCgoc2NyaXB0TmFtZSkgPT4gdG9TY3JpcHRDb21tYW5kKHNjcmlwdE5hbWUpKTtcbiAgICBpZiAoY29tbWFuZHMubGVuZ3RoID4gMCkge1xuICAgICAgd3JpdGVyVGFza3NbcGF0dGVybl0gPSBjb21tYW5kcztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHdyaXRlclRhc2tzO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7QUFNQTtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQLE9BQU8sYUFBYTtBQUVwQjtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1AsU0FBUywyQkFBMkI7QUFDcEMsU0FBUyxtQ0FBbUM7QUEyQzVDLE1BQU0sOEJBQThCLDRCQUE0QixFQUFFLEtBQUssR0FBRztBQUUxRSxNQUFNLHlCQUF5QjtBQUUvQixNQUFNLHFCQUFxQixnQkFBZ0Isc0JBQXNCO0FBUWpFLE1BQU0sMEJBQTBCO0FBU2hDLE1BQU0sc0NBQXNDO0FBaUI1QyxNQUFNLHNCQUFtRTtBQUFBLEVBQ3ZFLGtCQUFrQixDQUFDLFlBQVksUUFBUTtBQUFBLEVBQ3ZDLFFBQVEsQ0FBQyxhQUFhO0FBQ3hCO0FBRUEsTUFBTSxlQUE0RCxjQUFjLE1BQU0s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
@@ -0,0 +1,34 @@
1
+ /// <reference path="./library-references.d.mts" />
2
+ /**
3
+ * @file
4
+ *
5
+ * The `sync-upstreams` command: reads its arguments, wires {@link syncUpstreams} to the real git, `gh`, GitHub API and
6
+ * npm registry, and turns the results into an exit code.
7
+ */
8
+ import type { SyncDependencies, SyncUpstreamsOptions } from './upstream-sync.mjs';
9
+ /**
10
+ * Creates the sync's outside world: commands run with `spawnSync`, JSON fetched with `fetch`, output to stdout.
11
+ * `GITHUB_TOKEN`, when set, is sent to the GitHub API and nowhere else.
12
+ *
13
+ * @returns The dependencies.
14
+ */
15
+ export declare function createNodeSyncDependencies(): SyncDependencies;
16
+ /**
17
+ * Builds the sync options from the command line.
18
+ *
19
+ * `--dry-run` prints each PR it would open and changes nothing. `--only=<name>[,<name>]` limits the sync to those
20
+ * entries, `--base=<branch>` names the branch the PRs target (`main` by default), and `--config=<path>` names the
21
+ * `upstreams.json` (the one in the working directory by default).
22
+ *
23
+ * @param cliArguments - The arguments after the command name.
24
+ * @returns The options.
25
+ */
26
+ export declare function parseSyncUpstreamsArguments(cliArguments: readonly string[]): SyncUpstreamsOptions;
27
+ /**
28
+ * Runs the `sync-upstreams` command.
29
+ *
30
+ * @param cliArguments - The arguments after the command name.
31
+ * @param dependencies - The outside world. The real one when omitted.
32
+ * @returns The exit code: `1` when the arguments or `upstreams.json` are wrong or any entry failed, `0` otherwise.
33
+ */
34
+ export declare function runSyncUpstreamsCli(cliArguments: readonly string[], dependencies?: SyncDependencies): Promise<number>;
@@ -0,0 +1,77 @@
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
+ import { spawnSync } from "node:child_process";
7
+ import process from "node:process";
8
+ import { syncUpstreams } from "./upstream-sync.mjs";
9
+ const DEFAULT_BASE_BRANCH = "main";
10
+ const DEFAULT_CONFIG_PATH = "upstreams.json";
11
+ function createNodeSyncDependencies() {
12
+ return {
13
+ exec(file, arguments_, env) {
14
+ return toResult(spawnSync(file, arguments_, { encoding: "utf-8", env: { ...process.env, ...env } }));
15
+ },
16
+ async fetchJson(url) {
17
+ const headers = { Accept: "application/vnd.github+json" };
18
+ const token = process.env["GITHUB_TOKEN"];
19
+ if (token && url.startsWith("https://api.github.com/")) {
20
+ headers["Authorization"] = `Bearer ${token}`;
21
+ }
22
+ const response = await fetch(url, { headers });
23
+ if (!response.ok) {
24
+ throw new Error(`GET ${url} failed: HTTP ${String(response.status)}.`);
25
+ }
26
+ return await response.json();
27
+ },
28
+ log(text) {
29
+ process.stdout.write(`${text}
30
+ `);
31
+ },
32
+ shell(command, env) {
33
+ process.stdout.write(`> ${command}
34
+ `);
35
+ const result = toResult(spawnSync(command, { encoding: "utf-8", env: { ...process.env, ...env }, shell: true }));
36
+ process.stdout.write(result.output);
37
+ return result;
38
+ }
39
+ };
40
+ }
41
+ function parseSyncUpstreamsArguments(cliArguments) {
42
+ const known = ["--dry-run", "--only=", "--base=", "--config="];
43
+ const unknown = cliArguments.filter((argument) => known.every((prefix) => !(prefix.endsWith("=") ? argument.startsWith(prefix) : argument === prefix)));
44
+ if (unknown.length > 0) {
45
+ throw new Error(`sync-upstreams: unknown argument ${unknown.map((argument) => `"${argument}"`).join(", ")}. Known: --dry-run, --only=, --base=, --config=.`);
46
+ }
47
+ return {
48
+ baseBranch: readOption(cliArguments, "base") ?? DEFAULT_BASE_BRANCH,
49
+ configPath: readOption(cliArguments, "config") ?? DEFAULT_CONFIG_PATH,
50
+ dryRun: cliArguments.includes("--dry-run"),
51
+ only: readOption(cliArguments, "only")?.split(",").filter((name) => name !== "") ?? []
52
+ };
53
+ }
54
+ async function runSyncUpstreamsCli(cliArguments, dependencies = createNodeSyncDependencies()) {
55
+ try {
56
+ const results = await syncUpstreams(parseSyncUpstreamsArguments(cliArguments), dependencies);
57
+ return results.some((result) => result.outcome === "error") ? 1 : 0;
58
+ } catch (error) {
59
+ process.stderr.write(`${error instanceof Error ? error.message : String(error)}
60
+ `);
61
+ return 1;
62
+ }
63
+ }
64
+ function readOption(cliArguments, name) {
65
+ const prefix = `--${name}=`;
66
+ const value = cliArguments.find((argument) => argument.startsWith(prefix))?.slice(prefix.length);
67
+ return value === "" ? void 0 : value;
68
+ }
69
+ function toResult(result) {
70
+ return result.error ? { exitCode: 1, output: result.error.message } : { exitCode: result.status ?? 1, output: `${result.stdout}${result.stderr}` };
71
+ }
72
+ export {
73
+ createNodeSyncDependencies,
74
+ parseSyncUpstreamsArguments,
75
+ runSyncUpstreamsCli
76
+ };
77
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3Vwc3RyZWFtLXN5bmMtY2xpLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogVGhlIGBzeW5jLXVwc3RyZWFtc2AgY29tbWFuZDogcmVhZHMgaXRzIGFyZ3VtZW50cywgd2lyZXMge0BsaW5rIHN5bmNVcHN0cmVhbXN9IHRvIHRoZSByZWFsIGdpdCwgYGdoYCwgR2l0SHViIEFQSSBhbmRcbiAqIG5wbSByZWdpc3RyeSwgYW5kIHR1cm5zIHRoZSByZXN1bHRzIGludG8gYW4gZXhpdCBjb2RlLlxuICovXG5cbmltcG9ydCB0eXBlIHsgU3Bhd25TeW5jUmV0dXJucyB9IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5cbmltcG9ydCB7IHNwYXduU3luYyB9IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgcHJvY2VzcyBmcm9tICdub2RlOnByb2Nlc3MnO1xuXG5pbXBvcnQgdHlwZSB7XG4gIENvbW1hbmRSZXN1bHQsXG4gIFN5bmNEZXBlbmRlbmNpZXMsXG4gIFN5bmNVcHN0cmVhbXNPcHRpb25zXG59IGZyb20gJy4vdXBzdHJlYW0tc3luYy50cyc7XG5cbmltcG9ydCB7IHN5bmNVcHN0cmVhbXMgfSBmcm9tICcuL3Vwc3RyZWFtLXN5bmMudHMnO1xuXG5jb25zdCBERUZBVUxUX0JBU0VfQlJBTkNIID0gJ21haW4nO1xuY29uc3QgREVGQVVMVF9DT05GSUdfUEFUSCA9ICd1cHN0cmVhbXMuanNvbic7XG5cbi8qKlxuICogQ3JlYXRlcyB0aGUgc3luYydzIG91dHNpZGUgd29ybGQ6IGNvbW1hbmRzIHJ1biB3aXRoIGBzcGF3blN5bmNgLCBKU09OIGZldGNoZWQgd2l0aCBgZmV0Y2hgLCBvdXRwdXQgdG8gc3Rkb3V0LlxuICogYEdJVEhVQl9UT0tFTmAsIHdoZW4gc2V0LCBpcyBzZW50IHRvIHRoZSBHaXRIdWIgQVBJIGFuZCBub3doZXJlIGVsc2UuXG4gKlxuICogQHJldHVybnMgVGhlIGRlcGVuZGVuY2llcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZU5vZGVTeW5jRGVwZW5kZW5jaWVzKCk6IFN5bmNEZXBlbmRlbmNpZXMge1xuICByZXR1cm4ge1xuICAgIGV4ZWMoZmlsZSwgYXJndW1lbnRzXywgZW52KTogQ29tbWFuZFJlc3VsdCB7XG4gICAgICByZXR1cm4gdG9SZXN1bHQoc3Bhd25TeW5jKGZpbGUsIGFyZ3VtZW50c18sIHsgZW5jb2Rpbmc6ICd1dGYtOCcsIGVudjogeyAuLi5wcm9jZXNzLmVudiwgLi4uZW52IH0gfSkpO1xuICAgIH0sXG4gICAgYXN5bmMgZmV0Y2hKc29uKHVybCk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgICAgY29uc3QgaGVhZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHsgQWNjZXB0OiAnYXBwbGljYXRpb24vdm5kLmdpdGh1Yitqc29uJyB9O1xuICAgICAgY29uc3QgdG9rZW4gPSBwcm9jZXNzLmVudlsnR0lUSFVCX1RPS0VOJ107XG4gICAgICBpZiAodG9rZW4gJiYgdXJsLnN0YXJ0c1dpdGgoJ2h0dHBzOi8vYXBpLmdpdGh1Yi5jb20vJykpIHtcbiAgICAgICAgaGVhZGVyc1snQXV0aG9yaXphdGlvbiddID0gYEJlYXJlciAke3Rva2VufWA7XG4gICAgICB9XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCwgeyBoZWFkZXJzIH0pO1xuICAgICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEdFVCAke3VybH0gZmFpbGVkOiBIVFRQICR7U3RyaW5nKHJlc3BvbnNlLnN0YXR1cyl9LmApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICB9LFxuICAgIGxvZyh0ZXh0KTogdm9pZCB7XG4gICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZShgJHt0ZXh0fVxcbmApO1xuICAgIH0sXG4gICAgc2hlbGwoY29tbWFuZCwgZW52KTogQ29tbWFuZFJlc3VsdCB7XG4gICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZShgPiAke2NvbW1hbmR9XFxuYCk7XG4gICAgICBjb25zdCByZXN1bHQgPSB0b1Jlc3VsdChzcGF3blN5bmMoY29tbWFuZCwgeyBlbmNvZGluZzogJ3V0Zi04JywgZW52OiB7IC4uLnByb2Nlc3MuZW52LCAuLi5lbnYgfSwgc2hlbGw6IHRydWUgfSkpO1xuICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUocmVzdWx0Lm91dHB1dCk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgfTtcbn1cblxuLyoqXG4gKiBCdWlsZHMgdGhlIHN5bmMgb3B0aW9ucyBmcm9tIHRoZSBjb21tYW5kIGxpbmUuXG4gKlxuICogYC0tZHJ5LXJ1bmAgcHJpbnRzIGVhY2ggUFIgaXQgd291bGQgb3BlbiBhbmQgY2hhbmdlcyBub3RoaW5nLiBgLS1vbmx5PTxuYW1lPlssPG5hbWU+XWAgbGltaXRzIHRoZSBzeW5jIHRvIHRob3NlXG4gKiBlbnRyaWVzLCBgLS1iYXNlPTxicmFuY2g+YCBuYW1lcyB0aGUgYnJhbmNoIHRoZSBQUnMgdGFyZ2V0IChgbWFpbmAgYnkgZGVmYXVsdCksIGFuZCBgLS1jb25maWc9PHBhdGg+YCBuYW1lcyB0aGVcbiAqIGB1cHN0cmVhbXMuanNvbmAgKHRoZSBvbmUgaW4gdGhlIHdvcmtpbmcgZGlyZWN0b3J5IGJ5IGRlZmF1bHQpLlxuICpcbiAqIEBwYXJhbSBjbGlBcmd1bWVudHMgLSBUaGUgYXJndW1lbnRzIGFmdGVyIHRoZSBjb21tYW5kIG5hbWUuXG4gKiBAcmV0dXJucyBUaGUgb3B0aW9ucy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlU3luY1Vwc3RyZWFtc0FyZ3VtZW50cyhjbGlBcmd1bWVudHM6IHJlYWRvbmx5IHN0cmluZ1tdKTogU3luY1Vwc3RyZWFtc09wdGlvbnMge1xuICBjb25zdCBrbm93biA9IFsnLS1kcnktcnVuJywgJy0tb25seT0nLCAnLS1iYXNlPScsICctLWNvbmZpZz0nXTtcbiAgY29uc3QgdW5rbm93biA9IGNsaUFyZ3VtZW50cy5maWx0ZXIoKGFyZ3VtZW50KSA9PiBrbm93bi5ldmVyeSgocHJlZml4KSA9PiAhKHByZWZpeC5lbmRzV2l0aCgnPScpID8gYXJndW1lbnQuc3RhcnRzV2l0aChwcmVmaXgpIDogYXJndW1lbnQgPT09IHByZWZpeCkpKTtcbiAgaWYgKHVua25vd24ubGVuZ3RoID4gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgc3luYy11cHN0cmVhbXM6IHVua25vd24gYXJndW1lbnQgJHt1bmtub3duLm1hcCgoYXJndW1lbnQpID0+IGBcIiR7YXJndW1lbnR9XCJgKS5qb2luKCcsICcpfS4gS25vd246IC0tZHJ5LXJ1biwgLS1vbmx5PSwgLS1iYXNlPSwgLS1jb25maWc9LmApO1xuICB9XG4gIHJldHVybiB7XG4gICAgYmFzZUJyYW5jaDogcmVhZE9wdGlvbihjbGlBcmd1bWVudHMsICdiYXNlJykgPz8gREVGQVVMVF9CQVNFX0JSQU5DSCxcbiAgICBjb25maWdQYXRoOiByZWFkT3B0aW9uKGNsaUFyZ3VtZW50cywgJ2NvbmZpZycpID8/IERFRkFVTFRfQ09ORklHX1BBVEgsXG4gICAgZHJ5UnVuOiBjbGlBcmd1bWVudHMuaW5jbHVkZXMoJy0tZHJ5LXJ1bicpLFxuICAgIG9ubHk6IHJlYWRPcHRpb24oY2xpQXJndW1lbnRzLCAnb25seScpPy5zcGxpdCgnLCcpLmZpbHRlcigobmFtZSkgPT4gbmFtZSAhPT0gJycpID8/IFtdXG4gIH07XG59XG5cbi8qKlxuICogUnVucyB0aGUgYHN5bmMtdXBzdHJlYW1zYCBjb21tYW5kLlxuICpcbiAqIEBwYXJhbSBjbGlBcmd1bWVudHMgLSBUaGUgYXJndW1lbnRzIGFmdGVyIHRoZSBjb21tYW5kIG5hbWUuXG4gKiBAcGFyYW0gZGVwZW5kZW5jaWVzIC0gVGhlIG91dHNpZGUgd29ybGQuIFRoZSByZWFsIG9uZSB3aGVuIG9taXR0ZWQuXG4gKiBAcmV0dXJucyBUaGUgZXhpdCBjb2RlOiBgMWAgd2hlbiB0aGUgYXJndW1lbnRzIG9yIGB1cHN0cmVhbXMuanNvbmAgYXJlIHdyb25nIG9yIGFueSBlbnRyeSBmYWlsZWQsIGAwYCBvdGhlcndpc2UuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBydW5TeW5jVXBzdHJlYW1zQ2xpKGNsaUFyZ3VtZW50czogcmVhZG9ubHkgc3RyaW5nW10sIGRlcGVuZGVuY2llczogU3luY0RlcGVuZGVuY2llcyA9IGNyZWF0ZU5vZGVTeW5jRGVwZW5kZW5jaWVzKCkpOiBQcm9taXNlPG51bWJlcj4ge1xuICB0cnkge1xuICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBzeW5jVXBzdHJlYW1zKHBhcnNlU3luY1Vwc3RyZWFtc0FyZ3VtZW50cyhjbGlBcmd1bWVudHMpLCBkZXBlbmRlbmNpZXMpO1xuICAgIHJldHVybiByZXN1bHRzLnNvbWUoKHJlc3VsdCkgPT4gcmVzdWx0Lm91dGNvbWUgPT09ICdlcnJvcicpID8gMSA6IDA7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgLy8gQSB3cm9uZyBhcmd1bWVudCBvciBjb25maWcgaXMgdGhlIHVzZXIncyB0byBmaXgsIHNvIGl0IGdldHMgaXRzIG1lc3NhZ2UgcmF0aGVyIHRoYW4gYSBzdGFjayB0cmFjZS5cbiAgICBwcm9jZXNzLnN0ZGVyci53cml0ZShgJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcil9XFxuYCk7XG4gICAgcmV0dXJuIDE7XG4gIH1cbn1cblxuLy8gQW4gZW1wdHkgdmFsdWUgY291bnRzIGFzIGFic2VudCwgYmVjYXVzZSBhIHdvcmtmbG93IHBhc3NlcyBhbiB1bnNldCBpbnB1dCBhcyBvbmUuXG5mdW5jdGlvbiByZWFkT3B0aW9uKGNsaUFyZ3VtZW50czogcmVhZG9ubHkgc3RyaW5nW10sIG5hbWU6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHByZWZpeCA9IGAtLSR7bmFtZX09YDtcbiAgY29uc3QgdmFsdWUgPSBjbGlBcmd1bWVudHMuZmluZCgoYXJndW1lbnQpID0+IGFyZ3VtZW50LnN0YXJ0c1dpdGgocHJlZml4KSk/LnNsaWNlKHByZWZpeC5sZW5ndGgpO1xuICByZXR1cm4gdmFsdWUgPT09ICcnID8gdW5kZWZpbmVkIDogdmFsdWU7XG59XG5cbmZ1bmN0aW9uIHRvUmVzdWx0KHJlc3VsdDogU3Bhd25TeW5jUmV0dXJuczxzdHJpbmc+KTogQ29tbWFuZFJlc3VsdCB7XG4gIHJldHVybiByZXN1bHQuZXJyb3IgPyB7IGV4aXRDb2RlOiAxLCBvdXRwdXQ6IHJlc3VsdC5lcnJvci5tZXNzYWdlIH0gOiB7IGV4aXRDb2RlOiByZXN1bHQuc3RhdHVzID8/IDEsIG91dHB1dDogYCR7cmVzdWx0LnN0ZG91dH0ke3Jlc3VsdC5zdGRlcnJ9YCB9O1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7QUFTQSxTQUFTLGlCQUFpQjtBQUMxQixPQUFPLGFBQWE7QUFRcEIsU0FBUyxxQkFBcUI7QUFFOUIsTUFBTSxzQkFBc0I7QUFDNUIsTUFBTSxzQkFBc0I7QUFRckIsU0FBUyw2QkFBK0M7QUFDN0QsU0FBTztBQUFBLElBQ0wsS0FBSyxNQUFNLFlBQVksS0FBb0I7QUFDekMsYUFBTyxTQUFTLFVBQVUsTUFBTSxZQUFZLEVBQUUsVUFBVSxTQUFTLEtBQUssRUFBRSxHQUFHLFFBQVEsS0FBSyxHQUFHLElBQUksRUFBRSxDQUFDLENBQUM7QUFBQSxJQUNyRztBQUFBLElBQ0EsTUFBTSxVQUFVLEtBQXVCO0FBQ3JDLFlBQU0sVUFBa0MsRUFBRSxRQUFRLDhCQUE4QjtBQUNoRixZQUFNLFFBQVEsUUFBUSxJQUFJLGNBQWM7QUFDeEMsVUFBSSxTQUFTLElBQUksV0FBVyx5QkFBeUIsR0FBRztBQUN0RCxnQkFBUSxlQUFlLElBQUksVUFBVSxLQUFLO0FBQUEsTUFDNUM7QUFDQSxZQUFNLFdBQVcsTUFBTSxNQUFNLEtBQUssRUFBRSxRQUFRLENBQUM7QUFDN0MsVUFBSSxDQUFDLFNBQVMsSUFBSTtBQUNoQixjQUFNLElBQUksTUFBTSxPQUFPLEdBQUcsaUJBQWlCLE9BQU8sU0FBUyxNQUFNLENBQUMsR0FBRztBQUFBLE1BQ3ZFO0FBQ0EsYUFBTyxNQUFNLFNBQVMsS0FBSztBQUFBLElBQzdCO0FBQUEsSUFDQSxJQUFJLE1BQVk7QUFDZCxjQUFRLE9BQU8sTUFBTSxHQUFHLElBQUk7QUFBQSxDQUFJO0FBQUEsSUFDbEM7QUFBQSxJQUNBLE1BQU0sU0FBUyxLQUFvQjtBQUNqQyxjQUFRLE9BQU8sTUFBTSxLQUFLLE9BQU87QUFBQSxDQUFJO0FBQ3JDLFlBQU0sU0FBUyxTQUFTLFVBQVUsU0FBUyxFQUFFLFVBQVUsU0FBUyxLQUFLLEVBQUUsR0FBRyxRQUFRLEtBQUssR0FBRyxJQUFJLEdBQUcsT0FBTyxLQUFLLENBQUMsQ0FBQztBQUMvRyxjQUFRLE9BQU8sTUFBTSxPQUFPLE1BQU07QUFDbEMsYUFBTztBQUFBLElBQ1Q7QUFBQSxFQUNGO0FBQ0Y7QUFZTyxTQUFTLDRCQUE0QixjQUF1RDtBQUNqRyxRQUFNLFFBQVEsQ0FBQyxhQUFhLFdBQVcsV0FBVyxXQUFXO0FBQzdELFFBQU0sVUFBVSxhQUFhLE9BQU8sQ0FBQyxhQUFhLE1BQU0sTUFBTSxDQUFDLFdBQVcsRUFBRSxPQUFPLFNBQVMsR0FBRyxJQUFJLFNBQVMsV0FBVyxNQUFNLElBQUksYUFBYSxPQUFPLENBQUM7QUFDdEosTUFBSSxRQUFRLFNBQVMsR0FBRztBQUN0QixVQUFNLElBQUksTUFBTSxvQ0FBb0MsUUFBUSxJQUFJLENBQUMsYUFBYSxJQUFJLFFBQVEsR0FBRyxFQUFFLEtBQUssSUFBSSxDQUFDLGtEQUFrRDtBQUFBLEVBQzdKO0FBQ0EsU0FBTztBQUFBLElBQ0wsWUFBWSxXQUFXLGNBQWMsTUFBTSxLQUFLO0FBQUEsSUFDaEQsWUFBWSxXQUFXLGNBQWMsUUFBUSxLQUFLO0FBQUEsSUFDbEQsUUFBUSxhQUFhLFNBQVMsV0FBVztBQUFBLElBQ3pDLE1BQU0sV0FBVyxjQUFjLE1BQU0sR0FBRyxNQUFNLEdBQUcsRUFBRSxPQUFPLENBQUMsU0FBUyxTQUFTLEVBQUUsS0FBSyxDQUFDO0FBQUEsRUFDdkY7QUFDRjtBQVNBLGVBQXNCLG9CQUFvQixjQUFpQyxlQUFpQywyQkFBMkIsR0FBb0I7QUFDekosTUFBSTtBQUNGLFVBQU0sVUFBVSxNQUFNLGNBQWMsNEJBQTRCLFlBQVksR0FBRyxZQUFZO0FBQzNGLFdBQU8sUUFBUSxLQUFLLENBQUMsV0FBVyxPQUFPLFlBQVksT0FBTyxJQUFJLElBQUk7QUFBQSxFQUNwRSxTQUFTLE9BQU87QUFFZCxZQUFRLE9BQU8sTUFBTSxHQUFHLGlCQUFpQixRQUFRLE1BQU0sVUFBVSxPQUFPLEtBQUssQ0FBQztBQUFBLENBQUk7QUFDbEYsV0FBTztBQUFBLEVBQ1Q7QUFDRjtBQUdBLFNBQVMsV0FBVyxjQUFpQyxNQUFrQztBQUNyRixRQUFNLFNBQVMsS0FBSyxJQUFJO0FBQ3hCLFFBQU0sUUFBUSxhQUFhLEtBQUssQ0FBQyxhQUFhLFNBQVMsV0FBVyxNQUFNLENBQUMsR0FBRyxNQUFNLE9BQU8sTUFBTTtBQUMvRixTQUFPLFVBQVUsS0FBSyxTQUFZO0FBQ3BDO0FBRUEsU0FBUyxTQUFTLFFBQWlEO0FBQ2pFLFNBQU8sT0FBTyxRQUFRLEVBQUUsVUFBVSxHQUFHLFFBQVEsT0FBTyxNQUFNLFFBQVEsSUFBSSxFQUFFLFVBQVUsT0FBTyxVQUFVLEdBQUcsUUFBUSxHQUFHLE9BQU8sTUFBTSxHQUFHLE9BQU8sTUFBTSxHQUFHO0FBQ25KOyIsCiAgIm5hbWVzIjogW10KfQo=
@@ -0,0 +1,235 @@
1
+ /// <reference path="./library-references.d.mts" />
2
+ /**
3
+ * @file
4
+ *
5
+ * Watches the upstreams a repository mirrors and opens one update PR per upstream that moved.
6
+ *
7
+ * Everything here is driven by `upstreams.json` and the handler commands it names, so any repository that vendors
8
+ * upstream code can use it: through the `sync-upstreams` bin, or the reusable `sync-upstreams.yml` workflow.
9
+ */
10
+ /**
11
+ * What a command printed and how it exited.
12
+ */
13
+ export interface CommandResult {
14
+ readonly exitCode: number;
15
+ readonly output: string;
16
+ }
17
+ /**
18
+ * An upstream followed on a GitHub branch or tag, pinned to a commit.
19
+ */
20
+ export interface GitUpstreamEntry {
21
+ /**
22
+ * The pinned commit: the last upstream state the handler was run against.
23
+ */
24
+ commit: string;
25
+ /**
26
+ * The shell command that turns a newer upstream state into changes in this repository.
27
+ */
28
+ handler: string;
29
+ name: string;
30
+ /**
31
+ * The paths watched upstream, as globs relative to the repository root. A move that touches none of them opens no PR.
32
+ */
33
+ paths: readonly string[];
34
+ /**
35
+ * The branch or tag followed.
36
+ */
37
+ ref: string;
38
+ /**
39
+ * `<owner>/<repo>` on GitHub.
40
+ */
41
+ repo: string;
42
+ /**
43
+ * The shell command that checks the handler's result. Overrides the file's top-level `verify`.
44
+ */
45
+ verify?: string;
46
+ }
47
+ /**
48
+ * An upstream followed as an npm package's dist-tag, pinned to a version.
49
+ */
50
+ export interface NpmUpstreamEntry {
51
+ handler: string;
52
+ name: string;
53
+ /**
54
+ * The package name.
55
+ */
56
+ npm: string;
57
+ /**
58
+ * The dist-tag followed. `latest` when absent.
59
+ */
60
+ tag?: string;
61
+ verify?: string;
62
+ /**
63
+ * The pinned version.
64
+ */
65
+ version: string;
66
+ }
67
+ /**
68
+ * Everything the sync does to the outside world, so a test can stand a fixture in for it.
69
+ */
70
+ export interface SyncDependencies {
71
+ /**
72
+ * Runs an executable with arguments and no shell.
73
+ */
74
+ exec: (file: string, arguments_: readonly string[], env?: Readonly<Record<string, string>>) => CommandResult;
75
+ /**
76
+ * GETs a URL and parses the JSON it returns, throwing on an HTTP error.
77
+ */
78
+ fetchJson: (url: string) => Promise<unknown>;
79
+ log: (text: string) => void;
80
+ /**
81
+ * Runs a command line through the shell: a handler or a verify command.
82
+ */
83
+ shell: (command: string, env?: Readonly<Record<string, string>>) => CommandResult;
84
+ }
85
+ /**
86
+ * The PR an upstream move asks for.
87
+ */
88
+ export interface SyncPlan {
89
+ branch: string;
90
+ status: UpstreamStatus;
91
+ title: string;
92
+ }
93
+ /**
94
+ * What happened to one entry.
95
+ */
96
+ export interface SyncResult {
97
+ /**
98
+ * Set when checking or applying threw: the job reports it and moves on to the next entry.
99
+ */
100
+ readonly error?: string;
101
+ readonly name: string;
102
+ /**
103
+ * `planned` in a dry run, `opened`/`updated` when a PR was pushed, `unchanged` when the branch already held this result.
104
+ */
105
+ readonly outcome: 'current' | 'error' | 'opened' | 'planned' | 'unchanged' | 'unwatched' | 'updated';
106
+ readonly prNumber?: number;
107
+ }
108
+ /**
109
+ * What {@link syncUpstreams} syncs, and how.
110
+ */
111
+ export interface SyncUpstreamsOptions {
112
+ /**
113
+ * The branch each PR targets and each update branch is cut from.
114
+ */
115
+ readonly baseBranch: string;
116
+ /**
117
+ * The path to `upstreams.json`, which the sync updates the pin in.
118
+ */
119
+ readonly configPath: string;
120
+ /**
121
+ * Plan and print every PR, and change nothing.
122
+ */
123
+ readonly dryRun: boolean;
124
+ /**
125
+ * Only the entries with these names, or every entry when empty.
126
+ */
127
+ readonly only: readonly string[];
128
+ }
129
+ /**
130
+ * One upstream that `upstreams.json` lists: a git one or an npm one.
131
+ */
132
+ export type UpstreamEntry = GitUpstreamEntry | NpmUpstreamEntry;
133
+ /**
134
+ * The content of `upstreams.json`.
135
+ */
136
+ export interface UpstreamsConfig {
137
+ upstreams: readonly UpstreamEntry[];
138
+ /**
139
+ * The shell command that checks every handler's result, unless an entry names its own.
140
+ */
141
+ verify?: string;
142
+ }
143
+ /**
144
+ * What one comparison of an entry with its upstream found.
145
+ */
146
+ export interface UpstreamStatus {
147
+ /**
148
+ * The upstream paths that changed and are watched, sorted. Always empty for an npm upstream.
149
+ */
150
+ changedPaths: readonly string[];
151
+ /**
152
+ * A link that shows what changed between the pin and the head.
153
+ */
154
+ compareUrl: string;
155
+ entry: UpstreamEntry;
156
+ /**
157
+ * The commit or version the upstream is at now.
158
+ */
159
+ head: string;
160
+ /**
161
+ * The commit or version `upstreams.json` records.
162
+ */
163
+ pin: string;
164
+ /**
165
+ * `current`: nothing to do. `moved`: a PR is due. `unwatched`: upstream moved, but no watched path changed.
166
+ */
167
+ state: 'current' | 'moved' | 'unwatched';
168
+ /**
169
+ * Whether GitHub truncated the compare's file list, so a watched path may be missing from `changedPaths`.
170
+ */
171
+ truncated: boolean;
172
+ }
173
+ interface StepResult {
174
+ readonly command: string;
175
+ readonly result: CommandResult;
176
+ }
177
+ /**
178
+ * The handler and verify runs a PR body reports.
179
+ */
180
+ interface StepResults {
181
+ handler: StepResult;
182
+ verify: null | StepResult;
183
+ }
184
+ /**
185
+ * Writes the PR body.
186
+ *
187
+ * @param plan - The plan.
188
+ * @param steps - The handler and verify runs, or `null` in a dry run, where neither runs.
189
+ * @param diffStat - `git diff --stat` of the update commit, or `null` in a dry run.
190
+ * @returns The body, in Markdown.
191
+ */
192
+ export declare function buildPrBody(plan: SyncPlan, steps: null | StepResults, diffStat: null | string): string;
193
+ /**
194
+ * Compares one entry with its upstream.
195
+ *
196
+ * @param entry - The entry.
197
+ * @param dependencies - The outside world.
198
+ * @returns What the comparison found.
199
+ */
200
+ export declare function compareWithUpstream(entry: UpstreamEntry, dependencies: Pick<SyncDependencies, 'fetchJson'>): Promise<UpstreamStatus>;
201
+ /**
202
+ * Parses and validates an `upstreams.json`.
203
+ *
204
+ * @param text - The file's content.
205
+ * @returns The config.
206
+ */
207
+ export declare function parseUpstreamsConfig(text: string): UpstreamsConfig;
208
+ /**
209
+ * Plans the PR a moved upstream asks for.
210
+ *
211
+ * @param status - The comparison of a moved entry.
212
+ * @returns The branch and title.
213
+ */
214
+ export declare function planSync(status: UpstreamStatus): SyncPlan;
215
+ /**
216
+ * Checks every entry, and opens or updates one PR per moved upstream.
217
+ *
218
+ * A handler or verify failure still opens the PR, as a draft with the failure in its body, so a breaking upstream change
219
+ * is seen rather than skipped. An error in the sync itself, such as a failed API call, is reported in the entry's result
220
+ * and the next entry still runs.
221
+ *
222
+ * @param options - What to sync, and how.
223
+ * @param dependencies - The outside world.
224
+ * @returns One result per entry checked.
225
+ */
226
+ export declare function syncUpstreams(options: SyncUpstreamsOptions, dependencies: SyncDependencies): Promise<SyncResult[]>;
227
+ /**
228
+ * Records `head` as the entry's pin in `upstreams.json`, unless the handler already moved it, keeping the file's
229
+ * key order and formatting.
230
+ *
231
+ * @param configPath - The path to `upstreams.json`.
232
+ * @param status - The comparison.
233
+ */
234
+ export declare function writePin(configPath: string, status: UpstreamStatus): void;
235
+ export {};