semantifold 0.9.0 → 0.11.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 (198) hide show
  1. package/README.md +6 -3
  2. package/bin/semantifold.js +6 -0
  3. package/build/bin/semantifold.d.ts +3 -0
  4. package/build/bin/semantifold.d.ts.map +1 -0
  5. package/build/bin/semantifold.js +5 -0
  6. package/build/index.d.ts +8 -0
  7. package/build/index.d.ts.map +1 -1
  8. package/build/index.js +9 -1
  9. package/build/src/artifact-path.d.ts +16 -0
  10. package/build/src/artifact-path.d.ts.map +1 -1
  11. package/build/src/artifact-path.js +29 -3
  12. package/build/src/backends/c-check.d.ts +7 -0
  13. package/build/src/backends/c-check.d.ts.map +1 -0
  14. package/build/src/backends/c-check.js +65 -0
  15. package/build/src/backends/check-plan.d.ts +96 -0
  16. package/build/src/backends/check-plan.d.ts.map +1 -0
  17. package/build/src/backends/check-plan.js +135 -0
  18. package/build/src/backends/cpp-check.d.ts +7 -0
  19. package/build/src/backends/cpp-check.d.ts.map +1 -0
  20. package/build/src/backends/cpp-check.js +59 -0
  21. package/build/src/backends/csharp-check.d.ts +7 -0
  22. package/build/src/backends/csharp-check.d.ts.map +1 -0
  23. package/build/src/backends/csharp-check.js +125 -0
  24. package/build/src/backends/csharp.d.ts +1 -0
  25. package/build/src/backends/csharp.d.ts.map +1 -1
  26. package/build/src/backends/csharp.js +5 -4
  27. package/build/src/backends/dart-check.d.ts +7 -0
  28. package/build/src/backends/dart-check.d.ts.map +1 -0
  29. package/build/src/backends/dart-check.js +103 -0
  30. package/build/src/backends/dart.d.ts +2 -0
  31. package/build/src/backends/dart.d.ts.map +1 -1
  32. package/build/src/backends/dart.js +5 -5
  33. package/build/src/backends/go-check.d.ts +7 -0
  34. package/build/src/backends/go-check.d.ts.map +1 -0
  35. package/build/src/backends/go-check.js +77 -0
  36. package/build/src/backends/go.d.ts +1 -0
  37. package/build/src/backends/go.d.ts.map +1 -1
  38. package/build/src/backends/go.js +3 -3
  39. package/build/src/backends/java-check.d.ts +21 -0
  40. package/build/src/backends/java-check.d.ts.map +1 -0
  41. package/build/src/backends/java-check.js +73 -0
  42. package/build/src/backends/javascript-check.d.ts +7 -0
  43. package/build/src/backends/javascript-check.d.ts.map +1 -0
  44. package/build/src/backends/javascript-check.js +29 -0
  45. package/build/src/backends/kotlin-check.d.ts +7 -0
  46. package/build/src/backends/kotlin-check.d.ts.map +1 -0
  47. package/build/src/backends/kotlin-check.js +31 -0
  48. package/build/src/backends/kotlin.d.ts +1 -1
  49. package/build/src/backends/kotlin.js +2 -2
  50. package/build/src/backends/php-check.d.ts +7 -0
  51. package/build/src/backends/php-check.d.ts.map +1 -0
  52. package/build/src/backends/php-check.js +21 -0
  53. package/build/src/backends/program.d.ts +7 -0
  54. package/build/src/backends/program.d.ts.map +1 -1
  55. package/build/src/backends/program.js +16 -1
  56. package/build/src/backends/python-check.d.ts +7 -0
  57. package/build/src/backends/python-check.d.ts.map +1 -0
  58. package/build/src/backends/python-check.js +28 -0
  59. package/build/src/backends/ruby-check.d.ts +7 -0
  60. package/build/src/backends/ruby-check.d.ts.map +1 -0
  61. package/build/src/backends/ruby-check.js +21 -0
  62. package/build/src/backends/rust-check.d.ts +7 -0
  63. package/build/src/backends/rust-check.d.ts.map +1 -0
  64. package/build/src/backends/rust-check.js +65 -0
  65. package/build/src/backends/shared.d.ts.map +1 -1
  66. package/build/src/backends/shared.js +29 -1
  67. package/build/src/backends/swift-check.d.ts +7 -0
  68. package/build/src/backends/swift-check.d.ts.map +1 -0
  69. package/build/src/backends/swift-check.js +77 -0
  70. package/build/src/backends/typescript-check.d.ts +7 -0
  71. package/build/src/backends/typescript-check.d.ts.map +1 -0
  72. package/build/src/backends/typescript-check.js +33 -0
  73. package/build/src/backends/zig-check.d.ts +7 -0
  74. package/build/src/backends/zig-check.d.ts.map +1 -0
  75. package/build/src/backends/zig-check.js +70 -0
  76. package/build/src/diagnostic.d.ts +13 -1
  77. package/build/src/diagnostic.d.ts.map +1 -1
  78. package/build/src/diagnostic.js +14 -2
  79. package/build/src/frontends/java.d.ts.map +1 -1
  80. package/build/src/frontends/java.js +23 -1
  81. package/build/src/frontends/javascript-typescript.d.ts.map +1 -1
  82. package/build/src/frontends/javascript-typescript.js +45 -4
  83. package/build/src/frontends/php.d.ts.map +1 -1
  84. package/build/src/frontends/php.js +54 -3
  85. package/build/src/frontends/program.d.ts +6 -0
  86. package/build/src/frontends/program.d.ts.map +1 -1
  87. package/build/src/frontends/program.js +9 -1
  88. package/build/src/frontends/ruby.d.ts.map +1 -1
  89. package/build/src/frontends/ruby.js +55 -5
  90. package/build/src/language-registry.d.ts +54 -0
  91. package/build/src/language-registry.d.ts.map +1 -1
  92. package/build/src/language-registry.js +124 -10
  93. package/build/src/project-build.d.ts +172 -0
  94. package/build/src/project-build.d.ts.map +1 -0
  95. package/build/src/project-build.js +320 -0
  96. package/build/src/project-cli.d.ts +40 -0
  97. package/build/src/project-cli.d.ts.map +1 -0
  98. package/build/src/project-cli.js +145 -0
  99. package/build/src/project-manifest.d.ts +148 -0
  100. package/build/src/project-manifest.d.ts.map +1 -0
  101. package/build/src/project-manifest.js +432 -0
  102. package/build/src/project-reporter.d.ts +81 -0
  103. package/build/src/project-reporter.d.ts.map +1 -0
  104. package/build/src/project-reporter.js +293 -0
  105. package/build/src/project-snapshot.d.ts +129 -0
  106. package/build/src/project-snapshot.d.ts.map +1 -0
  107. package/build/src/project-snapshot.js +362 -0
  108. package/build/src/project-watch-reporter.d.ts +125 -0
  109. package/build/src/project-watch-reporter.d.ts.map +1 -0
  110. package/build/src/project-watch-reporter.js +280 -0
  111. package/build/src/project-watch.d.ts +133 -0
  112. package/build/src/project-watch.d.ts.map +1 -0
  113. package/build/src/project-watch.js +839 -0
  114. package/build/src/publication.d.ts +69 -5
  115. package/build/src/publication.d.ts.map +1 -1
  116. package/build/src/publication.js +246 -57
  117. package/build/src/semantic/effects.js +3 -1
  118. package/build/src/semantic/provenance.d.ts.map +1 -1
  119. package/build/src/semantic/provenance.js +11 -1
  120. package/build/src/semantic/types.d.ts +355 -4
  121. package/build/src/semantic/types.d.ts.map +1 -1
  122. package/build/src/semantic/types.js +92 -3
  123. package/build/src/semantic/validate.js +18 -1
  124. package/build/src/subprocess.d.ts +8 -0
  125. package/build/src/subprocess.d.ts.map +1 -1
  126. package/build/src/subprocess.js +50 -9
  127. package/build/src/target-check.d.ts +52 -0
  128. package/build/src/target-check.d.ts.map +1 -0
  129. package/build/src/target-check.js +796 -0
  130. package/build/src/toolchains.d.ts.map +1 -1
  131. package/build/src/toolchains.js +3 -3
  132. package/docs/adr-expression-breadth.md +186 -0
  133. package/docs/architecture.md +3 -1
  134. package/docs/c.md +4 -0
  135. package/docs/cpp.md +4 -0
  136. package/docs/dart.md +4 -0
  137. package/docs/generated-artifact-publication.md +11 -8
  138. package/docs/kotlin.md +2 -2
  139. package/docs/language-support.md +40 -6
  140. package/docs/parser-qualification.md +1 -1
  141. package/docs/project-build-cli.md +147 -0
  142. package/docs/project-watch.md +60 -0
  143. package/docs/rust.md +4 -0
  144. package/docs/swift.md +2 -0
  145. package/docs/testing.md +70 -3
  146. package/docs/watch-build-pipeline.md +39 -23
  147. package/docs/zig.md +2 -0
  148. package/examples/jsdoc-java-watch/expected-output.txt +3 -0
  149. package/examples/jsdoc-java-watch/semantifold.json +23 -0
  150. package/examples/jsdoc-java-watch/src/main.js +21 -0
  151. package/index.js +8 -0
  152. package/package.json +6 -1
  153. package/src/artifact-path.js +31 -2
  154. package/src/backends/c-check.js +80 -0
  155. package/src/backends/check-plan.js +147 -0
  156. package/src/backends/cpp-check.js +73 -0
  157. package/src/backends/csharp-check.js +139 -0
  158. package/src/backends/csharp.js +4 -3
  159. package/src/backends/dart-check.js +117 -0
  160. package/src/backends/dart.js +4 -4
  161. package/src/backends/go-check.js +89 -0
  162. package/src/backends/go.js +2 -2
  163. package/src/backends/java-check.js +77 -0
  164. package/src/backends/javascript-check.js +33 -0
  165. package/src/backends/kotlin-check.js +41 -0
  166. package/src/backends/kotlin.js +1 -1
  167. package/src/backends/php-check.js +23 -0
  168. package/src/backends/program.js +17 -0
  169. package/src/backends/python-check.js +30 -0
  170. package/src/backends/ruby-check.js +23 -0
  171. package/src/backends/rust-check.js +78 -0
  172. package/src/backends/shared.js +30 -0
  173. package/src/backends/swift-check.js +89 -0
  174. package/src/backends/typescript-check.js +37 -0
  175. package/src/backends/zig-check.js +81 -0
  176. package/src/diagnostic.js +9 -1
  177. package/src/frontends/java.js +24 -0
  178. package/src/frontends/javascript-typescript.js +49 -2
  179. package/src/frontends/php.js +61 -2
  180. package/src/frontends/program.js +9 -0
  181. package/src/frontends/ruby.js +62 -2
  182. package/src/language-registry.js +130 -9
  183. package/src/project-build.js +353 -0
  184. package/src/project-cli.js +155 -0
  185. package/src/project-manifest.js +479 -0
  186. package/src/project-reporter.js +320 -0
  187. package/src/project-snapshot.js +403 -0
  188. package/src/project-watch-reporter.js +303 -0
  189. package/src/project-watch.js +870 -0
  190. package/src/publication.js +275 -58
  191. package/src/semantic/effects.js +1 -0
  192. package/src/semantic/provenance.js +8 -0
  193. package/src/semantic/types.js +101 -2
  194. package/src/semantic/validate.js +26 -0
  195. package/src/subprocess.js +49 -8
  196. package/src/target-check.js +844 -0
  197. package/src/toolchains.js +3 -2
  198. package/tsconfig.json +1 -1
@@ -6,6 +6,7 @@
6
6
  * @param {Readonly<Record<string, string>>} input.environment - Exact environment.
7
7
  * @param {string} input.executable - Exact executable path.
8
8
  * @param {number} input.maxBuffer - Maximum bytes captured per output stream.
9
+ * @param {AbortSignal} [input.signal] - Optional owned cancellation signal.
9
10
  * @param {number} input.timeoutMs - Deadline before termination begins.
10
11
  * @returns {Promise<{stderr: string, stdout: string}>} Output after the owned process group closes.
11
12
  */
@@ -15,6 +16,7 @@ export declare function executeFileWithDeadline(input: {
15
16
  environment: Readonly<Record<string, string>>;
16
17
  executable: string;
17
18
  maxBuffer: number;
19
+ signal?: AbortSignal;
18
20
  timeoutMs: number;
19
21
  }): Promise<{
20
22
  stderr: string;
@@ -35,4 +37,10 @@ export declare function createExecuteFileWithDeadline({ registerSpawnListener }:
35
37
  * @returns {boolean} Whether the failure belongs to an owned deadline.
36
38
  */
37
39
  export declare function exceededOwnedDeadline(error: unknown): boolean;
40
+ /**
41
+ * Reports whether this module's cancellation signal initiated termination.
42
+ * @param {unknown} error - Subprocess failure.
43
+ * @returns {boolean} Whether the failure belongs to owned cancellation.
44
+ */
45
+ export declare function cancelledOwnedProcess(error: unknown): boolean;
38
46
  //# sourceMappingURL=subprocess.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"subprocess.d.ts","sourceRoot":"","sources":["../../src/subprocess.js"],"names":[],"mappings":"AASA;;;;;;;;;;GAUG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAR1C;IAAiC,SAAS,EAAlC,SAAS,MAAM,EAAE,CACzB;IAAuB,GAAG,AAA1B,CACA,EADQ,MAAM,CACd;IAAgD,WAAW,EAAnD,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CACxC;IAAsB,UAAU,EAAxB,MAAM,CACd;IAAsB,SAAS,EAAvB,MAAM,CACd;IAAsB,SAAS,EAAvB,MAAM,CACd;CAE0C,GAFhC,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAC,CAAC,CAIrD;AAED;;;;;GAKG;AACH,wBAAgB,6BAA6B,CAAC,EAAC,qBAAqB,EAAC,EAHlE;IAAuG,qBAAqB,EAApH,CAAC,KAAK,EAAE,OAAO,oBAAoB,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,IAAI,KAAK,IAAI,CACxF;CAEkE,GAFxD,OAAO,uBAAuB,CAI1C;AAgMD;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAHhC,OAGgC,GAF9B,OAAO,CAInB"}
1
+ {"version":3,"file":"subprocess.d.ts","sourceRoot":"","sources":["../../src/subprocess.js"],"names":[],"mappings":"AAUA;;;;;;;;;;;GAWG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAT1C;IAAiC,SAAS,EAAlC,SAAS,MAAM,EAAE,CACzB;IAAuB,GAAG,AAA1B,CACA,EADQ,MAAM,CACd;IAAgD,WAAW,EAAnD,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CACxC;IAAsB,UAAU,EAAxB,MAAM,CACd;IAAsB,SAAS,EAAvB,MAAM,CACd;IAA4B,MAAM,AAAlC,CACA,EADQ,WAAW,CACnB;IAAsB,SAAS,EAAvB,MAAM,CACd;CAE0C,GAFhC,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAC,CAAC,CAIrD;AAED;;;;;GAKG;AACH,wBAAgB,6BAA6B,CAAC,EAAC,qBAAqB,EAAC,EAHlE;IAAuG,qBAAqB,EAApH,CAAC,KAAK,EAAE,OAAO,oBAAoB,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,IAAI,KAAK,IAAI,CACxF;CAEkE,GAFxD,OAAO,uBAAuB,CAI1C;AA8ND;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAHhC,OAGgC,GAF9B,OAAO,CAInB;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAHhC,OAGgC,GAF9B,OAAO,CAInB"}
@@ -4,6 +4,7 @@ import { StringDecoder } from "node:string_decoder";
4
4
  const forcedTerminationGraceMs = 250;
5
5
  const retainedPipeGraceMs = 250;
6
6
  const deadlineFailures = new WeakSet();
7
+ const cancellationFailures = new WeakSet();
7
8
  /**
8
9
  * Executes one exact file while owning its complete bounded lifecycle.
9
10
  * @param {object} input - Process request.
@@ -12,6 +13,7 @@ const deadlineFailures = new WeakSet();
12
13
  * @param {Readonly<Record<string, string>>} input.environment - Exact environment.
13
14
  * @param {string} input.executable - Exact executable path.
14
15
  * @param {number} input.maxBuffer - Maximum bytes captured per output stream.
16
+ * @param {AbortSignal} [input.signal] - Optional owned cancellation signal.
15
17
  * @param {number} input.timeoutMs - Deadline before termination begins.
16
18
  * @returns {Promise<{stderr: string, stdout: string}>} Output after the owned process group closes.
17
19
  */
@@ -33,7 +35,7 @@ export function createExecuteFileWithDeadline({ registerSpawnListener }) {
33
35
  * @param {(child: import("node:child_process").ChildProcess, listener: () => void) => void} registerSpawnListener - Registers deadline initialization.
34
36
  * @returns {Promise<{stderr: string, stdout: string}>} Output after the owned process group closes.
35
37
  */
36
- function executeFileWithDeadlineUsing({ arguments: processArguments, cwd, environment, executable, maxBuffer, timeoutMs }, registerSpawnListener) {
38
+ function executeFileWithDeadlineUsing({ arguments: processArguments, cwd, environment, executable, maxBuffer, signal, timeoutMs }, registerSpawnListener) {
37
39
  if (process.platform == "win32") {
38
40
  return Promise.reject(Object.assign(new Error("Owned process-tree termination is unavailable on this platform."), {
39
41
  code: "ENOTSUP",
@@ -41,6 +43,11 @@ function executeFileWithDeadlineUsing({ arguments: processArguments, cwd, enviro
41
43
  stdout: ""
42
44
  }));
43
45
  }
46
+ if (signal?.aborted) {
47
+ const cancellationError = Object.assign(new Error("Subprocess was cancelled before launch."), { stderr: "", stdout: "" });
48
+ cancellationFailures.add(cancellationError);
49
+ return Promise.reject(cancellationError);
50
+ }
44
51
  return new Promise((resolve, reject) => {
45
52
  /** @type {ReturnType<typeof setTimeout> | undefined} */
46
53
  let deadlineTimer;
@@ -50,8 +57,10 @@ function executeFileWithDeadlineUsing({ arguments: processArguments, cwd, enviro
50
57
  let pipeTimer;
51
58
  /** @type {Error | undefined} */
52
59
  let launchError;
60
+ let cancellationRequested = false;
53
61
  let deadlineExceeded = false;
54
62
  let outputExceeded = false;
63
+ let processGroupOwned = false;
55
64
  let settled = false;
56
65
  const stderr = outputCapture(maxBuffer, () => terminateForOutputLimit());
57
66
  const stdout = outputCapture(maxBuffer, () => terminateForOutputLimit());
@@ -62,8 +71,16 @@ function executeFileWithDeadlineUsing({ arguments: processArguments, cwd, enviro
62
71
  stdio: ["ignore", "pipe", "pipe"]
63
72
  });
64
73
  const processGroupId = child.pid;
74
+ const cancel = () => {
75
+ if (settled || cancellationRequested || deadlineExceeded || outputExceeded)
76
+ return;
77
+ cancellationRequested = true;
78
+ if (processGroupOwned && processGroupId != undefined)
79
+ beginTermination(processGroupId);
80
+ };
65
81
  child.stderr.on("data", stderr.receive);
66
82
  child.stdout.on("data", stdout.receive);
83
+ signal?.addEventListener("abort", cancel, { once: true });
67
84
  child.once("error", (error) => {
68
85
  launchError = error;
69
86
  });
@@ -73,14 +90,19 @@ function executeFileWithDeadlineUsing({ arguments: processArguments, cwd, enviro
73
90
  child.kill("SIGKILL");
74
91
  return;
75
92
  }
93
+ processGroupOwned = true;
94
+ if (cancellationRequested) {
95
+ beginTermination(processGroupId);
96
+ return;
97
+ }
76
98
  deadlineTimer = setTimeout(() => {
77
- if (settled)
99
+ if (settled || cancellationRequested || deadlineExceeded || outputExceeded)
78
100
  return;
79
101
  deadlineExceeded = true;
80
102
  beginTermination(processGroupId);
81
103
  }, timeoutMs);
82
104
  });
83
- child.once("close", (code, signal) => {
105
+ child.once("close", (code, closeSignal) => {
84
106
  settled = true;
85
107
  if (deadlineTimer != undefined)
86
108
  clearTimeout(deadlineTimer);
@@ -88,6 +110,7 @@ function executeFileWithDeadlineUsing({ arguments: processArguments, cwd, enviro
88
110
  clearTimeout(forceTimer);
89
111
  if (pipeTimer != undefined)
90
112
  clearTimeout(pipeTimer);
113
+ signal?.removeEventListener("abort", cancel);
91
114
  const capturedStderr = stderr.finish();
92
115
  const capturedStdout = stdout.finish();
93
116
  if (launchError) {
@@ -96,25 +119,35 @@ function executeFileWithDeadlineUsing({ arguments: processArguments, cwd, enviro
96
119
  else if (outputExceeded) {
97
120
  reject(Object.assign(new Error(`Subprocess exceeded its ${maxBuffer}-byte output capture limit.`), {
98
121
  code: "ERR_CHILD_PROCESS_STDIO_MAXBUFFER",
99
- signal,
122
+ signal: closeSignal,
100
123
  stderr: capturedStderr,
101
124
  stdout: capturedStdout
102
125
  }));
103
126
  }
127
+ else if (cancellationRequested) {
128
+ const cancellationError = Object.assign(new Error("Subprocess was cancelled."), {
129
+ code,
130
+ signal: closeSignal,
131
+ stderr: capturedStderr,
132
+ stdout: capturedStdout
133
+ });
134
+ cancellationFailures.add(cancellationError);
135
+ reject(cancellationError);
136
+ }
104
137
  else if (deadlineExceeded) {
105
138
  const timeoutError = Object.assign(new Error("Subprocess exceeded its owned deadline."), {
106
139
  code,
107
- signal,
140
+ signal: closeSignal,
108
141
  stderr: capturedStderr,
109
142
  stdout: capturedStdout
110
143
  });
111
144
  deadlineFailures.add(timeoutError);
112
145
  reject(timeoutError);
113
146
  }
114
- else if (code != 0 || signal != null) {
147
+ else if (code != 0 || closeSignal != null) {
115
148
  reject(Object.assign(new Error("Subprocess failed after launch."), {
116
149
  code,
117
- signal,
150
+ signal: closeSignal,
118
151
  stderr: capturedStderr,
119
152
  stdout: capturedStdout
120
153
  }));
@@ -124,7 +157,7 @@ function executeFileWithDeadlineUsing({ arguments: processArguments, cwd, enviro
124
157
  });
125
158
  /** Begins bounded termination after output capture crosses its limit. */
126
159
  function terminateForOutputLimit() {
127
- if (outputExceeded || settled)
160
+ if (settled || cancellationRequested || deadlineExceeded || outputExceeded)
128
161
  return;
129
162
  outputExceeded = true;
130
163
  if (processGroupId != undefined)
@@ -230,4 +263,12 @@ function signalOwnedProcessGroup(processGroupId, signal) {
230
263
  export function exceededOwnedDeadline(error) {
231
264
  return typeof error == "object" && error != null && deadlineFailures.has(error);
232
265
  }
233
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3VicHJvY2Vzcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zdWJwcm9jZXNzLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLEVBQUMsS0FBSyxFQUFDLE1BQU0sb0JBQW9CLENBQUE7QUFDeEMsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLHFCQUFxQixDQUFBO0FBRWpELE1BQU0sd0JBQXdCLEdBQUcsR0FBRyxDQUFBO0FBQ3BDLE1BQU0sbUJBQW1CLEdBQUcsR0FBRyxDQUFBO0FBQy9CLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQTtBQUV0Qzs7Ozs7Ozs7OztHQVVHO0FBQ0gsTUFBTSxVQUFVLHVCQUF1QixDQUFDLEtBQUs7SUFDM0MsT0FBTyw0QkFBNEIsQ0FBQyxLQUFLLEVBQUUsa0JBQWtCLENBQUMsQ0FBQTtBQUNoRSxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsNkJBQTZCLENBQUMsRUFBQyxxQkFBcUIsRUFBQztJQUNuRSxPQUFPLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyw0QkFBNEIsQ0FBQyxLQUFLLEVBQUUscUJBQXFCLENBQUMsQ0FBQTtBQUM5RSxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxTQUFTLDRCQUE0QixDQUFDLEVBQUMsU0FBUyxFQUFFLGdCQUFnQixFQUFFLEdBQUcsRUFBRSxXQUFXLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUMsRUFBRSxxQkFBcUI7SUFDNUksSUFBSSxPQUFPLENBQUMsUUFBUSxJQUFJLE9BQU8sRUFBRSxDQUFDO1FBQ2hDLE9BQU8sT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksS0FBSyxDQUFDLGlFQUFpRSxDQUFDLEVBQUU7WUFDaEgsSUFBSSxFQUFFLFNBQVM7WUFDZixNQUFNLEVBQUUsRUFBRTtZQUNWLE1BQU0sRUFBRSxFQUFFO1NBQ1gsQ0FBQyxD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QixDQUFDLGNBQWMsRUFBRSxNQUFNO0lBQ3JELElBQUksQ0FBQztRQUNILE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxjQUFjLEVBQUUsTUFBTSxDQUFDLENBQUE7SUFDdkMsQ0FBQztJQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7UUFDZixJQUFJLENBQUMsQ0FBQyxLQUFLLFlBQVksS0FBSyxJQUFJLE1BQU0sSUFBSSxLQUFLLElBQUksS0FBSyxDQUFDLElBQUksSUFBSSxPQUFPLENBQUM7WUFBRSxNQUFNLEtBQUssQ0FBQTtJQUN4RixDQUFDO0FBQ0gsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUscUJBQXFCLENBQUMsS0FBSztJQUN6QyxPQUFPLE9BQU8sS0FBSyxJQUFJLFFBQVEsSUFBSSxLQUFLLElBQUksSUFBSSxJQUFJLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQTtBQUNqRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCB7c3Bhd259IGZyb20gXCJub2RlOmNoaWxkX3Byb2Nlc3NcIlxuaW1wb3J0IHtTdHJpbmdEZWNvZGVyfSBmcm9tIFwibm9kZTpzdHJpbmdfZGVjb2RlclwiXG5cbmNvbnN0IGZvcmNlZFRlcm1pbmF0aW9uR3JhY2VNcyA9IDI1MFxuY29uc3QgcmV0YWluZWRQaXBlR3JhY2VNcyA9IDI1MFxuY29uc3QgZGVhZGxpbmVGYWlsdXJlcyA9IG5ldyBXZWFrU2V0KClcblxuLyoqXG4gKiBFeGVjdXRlcyBvbmUgZXhhY3QgZmlsZSB3aGlsZSBvd25pbmcgaXRzIGNvbXBsZXRlIGJvdW5kZWQgbGlmZWN5Y2xlLlxuICogQHBhcmFtIHtvYmplY3R9IGlucHV0IC0gUHJvY2VzcyByZXF1ZXN0LlxuICogQHBhcmFtIHtyZWFkb25seSBzdHJpbmdbXX0gaW5wdXQuYXJndW1lbnRzIC0gRXhhY3QgYXJndW1lbnQgYXJyYXkuXG4gKiBAcGFyYW0ge3N0cmluZ30gW2lucHV0LmN3ZF0gLSBXb3JraW5nIGRpcmVjdG9yeS5cbiAqIEBwYXJhbSB7UmVhZG9ubHk8UmVjb3JkPHN0cmluZywgc3RyaW5nPj59IGlucHV0LmVudmlyb25tZW50IC0gRXhhY3QgZW52aXJvbm1lbnQuXG4gKiBAcGFyYW0ge3N0cmluZ30gaW5wdXQuZXhlY3V0YWJsZSAtIEV4YWN0IGV4ZWN1dGFibGUgcGF0aC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBpbnB1dC5tYXhCdWZmZXIgLSBNYXhpbXVtIGJ5dGVzIGNhcHR1cmVkIHBlciBvdXRwdXQgc3RyZWFtLlxuICogQHBhcmFtIHtudW1iZXJ9IGlucHV0LnRpbWVvdXRNcyAtIERlYWRsaW5lIGJlZm9yZSB0ZXJtaW5hdGlvbiBiZWdpbnMuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTx7c3RkZXJyOiBzdHJpbmcsIHN0ZG91dDogc3RyaW5nfT59IE91dHB1dCBhZnRlciB0aGUgb3duZWQgcHJvY2VzcyBncm91cCBjbG9zZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleGVjdXRlRmlsZVdpdGhEZWFkbGluZShpbnB1dCkge1xuICByZXR1cm4gZXhlY3V0ZUZpbGVXaXRoRGVhZGxpbmVVc2luZyhpbnB1dCwgcmVnaXN0ZXJDaGlsZFNwYXduKVxufVxuXG4vKipcbiAqIENyZWF0ZXMgYW4gZXhlY3V0b3Igd2hvc2Ugc3Bhd24gb2JzZXJ2YXRpb24gYmVsb25ncyBvbmx5IHRvIHRoYXQgZXhlY3V0b3IgaW5zdGFuY2UuXG4gKiBAcGFyYW0ge29iamVjdH0gZGVwZW5kZW5jaWVzIC0gSW50ZXJuYWwgbGlmZWN5Y2xlIGRlcGVuZGVuY2llcy5cbiAqIEBwYXJhbSB7KGNoaWxkOiBpbXBvcnQoXCJub2RlOmNoaWxkX3Byb2Nlc3NcIikuQ2hpbGRQcm9jZXNzLCBsaXN0ZW5lcjogKCkgPT4gdm9pZCkgPT4gdm9pZH0gZGVwZW5kZW5jaWVzLnJlZ2lzdGVyU3Bhd25MaXN0ZW5lciAtIFJlZ2lzdGVycyBkZWFkbGluZSBpbml0aWFsaXphdGlvbi5cbiAqIEByZXR1cm5zIHt0eXBlb2YgZXhlY3V0ZUZpbGVXaXRoRGVhZGxpbmV9IE93bmVkIHN1YnByb2Nlc3MgZXhlY3V0b3IuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVFeGVjdXRlRmlsZVdpdGhEZWFkbGluZSh7cmVnaXN0ZXJTcGF3bkxpc3RlbmVyfSkge1xuICByZXR1cm4gKGlucHV0KSA9PiBleGVjdXRlRmlsZVdpdGhEZWFkbGluZVVzaW5nKGlucHV0LCByZWdpc3RlclNwYXduTGlzdGVuZXIpXG59XG5cbi8qKlxuICogRXhlY3V0ZXMgd2l0aCBleGFjdCBpbnN0YW5jZS1vd25lZCBzcGF3biBvYnNlcnZhdGlvbi5cbiAqIEBwYXJhbSB7UGFyYW1ldGVyczx0eXBlb2YgZXhlY3V0ZUZpbGVXaXRoRGVhZGxpbmU+WzBdfSBpbnB1dCAtIFByb2Nlc3MgcmVxdWVzdC5cbiAqIEBwYXJhbSB7KGNoaWxkOiBpbXBvcnQoXCJub2RlOmNoaWxkX3Byb2Nlc3NcIikuQ2hpbGRQcm9jZXNzLCBsaXN0ZW5lcjogKCkgPT4gdm9pZCkgPT4gdm9pZH0gcmVnaXN0ZXJTcGF3bkxpc3RlbmVyIC0gUmVnaXN0ZXJzIGRlYWRsaW5lIGluaXRpYWxpemF0aW9uLlxuICogQHJldHVybnMge1Byb21pc2U8e3N0ZGVycjogc3RyaW5nLCBzdGRvdXQ6IHN0cmluZ30+fSBPdXRwdXQgYWZ0ZXIgdGhlIG93bmVkIHByb2Nlc3MgZ3JvdXAgY2xvc2VzLlxuICovXG5mdW5jdGlvbiBleGVjdXRlRmlsZVdpdGhEZWFkbGluZVVzaW5nKHthcmd1bWVudHM6IHByb2Nlc3NBcmd1bWVudHMsIGN3ZCwgZW52aXJvbm1lbnQsIGV4ZWN1dGFibGUsIG1heEJ1ZmZlciwgdGltZW91dE1zfSwgcmVnaXN0ZXJTcGF3bkxpc3RlbmVyKSB7XG4gIGlmIChwcm9jZXNzLnBsYXRmb3JtID09IFwid2luMzJcIikge1xuICAgIHJldHVybiBQcm9taXNlLnJlamVjdChPYmplY3QuYXNzaWduKG5ldyBFcnJvcihcIk93bmVkIHByb2Nlc3MtdHJlZSB0ZXJtaW5hdGlvbiBpcyB1bmF2YWlsYWJsZSBvbiB0aGlzIHBsYXRmb3JtLlwiKSwge1xuICAgICAgY29kZTogXCJFTk9UU1VQXCIsXG4gICAgICBzdGRlcnI6IFwiXCIsXG4gICAgICBzdGRvdXQ6IFwiXCJcbiAgICB9KSlcbiAgfVxuXG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgLyoqIEB0eXBlIHtSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IHVuZGVmaW5lZH0gKi9cbiAgICBsZXQgZGVhZGxpbmVUaW1lclxuICAgIC8qKiBAdHlwZSB7UmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4gfCB1bmRlZmluZWR9ICovXG4gICAgbGV0IGZvcmNlVGltZXJcbiAgICAvKiogQHR5cGUge1JldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgdW5kZWZpbmVkfSAqL1xuICAgIGxldCBwaXBlVGltZXJcbiAgICAvKiogQHR5cGUge0Vycm9yIHwgdW5kZWZpbmVkfSAqL1xuICAgIGxldCBsYXVuY2hFcnJvclxuICAgIGxldCBkZWFkbGluZUV4Y2VlZGVkID0gZmFsc2VcbiAgICBsZXQgb3V0cHV0RXhjZWVkZWQgPSBmYWxzZVxuICAgIGxldCBzZXR0bGVkID0gZmFsc2VcbiAgICBjb25zdCBzdGRlcnIgPSBvdXRwdXRDYXB0dXJlKG1heEJ1ZmZlciwgKCkgPT4gdGVybWluYXRlRm9yT3V0cHV0TGltaXQoKSlcbiAgICBjb25zdCBzdGRvdXQgPSBvdXRwdXRDYXB0dXJlKG1heEJ1ZmZlciwgKCkgPT4gdGVybWluYXRlRm9yT3V0cHV0TGltaXQoKSlcbiAgICBjb25zdCBjaGlsZCA9IHNwYXduKGV4ZWN1dGFibGUsIFsuLi5wcm9jZXNzQXJndW1lbnRzXSwge1xuICAgICAgY3dkLFxuICAgICAgZGV0YWNoZWQ6IHRydWUsXG4gICAgICBlbnY6IGVudmlyb25tZW50LFxuICAgICAgc3RkaW86IFtcImlnbm9yZVwiLCBcInBpcGVcIiwgXCJwaXBlXCJdXG4gICAgfSlcbiAgICBjb25zdCBwcm9jZXNzR3JvdXBJZCA9IGNoaWxkLnBpZFxuXG4gICAgY2hpbGQuc3RkZXJyLm9uKFwiZGF0YVwiLCBzdGRlcnIucmVjZWl2ZSlcbiAgICBjaGlsZC5zdGRvdXQub24oXCJkYXRhXCIsIHN0ZG91dC5yZWNlaXZlKVxuICAgIGNoaWxkLm9uY2UoXCJlcnJvclwiLCAoZXJyb3IpID0+IHtcbiAgICAgIGxhdW5jaEVycm9yID0gZXJyb3JcbiAgICB9KVxuICAgIHJlZ2lzdGVyU3Bhd25MaXN0ZW5lcihjaGlsZCwgKCkgPT4ge1xuICAgICAgaWYgKHByb2Nlc3NHcm91cElkID09IHVuZGVmaW5lZCB8fCAhdmVyaWZ5T3duZWRQcm9jZXNzR3JvdXAocHJvY2Vzc0dyb3VwSWQpKSB7XG4gICAgICAgIGxhdW5jaEVycm9yID0gT2JqZWN0LmFzc2lnbihuZXcgRXJyb3IoXCJTcGF3bmVkIHN1YnByb2Nlc3MgZGlkIG5vdCBlc3RhYmxpc2ggaXRzIHJlcXVpcmVkIHByb2Nlc3MgZ3JvdXAuXCIpLCB7Y29kZTogXCJFTk9UU1VQXCJ9KVxuICAgICAgICBjaGlsZC5raWxsKFwiU0lHS0lMTFwiKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgZGVhZGxpbmVUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBpZiAoc2V0dGxlZCkgcmV0dXJuXG4gICAgICAgIGRlYWRsaW5lRXhjZWVkZWQgPSB0cnVlXG4gICAgICAgIGJlZ2luVGVybWluYXRpb24ocHJvY2Vzc0dyb3VwSWQpXG4gICAgICB9LCB0aW1lb3V0TXMpXG4gICAgfSlcbiAgICBjaGlsZC5vbmNlKFwiY2xvc2VcIiwgKGNvZGUsIHNpZ25hbCkgPT4ge1xuICAgICAgc2V0dGxlZCA9IHRydWVcbiAgICAgIGlmIChkZWFkbGluZVRpbWVyICE9IHVuZGVmaW5lZCkgY2xlYXJUaW1lb3V0KGRlYWRsaW5lVGltZXIpXG4gICAgICBpZiAoZm9yY2VUaW1lciAhPSB1bmRlZmluZWQpIGNsZWFyVGltZW91dChmb3JjZVRpbWVyKVxuICAgICAgaWYgKHBpcGVUaW1lciAhPSB1bmRlZmluZWQpIGNsZWFyVGltZW91dChwaXBlVGltZXIpXG4gICAgICBjb25zdCBjYXB0dXJlZFN0ZGVyciA9IHN0ZGVyci5maW5pc2goKVxuICAgICAgY29uc3QgY2FwdHVyZWRTdGRvdXQgPSBzdGRvdXQuZmluaXNoKClcblxuICAgICAgaWYgKGxhdW5jaEVycm9yKSB7XG4gICAgICAgIHJlamVjdChPYmplY3QuYXNzaWduKGxhdW5jaEVycm9yLCB7c3RkZXJyOiBjYXB0dXJlZFN0ZGVyciwgc3Rkb3V0OiBjYXB0dXJlZFN0ZG91dH0pKVxuICAgICAgfSBlbHNlIGlmIChvdXRwdXRFeGNlZWRlZCkge1xuICAgICAgICByZWplY3QoT2JqZWN0LmFzc2lnbihuZXcgRXJyb3IoYFN1YnByb2Nlc3MgZXhjZWVkZWQgaXRzICR7bWF4QnVmZmVyfS1ieXRlIG91dHB1dCBjYXB0dXJlIGxpbWl0LmApLCB7XG4gICAgICAgICAgY29kZTogXCJFUlJfQ0hJTERfUFJPQ0VTU19TVERJT19NQVhCVUZGRVJcIixcbiAgICAgICAgICBzaWduYWwsXG4gICAgICAgICAgc3RkZXJyOiBjYXB0dXJlZFN0ZGVycixcbiAgICAgICAgICBzdGRvdXQ6IGNhcHR1cmVkU3Rkb3V0XG4gICAgICAgIH0pKVxuICAgICAgfSBlbHNlIGlmIChkZWFkbGluZUV4Y2VlZGVkKSB7XG4gICAgICAgIGNvbnN0IHRpbWVvdXRFcnJvciA9IE9iamVjdC5hc3NpZ24obmV3IEVycm9yKFwiU3VicHJvY2VzcyBleGNlZWRlZCBpdHMgb3duZWQgZGVhZGxpbmUuXCIpLCB7XG4gICAgICAgICAgY29kZSxcbiAgICAgICAgICBzaWduYWwsXG4gICAgICAgICAgc3RkZXJyOiBjYXB0dXJlZFN0ZGVycixcbiAgICAgICAgICBzdGRvdXQ6IGNhcHR1cmVkU3Rkb3V0XG4gICAgICAgIH0pXG5cbiAgICAgICAgZGVhZGxpbmVGYWlsdXJlcy5hZGQodGltZW91dEVycm9yKVxuICAgICAgICByZWplY3QodGltZW91dEVycm9yKVxuICAgICAgfSBlbHNlIGlmIChjb2RlICE9IDAgfHwgc2lnbmFsICE9IG51bGwpIHtcbiAgICAgICAgcmVqZWN0KE9iamVjdC5hc3NpZ24obmV3IEVycm9yKFwiU3VicHJvY2VzcyBmYWlsZWQgYWZ0ZXIgbGF1bmNoLlwiKSwge1xuICAgICAgICAgIGNvZGUsXG4gICAgICAgICAgc2lnbmFsLFxuICAgICAgICAgIHN0ZGVycjogY2FwdHVyZWRTdGRlcnIsXG4gICAgICAgICAgc3Rkb3V0OiBjYXB0dXJlZFN0ZG91dFxuICAgICAgICB9KSlcbiAgICAgIH0gZWxzZSByZXNvbHZlKHtzdGRlcnI6IGNhcHR1cmVkU3RkZXJyLCBzdGRvdXQ6IGNhcHR1cmVkU3Rkb3V0fSlcbiAgICB9KVxuXG4gICAgLyoqIEJlZ2lucyBib3VuZGVkIHRlcm1pbmF0aW9uIGFmdGVyIG91dHB1dCBjYXB0dXJlIGNyb3NzZXMgaXRzIGxpbWl0LiAqL1xuICAgIGZ1bmN0aW9uIHRlcm1pbmF0ZUZvck91dHB1dExpbWl0KCkge1xuICAgICAgaWYgKG91dHB1dEV4Y2VlZGVkIHx8IHNldHRsZWQpIHJldHVyblxuICAgICAgb3V0cHV0RXhjZWVkZWQgPSB0cnVlXG4gICAgICBpZiAocHJvY2Vzc0dyb3VwSWQgIT0gdW5kZWZpbmVkKSBiZWdpblRlcm1pbmF0aW9uKHByb2Nlc3NHcm91cElkKVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNpZ25hbHMgdGhlIG93bmVkIGdyb3VwIG5vdyBhbmQgZXNjYWxhdGVzIGlmIGl0cyBpbmhlcml0ZWQgcGlwZXMgcmVtYWluIG9wZW4uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG93bmVkR3JvdXBJZCAtIFNwYXduLXZlcmlmaWVkIHByb2Nlc3MtZ3JvdXAgaWRlbnRpdHkuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmVnaW5UZXJtaW5hdGlvbihvd25lZEdyb3VwSWQpIHtcbiAgICAgIHNpZ25hbE93bmVkUHJvY2Vzc0dyb3VwKG93bmVkR3JvdXBJZCwgXCJTSUdURVJNXCIpXG4gICAgICBpZiAoIXNldHRsZWQgJiYgZm9yY2VUaW1lciA9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZm9yY2VUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIGlmIChzZXR0bGVkKSByZXR1cm5cbiAgICAgICAgICBzaWduYWxPd25lZFByb2Nlc3NHcm91cChvd25lZEdyb3VwSWQsIFwiU0lHS0lMTFwiKVxuICAgICAgICAgIHBpcGVUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHNldHRsZWQpIHJldHVyblxuICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LmRlc3Ryb3koKVxuICAgICAgICAgICAgY2hpbGQuc3RkZXJyLmRlc3Ryb3koKVxuICAgICAgICAgIH0sIHJldGFpbmVkUGlwZUdyYWNlTXMpXG4gICAgICAgIH0sIGZvcmNlZFRlcm1pbmF0aW9uR3JhY2VNcylcbiAgICAgIH1cbiAgICB9XG4gIH0pXG59XG5cbi8qKlxuICogUmVnaXN0ZXJzIHByb2R1Y3Rpb24gZGVhZGxpbmUgaW5pdGlhbGl6YXRpb24gb24gdGhlIGNoaWxkJ3MgcmVhbCBzcGF3biBldmVudC5cbiAqIEBwYXJhbSB7aW1wb3J0KFwibm9kZTpjaGlsZF9wcm9jZXNzXCIpLkNoaWxkUHJvY2Vzc30gY2hpbGQgLSBFeGFjdCBzcGF3bmVkIGNoaWxkLlxuICogQHBhcmFtIHsoKSA9PiB2b2lkfSBsaXN0ZW5lciAtIERlYWRsaW5lIGluaXRpYWxpemF0aW9uLlxuICovXG5mdW5jdGlvbiByZWdpc3RlckNoaWxkU3Bhd24oY2hpbGQsIGxpc3RlbmVyKSB7XG4gIGNoaWxkLm9uY2UoXCJzcGF3blwiLCBsaXN0ZW5lcilcbn1cblxuLyoqXG4gKiBDcmVhdGVzIG9uZSBieXRlLWJvdW5kZWQgVVRGLTggc3RyZWFtIGNhcHR1cmUuXG4gKiBAcGFyYW0ge251bWJlcn0gbWF4aW11bUJ5dGVzIC0gTWF4aW11bSBjYXB0dXJlZCBieXRlcy5cbiAqIEBwYXJhbSB7KCkgPT4gdm9pZH0gb25FeGNlZWRlZCAtIEZpcnN0LW92ZXJmbG93IGNhbGxiYWNrLlxuICogQHJldHVybnMge3tmaW5pc2g6ICgpID0+IHN0cmluZywgcmVjZWl2ZTogKGNodW5rOiBCdWZmZXIpID0+IHZvaWR9fSBDYXB0dXJlIGNhbGxiYWNrcy5cbiAqL1xuZnVuY3Rpb24gb3V0cHV0Q2FwdHVyZShtYXhpbXVtQnl0ZXMsIG9uRXhjZWVkZWQpIHtcbiAgY29uc3QgZGVjb2RlciA9IG5ldyBTdHJpbmdEZWNvZGVyKFwidXRmOFwiKVxuICBsZXQgYnl0ZUxlbmd0aCA9IDBcbiAgbGV0IGNvbnRlbnQgPSBcIlwiXG4gIGxldCBleGNlZWRlZCA9IGZhbHNlXG5cbiAgcmV0dXJuIHtcbiAgICBmaW5pc2goKSB7XG4gICAgICByZXR1cm4gY29udGVudCArIGRlY29kZXIuZW5kKClcbiAgICB9LFxuICAgIHJlY2VpdmUoY2h1bmspIHtcbiAgICAgIGlmIChleGNlZWRlZCkgcmV0dXJuXG4gICAgICBjb25zdCByZW1haW5pbmcgPSBtYXhpbXVtQnl0ZXMgLSBieXRlTGVuZ3RoXG5cbiAgICAgIGlmIChjaHVuay5sZW5ndGggPiByZW1haW5pbmcpIHtcbiAgICAgICAgaWYgKHJlbWFpbmluZyA+IDApIGNvbnRlbnQgKz0gZGVjb2Rlci53cml0ZShjaHVuay5zdWJhcnJheSgwLCByZW1haW5pbmcpKVxuICAgICAgICBleGNlZWRlZCA9IHRydWVcbiAgICAgICAgb25FeGNlZWRlZCgpXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgYnl0ZUxlbmd0aCArPSBjaHVuay5sZW5ndGhcbiAgICAgIGNvbnRlbnQgKz0gZGVjb2Rlci53cml0ZShjaHVuaylcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBWZXJpZmllcyB0aGF0IHRoZSBzcGF3bmVkIGNoaWxkIGlzIHRoZSBsaXZlIGxlYWRlciBvZiBpdHMgZGlzdGluY3QgUE9TSVggZ3JvdXAuXG4gKiBAcGFyYW0ge251bWJlcn0gcHJvY2Vzc0dyb3VwSWQgLSBTcGF3bi1yZXR1cm5lZCBjaGlsZCBQSUQgYW5kIHJlcXVpcmVkIGdyb3VwIElELlxuICogQHJldHVybnMge2Jvb2xlYW59IFdoZXRoZXIgdGhlIG93bmVkIGdyb3VwIGV4aXN0cy5cbiAqL1xuZnVuY3Rpb24gdmVyaWZ5T3duZWRQcm9jZXNzR3JvdXAocHJvY2Vzc0dyb3VwSWQpIHtcbiAgdHJ5IHtcbiAgICBwcm9jZXNzLmtpbGwoLXByb2Nlc3NHcm91cElkLCAwKVxuICAgIHJldHVybiB0cnVlXG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgJiYgXCJjb2RlXCIgaW4gZXJyb3IgJiYgZXJyb3IuY29kZSA9PSBcIkVTUkNIXCIpIHJldHVybiBmYWxzZVxuICAgIHRocm93IGVycm9yXG4gIH1cbn1cblxuLyoqXG4gKiBTaWduYWxzIG9ubHkgdGhlIHZlcmlmaWVkIHByb2Nlc3MgZ3JvdXAgY3JlYXRlZCBmb3IgdGhlIGV4YWN0IHNwYXduZWQgY2hpbGQuXG4gKiBAcGFyYW0ge251bWJlcn0gcHJvY2Vzc0dyb3VwSWQgLSBTcGF3bi1yZXR1cm5lZCBjaGlsZCBQSUQgYW5kIFBPU0lYIHByb2Nlc3MtZ3JvdXAgSUQuXG4gKiBAcGFyYW0ge1wiU0lHS0lMTFwiIHwgXCJTSUdURVJNXCJ9IHNpZ25hbCAtIExpZmVjeWNsZSBzaWduYWwuXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZnVuY3Rpb24gc2lnbmFsT3duZWRQcm9jZXNzR3JvdXAocHJvY2Vzc0dyb3VwSWQsIHNpZ25hbCkge1xuICB0cnkge1xuICAgIHByb2Nlc3Mua2lsbCgtcHJvY2Vzc0dyb3VwSWQsIHNpZ25hbClcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAoIShlcnJvciBpbnN0YW5jZW9mIEVycm9yICYmIFwiY29kZVwiIGluIGVycm9yICYmIGVycm9yLmNvZGUgPT0gXCJFU1JDSFwiKSkgdGhyb3cgZXJyb3JcbiAgfVxufVxuXG4vKipcbiAqIFJlcG9ydHMgd2hldGhlciB0aGlzIG1vZHVsZSdzIGRlYWRsaW5lIHRpbWVyIGluaXRpYXRlZCB0ZXJtaW5hdGlvbi5cbiAqIEBwYXJhbSB7dW5rbm93bn0gZXJyb3IgLSBTdWJwcm9jZXNzIGZhaWx1cmUuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gV2hldGhlciB0aGUgZmFpbHVyZSBiZWxvbmdzIHRvIGFuIG93bmVkIGRlYWRsaW5lLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXhjZWVkZWRPd25lZERlYWRsaW5lKGVycm9yKSB7XG4gIHJldHVybiB0eXBlb2YgZXJyb3IgPT0gXCJvYmplY3RcIiAmJiBlcnJvciAhPSBudWxsICYmIGRlYWRsaW5lRmFpbHVyZXMuaGFzKGVycm9yKVxufVxuIl19
266
+ /**
267
+ * Reports whether this module's cancellation signal initiated termination.
268
+ * @param {unknown} error - Subprocess failure.
269
+ * @returns {boolean} Whether the failure belongs to owned cancellation.
270
+ */
271
+ export function cancelledOwnedProcess(error) {
272
+ return typeof error == "object" && error != null && cancellationFailures.has(error);
273
+ }
274
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3VicHJvY2Vzcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zdWJwcm9jZXNzLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLEVBQUMsS0FBSyxFQUFDLE1BQU0sb0JBQW9CLENBQUE7QUFDeEMsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLHFCQUFxQixDQUFBO0FBRWpELE1BQU0sd0JBQXdCLEdBQUcsR0FBRyxDQUFBO0FBQ3BDLE1BQU0sbUJBQW1CLEdBQUcsR0FBRyxDQUFBO0FBQy9CLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQTtBQUN0QyxNQUFNLG9CQUFvQixHQUFHLElBQUksT0FBTyxFQUFFLENBQUE7QUFFMUM7Ozs7Ozs7Ozs7O0dBV0c7QUFDSCxNQUFNLFVBQVUsdUJBQXVCLENBQUMsS0FBSztJQUMzQyxPQUFPLDRCQUE0QixDQUFDLEtBQUssRUFBRSxrQkFBa0IsQ0FBQyxDQUFBO0FBQ2hFLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSw2QkFBNkIsQ0FBQyxFQUFDLHFCQUFxQixFQUFDO0lBQ25FLE9BQU8sQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLDRCQUE0QixDQUFDLEtBQUssRUFBRSxxQkFBcUIsQ0FBQyxDQUFBO0FBQzlFLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILFNBQVMsNEJBQTRCLENBQUMsRUFBQyxTQUFTLEVBQUUsZ0JBQWdCLEVBQUUsR0FBRyxFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUMsRUFBRSxxQkFBcUI7SUFDcEosSUFBSSxPQUFPLENBQUMsUUFBUSxJQUFJLE9BQU8sRUFBRSxDQUFDO1FBQ2hDLE9BQU8sT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksS0FBSyxDQUFDLGlFQUFpRSxDQUFDLEVBQUU7WUFDaEgsSUFBSSxFQUFFLFNB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LyBAdHMtY2hlY2tcblxuaW1wb3J0IHtzcGF3bn0gZnJvbSBcIm5vZGU6Y2hpbGRfcHJvY2Vzc1wiXG5pbXBvcnQge1N0cmluZ0RlY29kZXJ9IGZyb20gXCJub2RlOnN0cmluZ19kZWNvZGVyXCJcblxuY29uc3QgZm9yY2VkVGVybWluYXRpb25HcmFjZU1zID0gMjUwXG5jb25zdCByZXRhaW5lZFBpcGVHcmFjZU1zID0gMjUwXG5jb25zdCBkZWFkbGluZUZhaWx1cmVzID0gbmV3IFdlYWtTZXQoKVxuY29uc3QgY2FuY2VsbGF0aW9uRmFpbHVyZXMgPSBuZXcgV2Vha1NldCgpXG5cbi8qKlxuICogRXhlY3V0ZXMgb25lIGV4YWN0IGZpbGUgd2hpbGUgb3duaW5nIGl0cyBjb21wbGV0ZSBib3VuZGVkIGxpZmVjeWNsZS5cbiAqIEBwYXJhbSB7b2JqZWN0fSBpbnB1dCAtIFByb2Nlc3MgcmVxdWVzdC5cbiAqIEBwYXJhbSB7cmVhZG9ubHkgc3RyaW5nW119IGlucHV0LmFyZ3VtZW50cyAtIEV4YWN0IGFyZ3VtZW50IGFycmF5LlxuICogQHBhcmFtIHtzdHJpbmd9IFtpbnB1dC5jd2RdIC0gV29ya2luZyBkaXJlY3RvcnkuXG4gKiBAcGFyYW0ge1JlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHN0cmluZz4+fSBpbnB1dC5lbnZpcm9ubWVudCAtIEV4YWN0IGVudmlyb25tZW50LlxuICogQHBhcmFtIHtzdHJpbmd9IGlucHV0LmV4ZWN1dGFibGUgLSBFeGFjdCBleGVjdXRhYmxlIHBhdGguXG4gKiBAcGFyYW0ge251bWJlcn0gaW5wdXQubWF4QnVmZmVyIC0gTWF4aW11bSBieXRlcyBjYXB0dXJlZCBwZXIgb3V0cHV0IHN0cmVhbS5cbiAqIEBwYXJhbSB7QWJvcnRTaWduYWx9IFtpbnB1dC5zaWduYWxdIC0gT3B0aW9uYWwgb3duZWQgY2FuY2VsbGF0aW9uIHNpZ25hbC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBpbnB1dC50aW1lb3V0TXMgLSBEZWFkbGluZSBiZWZvcmUgdGVybWluYXRpb24gYmVnaW5zLlxuICogQHJldHVybnMge1Byb21pc2U8e3N0ZGVycjogc3RyaW5nLCBzdGRvdXQ6IHN0cmluZ30+fSBPdXRwdXQgYWZ0ZXIgdGhlIG93bmVkIHByb2Nlc3MgZ3JvdXAgY2xvc2VzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXhlY3V0ZUZpbGVXaXRoRGVhZGxpbmUoaW5wdXQpIHtcbiAgcmV0dXJuIGV4ZWN1dGVGaWxlV2l0aERlYWRsaW5lVXNpbmcoaW5wdXQsIHJlZ2lzdGVyQ2hpbGRTcGF3bilcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGFuIGV4ZWN1dG9yIHdob3NlIHNwYXduIG9ic2VydmF0aW9uIGJlbG9uZ3Mgb25seSB0byB0aGF0IGV4ZWN1dG9yIGluc3RhbmNlLlxuICogQHBhcmFtIHtvYmplY3R9IGRlcGVuZGVuY2llcyAtIEludGVybmFsIGxpZmVjeWNsZSBkZXBlbmRlbmNpZXMuXG4gKiBAcGFyYW0geyhjaGlsZDogaW1wb3J0KFwibm9kZTpjaGlsZF9wcm9jZXNzXCIpLkNoaWxkUHJvY2VzcywgbGlzdGVuZXI6ICgpID0+IHZvaWQpID0+IHZvaWR9IGRlcGVuZGVuY2llcy5yZWdpc3RlclNwYXduTGlzdGVuZXIgLSBSZWdpc3RlcnMgZGVhZGxpbmUgaW5pdGlhbGl6YXRpb24uXG4gKiBAcmV0dXJucyB7dHlwZW9mIGV4ZWN1dGVGaWxlV2l0aERlYWRsaW5lfSBPd25lZCBzdWJwcm9jZXNzIGV4ZWN1dG9yLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRXhlY3V0ZUZpbGVXaXRoRGVhZGxpbmUoe3JlZ2lzdGVyU3Bhd25MaXN0ZW5lcn0pIHtcbiAgcmV0dXJuIChpbnB1dCkgPT4gZXhlY3V0ZUZpbGVXaXRoRGVhZGxpbmVVc2luZyhpbnB1dCwgcmVnaXN0ZXJTcGF3bkxpc3RlbmVyKVxufVxuXG4vKipcbiAqIEV4ZWN1dGVzIHdpdGggZXhhY3QgaW5zdGFuY2Utb3duZWQgc3Bhd24gb2JzZXJ2YXRpb24uXG4gKiBAcGFyYW0ge1BhcmFtZXRlcnM8dHlwZW9mIGV4ZWN1dGVGaWxlV2l0aERlYWRsaW5lPlswXX0gaW5wdXQgLSBQcm9jZXNzIHJlcXVlc3QuXG4gKiBAcGFyYW0geyhjaGlsZDogaW1wb3J0KFwibm9kZTpjaGlsZF9wcm9jZXNzXCIpLkNoaWxkUHJvY2VzcywgbGlzdGVuZXI6ICgpID0+IHZvaWQpID0+IHZvaWR9IHJlZ2lzdGVyU3Bhd25MaXN0ZW5lciAtIFJlZ2lzdGVycyBkZWFkbGluZSBpbml0aWFsaXphdGlvbi5cbiAqIEByZXR1cm5zIHtQcm9taXNlPHtzdGRlcnI6IHN0cmluZywgc3Rkb3V0OiBzdHJpbmd9Pn0gT3V0cHV0IGFmdGVyIHRoZSBvd25lZCBwcm9jZXNzIGdyb3VwIGNsb3Nlcy5cbiAqL1xuZnVuY3Rpb24gZXhlY3V0ZUZpbGVXaXRoRGVhZGxpbmVVc2luZyh7YXJndW1lbnRzOiBwcm9jZXNzQXJndW1lbnRzLCBjd2QsIGVudmlyb25tZW50LCBleGVjdXRhYmxlLCBtYXhCdWZmZXIsIHNpZ25hbCwgdGltZW91dE1zfSwgcmVnaXN0ZXJTcGF3bkxpc3RlbmVyKSB7XG4gIGlmIChwcm9jZXNzLnBsYXRmb3JtID09IFwid2luMzJcIikge1xuICAgIHJldHVybiBQcm9taXNlLnJlamVjdChPYmplY3QuYXNzaWduKG5ldyBFcnJvcihcIk93bmVkIHByb2Nlc3MtdHJlZSB0ZXJtaW5hdGlvbiBpcyB1bmF2YWlsYWJsZSBvbiB0aGlzIHBsYXRmb3JtLlwiKSwge1xuICAgICAgY29kZTogXCJFTk9UU1VQXCIsXG4gICAgICBzdGRlcnI6IFwiXCIsXG4gICAgICBzdGRvdXQ6IFwiXCJcbiAgICB9KSlcbiAgfVxuICBpZiAoc2lnbmFsPy5hYm9ydGVkKSB7XG4gICAgY29uc3QgY2FuY2VsbGF0aW9uRXJyb3IgPSBPYmplY3QuYXNzaWduKG5ldyBFcnJvcihcIlN1YnByb2Nlc3Mgd2FzIGNhbmNlbGxlZCBiZWZvcmUgbGF1bmNoLlwiKSwge3N0ZGVycjogXCJcIiwgc3Rkb3V0OiBcIlwifSlcblxuICAgIGNhbmNlbGxhdGlvbkZhaWx1cmVzLmFkZChjYW5jZWxsYXRpb25FcnJvcilcbiAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoY2FuY2VsbGF0aW9uRXJyb3IpXG4gIH1cblxuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIC8qKiBAdHlwZSB7UmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4gfCB1bmRlZmluZWR9ICovXG4gICAgbGV0IGRlYWRsaW5lVGltZXJcbiAgICAvKiogQHR5cGUge1JldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgdW5kZWZpbmVkfSAqL1xuICAgIGxldCBmb3JjZVRpbWVyXG4gICAgLyoqIEB0eXBlIHtSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IHVuZGVmaW5lZH0gKi9cbiAgICBsZXQgcGlwZVRpbWVyXG4gICAgLyoqIEB0eXBlIHtFcnJvciB8IHVuZGVmaW5lZH0gKi9cbiAgICBsZXQgbGF1bmNoRXJyb3JcbiAgICBsZXQgY2FuY2VsbGF0aW9uUmVxdWVzdGVkID0gZmFsc2VcbiAgICBsZXQgZGVhZGxpbmVFeGNlZWRlZCA9IGZhbHNlXG4gICAgbGV0IG91dHB1dEV4Y2VlZGVkID0gZmFsc2VcbiAgICBsZXQgcHJvY2Vzc0dyb3VwT3duZWQgPSBmYWxzZVxuICAgIGxldCBzZXR0bGVkID0gZmFsc2VcbiAgICBjb25zdCBzdGRlcnIgPSBvdXRwdXRDYXB0dXJlKG1heEJ1ZmZlciwgKCkgPT4gdGVybWluYXRlRm9yT3V0cHV0TGltaXQoKSlcbiAgICBjb25zdCBzdGRvdXQgPSBvdXRwdXRDYXB0dXJlKG1heEJ1ZmZlciwgKCkgPT4gdGVybWluYXRlRm9yT3V0cHV0TGltaXQoKSlcbiAgICBjb25zdCBjaGlsZCA9IHNwYXduKGV4ZWN1dGFibGUsIFsuLi5wcm9jZXNzQXJndW1lbnRzXSwge1xuICAgICAgY3dkLFxuICAgICAgZGV0YWNoZWQ6IHRydWUsXG4gICAgICBlbnY6IGVudmlyb25tZW50LFxuICAgICAgc3RkaW86IFtcImlnbm9yZVwiLCBcInBpcGVcIiwgXCJwaXBlXCJdXG4gICAgfSlcbiAgICBjb25zdCBwcm9jZXNzR3JvdXBJZCA9IGNoaWxkLnBpZFxuICAgIGNvbnN0IGNhbmNlbCA9ICgpID0+IHtcbiAgICAgIGlmIChzZXR0bGVkIHx8IGNhbmNlbGxhdGlvblJlcXVlc3RlZCB8fCBkZWFkbGluZUV4Y2VlZGVkIHx8IG91dHB1dEV4Y2VlZGVkKSByZXR1cm5cbiAgICAgIGNhbmNlbGxhdGlvblJlcXVlc3RlZCA9IHRydWVcbiAgICAgIGlmIChwcm9jZXNzR3JvdXBPd25lZCAmJiBwcm9jZXNzR3JvdXBJZCAhPSB1bmRlZmluZWQpIGJlZ2luVGVybWluYXRpb24ocHJvY2Vzc0dyb3VwSWQpXG4gICAgfVxuXG4gICAgY2hpbGQuc3RkZXJyLm9uKFwiZGF0YVwiLCBzdGRlcnIucmVjZWl2ZSlcbiAgICBjaGlsZC5zdGRvdXQub24oXCJkYXRhXCIsIHN0ZG91dC5yZWNlaXZlKVxuICAgIHNpZ25hbD8uYWRkRXZlbnRMaXN0ZW5lcihcImFib3J0XCIsIGNhbmNlbCwge29uY2U6IHRydWV9KVxuICAgIGNoaWxkLm9uY2UoXCJlcnJvclwiLCAoZXJyb3IpID0+IHtcbiAgICAgIGxhdW5jaEVycm9yID0gZXJyb3JcbiAgICB9KVxuICAgIHJlZ2lzdGVyU3Bhd25MaXN0ZW5lcihjaGlsZCwgKCkgPT4ge1xuICAgICAgaWYgKHByb2Nlc3NHcm91cElkID09IHVuZGVmaW5lZCB8fCAhdmVyaWZ5T3duZWRQcm9jZXNzR3JvdXAocHJvY2Vzc0dyb3VwSWQpKSB7XG4gICAgICAgIGxhdW5jaEVycm9yID0gT2JqZWN0LmFzc2lnbihuZXcgRXJyb3IoXCJTcGF3bmVkIHN1YnByb2Nlc3MgZGlkIG5vdCBlc3RhYmxpc2ggaXRzIHJlcXVpcmVkIHByb2Nlc3MgZ3JvdXAuXCIpLCB7Y29kZTogXCJFTk9UU1VQXCJ9KVxuICAgICAgICBjaGlsZC5raWxsKFwiU0lHS0lMTFwiKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICAgIHByb2Nlc3NHcm91cE93bmVkID0gdHJ1ZVxuICAgICAgaWYgKGNhbmNlbGxhdGlvblJlcXVlc3RlZCkge1xuICAgICAgICBiZWdpblRlcm1pbmF0aW9uKHByb2Nlc3NHcm91cElkKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgZGVhZGxpbmVUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBpZiAoc2V0dGxlZCB8fCBjYW5jZWxsYXRpb25SZXF1ZXN0ZWQgfHwgZGVhZGxpbmVFeGNlZWRlZCB8fCBvdXRwdXRFeGNlZWRlZCkgcmV0dXJuXG4gICAgICAgIGRlYWRsaW5lRXhjZWVkZWQgPSB0cnVlXG4gICAgICAgIGJlZ2luVGVybWluYXRpb24ocHJvY2Vzc0dyb3VwSWQpXG4gICAgICB9LCB0aW1lb3V0TXMpXG4gICAgfSlcbiAgICBjaGlsZC5vbmNlKFwiY2xvc2VcIiwgKGNvZGUsIGNsb3NlU2lnbmFsKSA9PiB7XG4gICAgICBzZXR0bGVkID0gdHJ1ZVxuICAgICAgaWYgKGRlYWRsaW5lVGltZXIgIT0gdW5kZWZpbmVkKSBjbGVhclRpbWVvdXQoZGVhZGxpbmVUaW1lcilcbiAgICAgIGlmIChmb3JjZVRpbWVyICE9IHVuZGVmaW5lZCkgY2xlYXJUaW1lb3V0KGZvcmNlVGltZXIpXG4gICAgICBpZiAocGlwZVRpbWVyICE9IHVuZGVmaW5lZCkgY2xlYXJUaW1lb3V0KHBpcGVUaW1lcilcbiAgICAgIHNpZ25hbD8ucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImFib3J0XCIsIGNhbmNlbClcbiAgICAgIGNvbnN0IGNhcHR1cmVkU3RkZXJyID0gc3RkZXJyLmZpbmlzaCgpXG4gICAgICBjb25zdCBjYXB0dXJlZFN0ZG91dCA9IHN0ZG91dC5maW5pc2goKVxuXG4gICAgICBpZiAobGF1bmNoRXJyb3IpIHtcbiAgICAgICAgcmVqZWN0KE9iamVjdC5hc3NpZ24obGF1bmNoRXJyb3IsIHtzdGRlcnI6IGNhcHR1cmVkU3RkZXJyLCBzdGRvdXQ6IGNhcHR1cmVkU3Rkb3V0fSkpXG4gICAgICB9IGVsc2UgaWYgKG91dHB1dEV4Y2VlZGVkKSB7XG4gICAgICAgIHJlamVjdChPYmplY3QuYXNzaWduKG5ldyBFcnJvcihgU3VicHJvY2VzcyBleGNlZWRlZCBpdHMgJHttYXhCdWZmZXJ9LWJ5dGUgb3V0cHV0IGNhcHR1cmUgbGltaXQuYCksIHtcbiAgICAgICAgICBjb2RlOiBcIkVSUl9DSElMRF9QUk9DRVNTX1NURElPX01BWEJVRkZFUlwiLFxuICAgICAgICAgIHNpZ25hbDogY2xvc2VTaWduYWwsXG4gICAgICAgICAgc3RkZXJyOiBjYXB0dXJlZFN0ZGVycixcbiAgICAgICAgICBzdGRvdXQ6IGNhcHR1cmVkU3Rkb3V0XG4gICAgICAgIH0pKVxuICAgICAgfSBlbHNlIGlmIChjYW5jZWxsYXRpb25SZXF1ZXN0ZWQpIHtcbiAgICAgICAgY29uc3QgY2FuY2VsbGF0aW9uRXJyb3IgPSBPYmplY3QuYXNzaWduKG5ldyBFcnJvcihcIlN1YnByb2Nlc3Mgd2FzIGNhbmNlbGxlZC5cIiksIHtcbiAgICAgICAgICBjb2RlLFxuICAgICAgICAgIHNpZ25hbDogY2xvc2VTaWduYWwsXG4gICAgICAgICAgc3RkZXJyOiBjYXB0dXJlZFN0ZGVycixcbiAgICAgICAgICBzdGRvdXQ6IGNhcHR1cmVkU3Rkb3V0XG4gICAgICAgIH0pXG5cbiAgICAgICAgY2FuY2VsbGF0aW9uRmFpbHVyZXMuYWRkKGNhbmNlbGxhdGlvbkVycm9yKVxuICAgICAgICByZWplY3QoY2FuY2VsbGF0aW9uRXJyb3IpXG4gICAgICB9IGVsc2UgaWYgKGRlYWRsaW5lRXhjZWVkZWQpIHtcbiAgICAgICAgY29uc3QgdGltZW91dEVycm9yID0gT2JqZWN0LmFzc2lnbihuZXcgRXJyb3IoXCJTdWJwcm9jZXNzIGV4Y2VlZGVkIGl0cyBvd25lZCBkZWFkbGluZS5cIiksIHtcbiAgICAgICAgICBjb2RlLFxuICAgICAgICAgIHNpZ25hbDogY2xvc2VTaWduYWwsXG4gICAgICAgICAgc3RkZXJyOiBjYXB0dXJlZFN0ZGVycixcbiAgICAgICAgICBzdGRvdXQ6IGNhcHR1cmVkU3Rkb3V0XG4gICAgICAgIH0pXG5cbiAgICAgICAgZGVhZGxpbmVGYWlsdXJlcy5hZGQodGltZW91dEVycm9yKVxuICAgICAgICByZWplY3QodGltZW91dEVycm9yKVxuICAgICAgfSBlbHNlIGlmIChjb2RlICE9IDAgfHwgY2xvc2VTaWduYWwgIT0gbnVsbCkge1xuICAgICAgICByZWplY3QoT2JqZWN0LmFzc2lnbihuZXcgRXJyb3IoXCJTdWJwcm9jZXNzIGZhaWxlZCBhZnRlciBsYXVuY2guXCIpLCB7XG4gICAgICAgICAgY29kZSxcbiAgICAgICAgICBzaWduYWw6IGNsb3NlU2lnbmFsLFxuICAgICAgICAgIHN0ZGVycjogY2FwdHVyZWRTdGRlcnIsXG4gICAgICAgICAgc3Rkb3V0OiBjYXB0dXJlZFN0ZG91dFxuICAgICAgICB9KSlcbiAgICAgIH0gZWxzZSByZXNvbHZlKHtzdGRlcnI6IGNhcHR1cmVkU3RkZXJyLCBzdGRvdXQ6IGNhcHR1cmVkU3Rkb3V0fSlcbiAgICB9KVxuXG4gICAgLyoqIEJlZ2lucyBib3VuZGVkIHRlcm1pbmF0aW9uIGFmdGVyIG91dHB1dCBjYXB0dXJlIGNyb3NzZXMgaXRzIGxpbWl0LiAqL1xuICAgIGZ1bmN0aW9uIHRlcm1pbmF0ZUZvck91dHB1dExpbWl0KCkge1xuICAgICAgaWYgKHNldHRsZWQgfHwgY2FuY2VsbGF0aW9uUmVxdWVzdGVkIHx8IGRlYWRsaW5lRXhjZWVkZWQgfHwgb3V0cHV0RXhjZWVkZWQpIHJldHVyblxuICAgICAgb3V0cHV0RXhjZWVkZWQgPSB0cnVlXG4gICAgICBpZiAocHJvY2Vzc0dyb3VwSWQgIT0gdW5kZWZpbmVkKSBiZWdpblRlcm1pbmF0aW9uKHByb2Nlc3NHcm91cElkKVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNpZ25hbHMgdGhlIG93bmVkIGdyb3VwIG5vdyBhbmQgZXNjYWxhdGVzIGlmIGl0cyBpbmhlcml0ZWQgcGlwZXMgcmVtYWluIG9wZW4uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG93bmVkR3JvdXBJZCAtIFNwYXduLXZlcmlmaWVkIHByb2Nlc3MtZ3JvdXAgaWRlbnRpdHkuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmVnaW5UZXJtaW5hdGlvbihvd25lZEdyb3VwSWQpIHtcbiAgICAgIHNpZ25hbE93bmVkUHJvY2Vzc0dyb3VwKG93bmVkR3JvdXBJZCwgXCJTSUdURVJNXCIpXG4gICAgICBpZiAoIXNldHRsZWQgJiYgZm9yY2VUaW1lciA9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZm9yY2VUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIGlmIChzZXR0bGVkKSByZXR1cm5cbiAgICAgICAgICBzaWduYWxPd25lZFByb2Nlc3NHcm91cChvd25lZEdyb3VwSWQsIFwiU0lHS0lMTFwiKVxuICAgICAgICAgIHBpcGVUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHNldHRsZWQpIHJldHVyblxuICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LmRlc3Ryb3koKVxuICAgICAgICAgICAgY2hpbGQuc3RkZXJyLmRlc3Ryb3koKVxuICAgICAgICAgIH0sIHJldGFpbmVkUGlwZUdyYWNlTXMpXG4gICAgICAgIH0sIGZvcmNlZFRlcm1pbmF0aW9uR3JhY2VNcylcbiAgICAgIH1cbiAgICB9XG4gIH0pXG59XG5cbi8qKlxuICogUmVnaXN0ZXJzIHByb2R1Y3Rpb24gZGVhZGxpbmUgaW5pdGlhbGl6YXRpb24gb24gdGhlIGNoaWxkJ3MgcmVhbCBzcGF3biBldmVudC5cbiAqIEBwYXJhbSB7aW1wb3J0KFwibm9kZTpjaGlsZF9wcm9jZXNzXCIpLkNoaWxkUHJvY2Vzc30gY2hpbGQgLSBFeGFjdCBzcGF3bmVkIGNoaWxkLlxuICogQHBhcmFtIHsoKSA9PiB2b2lkfSBsaXN0ZW5lciAtIERlYWRsaW5lIGluaXRpYWxpemF0aW9uLlxuICovXG5mdW5jdGlvbiByZWdpc3RlckNoaWxkU3Bhd24oY2hpbGQsIGxpc3RlbmVyKSB7XG4gIGNoaWxkLm9uY2UoXCJzcGF3blwiLCBsaXN0ZW5lcilcbn1cblxuLyoqXG4gKiBDcmVhdGVzIG9uZSBieXRlLWJvdW5kZWQgVVRGLTggc3RyZWFtIGNhcHR1cmUuXG4gKiBAcGFyYW0ge251bWJlcn0gbWF4aW11bUJ5dGVzIC0gTWF4aW11bSBjYXB0dXJlZCBieXRlcy5cbiAqIEBwYXJhbSB7KCkgPT4gdm9pZH0gb25FeGNlZWRlZCAtIEZpcnN0LW92ZXJmbG93IGNhbGxiYWNrLlxuICogQHJldHVybnMge3tmaW5pc2g6ICgpID0+IHN0cmluZywgcmVjZWl2ZTogKGNodW5rOiBCdWZmZXIpID0+IHZvaWR9fSBDYXB0dXJlIGNhbGxiYWNrcy5cbiAqL1xuZnVuY3Rpb24gb3V0cHV0Q2FwdHVyZShtYXhpbXVtQnl0ZXMsIG9uRXhjZWVkZWQpIHtcbiAgY29uc3QgZGVjb2RlciA9IG5ldyBTdHJpbmdEZWNvZGVyKFwidXRmOFwiKVxuICBsZXQgYnl0ZUxlbmd0aCA9IDBcbiAgbGV0IGNvbnRlbnQgPSBcIlwiXG4gIGxldCBleGNlZWRlZCA9IGZhbHNlXG5cbiAgcmV0dXJuIHtcbiAgICBmaW5pc2goKSB7XG4gICAgICByZXR1cm4gY29udGVudCArIGRlY29kZXIuZW5kKClcbiAgICB9LFxuICAgIHJlY2VpdmUoY2h1bmspIHtcbiAgICAgIGlmIChleGNlZWRlZCkgcmV0dXJuXG4gICAgICBjb25zdCByZW1haW5pbmcgPSBtYXhpbXVtQnl0ZXMgLSBieXRlTGVuZ3RoXG5cbiAgICAgIGlmIChjaHVuay5sZW5ndGggPiByZW1haW5pbmcpIHtcbiAgICAgICAgaWYgKHJlbWFpbmluZyA+IDApIGNvbnRlbnQgKz0gZGVjb2Rlci53cml0ZShjaHVuay5zdWJhcnJheSgwLCByZW1haW5pbmcpKVxuICAgICAgICBleGNlZWRlZCA9IHRydWVcbiAgICAgICAgb25FeGNlZWRlZCgpXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgYnl0ZUxlbmd0aCArPSBjaHVuay5sZW5ndGhcbiAgICAgIGNvbnRlbnQgKz0gZGVjb2Rlci53cml0ZShjaHVuaylcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBWZXJpZmllcyB0aGF0IHRoZSBzcGF3bmVkIGNoaWxkIGlzIHRoZSBsaXZlIGxlYWRlciBvZiBpdHMgZGlzdGluY3QgUE9TSVggZ3JvdXAuXG4gKiBAcGFyYW0ge251bWJlcn0gcHJvY2Vzc0dyb3VwSWQgLSBTcGF3bi1yZXR1cm5lZCBjaGlsZCBQSUQgYW5kIHJlcXVpcmVkIGdyb3VwIElELlxuICogQHJldHVybnMge2Jvb2xlYW59IFdoZXRoZXIgdGhlIG93bmVkIGdyb3VwIGV4aXN0cy5cbiAqL1xuZnVuY3Rpb24gdmVyaWZ5T3duZWRQcm9jZXNzR3JvdXAocHJvY2Vzc0dyb3VwSWQpIHtcbiAgdHJ5IHtcbiAgICBwcm9jZXNzLmtpbGwoLXByb2Nlc3NHcm91cElkLCAwKVxuICAgIHJldHVybiB0cnVlXG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgJiYgXCJjb2RlXCIgaW4gZXJyb3IgJiYgZXJyb3IuY29kZSA9PSBcIkVTUkNIXCIpIHJldHVybiBmYWxzZVxuICAgIHRocm93IGVycm9yXG4gIH1cbn1cblxuLyoqXG4gKiBTaWduYWxzIG9ubHkgdGhlIHZlcmlmaWVkIHByb2Nlc3MgZ3JvdXAgY3JlYXRlZCBmb3IgdGhlIGV4YWN0IHNwYXduZWQgY2hpbGQuXG4gKiBAcGFyYW0ge251bWJlcn0gcHJvY2Vzc0dyb3VwSWQgLSBTcGF3bi1yZXR1cm5lZCBjaGlsZCBQSUQgYW5kIFBPU0lYIHByb2Nlc3MtZ3JvdXAgSUQuXG4gKiBAcGFyYW0ge1wiU0lHS0lMTFwiIHwgXCJTSUdURVJNXCJ9IHNpZ25hbCAtIExpZmVjeWNsZSBzaWduYWwuXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZnVuY3Rpb24gc2lnbmFsT3duZWRQcm9jZXNzR3JvdXAocHJvY2Vzc0dyb3VwSWQsIHNpZ25hbCkge1xuICB0cnkge1xuICAgIHByb2Nlc3Mua2lsbCgtcHJvY2Vzc0dyb3VwSWQsIHNpZ25hbClcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAoIShlcnJvciBpbnN0YW5jZW9mIEVycm9yICYmIFwiY29kZVwiIGluIGVycm9yICYmIGVycm9yLmNvZGUgPT0gXCJFU1JDSFwiKSkgdGhyb3cgZXJyb3JcbiAgfVxufVxuXG4vKipcbiAqIFJlcG9ydHMgd2hldGhlciB0aGlzIG1vZHVsZSdzIGRlYWRsaW5lIHRpbWVyIGluaXRpYXRlZCB0ZXJtaW5hdGlvbi5cbiAqIEBwYXJhbSB7dW5rbm93bn0gZXJyb3IgLSBTdWJwcm9jZXNzIGZhaWx1cmUuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gV2hldGhlciB0aGUgZmFpbHVyZSBiZWxvbmdzIHRvIGFuIG93bmVkIGRlYWRsaW5lLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXhjZWVkZWRPd25lZERlYWRsaW5lKGVycm9yKSB7XG4gIHJldHVybiB0eXBlb2YgZXJyb3IgPT0gXCJvYmplY3RcIiAmJiBlcnJvciAhPSBudWxsICYmIGRlYWRsaW5lRmFpbHVyZXMuaGFzKGVycm9yKVxufVxuXG4vKipcbiAqIFJlcG9ydHMgd2hldGhlciB0aGlzIG1vZHVsZSdzIGNhbmNlbGxhdGlvbiBzaWduYWwgaW5pdGlhdGVkIHRlcm1pbmF0aW9uLlxuICogQHBhcmFtIHt1bmtub3dufSBlcnJvciAtIFN1YnByb2Nlc3MgZmFpbHVyZS5cbiAqIEByZXR1cm5zIHtib29sZWFufSBXaGV0aGVyIHRoZSBmYWlsdXJlIGJlbG9uZ3MgdG8gb3duZWQgY2FuY2VsbGF0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2FuY2VsbGVkT3duZWRQcm9jZXNzKGVycm9yKSB7XG4gIHJldHVybiB0eXBlb2YgZXJyb3IgPT0gXCJvYmplY3RcIiAmJiBlcnJvciAhPSBudWxsICYmIGNhbmNlbGxhdGlvbkZhaWx1cmVzLmhhcyhlcnJvcilcbn1cbiJdfQ==
@@ -0,0 +1,52 @@
1
+ import { executeFileWithDeadline } from "./subprocess.js";
2
+ /**
3
+ * Creates and validates one target-owned developer check plan.
4
+ * @param {object} input - Exact staged target context.
5
+ * @param {import("./semantic/types.js").GeneratedArtifactSet} input.artifacts - Validated staged artifacts.
6
+ * @param {string} input.buildPath - Exact generation-scoped target build subtree.
7
+ * @param {string} input.projectId - Exact project identity.
8
+ * @param {string} input.sourcePath - Exact generation-scoped target source subtree.
9
+ * @param {string} input.targetId - Exact project target identity.
10
+ * @param {readonly import("./semantic/types.js").DiscoveredToolchain[]} input.tools - Discovered immutable tool records.
11
+ * @returns {import("./semantic/types.js").TargetCheckPlan} Validated immutable plan.
12
+ */
13
+ export declare function createTargetCheckPlan(input: {
14
+ artifacts: import("./semantic/types.js").GeneratedArtifactSet;
15
+ buildPath: string;
16
+ projectId: string;
17
+ sourcePath: string;
18
+ targetId: string;
19
+ tools: readonly import("./semantic/types.js").DiscoveredToolchain[];
20
+ }): import("./semantic/types.js").TargetCheckPlan;
21
+ /**
22
+ * Owns ordered check subprocesses and settles only after each child closes.
23
+ */
24
+ export declare class TargetCheckRunner {
25
+ /**
26
+ * Runs one already-staged immutable plan without executing generated application code.
27
+ * @param {import("./semantic/types.js").TargetCheckPlan} plan - Target-owned plan.
28
+ * @param {{onStage?: (result: import("./semantic/types.js").TargetCheckStageResult) => void, signal?: AbortSignal, timeoutMs?: number}} [options] - Lifecycle controls.
29
+ * @returns {Promise<import("./semantic/types.js").TargetCheckResult>} Successful check evidence and output metadata.
30
+ */
31
+ run(plan: import("./semantic/types.js").TargetCheckPlan, options?: {
32
+ onStage?: (result: import("./semantic/types.js").TargetCheckStageResult) => void;
33
+ signal?: AbortSignal;
34
+ timeoutMs?: number;
35
+ }): Promise<import("./semantic/types.js").TargetCheckResult>;
36
+ }
37
+ /**
38
+ * Creates a runner with focused instance-owned dependencies.
39
+ * @param {{execute: typeof executeFileWithDeadline, now: () => number}} dependencies - Testable lifecycle collaborators.
40
+ * @returns {TargetCheckRunner} Runner.
41
+ */
42
+ export declare function createTargetCheckRunner(dependencies: {
43
+ execute: typeof executeFileWithDeadline;
44
+ now: () => number;
45
+ }): TargetCheckRunner;
46
+ /**
47
+ * Validates a complete immutable plan before any process starts.
48
+ * @param {unknown} candidate - Candidate plan.
49
+ * @returns {import("./semantic/types.js").TargetCheckPlan} Exact validated plan.
50
+ */
51
+ export declare function validateTargetCheckPlan(candidate: unknown): import("./semantic/types.js").TargetCheckPlan;
52
+ //# sourceMappingURL=target-check.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"target-check.d.ts","sourceRoot":"","sources":["../../src/target-check.js"],"names":[],"mappings":"AAQA,OAAO,EAA+C,uBAAuB,EAAC,MAAM,iBAAiB,CAAA;AAgBrG;;;;;;;;;;GAUG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EARxC;IAAkE,SAAS,EAAnE,OAAO,qBAAqB,EAAE,oBAAoB,CAC1D;IAAsB,SAAS,EAAvB,MAAM,CACd;IAAsB,SAAS,EAAvB,MAAM,CACd;IAAsB,UAAU,EAAxB,MAAM,CACd;IAAsB,QAAQ,EAAtB,MAAM,CACd;IAA4E,KAAK,EAAzE,SAAS,OAAO,qBAAqB,EAAE,mBAAmB,EAAE,CACpE;CAEwC,GAF9B,OAAO,qBAAqB,EAAE,eAAe,CAuEzD;AAED;;GAEG;AACH,qBAAa,iBAAiB;IAC5B;;;;;OAKG;IACG,GAAG,CAAC,IAAI,EAJH,OAAO,qBAAqB,EAAE,eAI3B,EAAE,OAAO,AAHpB,CACA,EADQ;QAAC,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,qBAAqB,EAAE,sBAAsB,KAAK,IAAI,CAAC;QAAC,MAAM,CAAC,EAAE,WAAW,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAG1G,GAFf,OAAO,CAAC,OAAO,qBAAqB,EAAE,iBAAiB,CAAC,CA8FpE;CACF;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,YAAY,EAHzC;IAAC,OAAO,EAAE,OAAO,uBAAuB,CAAC;IAAC,GAAG,EAAE,MAAM,MAAM,CAAA;CAGlB,GAFvC,iBAAiB,CAW7B;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,SAAS,EAHtC,OAGsC,GAFpC,OAAO,qBAAqB,EAAE,eAAe,CA4IzD"}