semantifold 0.3.0 → 0.5.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 (303) hide show
  1. package/README.md +61 -15
  2. package/build/index.d.ts +52 -2
  3. package/build/index.d.ts.map +1 -1
  4. package/build/index.js +60 -8
  5. package/build/src/artifact-path.d.ts +23 -1
  6. package/build/src/artifact-path.d.ts.map +1 -1
  7. package/build/src/artifact-path.js +45 -3
  8. package/build/src/artifacts.d.ts.map +1 -1
  9. package/build/src/artifacts.js +66 -1
  10. package/build/src/backends/android.d.ts +49 -0
  11. package/build/src/backends/android.d.ts.map +1 -0
  12. package/build/src/backends/android.js +1274 -0
  13. package/build/src/backends/c-validation.d.ts.map +1 -1
  14. package/build/src/backends/c-validation.js +7 -3
  15. package/build/src/backends/cpp-validation.d.ts.map +1 -1
  16. package/build/src/backends/cpp-validation.js +7 -3
  17. package/build/src/backends/csharp.js +7 -1
  18. package/build/src/backends/dart-runtime.d.ts +2 -0
  19. package/build/src/backends/dart-runtime.d.ts.map +1 -0
  20. package/build/src/backends/dart-runtime.js +41 -0
  21. package/build/src/backends/dart.d.ts +20 -0
  22. package/build/src/backends/dart.d.ts.map +1 -0
  23. package/build/src/backends/dart.js +321 -0
  24. package/build/src/backends/effects.d.ts +60 -0
  25. package/build/src/backends/effects.d.ts.map +1 -0
  26. package/build/src/backends/effects.js +746 -0
  27. package/build/src/backends/go.js +18 -4
  28. package/build/src/backends/identifiers.d.ts +36 -4
  29. package/build/src/backends/identifiers.d.ts.map +1 -1
  30. package/build/src/backends/identifiers.js +160 -10
  31. package/build/src/backends/index.d.ts.map +1 -1
  32. package/build/src/backends/index.js +27 -4
  33. package/build/src/backends/ios.d.ts +68 -0
  34. package/build/src/backends/ios.d.ts.map +1 -0
  35. package/build/src/backends/ios.js +1503 -0
  36. package/build/src/backends/java.d.ts.map +1 -1
  37. package/build/src/backends/java.js +429 -36
  38. package/build/src/backends/javascript.d.ts +6 -0
  39. package/build/src/backends/javascript.d.ts.map +1 -1
  40. package/build/src/backends/javascript.js +380 -24
  41. package/build/src/backends/kotlin-runtime.d.ts +3 -0
  42. package/build/src/backends/kotlin-runtime.d.ts.map +1 -0
  43. package/build/src/backends/kotlin-runtime.js +29 -0
  44. package/build/src/backends/kotlin.d.ts +33 -0
  45. package/build/src/backends/kotlin.d.ts.map +1 -0
  46. package/build/src/backends/kotlin.js +138 -0
  47. package/build/src/backends/native-validation.d.ts +2 -2
  48. package/build/src/backends/native-validation.d.ts.map +1 -1
  49. package/build/src/backends/native-validation.js +2 -2
  50. package/build/src/backends/ordered-expressions.d.ts.map +1 -1
  51. package/build/src/backends/ordered-expressions.js +39 -7
  52. package/build/src/backends/php-stdlib-support.d.ts +19 -0
  53. package/build/src/backends/php-stdlib-support.d.ts.map +1 -0
  54. package/build/src/backends/php-stdlib-support.js +227 -0
  55. package/build/src/backends/php.d.ts.map +1 -1
  56. package/build/src/backends/php.js +448 -33
  57. package/build/src/backends/program.d.ts +83 -0
  58. package/build/src/backends/program.d.ts.map +1 -0
  59. package/build/src/backends/program.js +1309 -0
  60. package/build/src/backends/python.js +7 -1
  61. package/build/src/backends/ruby.d.ts.map +1 -1
  62. package/build/src/backends/ruby.js +310 -24
  63. package/build/src/backends/rust-runtime.d.ts +7 -0
  64. package/build/src/backends/rust-runtime.d.ts.map +1 -0
  65. package/build/src/backends/rust-runtime.js +32 -0
  66. package/build/src/backends/rust-validation.d.ts +9 -0
  67. package/build/src/backends/rust-validation.d.ts.map +1 -0
  68. package/build/src/backends/rust-validation.js +78 -0
  69. package/build/src/backends/rust.d.ts +24 -0
  70. package/build/src/backends/rust.d.ts.map +1 -0
  71. package/build/src/backends/rust.js +344 -0
  72. package/build/src/backends/scalars.d.ts +14 -6
  73. package/build/src/backends/scalars.d.ts.map +1 -1
  74. package/build/src/backends/scalars.js +167 -17
  75. package/build/src/backends/shared.d.ts +23 -4
  76. package/build/src/backends/shared.d.ts.map +1 -1
  77. package/build/src/backends/shared.js +2174 -62
  78. package/build/src/backends/stdlib-support.d.ts +14 -0
  79. package/build/src/backends/stdlib-support.d.ts.map +1 -0
  80. package/build/src/backends/stdlib-support.js +237 -0
  81. package/build/src/backends/swift-runtime.d.ts +3 -0
  82. package/build/src/backends/swift-runtime.d.ts.map +1 -0
  83. package/build/src/backends/swift-runtime.js +14 -0
  84. package/build/src/backends/swift.d.ts +8 -0
  85. package/build/src/backends/swift.d.ts.map +1 -0
  86. package/build/src/backends/swift.js +127 -0
  87. package/build/src/backends/typescript.d.ts.map +1 -1
  88. package/build/src/backends/typescript.js +344 -24
  89. package/build/src/backends/wasm.d.ts +43 -0
  90. package/build/src/backends/wasm.d.ts.map +1 -0
  91. package/build/src/backends/wasm.js +2164 -0
  92. package/build/src/backends/writer.d.ts +255 -4
  93. package/build/src/backends/writer.d.ts.map +1 -1
  94. package/build/src/backends/writer.js +491 -3
  95. package/build/src/diagnostic.d.ts +4 -3
  96. package/build/src/diagnostic.d.ts.map +1 -1
  97. package/build/src/diagnostic.js +5 -3
  98. package/build/src/frontends/c.d.ts.map +1 -1
  99. package/build/src/frontends/c.js +5 -3
  100. package/build/src/frontends/cpp.d.ts.map +1 -1
  101. package/build/src/frontends/cpp.js +5 -3
  102. package/build/src/frontends/csharp.d.ts.map +1 -1
  103. package/build/src/frontends/csharp.js +7 -3
  104. package/build/src/frontends/dart.d.ts +10 -0
  105. package/build/src/frontends/dart.d.ts.map +1 -0
  106. package/build/src/frontends/dart.js +913 -0
  107. package/build/src/frontends/index.d.ts +3 -1
  108. package/build/src/frontends/index.d.ts.map +1 -1
  109. package/build/src/frontends/index.js +15 -5
  110. package/build/src/frontends/java.d.ts +110 -1
  111. package/build/src/frontends/java.d.ts.map +1 -1
  112. package/build/src/frontends/java.js +1725 -70
  113. package/build/src/frontends/javascript-typescript.d.ts +69 -1
  114. package/build/src/frontends/javascript-typescript.d.ts.map +1 -1
  115. package/build/src/frontends/javascript-typescript.js +1825 -93
  116. package/build/src/frontends/kotlin.d.ts +10 -0
  117. package/build/src/frontends/kotlin.d.ts.map +1 -0
  118. package/build/src/frontends/kotlin.js +685 -0
  119. package/build/src/frontends/php.d.ts +118 -1
  120. package/build/src/frontends/php.d.ts.map +1 -1
  121. package/build/src/frontends/php.js +1583 -76
  122. package/build/src/frontends/program.d.ts +74 -0
  123. package/build/src/frontends/program.d.ts.map +1 -0
  124. package/build/src/frontends/program.js +989 -0
  125. package/build/src/frontends/ruby.d.ts +68 -1
  126. package/build/src/frontends/ruby.d.ts.map +1 -1
  127. package/build/src/frontends/ruby.js +1446 -101
  128. package/build/src/frontends/rust-parser.d.ts +11 -0
  129. package/build/src/frontends/rust-parser.d.ts.map +1 -0
  130. package/build/src/frontends/rust-parser.js +15 -0
  131. package/build/src/frontends/rust.d.ts +14 -0
  132. package/build/src/frontends/rust.d.ts.map +1 -0
  133. package/build/src/frontends/rust.js +715 -0
  134. package/build/src/frontends/scalars.d.ts +10 -0
  135. package/build/src/frontends/scalars.d.ts.map +1 -1
  136. package/build/src/frontends/scalars.js +28 -2
  137. package/build/src/frontends/swift.d.ts +10 -0
  138. package/build/src/frontends/swift.d.ts.map +1 -0
  139. package/build/src/frontends/swift.js +860 -0
  140. package/build/src/frontends/types.d.ts +186 -0
  141. package/build/src/frontends/types.d.ts.map +1 -0
  142. package/build/src/frontends/types.js +634 -0
  143. package/build/src/language-registry.d.ts +46 -4
  144. package/build/src/language-registry.d.ts.map +1 -1
  145. package/build/src/language-registry.js +177 -13
  146. package/build/src/mapping.d.ts +2 -2
  147. package/build/src/mapping.d.ts.map +1 -1
  148. package/build/src/mapping.js +31 -10
  149. package/build/src/semantic/capabilities.d.ts +66 -0
  150. package/build/src/semantic/capabilities.d.ts.map +1 -0
  151. package/build/src/semantic/capabilities.js +649 -0
  152. package/build/src/semantic/effects.d.ts +26 -0
  153. package/build/src/semantic/effects.d.ts.map +1 -0
  154. package/build/src/semantic/effects.js +764 -0
  155. package/build/src/semantic/generics.d.ts +23 -0
  156. package/build/src/semantic/generics.d.ts.map +1 -0
  157. package/build/src/semantic/generics.js +61 -0
  158. package/build/src/semantic/lifetime.d.ts +37 -0
  159. package/build/src/semantic/lifetime.d.ts.map +1 -0
  160. package/build/src/semantic/lifetime.js +527 -0
  161. package/build/src/semantic/provenance.d.ts +9 -2
  162. package/build/src/semantic/provenance.d.ts.map +1 -1
  163. package/build/src/semantic/provenance.js +462 -20
  164. package/build/src/semantic/scalars.d.ts +11 -0
  165. package/build/src/semantic/scalars.d.ts.map +1 -1
  166. package/build/src/semantic/scalars.js +16 -1
  167. package/build/src/semantic/stdlib.d.ts +254 -0
  168. package/build/src/semantic/stdlib.d.ts.map +1 -0
  169. package/build/src/semantic/stdlib.js +880 -0
  170. package/build/src/semantic/types.d.ts +3108 -178
  171. package/build/src/semantic/types.d.ts.map +1 -1
  172. package/build/src/semantic/types.js +730 -15
  173. package/build/src/semantic/validate.d.ts +85 -5
  174. package/build/src/semantic/validate.d.ts.map +1 -1
  175. package/build/src/semantic/validate.js +2576 -98
  176. package/build/src/stdlib-facades.d.ts +304 -0
  177. package/build/src/stdlib-facades.d.ts.map +1 -0
  178. package/build/src/stdlib-facades.js +1167 -0
  179. package/build/src/stdlib-negotiation.d.ts +69 -0
  180. package/build/src/stdlib-negotiation.d.ts.map +1 -0
  181. package/build/src/stdlib-negotiation.js +403 -0
  182. package/build/src/stdlib-providers.d.ts +72 -0
  183. package/build/src/stdlib-providers.d.ts.map +1 -0
  184. package/build/src/stdlib-providers.js +339 -0
  185. package/build/src/toolchains.d.ts +55 -1
  186. package/build/src/toolchains.d.ts.map +1 -1
  187. package/build/src/toolchains.js +15 -4
  188. package/docs/android.md +79 -0
  189. package/docs/architecture.md +47 -13
  190. package/docs/dart.md +60 -0
  191. package/docs/goals.md +3 -3
  192. package/docs/ios.md +121 -0
  193. package/docs/kotlin.md +42 -0
  194. package/docs/language-support.md +238 -26
  195. package/docs/multi-file-modules.md +52 -0
  196. package/docs/parser-qualification.md +121 -8
  197. package/docs/plans/2026-09-05-standard-library-portability.md +10 -10
  198. package/docs/rust.md +88 -0
  199. package/docs/source-maps.md +17 -7
  200. package/docs/specification.md +5 -0
  201. package/docs/standard-library-portability.md +39 -8
  202. package/docs/swift.md +44 -0
  203. package/docs/testing.md +381 -4
  204. package/docs/webassembly.md +52 -0
  205. package/index.js +66 -8
  206. package/node_modules/semantifold-tree-sitter-legacy-internal/README.md +2 -2
  207. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/LICENSE +21 -0
  208. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/README.md +45 -0
  209. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/binding.gyp +30 -0
  210. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/bindings/node/binding.cc +20 -0
  211. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/bindings/node/binding_test.js +9 -0
  212. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/bindings/node/index.d.ts +28 -0
  213. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/bindings/node/index.js +11 -0
  214. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/grammar.js +1630 -0
  215. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/package.json +64 -0
  216. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/prebuilds/darwin-arm64/tree-sitter-rust.node +0 -0
  217. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/prebuilds/darwin-x64/tree-sitter-rust.node +0 -0
  218. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/prebuilds/linux-arm64/tree-sitter-rust.node +0 -0
  219. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/prebuilds/linux-x64/tree-sitter-rust.node +0 -0
  220. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/prebuilds/win32-arm64/tree-sitter-rust.node +0 -0
  221. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/prebuilds/win32-x64/tree-sitter-rust.node +0 -0
  222. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/queries/highlights.scm +159 -0
  223. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/queries/injections.scm +9 -0
  224. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/queries/tags.scm +60 -0
  225. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/src/grammar.json +9405 -0
  226. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/src/node-types.json +5399 -0
  227. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/src/parser.c +192569 -0
  228. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/src/scanner.c +393 -0
  229. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/src/tree_sitter/alloc.h +54 -0
  230. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/src/tree_sitter/array.h +290 -0
  231. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/src/tree_sitter/parser.h +266 -0
  232. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/tree-sitter-rust.wasm +0 -0
  233. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/tree-sitter.json +53 -0
  234. package/node_modules/semantifold-tree-sitter-legacy-internal/package.json +3 -2
  235. package/node_modules/semantifold-tree-sitter-legacy-internal/src/c.js +5 -4
  236. package/package.json +5 -2
  237. package/src/artifact-path.js +47 -2
  238. package/src/artifacts.js +67 -0
  239. package/src/backends/android.js +1370 -0
  240. package/src/backends/c-validation.js +6 -1
  241. package/src/backends/cpp-validation.js +6 -1
  242. package/src/backends/csharp.js +3 -0
  243. package/src/backends/dart-runtime.js +41 -0
  244. package/src/backends/dart.js +326 -0
  245. package/src/backends/effects.js +705 -0
  246. package/src/backends/go.js +14 -2
  247. package/src/backends/identifiers.js +166 -9
  248. package/src/backends/index.js +27 -2
  249. package/src/backends/ios.js +1612 -0
  250. package/src/backends/java.js +454 -36
  251. package/src/backends/javascript.js +389 -23
  252. package/src/backends/kotlin-runtime.js +29 -0
  253. package/src/backends/kotlin.js +144 -0
  254. package/src/backends/native-validation.js +1 -1
  255. package/src/backends/ordered-expressions.js +40 -6
  256. package/src/backends/php-stdlib-support.js +239 -0
  257. package/src/backends/php.js +469 -32
  258. package/src/backends/program.js +1408 -0
  259. package/src/backends/python.js +3 -0
  260. package/src/backends/ruby.js +326 -23
  261. package/src/backends/rust-runtime.js +34 -0
  262. package/src/backends/rust-validation.js +75 -0
  263. package/src/backends/rust.js +335 -0
  264. package/src/backends/scalars.js +141 -16
  265. package/src/backends/shared.js +2314 -115
  266. package/src/backends/stdlib-support.js +234 -0
  267. package/src/backends/swift-runtime.js +14 -0
  268. package/src/backends/swift.js +132 -0
  269. package/src/backends/typescript.js +349 -23
  270. package/src/backends/wasm.js +2208 -0
  271. package/src/backends/writer.js +545 -2
  272. package/src/diagnostic.js +4 -2
  273. package/src/frontends/c.js +4 -2
  274. package/src/frontends/cpp.js +4 -2
  275. package/src/frontends/csharp.js +4 -2
  276. package/src/frontends/dart.js +963 -0
  277. package/src/frontends/index.js +14 -4
  278. package/src/frontends/java.js +1977 -69
  279. package/src/frontends/javascript-typescript.js +2046 -102
  280. package/src/frontends/kotlin.js +713 -0
  281. package/src/frontends/php.js +1725 -79
  282. package/src/frontends/program.js +1062 -0
  283. package/src/frontends/ruby.js +1624 -98
  284. package/src/frontends/rust-parser.js +18 -0
  285. package/src/frontends/rust.js +714 -0
  286. package/src/frontends/scalars.js +31 -1
  287. package/src/frontends/swift.js +893 -0
  288. package/src/frontends/types.js +750 -0
  289. package/src/language-registry.js +182 -12
  290. package/src/mapping.js +33 -9
  291. package/src/semantic/capabilities.js +671 -0
  292. package/src/semantic/effects.js +737 -0
  293. package/src/semantic/generics.js +58 -0
  294. package/src/semantic/lifetime.js +517 -0
  295. package/src/semantic/provenance.js +412 -19
  296. package/src/semantic/scalars.js +17 -0
  297. package/src/semantic/stdlib.js +921 -0
  298. package/src/semantic/types.js +810 -14
  299. package/src/semantic/validate.js +2934 -209
  300. package/src/stdlib-facades.js +1211 -0
  301. package/src/stdlib-negotiation.js +446 -0
  302. package/src/stdlib-providers.js +377 -0
  303. package/src/toolchains.js +16 -3
@@ -0,0 +1,69 @@
1
+ export type StdlibContractRegistry = import("./semantic/stdlib.js").StdlibContractRegistry;
2
+ export type StdlibProviderRecord = import("./stdlib-providers.js").StdlibProviderRecord;
3
+ export type VersionRange = import("./semantic/stdlib.js").VersionRange;
4
+ export type StdlibNegotiationRequirement = {
5
+ /**
6
+ * - Canonical module identity.
7
+ */
8
+ module: string;
9
+ /**
10
+ * - Required canonical operations.
11
+ */
12
+ operations: string[];
13
+ /**
14
+ * - Declared version range.
15
+ */
16
+ range?: string | undefined;
17
+ };
18
+ export type StdlibNegotiationResult = {
19
+ /**
20
+ * - Negotiated target language.
21
+ */
22
+ target: string;
23
+ /**
24
+ * - Linked modules in identity order.
25
+ */
26
+ modules: readonly {
27
+ identity: string;
28
+ operations: string[];
29
+ version: string;
30
+ }[];
31
+ /**
32
+ * - Selected providers in identity order.
33
+ */
34
+ providers: readonly {
35
+ identity: string;
36
+ target: string;
37
+ module: string;
38
+ version: string;
39
+ operations: string[];
40
+ nativeEntries: Readonly<Record<string, string>>;
41
+ runtimeProfile: string;
42
+ }[];
43
+ };
44
+ /**
45
+ * @typedef StdlibNegotiationRequirement
46
+ * @property {string} module - Canonical module identity.
47
+ * @property {string[]} operations - Required canonical operations.
48
+ * @property {string | undefined} [range] - Declared version range.
49
+ */
50
+ /**
51
+ * @typedef StdlibNegotiationResult
52
+ * @property {string} target - Negotiated target language.
53
+ * @property {readonly {identity: string, operations: string[], version: string}[]} modules - Linked modules in identity order.
54
+ * @property {readonly {identity: string, target: string, module: string, version: string, operations: string[], nativeEntries: Readonly<Record<string, string>>, runtimeProfile: string}[]} providers - Selected providers in identity order.
55
+ */
56
+ /**
57
+ * Negotiates the complete transitive stdlib provider closure for one target.
58
+ * @param {{contracts?: StdlibContractRegistry, providers?: {providersFor(target: string, module: string, version: string): readonly StdlibProviderRecord[]}, requirements: StdlibNegotiationRequirement[], target: string}} input - Negotiation request.
59
+ * @returns {Readonly<StdlibNegotiationResult>} Frozen negotiation result.
60
+ */
61
+ export declare function negotiateStdlibProviders({ contracts, providers, requirements, target }: {
62
+ contracts?: StdlibContractRegistry;
63
+ providers?: {
64
+ providersFor(target: string, module: string, version: string): readonly StdlibProviderRecord[];
65
+ };
66
+ requirements: StdlibNegotiationRequirement[];
67
+ target: string;
68
+ }): Readonly<StdlibNegotiationResult>;
69
+ //# sourceMappingURL=stdlib-negotiation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stdlib-negotiation.d.ts","sourceRoot":"","sources":["../../src/stdlib-negotiation.js"],"names":[],"mappings":"AAcI,YAAiE,sBAAsB,GAA7E,OAAO,sBAAsB,EAAE,sBAAsB,CAAwB;AACvF,YAAgE,oBAAoB,GAA1E,OAAO,uBAAuB,EAAE,oBAAoB,CAAsB;AACpF,YAAuD,YAAY,GAAzD,OAAO,sBAAsB,EAAE,YAAY,CAAc;AAOpE,YAAS,4BAA4B,GACrC;;;;IAAmB,MAAM,EAAd,MAAM,CACjB;;;;IAAqB,UAAU,EAApB,MAAM,EAAE,CACnB;;;;IAAgC,KAAK,AAArC,CACF,EADa,MAAM,GAAG,SAAS,CAC/B;CAAA,CAAA;AAGE,YAAS,uBAAuB,GAChC;;;;IAAmB,MAAM,EAAd,MAAM,CACjB;;;;IAAiF,OAAO,EAA7E,SAAS;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,EAAE,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAC,EAAE,CAC/E;;;;IAA0L,SAAS,EAAxL,SAAS;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,EAAE,CAAC;QAAC,aAAa,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;QAAC,cAAc,EAAE,MAAM,CAAA;KAAC,EAAE,CAC1L;CAAA,CAAA;AAZD;;;;;GAKG;AAEH;;;;;GAKG;AAEH;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,EAAC,SAA4B,EAAE,SAAkC,EAAE,YAAY,EAAE,MAAM,EAAC,EAHtH;IAAC,SAAS,CAAC,EAAE,sBAAsB,CAAC;IAAC,SAAS,CAAC,EAAE;QAAC,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,SAAS,oBAAoB,EAAE,CAAA;KAAC,CAAC;IAAC,YAAY,EAAE,4BAA4B,EAAE,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAGzF,GAFpH,QAAQ,CAAC,uBAAuB,CAAC,CAgN7C"}
@@ -0,0 +1,403 @@
1
+ // @ts-check
2
+ import { isDenseArray } from "./array.js";
3
+ import { SemantifoldDiagnostic } from "./diagnostic.js";
4
+ import { compareStdlibVersions, createStdlibContractRegistry, intersectStdlibVersionRanges, parseStdlibVersion, parseStdlibVersionRange, stdlibVersionSatisfies } from "./semantic/stdlib.js";
5
+ import { stdlibProviderRegistry } from "./stdlib-providers.js";
6
+ /** @typedef {import("./semantic/stdlib.js").StdlibContractRegistry} StdlibContractRegistry */
7
+ /** @typedef {import("./stdlib-providers.js").StdlibProviderRecord} StdlibProviderRecord */
8
+ /** @typedef {import("./semantic/stdlib.js").VersionRange} VersionRange */
9
+ /** @type {Readonly<VersionRange>} */
10
+ const universalRange = Object.freeze({ lower: /** @type {[number, number, number]} */ (Object.freeze([0, 0, 0])), upper: null });
11
+ const builtinContracts = createStdlibContractRegistry();
12
+ /**
13
+ * @typedef StdlibNegotiationRequirement
14
+ * @property {string} module - Canonical module identity.
15
+ * @property {string[]} operations - Required canonical operations.
16
+ * @property {string | undefined} [range] - Declared version range.
17
+ */
18
+ /**
19
+ * @typedef StdlibNegotiationResult
20
+ * @property {string} target - Negotiated target language.
21
+ * @property {readonly {identity: string, operations: string[], version: string}[]} modules - Linked modules in identity order.
22
+ * @property {readonly {identity: string, target: string, module: string, version: string, operations: string[], nativeEntries: Readonly<Record<string, string>>, runtimeProfile: string}[]} providers - Selected providers in identity order.
23
+ */
24
+ /**
25
+ * Negotiates the complete transitive stdlib provider closure for one target.
26
+ * @param {{contracts?: StdlibContractRegistry, providers?: {providersFor(target: string, module: string, version: string): readonly StdlibProviderRecord[]}, requirements: StdlibNegotiationRequirement[], target: string}} input - Negotiation request.
27
+ * @returns {Readonly<StdlibNegotiationResult>} Frozen negotiation result.
28
+ */
29
+ export function negotiateStdlibProviders({ contracts = builtinContracts, providers = stdlibProviderRegistry, requirements, target }) {
30
+ if (!isDenseArray(requirements))
31
+ invalidRequirement("Stdlib negotiation requirements must be an ordered dense array.");
32
+ /** @type {Map<string, VersionRange>} */
33
+ const ranges = new Map();
34
+ /** @type {Map<string, string>} */
35
+ const rangeKeys = new Map();
36
+ /** @type {Map<string, Set<string>>} */
37
+ const usedOperations = new Map();
38
+ /**
39
+ * Intersects one declared range into the per-module closure.
40
+ * @param {string} module - Canonical module identity.
41
+ * @param {VersionRange} range - Declared version range.
42
+ * @returns {boolean} Whether the combined range changed.
43
+ */
44
+ function addRange(module, range) {
45
+ const current = ranges.get(module) ?? universalRange;
46
+ const next = intersectStdlibVersionRanges(current, range);
47
+ if (next === null)
48
+ throw new SemantifoldDiagnostic({
49
+ code: "STDLIB_VERSION_INCOMPATIBLE",
50
+ language: module,
51
+ message: `Canonical module '${module}' has no version satisfying every declared range.`
52
+ });
53
+ const key = rangeKey(next);
54
+ if (rangeKeys.get(module) == key)
55
+ return false;
56
+ ranges.set(module, next);
57
+ rangeKeys.set(module, key);
58
+ return true;
59
+ }
60
+ /**
61
+ * Rejects a module identity absent from the contract registry.
62
+ * @param {string} module - Canonical module identity.
63
+ * @returns {void}
64
+ */
65
+ function requireModule(module) {
66
+ if (!contracts.modules.some(({ identity }) => identity == module)) {
67
+ throw new SemantifoldDiagnostic({
68
+ code: "STDLIB_MODULE_UNKNOWN",
69
+ language: module,
70
+ message: `Canonical module '${module}' is not registered.`
71
+ });
72
+ }
73
+ }
74
+ for (const requirement of requirements) {
75
+ if (!isPlainObject(requirement))
76
+ invalidRequirement("Every stdlib negotiation requirement must be a plain object.");
77
+ const module = /** @type {string} */ (requirement.module);
78
+ const operations = /** @type {unknown} */ (requirement.operations);
79
+ if (typeof module != "string") {
80
+ throw new SemantifoldDiagnostic({ code: "STDLIB_MODULE_UNKNOWN", language: String(module), message: "Canonical module identity is missing." });
81
+ }
82
+ if (!isDenseArray(operations) || !operations.every((operation) => typeof operation == "string")) {
83
+ invalidRequirement(`Requirement for module '${module}' declares invalid operations.`);
84
+ }
85
+ if (operations.length == 0)
86
+ continue;
87
+ requireModule(module);
88
+ for (const operation of /** @type {string[]} */ (operations)) {
89
+ const used = usedOperations.get(module) ?? new Set();
90
+ used.add(operation);
91
+ usedOperations.set(module, used);
92
+ }
93
+ if (requirement.range !== undefined) {
94
+ const range = parseStdlibVersionRange(requirement.range);
95
+ if (range === null)
96
+ malformedRange(String(requirement.range));
97
+ addRange(module, range);
98
+ }
99
+ }
100
+ let changed = true;
101
+ while (changed) {
102
+ changed = false;
103
+ for (const module of [...usedOperations.keys()].sort()) {
104
+ const contract = resolveModuleVersion(contracts, module, ranges.get(module) ?? universalRange);
105
+ const declared = new Map(contract.operations.map(({ dependencies, name }) => [name, dependencies]));
106
+ for (const dependency of contract.dependencies) {
107
+ requireModule(dependency.module);
108
+ if (addRange(dependency.module, asVersionRange(dependency.range)))
109
+ changed = true;
110
+ if (!usedOperations.has(dependency.module)) {
111
+ usedOperations.set(dependency.module, new Set());
112
+ changed = true;
113
+ }
114
+ }
115
+ for (const operation of [... /** @type {Set<string>} */(usedOperations.get(module))].sort()) {
116
+ const dependencies = declared.get(operation);
117
+ if (dependencies === undefined)
118
+ undeclaredOperation(module, operation);
119
+ for (const dependency of dependencies) {
120
+ const { module: dependencyModule, operation: dependencyOperation, range } = dependency;
121
+ requireModule(dependencyModule);
122
+ if (addRange(dependencyModule, asVersionRange(range)))
123
+ changed = true;
124
+ const used = usedOperations.get(dependencyModule) ?? new Set();
125
+ if (!used.has(dependencyOperation)) {
126
+ used.add(dependencyOperation);
127
+ usedOperations.set(dependencyModule, used);
128
+ changed = true;
129
+ }
130
+ }
131
+ }
132
+ }
133
+ }
134
+ /** @type {Map<string, StdlibProviderRecord>} */
135
+ const selectedProviders = new Map();
136
+ let stable = false;
137
+ while (!stable) {
138
+ stable = true;
139
+ selectedProviders.clear();
140
+ for (const module of [...usedOperations.keys()].sort()) {
141
+ const contract = resolveModuleVersion(contracts, module, ranges.get(module) ?? universalRange);
142
+ const candidates = providers.providersFor(target, module, contract.version);
143
+ if (candidates.length == 0) {
144
+ throw new SemantifoldDiagnostic({
145
+ code: "STDLIB_PROVIDER_MISSING",
146
+ language: target,
147
+ message: `No registered provider serves module '${module}' version '${contract.version}'.`
148
+ });
149
+ }
150
+ if (candidates.length > 1) {
151
+ throw new SemantifoldDiagnostic({
152
+ code: "STDLIB_PROVIDER_AMBIGUOUS",
153
+ language: target,
154
+ message: `Multiple registered providers serve module '${module}' version '${contract.version}'.`
155
+ });
156
+ }
157
+ const provider = /** @type {StdlibProviderRecord} */ (candidates[0]);
158
+ selectedProviders.set(module, provider);
159
+ for (const dependency of provider.dependencies) {
160
+ if (!contracts.modules.some(({ identity }) => identity == dependency.module)) {
161
+ throw new SemantifoldDiagnostic({
162
+ code: "STDLIB_PROVIDER_DEPENDENCY_MISSING",
163
+ language: provider.identity,
164
+ message: `Provider dependency module '${dependency.module}' is not registered.`
165
+ });
166
+ }
167
+ if (addRange(dependency.module, asVersionRange(dependency.range)))
168
+ stable = false;
169
+ if (!usedOperations.has(dependency.module)) {
170
+ usedOperations.set(dependency.module, new Set());
171
+ stable = false;
172
+ }
173
+ }
174
+ }
175
+ }
176
+ for (const module of [...usedOperations.keys()].sort()) {
177
+ const provider = /** @type {StdlibProviderRecord} */ (selectedProviders.get(module));
178
+ const provided = new Set(provider.provides[0].operations);
179
+ const missing = [... /** @type {Set<string>} */(usedOperations.get(module))].sort()
180
+ .filter((operation) => !provided.has(operation));
181
+ if (missing.length > 0) {
182
+ throw new SemantifoldDiagnostic({
183
+ code: "STDLIB_PROVIDER_MISSING",
184
+ language: target,
185
+ message: `Provider '${provider.identity}' does not provide operation${missing.length > 1 ? "s" : ""} '${missing.join("', '")}' of module '${module}'.`
186
+ });
187
+ }
188
+ }
189
+ assertAcyclic(contracts, ranges, usedOperations, selectedProviders);
190
+ /** @type {{identity: string, operations: string[], version: string}[]} */
191
+ const modules = [...usedOperations.keys()].sort().map((identity) => {
192
+ const contract = resolveModuleVersion(contracts, identity, ranges.get(identity) ?? universalRange);
193
+ const used = /** @type {Set<string>} */ (usedOperations.get(identity));
194
+ return {
195
+ identity,
196
+ operations: contract.operations.map(({ name }) => name).filter((name) => used.has(name)),
197
+ version: contract.version
198
+ };
199
+ });
200
+ /** @type {{identity: string, target: string, module: string, version: string, operations: string[], nativeEntries: Record<string, string>, runtimeProfile: string}[]} */
201
+ const providerResults = [...selectedProviders.values()].sort((left, right) => left.identity < right.identity ? -1 : left.identity > right.identity ? 1 : 0).map((provider) => {
202
+ const module = provider.provides[0].module;
203
+ const contract = resolveModuleVersion(contracts, module, ranges.get(module) ?? universalRange);
204
+ const used = /** @type {Set<string>} */ (usedOperations.get(module));
205
+ const operations = contract.operations.map(({ name }) => name).filter((name) => used.has(name));
206
+ return {
207
+ identity: provider.identity,
208
+ module,
209
+ nativeEntries: Object.fromEntries(operations.map((operation) => [
210
+ operation,
211
+ /** @type {string} */ (provider.nativeEntries[operation])
212
+ ])),
213
+ operations,
214
+ runtimeProfile: provider.runtimeProfile,
215
+ target: provider.target,
216
+ version: provider.provides[0].version
217
+ };
218
+ });
219
+ return deepFreeze(/** @type {StdlibNegotiationResult} */ ({ modules, providers: providerResults, target }));
220
+ }
221
+ /**
222
+ * Resolves the highest registered contract version satisfying one combined range.
223
+ * @param {StdlibContractRegistry} contracts - Canonical contract registry.
224
+ * @param {string} module - Canonical module identity.
225
+ * @param {VersionRange} range - Combined half-open range.
226
+ * @returns {import("./semantic/stdlib.js").StdlibContract} Exact-version contract.
227
+ */
228
+ function resolveModuleVersion(contracts, module, range) {
229
+ const listed = contracts.modules.find(({ identity }) => identity == module);
230
+ if (!listed) {
231
+ throw new SemantifoldDiagnostic({ code: "STDLIB_MODULE_UNKNOWN", language: module, message: `Canonical module '${module}' is not registered.` });
232
+ }
233
+ /** @type {[number, number, number] | null} */
234
+ let resolved = null;
235
+ for (const version of listed.versions) {
236
+ const tuple = /** @type {[number, number, number]} */ (parseStdlibVersion(version));
237
+ if (stdlibVersionSatisfies(tuple, range) && (resolved === null || compareStdlibVersions(tuple, resolved) > 0)) {
238
+ resolved = tuple;
239
+ }
240
+ }
241
+ if (resolved === null) {
242
+ throw new SemantifoldDiagnostic({
243
+ code: "STDLIB_VERSION_INCOMPATIBLE",
244
+ language: module,
245
+ message: `Canonical module '${module}' has no registered version satisfying the combined range.`
246
+ });
247
+ }
248
+ return contracts.resolveModule(module, `${resolved[0]}.${resolved[1]}.${resolved[2]}`);
249
+ }
250
+ /**
251
+ * Fails deterministically when canonical operation dependencies or selected provider
252
+ * module dependencies cycle.
253
+ * @param {StdlibContractRegistry} contracts - Canonical contract registry.
254
+ * @param {Map<string, VersionRange>} ranges - Combined ranges per module.
255
+ * @param {Map<string, Set<string>>} usedOperations - Used operations per module.
256
+ * @param {Map<string, StdlibProviderRecord>} selectedProviders - Selected provider per module.
257
+ * @returns {void}
258
+ */
259
+ function assertAcyclic(contracts, ranges, usedOperations, selectedProviders) {
260
+ /** @type {Map<string, string[]>} */
261
+ const edges = new Map();
262
+ for (const module of [...usedOperations.keys()].sort()) {
263
+ const contract = resolveModuleVersion(contracts, module, ranges.get(module) ?? universalRange);
264
+ const declared = new Map(contract.operations.map(({ dependencies, name }) => [name, dependencies]));
265
+ const used = /** @type {Set<string>} */ (usedOperations.get(module));
266
+ for (const operation of [...used].sort()) {
267
+ const nodeKey = `${module}\u0000${operation}`;
268
+ const targets = /** @type {string[]} */ (edges.get(nodeKey) ?? []);
269
+ for (const dependency of /** @type {{module: string, operation: string}[]} */ (declared.get(operation))) {
270
+ targets.push(`${dependency.module}\u0000${dependency.operation}`);
271
+ }
272
+ edges.set(nodeKey, targets.sort());
273
+ }
274
+ const moduleNodeKey = `${module}\u0000\u0000`;
275
+ const moduleTargets = /** @type {string[]} */ (edges.get(moduleNodeKey) ?? []);
276
+ for (const dependency of contract.dependencies)
277
+ moduleTargets.push(`${dependency.module}\u0000\u0000`);
278
+ edges.set(moduleNodeKey, moduleTargets.sort());
279
+ }
280
+ for (const module of [...selectedProviders.keys()].sort()) {
281
+ const provider = /** @type {StdlibProviderRecord} */ (selectedProviders.get(module));
282
+ const nodeKey = `${module}\u0000\u0000`;
283
+ const targets = /** @type {string[]} */ (edges.get(nodeKey) ?? []);
284
+ for (const dependency of provider.dependencies) {
285
+ targets.push(`${dependency.module}\u0000\u0000`);
286
+ }
287
+ edges.set(nodeKey, targets.sort());
288
+ }
289
+ /** @type {Map<string, number>} */
290
+ const colors = new Map();
291
+ /**
292
+ * Walks the dependency edges in deterministic order, rejecting cycles.
293
+ * @param {string} nodeKey - Node key.
294
+ * @returns {void}
295
+ */
296
+ function visit(nodeKey) {
297
+ colors.set(nodeKey, 1);
298
+ for (const target of /** @type {string[]} */ (edges.get(nodeKey) ?? [])) {
299
+ const color = colors.get(target) ?? 0;
300
+ if (color == 1)
301
+ throw new SemantifoldDiagnostic({
302
+ code: "STDLIB_PROVIDER_CYCLE",
303
+ language: target.split("\u0000")[0],
304
+ message: "Canonical stdlib dependencies form a cycle."
305
+ });
306
+ if (color == 0)
307
+ visit(target);
308
+ }
309
+ colors.set(nodeKey, 2);
310
+ }
311
+ for (const nodeKey of [...edges.keys()].sort()) {
312
+ if ((colors.get(nodeKey) ?? 0) == 0)
313
+ visit(nodeKey);
314
+ }
315
+ }
316
+ /**
317
+ * Normalizes a declared dependency range, accepting canonical strings or parsed ranges.
318
+ * @param {unknown} value - Candidate range.
319
+ * @returns {VersionRange} Half-open range.
320
+ */
321
+ function asVersionRange(value) {
322
+ if (typeof value == "string") {
323
+ const parsed = parseStdlibVersionRange(value);
324
+ if (parsed === null)
325
+ malformedRange(value);
326
+ return parsed;
327
+ }
328
+ if (isPlainObject(value) && Array.isArray(value.lower) && value.lower.length == 3 &&
329
+ value.lower.every((part) => Number.isInteger(part)) &&
330
+ (value.upper === null || (Array.isArray(value.upper) && value.upper.length == 3 &&
331
+ value.upper.every((part) => Number.isInteger(part))))) {
332
+ return { lower: /** @type {[number, number, number]} */ (value.lower), upper: value.upper === null ? null : /** @type {[number, number, number]} */ (value.upper) };
333
+ }
334
+ return malformedRange(String(value));
335
+ }
336
+ /**
337
+ * Encodes one half-open range deterministically.
338
+ * @param {VersionRange} range - Half-open range.
339
+ * @returns {string} Stable key.
340
+ */
341
+ function rangeKey(range) {
342
+ return `${range.lower.join(".")}..${range.upper === null ? "" : range.upper.join(".")}`;
343
+ }
344
+ /**
345
+ * Throws a malformed-version-range diagnostic.
346
+ * @param {string} range - Candidate range.
347
+ * @returns {never} Always throws.
348
+ */
349
+ function malformedRange(range) {
350
+ throw new SemantifoldDiagnostic({
351
+ code: "STDLIB_VERSION_MALFORMED",
352
+ language: "stdlib",
353
+ message: `Stdlib version range '${range}' is not canonical.`
354
+ });
355
+ }
356
+ /**
357
+ * Throws an undeclared-operation diagnostic.
358
+ * @param {string} module - Canonical module identity.
359
+ * @param {string} operation - Missing operation.
360
+ * @returns {never} Always throws.
361
+ */
362
+ function undeclaredOperation(module, operation) {
363
+ throw new SemantifoldDiagnostic({
364
+ code: "STDLIB_OPERATION_UNDECLARED",
365
+ language: module,
366
+ message: `Operation '${operation}' is not declared by canonical module '${module}'.`
367
+ });
368
+ }
369
+ /**
370
+ * Throws a requirement-shape diagnostic.
371
+ * @param {string} message - Failure detail.
372
+ * @returns {never} Always throws.
373
+ */
374
+ function invalidRequirement(message) {
375
+ throw new SemantifoldDiagnostic({ code: "STDLIB_CONTRACT_INVALID", language: "stdlib", message });
376
+ }
377
+ /**
378
+ * Checks for an ordinary string-keyed object.
379
+ * @param {unknown} value - Candidate value.
380
+ * @returns {value is Record<string, unknown>} Whether the value is a plain object.
381
+ */
382
+ function isPlainObject(value) {
383
+ if (typeof value != "object" || value === null)
384
+ return false;
385
+ const prototype = Object.getPrototypeOf(value);
386
+ return prototype === Object.prototype || prototype === null;
387
+ }
388
+ /**
389
+ * Deep-freezes a detached value.
390
+ * @template T
391
+ * @param {T} value - Detached value.
392
+ * @returns {Readonly<T>} Frozen value.
393
+ */
394
+ function deepFreeze(value) {
395
+ if (typeof value != "object" || value === null || Object.isFrozen(value))
396
+ return /** @type {Readonly<T>} */ (value);
397
+ Object.freeze(value);
398
+ for (const property of Object.getOwnPropertyNames(value)) {
399
+ deepFreeze(/** @type {unknown} */ (/** @type {Record<string, unknown>} */ (value)[property]));
400
+ }
401
+ return /** @type {Readonly<T>} */ (value);
402
+ }
403
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RkbGliLW5lZ290aWF0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3N0ZGxpYi1uZWdvdGlhdGlvbi5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZO0FBRVosT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLFlBQVksQ0FBQTtBQUN2QyxPQUFPLEVBQUMscUJBQXFCLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQTtBQUNyRCxPQUFPLEVBQ0wscUJBQXFCLEVBQ3JCLDRCQUE0QixFQUM1Qiw0QkFBNEIsRUFDNUIsa0JBQWtCLEVBQ2xCLHVCQUF1QixFQUN2QixzQkFBc0IsRUFDdkIsTUFBTSxzQkFBc0IsQ0FBQTtBQUM3QixPQUFPLEVBQUMsc0JBQXNCLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQTtBQUU1RCw4RkFBOEY7QUFDOUYsMkZBQTJGO0FBQzNGLDBFQUEwRTtBQUUxRSxxQ0FBcUM7QUFDckMsTUFBTSxjQUFjLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFDLEtBQUssRUFBRSx1Q0FBdUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFDLENBQUMsQ0FBQTtBQUM5SCxNQUFNLGdCQUFnQixHQUFHLDRCQUE0QixFQUFFLENBQUE7QUFFdkQ7Ozs7O0dBS0c7QUFFSDs7Ozs7R0FLRztBQUVIOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsd0JBQXdCLENBQUMsRUFBQyxTQUFTLEdBQUcsZ0JBQWdCLEVBQUUsU0FBUyxHQUFHLHNCQUFzQixFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUM7SUFDL0gsSUFBSSxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUM7UUFBRSxrQkFBa0IsQ0FBQyxpRUFBaUUsQ0FBQyxDQUFBO0lBQ3RILHdDQUF3QztJQUN4QyxNQUFNLE1BQU0sR0FBRyxJQUFJLEdBQUcsRUFB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SSxPQUFPLEtBQUssSUFBSSxRQUFRLElBQUksS0FBSyxLQUFLLElBQUksSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztRQUFFLE9BQU8sMEJBQTBCLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUNuSCxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFBO0lBRXBCLEtBQUssTUFBTSxRQUFRLElBQUksTUFBTSxDQUFDLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDekQsVUFBVSxDQUFDLHNCQUFzQixDQUFDLENBQUUsc0NBQXNDLENBQUMsQ0FBQyxLQUFLLENBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFDakcsQ0FBQztJQUNELE9BQU8sMEJBQTBCLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQTtBQUMzQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCB7aXNEZW5zZUFycmF5fSBmcm9tIFwiLi9hcnJheS5qc1wiXG5pbXBvcnQge1NlbWFudGlmb2xkRGlhZ25vc3RpY30gZnJvbSBcIi4vZGlhZ25vc3RpYy5qc1wiXG5pbXBvcnQge1xuICBjb21wYXJlU3RkbGliVmVyc2lvbnMsXG4gIGNyZWF0ZVN0ZGxpYkNvbnRyYWN0UmVnaXN0cnksXG4gIGludGVyc2VjdFN0ZGxpYlZlcnNpb25SYW5nZXMsXG4gIHBhcnNlU3RkbGliVmVyc2lvbixcbiAgcGFyc2VTdGRsaWJWZXJzaW9uUmFuZ2UsXG4gIHN0ZGxpYlZlcnNpb25TYXRpc2ZpZXNcbn0gZnJvbSBcIi4vc2VtYW50aWMvc3RkbGliLmpzXCJcbmltcG9ydCB7c3RkbGliUHJvdmlkZXJSZWdpc3RyeX0gZnJvbSBcIi4vc3RkbGliLXByb3ZpZGVycy5qc1wiXG5cbi8qKiBAdHlwZWRlZiB7aW1wb3J0KFwiLi9zZW1hbnRpYy9zdGRsaWIuanNcIikuU3RkbGliQ29udHJhY3RSZWdpc3RyeX0gU3RkbGliQ29udHJhY3RSZWdpc3RyeSAqL1xuLyoqIEB0eXBlZGVmIHtpbXBvcnQoXCIuL3N0ZGxpYi1wcm92aWRlcnMuanNcIikuU3RkbGliUHJvdmlkZXJSZWNvcmR9IFN0ZGxpYlByb3ZpZGVyUmVjb3JkICovXG4vKiogQHR5cGVkZWYge2ltcG9ydChcIi4vc2VtYW50aWMvc3RkbGliLmpzXCIpLlZlcnNpb25SYW5nZX0gVmVyc2lvblJhbmdlICovXG5cbi8qKiBAdHlwZSB7UmVhZG9ubHk8VmVyc2lvblJhbmdlPn0gKi9cbmNvbnN0IHVuaXZlcnNhbFJhbmdlID0gT2JqZWN0LmZyZWV6ZSh7bG93ZXI6IC8qKiBAdHlwZSB7W251bWJlciwgbnVtYmVyLCBudW1iZXJdfSAqLyAoT2JqZWN0LmZyZWV6ZShbMCwgMCwgMF0pKSwgdXBwZXI6IG51bGx9KVxuY29uc3QgYnVpbHRpbkNvbnRyYWN0cyA9IGNyZWF0ZVN0ZGxpYkNvbnRyYWN0UmVnaXN0cnkoKVxuXG4vKipcbiAqIEB0eXBlZGVmIFN0ZGxpYk5lZ290aWF0aW9uUmVxdWlyZW1lbnRcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBtb2R1bGUgLSBDYW5vbmljYWwgbW9kdWxlIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtzdHJpbmdbXX0gb3BlcmF0aW9ucyAtIFJlcXVpcmVkIGNhbm9uaWNhbCBvcGVyYXRpb25zLlxuICogQHByb3BlcnR5IHtzdHJpbmcgfCB1bmRlZmluZWR9IFtyYW5nZV0gLSBEZWNsYXJlZCB2ZXJzaW9uIHJhbmdlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgU3RkbGliTmVnb3RpYXRpb25SZXN1bHRcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0YXJnZXQgLSBOZWdvdGlhdGVkIHRhcmdldCBsYW5ndWFnZS5cbiAqIEBwcm9wZXJ0eSB7cmVhZG9ubHkge2lkZW50aXR5OiBzdHJpbmcsIG9wZXJhdGlvbnM6IHN0cmluZ1tdLCB2ZXJzaW9uOiBzdHJpbmd9W119IG1vZHVsZXMgLSBMaW5rZWQgbW9kdWxlcyBpbiBpZGVudGl0eSBvcmRlci5cbiAqIEBwcm9wZXJ0eSB7cmVhZG9ubHkge2lkZW50aXR5OiBzdHJpbmcsIHRhcmdldDogc3RyaW5nLCBtb2R1bGU6IHN0cmluZywgdmVyc2lvbjogc3RyaW5nLCBvcGVyYXRpb25zOiBzdHJpbmdbXSwgbmF0aXZlRW50cmllczogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4sIHJ1bnRpbWVQcm9maWxlOiBzdHJpbmd9W119IHByb3ZpZGVycyAtIFNlbGVjdGVkIHByb3ZpZGVycyBpbiBpZGVudGl0eSBvcmRlci5cbiAqL1xuXG4vKipcbiAqIE5lZ290aWF0ZXMgdGhlIGNvbXBsZXRlIHRyYW5zaXRpdmUgc3RkbGliIHByb3ZpZGVyIGNsb3N1cmUgZm9yIG9uZSB0YXJnZXQuXG4gKiBAcGFyYW0ge3tjb250cmFjdHM/OiBTdGRsaWJDb250cmFjdFJlZ2lzdHJ5LCBwcm92aWRlcnM/OiB7cHJvdmlkZXJzRm9yKHRhcmdldDogc3RyaW5nLCBtb2R1bGU6IHN0cmluZywgdmVyc2lvbjogc3RyaW5nKTogcmVhZG9ubHkgU3RkbGliUHJvdmlkZXJSZWNvcmRbXX0sIHJlcXVpcmVtZW50czogU3RkbGliTmVnb3RpYXRpb25SZXF1aXJlbWVudFtdLCB0YXJnZXQ6IHN0cmluZ319IGlucHV0IC0gTmVnb3RpYXRpb24gcmVxdWVzdC5cbiAqIEByZXR1cm5zIHtSZWFkb25seTxTdGRsaWJOZWdvdGlhdGlvblJlc3VsdD59IEZyb3plbiBuZWdvdGlhdGlvbiByZXN1bHQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBuZWdvdGlhdGVTdGRsaWJQcm92aWRlcnMoe2NvbnRyYWN0cyA9IGJ1aWx0aW5Db250cmFjdHMsIHByb3ZpZGVycyA9IHN0ZGxpYlByb3ZpZGVyUmVnaXN0cnksIHJlcXVpcmVtZW50cywgdGFyZ2V0fSkge1xuICBpZiAoIWlzRGVuc2VBcnJheShyZXF1aXJlbWVudHMpKSBpbnZhbGlkUmVxdWlyZW1lbnQoXCJTdGRsaWIgbmVnb3RpYXRpb24gcmVxdWlyZW1lbnRzIG11c3QgYmUgYW4gb3JkZXJlZCBkZW5zZSBhcnJheS5cIilcbiAgLyoqIEB0eXBlIHtNYXA8c3RyaW5nLCBWZXJzaW9uUmFuZ2U+fSAqL1xuICBjb25zdCByYW5nZXMgPSBuZXcgTWFwKClcbiAgLyoqIEB0eXBlIHtNYXA8c3RyaW5nLCBzdHJpbmc+fSAqL1xuICBjb25zdCByYW5nZUtleXMgPSBuZXcgTWFwKClcbiAgLyoqIEB0eXBlIHtNYXA8c3RyaW5nLCBTZXQ8c3RyaW5nPj59ICovXG4gIGNvbnN0IHVzZWRPcGVyYXRpb25zID0gbmV3IE1hcCgpXG5cbiAgLyoqXG4gICAqIEludGVyc2VjdHMgb25lIGRlY2xhcmVkIHJhbmdlIGludG8gdGhlIHBlci1tb2R1bGUgY2xvc3VyZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG1vZHVsZSAtIENhbm9uaWNhbCBtb2R1bGUgaWRlbnRpdHkuXG4gICAqIEBwYXJhbSB7VmVyc2lvblJhbmdlfSByYW5nZSAtIERlY2xhcmVkIHZlcnNpb24gcmFuZ2UuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSBXaGV0aGVyIHRoZSBjb21iaW5lZCByYW5nZSBjaGFuZ2VkLlxuICAgKi9cbiAgZnVuY3Rpb24gYWRkUmFuZ2UobW9kdWxlLCByYW5nZSkge1xuICAgIGNvbnN0IGN1cnJlbnQgPSByYW5nZXMuZ2V0KG1vZHVsZSkgPz8gdW5pdmVyc2FsUmFuZ2VcbiAgICBjb25zdCBuZXh0ID0gaW50ZXJzZWN0U3RkbGliVmVyc2lvblJhbmdlcyhjdXJyZW50LCByYW5nZSlcblxuICAgIGlmIChuZXh0ID09PSBudWxsKSB0aHJvdyBuZXcgU2VtYW50aWZvbGREaWFnbm9zdGljKHtcbiAgICAgIGNvZGU6IFwiU1RETElCX1ZFUlNJT05fSU5DT01QQVRJQkxFXCIsXG4gICAgICBsYW5ndWFnZTogbW9kdWxlLFxuICAgICAgbWVzc2FnZTogYENhbm9uaWNhbCBtb2R1bGUgJyR7bW9kdWxlfScgaGFzIG5vIHZlcnNpb24gc2F0aXNmeWluZyBldmVyeSBkZWNsYXJlZCByYW5nZS5gXG4gICAgfSlcbiAgICBjb25zdCBrZXkgPSByYW5nZUtleShuZXh0KVxuXG4gICAgaWYgKHJhbmdlS2V5cy5nZXQobW9kdWxlKSA9PSBrZXkpIHJldHVybiBmYWxzZVxuICAgIHJhbmdlcy5zZXQobW9kdWxlLCBuZXh0KVxuICAgIHJhbmdlS2V5cy5zZXQobW9kdWxlLCBrZXkpXG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWplY3RzIGEgbW9kdWxlIGlkZW50aXR5IGFic2VudCBmcm9tIHRoZSBjb250cmFjdCByZWdpc3RyeS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG1vZHVsZSAtIENhbm9uaWNhbCBtb2R1bGUgaWRlbnRpdHkuXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgZnVuY3Rpb24gcmVxdWlyZU1vZHVsZShtb2R1bGUpIHtcbiAgICBpZiAoIWNvbnRyYWN0cy5tb2R1bGVzLnNvbWUoKHtpZGVudGl0eX0pID0+IGlkZW50aXR5ID09IG1vZHVsZSkpIHtcbiAgICAgIHRocm93IG5ldyBTZW1hbnRpZm9sZERpYWdub3N0aWMoe1xuICAgICAgICBjb2RlOiBcIlNURExJQl9NT0RVTEVfVU5LTk9XTlwiLFxuICAgICAgICBsYW5ndWFnZTogbW9kdWxlLFxuICAgICAgICBtZXNzYWdlOiBgQ2Fub25pY2FsIG1vZHVsZSAnJHttb2R1bGV9JyBpcyBub3QgcmVnaXN0ZXJlZC5gXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIGZvciAoY29uc3QgcmVxdWlyZW1lbnQgb2YgcmVxdWlyZW1lbnRzKSB7XG4gICAgaWYgKCFpc1BsYWluT2JqZWN0KHJlcXVpcmVtZW50KSkgaW52YWxpZFJlcXVpcmVtZW50KFwiRXZlcnkgc3RkbGliIG5lZ290aWF0aW9uIHJlcXVpcmVtZW50IG11c3QgYmUgYSBwbGFpbiBvYmplY3QuXCIpXG4gICAgY29uc3QgbW9kdWxlID0gLyoqIEB0eXBlIHtzdHJpbmd9ICovIChyZXF1aXJlbWVudC5tb2R1bGUpXG4gICAgY29uc3Qgb3BlcmF0aW9ucyA9IC8qKiBAdHlwZSB7dW5rbm93bn0gKi8gKHJlcXVpcmVtZW50Lm9wZXJhdGlvbnMpXG5cbiAgICBpZiAodHlwZW9mIG1vZHVsZSAhPSBcInN0cmluZ1wiKSB7XG4gICAgICB0aHJvdyBuZXcgU2VtYW50aWZvbGREaWFnbm9zdGljKHtjb2RlOiBcIlNURExJQl9NT0RVTEVfVU5LTk9XTlwiLCBsYW5ndWFnZTogU3RyaW5nKG1vZHVsZSksIG1lc3NhZ2U6IFwiQ2Fub25pY2FsIG1vZHVsZSBpZGVudGl0eSBpcyBtaXNzaW5nLlwifSlcbiAgICB9XG4gICAgaWYgKCFpc0RlbnNlQXJyYXkob3BlcmF0aW9ucykgfHwgIW9wZXJhdGlvbnMuZXZlcnkoKG9wZXJhdGlvbikgPT4gdHlwZW9mIG9wZXJhdGlvbiA9PSBcInN0cmluZ1wiKSkge1xuICAgICAgaW52YWxpZFJlcXVpcmVtZW50KGBSZXF1aXJlbWVudCBmb3IgbW9kdWxlICcke21vZHVsZX0nIGRlY2xhcmVzIGludmFsaWQgb3BlcmF0aW9ucy5gKVxuICAgIH1cbiAgICBpZiAob3BlcmF0aW9ucy5sZW5ndGggPT0gMCkgY29udGludWVcbiAgICByZXF1aXJlTW9kdWxlKG1vZHVsZSlcbiAgICBmb3IgKGNvbnN0IG9wZXJhdGlvbiBvZiAvKiogQHR5cGUge3N0cmluZ1tdfSAqLyAob3BlcmF0aW9ucykpIHtcbiAgICAgIGNvbnN0IHVzZWQgPSB1c2VkT3BlcmF0aW9ucy5nZXQobW9kdWxlKSA/PyBuZXcgU2V0KClcblxuICAgICAgdXNlZC5hZGQob3BlcmF0aW9uKVxuICAgICAgdXNlZE9wZXJhdGlvbnMuc2V0KG1vZHVsZSwgdXNlZClcbiAgICB9XG4gICAgaWYgKHJlcXVpcmVtZW50LnJhbmdlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IHJhbmdlID0gcGFyc2VTdGRsaWJWZXJzaW9uUmFuZ2UocmVxdWlyZW1lbnQucmFuZ2UpXG5cbiAgICAgIGlmIChyYW5nZSA9PT0gbnVsbCkgbWFsZm9ybWVkUmFuZ2UoU3RyaW5nKHJlcXVpcmVtZW50LnJhbmdlKSlcbiAgICAgIGFkZFJhbmdlKG1vZHVsZSwgcmFuZ2UpXG4gICAgfVxuICB9XG5cbiAgbGV0IGNoYW5nZWQgPSB0cnVlXG5cbiAgd2hpbGUgKGNoYW5nZWQpIHtcbiAgICBjaGFuZ2VkID0gZmFsc2VcblxuICAgIGZvciAoY29uc3QgbW9kdWxlIG9mIFsuLi51c2VkT3BlcmF0aW9ucy5rZXlzKCldLnNvcnQoKSkge1xuICAgICAgY29uc3QgY29udHJhY3QgPSByZXNvbHZlTW9kdWxlVmVyc2lvbihjb250cmFjdHMsIG1vZHVsZSwgcmFuZ2VzLmdldChtb2R1bGUpID8/IHVuaXZlcnNhbFJhbmdlKVxuICAgICAgY29uc3QgZGVjbGFyZWQgPSBuZXcgTWFwKGNvbnRyYWN0Lm9wZXJhdGlvbnMubWFwKCh7ZGVwZW5kZW5jaWVzLCBuYW1lfSkgPT4gW25hbWUsIGRlcGVuZGVuY2llc10pKVxuXG4gICAgICBmb3IgKGNvbnN0IGRlcGVuZGVuY3kgb2YgY29udHJhY3QuZGVwZW5kZW5jaWVzKSB7XG4gICAgICAgIHJlcXVpcmVNb2R1bGUoZGVwZW5kZW5jeS5tb2R1bGUpXG4gICAgICAgIGlmIChhZGRSYW5nZShkZXBlbmRlbmN5Lm1vZHVsZSwgYXNWZXJzaW9uUmFuZ2UoZGVwZW5kZW5jeS5yYW5nZSkpKSBjaGFuZ2VkID0gdHJ1ZVxuICAgICAgICBpZiAoIXVzZWRPcGVyYXRpb25zLmhhcyhkZXBlbmRlbmN5Lm1vZHVsZSkpIHtcbiAgICAgICAgICB1c2VkT3BlcmF0aW9ucy5zZXQoZGVwZW5kZW5jeS5tb2R1bGUsIG5ldyBTZXQoKSlcbiAgICAgICAgICBjaGFuZ2VkID0gdHJ1ZVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGZvciAoY29uc3Qgb3BlcmF0aW9uIG9mIFsuLi4vKiogQHR5cGUge1NldDxzdHJpbmc+fSAqLyAodXNlZE9wZXJhdGlvbnMuZ2V0KG1vZHVsZSkpXS5zb3J0KCkpIHtcbiAgICAgICAgY29uc3QgZGVwZW5kZW5jaWVzID0gZGVjbGFyZWQuZ2V0KG9wZXJhdGlvbilcblxuICAgICAgICBpZiAoZGVwZW5kZW5jaWVzID09PSB1bmRlZmluZWQpIHVuZGVjbGFyZWRPcGVyYXRpb24obW9kdWxlLCBvcGVyYXRpb24pXG4gICAgICAgIGZvciAoY29uc3QgZGVwZW5kZW5jeSBvZiBkZXBlbmRlbmNpZXMpIHtcbiAgICAgICAgICBjb25zdCB7bW9kdWxlOiBkZXBlbmRlbmN5TW9kdWxlLCBvcGVyYXRpb246IGRlcGVuZGVuY3lPcGVyYXRpb24sIHJhbmdlfSA9IGRlcGVuZGVuY3lcblxuICAgICAgICAgIHJlcXVpcmVNb2R1bGUoZGVwZW5kZW5jeU1vZHVsZSlcbiAgICAgICAgICBpZiAoYWRkUmFuZ2UoZGVwZW5kZW5jeU1vZHVsZSwgYXNWZXJzaW9uUmFuZ2UocmFuZ2UpKSkgY2hhbmdlZCA9IHRydWVcbiAgICAgICAgICBjb25zdCB1c2VkID0gdXNlZE9wZXJhdGlvbnMuZ2V0KGRlcGVuZGVuY3lNb2R1bGUpID8/IG5ldyBTZXQoKVxuXG4gICAgICAgICAgaWYgKCF1c2VkLmhhcyhkZXBlbmRlbmN5T3BlcmF0aW9uKSkge1xuICAgICAgICAgICAgdXNlZC5hZGQoZGVwZW5kZW5jeU9wZXJhdGlvbilcbiAgICAgICAgICAgIHVzZWRPcGVyYXRpb25zLnNldChkZXBlbmRlbmN5TW9kdWxlLCB1c2VkKVxuICAgICAgICAgICAgY2hhbmdlZCA9IHRydWVcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKiogQHR5cGUge01hcDxzdHJpbmcsIFN0ZGxpYlByb3ZpZGVyUmVjb3JkPn0gKi9cbiAgY29uc3Qgc2VsZWN0ZWRQcm92aWRlcnMgPSBuZXcgTWFwKClcbiAgbGV0IHN0YWJsZSA9IGZhbHNlXG5cbiAgd2hpbGUgKCFzdGFibGUpIHtcbiAgICBzdGFibGUgPSB0cnVlXG4gICAgc2VsZWN0ZWRQcm92aWRlcnMuY2xlYXIoKVxuXG4gICAgZm9yIChjb25zdCBtb2R1bGUgb2YgWy4uLnVzZWRPcGVyYXRpb25zLmtleXMoKV0uc29ydCgpKSB7XG4gICAgICBjb25zdCBjb250cmFjdCA9IHJlc29sdmVNb2R1bGVWZXJzaW9uKGNvbnRyYWN0cywgbW9kdWxlLCByYW5nZXMuZ2V0KG1vZHVsZSkgPz8gdW5pdmVyc2FsUmFuZ2UpXG4gICAgICBjb25zdCBjYW5kaWRhdGVzID0gcHJvdmlkZXJzLnByb3ZpZGVyc0Zvcih0YXJnZXQsIG1vZHVsZSwgY29udHJhY3QudmVyc2lvbilcblxuICAgICAgaWYgKGNhbmRpZGF0ZXMubGVuZ3RoID09IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IFNlbWFudGlmb2xkRGlhZ25vc3RpYyh7XG4gICAgICAgICAgY29kZTogXCJTVERMSUJfUFJPVklERVJfTUlTU0lOR1wiLFxuICAgICAgICAgIGxhbmd1YWdlOiB0YXJnZXQsXG4gICAgICAgICAgbWVzc2FnZTogYE5vIHJlZ2lzdGVyZWQgcHJvdmlkZXIgc2VydmVzIG1vZHVsZSAnJHttb2R1bGV9JyB2ZXJzaW9uICcke2NvbnRyYWN0LnZlcnNpb259Jy5gXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgICBpZiAoY2FuZGlkYXRlcy5sZW5ndGggPiAxKSB7XG4gICAgICAgIHRocm93IG5ldyBTZW1hbnRpZm9sZERpYWdub3N0aWMoe1xuICAgICAgICAgIGNvZGU6IFwiU1RETElCX1BST1ZJREVSX0FNQklHVU9VU1wiLFxuICAgICAgICAgIGxhbmd1YWdlOiB0YXJnZXQsXG4gICAgICAgICAgbWVzc2FnZTogYE11bHRpcGxlIHJlZ2lzdGVyZWQgcHJvdmlkZXJzIHNlcnZlIG1vZHVsZSAnJHttb2R1bGV9JyB2ZXJzaW9uICcke2NvbnRyYWN0LnZlcnNpb259Jy5gXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgICBjb25zdCBwcm92aWRlciA9IC8qKiBAdHlwZSB7U3RkbGliUHJvdmlkZXJSZWNvcmR9ICovIChjYW5kaWRhdGVzWzBdKVxuXG4gICAgICBzZWxlY3RlZFByb3ZpZGVycy5zZXQobW9kdWxlLCBwcm92aWRlcilcbiAgICAgIGZvciAoY29uc3QgZGVwZW5kZW5jeSBvZiBwcm92aWRlci5kZXBlbmRlbmNpZXMpIHtcbiAgICAgICAgaWYgKCFjb250cmFjdHMubW9kdWxlcy5zb21lKCh7aWRlbnRpdHl9KSA9PiBpZGVudGl0eSA9PSBkZXBlbmRlbmN5Lm1vZHVsZSkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgU2VtYW50aWZvbGREaWFnbm9zdGljKHtcbiAgICAgICAgICAgIGNvZGU6IFwiU1RETElCX1BST1ZJREVSX0RFUEVOREVOQ1lfTUlTU0lOR1wiLFxuICAgICAgICAgICAgbGFuZ3VhZ2U6IHByb3ZpZGVyLmlkZW50aXR5LFxuICAgICAgICAgICAgbWVzc2FnZTogYFByb3ZpZGVyIGRlcGVuZGVuY3kgbW9kdWxlICcke2RlcGVuZGVuY3kubW9kdWxlfScgaXMgbm90IHJlZ2lzdGVyZWQuYFxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGFkZFJhbmdlKGRlcGVuZGVuY3kubW9kdWxlLCBhc1ZlcnNpb25SYW5nZShkZXBlbmRlbmN5LnJhbmdlKSkpIHN0YWJsZSA9IGZhbHNlXG4gICAgICAgIGlmICghdXNlZE9wZXJhdGlvbnMuaGFzKGRlcGVuZGVuY3kubW9kdWxlKSkge1xuICAgICAgICAgIHVzZWRPcGVyYXRpb25zLnNldChkZXBlbmRlbmN5Lm1vZHVsZSwgbmV3IFNldCgpKVxuICAgICAgICAgIHN0YWJsZSA9IGZhbHNlXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgZm9yIChjb25zdCBtb2R1bGUgb2YgWy4uLnVzZWRPcGVyYXRpb25zLmtleXMoKV0uc29ydCgpKSB7XG4gICAgY29uc3QgcHJvdmlkZXIgPSAvKiogQHR5cGUge1N0ZGxpYlByb3ZpZGVyUmVjb3JkfSAqLyAoc2VsZWN0ZWRQcm92aWRlcnMuZ2V0KG1vZHVsZSkpXG4gICAgY29uc3QgcHJvdmlkZWQgPSBuZXcgU2V0KHByb3ZpZGVyLnByb3ZpZGVzWzBdLm9wZXJhdGlvbnMpXG4gICAgY29uc3QgbWlzc2luZyA9IFsuLi4vKiogQHR5cGUge1NldDxzdHJpbmc+fSAqLyAodXNlZE9wZXJhdGlvbnMuZ2V0KG1vZHVsZSkpXS5zb3J0KClcbiAgICAgIC5maWx0ZXIoKG9wZXJhdGlvbikgPT4gIXByb3ZpZGVkLmhhcyhvcGVyYXRpb24pKVxuXG4gICAgaWYgKG1pc3NpbmcubGVuZ3RoID4gMCkge1xuICAgICAgdGhyb3cgbmV3IFNlbWFudGlmb2xkRGlhZ25vc3RpYyh7XG4gICAgICAgIGNvZGU6IFwiU1RETElCX1BST1ZJREVSX01JU1NJTkdcIixcbiAgICAgICAgbGFuZ3VhZ2U6IHRhcmdldCxcbiAgICAgICAgbWVzc2FnZTogYFByb3ZpZGVyICcke3Byb3ZpZGVyLmlkZW50aXR5fScgZG9lcyBub3QgcHJvdmlkZSBvcGVyYXRpb24ke21pc3NpbmcubGVuZ3RoID4gMSA/IFwic1wiIDogXCJcIn0gJyR7bWlzc2luZy5qb2luKFwiJywgJ1wiKX0nIG9mIG1vZHVsZSAnJHttb2R1bGV9Jy5gXG4gICAgICB9KVxuICAgIH1cbiAgfVxuICBhc3NlcnRBY3ljbGljKGNvbnRyYWN0cywgcmFuZ2VzLCB1c2VkT3BlcmF0aW9ucywgc2VsZWN0ZWRQcm92aWRlcnMpXG4gIC8qKiBAdHlwZSB7e2lkZW50aXR5OiBzdHJpbmcsIG9wZXJhdGlvbnM6IHN0cmluZ1tdLCB2ZXJzaW9uOiBzdHJpbmd9W119ICovXG4gIGNvbnN0IG1vZHVsZXMgPSBbLi4udXNlZE9wZXJhdGlvbnMua2V5cygpXS5zb3J0KCkubWFwKChpZGVudGl0eSkgPT4ge1xuICAgIGNvbnN0IGNvbnRyYWN0ID0gcmVzb2x2ZU1vZHVsZVZlcnNpb24oY29udHJhY3RzLCBpZGVudGl0eSwgcmFuZ2VzLmdldChpZGVudGl0eSkgPz8gdW5pdmVyc2FsUmFuZ2UpXG4gICAgY29uc3QgdXNlZCA9IC8qKiBAdHlwZSB7U2V0PHN0cmluZz59ICovICh1c2VkT3BlcmF0aW9ucy5nZXQoaWRlbnRpdHkpKVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGlkZW50aXR5LFxuICAgICAgb3BlcmF0aW9uczogY29udHJhY3Qub3BlcmF0aW9ucy5tYXAoKHtuYW1lfSkgPT4gbmFtZSkuZmlsdGVyKChuYW1lKSA9PiB1c2VkLmhhcyhuYW1lKSksXG4gICAgICB2ZXJzaW9uOiBjb250cmFjdC52ZXJzaW9uXG4gICAgfVxuICB9KVxuICAvKiogQHR5cGUge3tpZGVudGl0eTogc3RyaW5nLCB0YXJnZXQ6IHN0cmluZywgbW9kdWxlOiBzdHJpbmcsIHZlcnNpb246IHN0cmluZywgb3BlcmF0aW9uczogc3RyaW5nW10sIG5hdGl2ZUVudHJpZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sIHJ1bnRpbWVQcm9maWxlOiBzdHJpbmd9W119ICovXG4gIGNvbnN0IHByb3ZpZGVyUmVzdWx0cyA9IFsuLi5zZWxlY3RlZFByb3ZpZGVycy52YWx1ZXMoKV0uc29ydCgobGVmdCwgcmlnaHQpID0+XG4gICAgbGVmdC5pZGVudGl0eSA8IHJpZ2h0LmlkZW50aXR5ID8gLTEgOiBsZWZ0LmlkZW50aXR5ID4gcmlnaHQuaWRlbnRpdHkgPyAxIDogMCkubWFwKChwcm92aWRlcikgPT4ge1xuICAgIGNvbnN0IG1vZHVsZSA9IHByb3ZpZGVyLnByb3ZpZGVzWzBdLm1vZHVsZVxuICAgIGNvbnN0IGNvbnRyYWN0ID0gcmVzb2x2ZU1vZHVsZVZlcnNpb24oY29udHJhY3RzLCBtb2R1bGUsIHJhbmdlcy5nZXQobW9kdWxlKSA/PyB1bml2ZXJzYWxSYW5nZSlcbiAgICBjb25zdCB1c2VkID0gLyoqIEB0eXBlIHtTZXQ8c3RyaW5nPn0gKi8gKHVzZWRPcGVyYXRpb25zLmdldChtb2R1bGUpKVxuICAgIGNvbnN0IG9wZXJhdGlvbnMgPSBjb250cmFjdC5vcGVyYXRpb25zLm1hcCgoe25hbWV9KSA9PiBuYW1lKS5maWx0ZXIoKG5hbWUpID0+IHVzZWQuaGFzKG5hbWUpKVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGlkZW50aXR5OiBwcm92aWRlci5pZGVudGl0eSxcbiAgICAgIG1vZHVsZSxcbiAgICAgIG5hdGl2ZUVudHJpZXM6IE9iamVjdC5mcm9tRW50cmllcyhvcGVyYXRpb25zLm1hcCgob3BlcmF0aW9uKSA9PiBbXG4gICAgICAgIG9wZXJhdGlvbixcbiAgICAgICAgLyoqIEB0eXBlIHtzdHJpbmd9ICovIChwcm92aWRlci5uYXRpdmVFbnRyaWVzW29wZXJhdGlvbl0pXG4gICAgICBdKSksXG4gICAgICBvcGVyYXRpb25zLFxuICAgICAgcnVudGltZVByb2ZpbGU6IHByb3ZpZGVyLnJ1bnRpbWVQcm9maWxlLFxuICAgICAgdGFyZ2V0OiBwcm92aWRlci50YXJnZXQsXG4gICAgICB2ZXJzaW9uOiBwcm92aWRlci5wcm92aWRlc1swXS52ZXJzaW9uXG4gICAgfVxuICB9KVxuICByZXR1cm4gZGVlcEZyZWV6ZSgvKiogQHR5cGUge1N0ZGxpYk5lZ290aWF0aW9uUmVzdWx0fSAqLyAoe21vZHVsZXMsIHByb3ZpZGVyczogcHJvdmlkZXJSZXN1bHRzLCB0YXJnZXR9KSlcbn1cblxuLyoqXG4gKiBSZXNvbHZlcyB0aGUgaGlnaGVzdCByZWdpc3RlcmVkIGNvbnRyYWN0IHZlcnNpb24gc2F0aXNmeWluZyBvbmUgY29tYmluZWQgcmFuZ2UuXG4gKiBAcGFyYW0ge1N0ZGxpYkNvbnRyYWN0UmVnaXN0cnl9IGNvbnRyYWN0cyAtIENhbm9uaWNhbCBjb250cmFjdCByZWdpc3RyeS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBtb2R1bGUgLSBDYW5vbmljYWwgbW9kdWxlIGlkZW50aXR5LlxuICogQHBhcmFtIHtWZXJzaW9uUmFuZ2V9IHJhbmdlIC0gQ29tYmluZWQgaGFsZi1vcGVuIHJhbmdlLlxuICogQHJldHVybnMge2ltcG9ydChcIi4vc2VtYW50aWMvc3RkbGliLmpzXCIpLlN0ZGxpYkNvbnRyYWN0fSBFeGFjdC12ZXJzaW9uIGNvbnRyYWN0LlxuICovXG5mdW5jdGlvbiByZXNvbHZlTW9kdWxlVmVyc2lvbihjb250cmFjdHMsIG1vZHVsZSwgcmFuZ2UpIHtcbiAgY29uc3QgbGlzdGVkID0gY29udHJhY3RzLm1vZHVsZXMuZmluZCgoe2lkZW50aXR5fSkgPT4gaWRlbnRpdHkgPT0gbW9kdWxlKVxuXG4gIGlmICghbGlzdGVkKSB7XG4gICAgdGhyb3cgbmV3IFNlbWFudGlmb2xkRGlhZ25vc3RpYyh7Y29kZTogXCJTVERMSUJfTU9EVUxFX1VOS05PV05cIiwgbGFuZ3VhZ2U6IG1vZHVsZSwgbWVzc2FnZTogYENhbm9uaWNhbCBtb2R1bGUgJyR7bW9kdWxlfScgaXMgbm90IHJlZ2lzdGVyZWQuYH0pXG4gIH1cbiAgLyoqIEB0eXBlIHtbbnVtYmVyLCBudW1iZXIsIG51bWJlcl0gfCBudWxsfSAqL1xuICBsZXQgcmVzb2x2ZWQgPSBudWxsXG5cbiAgZm9yIChjb25zdCB2ZXJzaW9uIG9mIGxpc3RlZC52ZXJzaW9ucykge1xuICAgIGNvbnN0IHR1cGxlID0gLyoqIEB0eXBlIHtbbnVtYmVyLCBudW1iZXIsIG51bWJlcl19ICovIChwYXJzZVN0ZGxpYlZlcnNpb24odmVyc2lvbikpXG5cbiAgICBpZiAoc3RkbGliVmVyc2lvblNhdGlzZmllcyh0dXBsZSwgcmFuZ2UpICYmIChyZXNvbHZlZCA9PT0gbnVsbCB8fCBjb21wYXJlU3RkbGliVmVyc2lvbnModHVwbGUsIHJlc29sdmVkKSA+IDApKSB7XG4gICAgICByZXNvbHZlZCA9IHR1cGxlXG4gICAgfVxuICB9XG4gIGlmIChyZXNvbHZlZCA9PT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBTZW1hbnRpZm9sZERpYWdub3N0aWMoe1xuICAgICAgY29kZTogXCJTVERMSUJfVkVSU0lPTl9JTkNPTVBBVElCTEVcIixcbiAgICAgIGxhbmd1YWdlOiBtb2R1bGUsXG4gICAgICBtZXNzYWdlOiBgQ2Fub25pY2FsIG1vZHVsZSAnJHttb2R1bGV9JyBoYXMgbm8gcmVnaXN0ZXJlZCB2ZXJzaW9uIHNhdGlzZnlpbmcgdGhlIGNvbWJpbmVkIHJhbmdlLmBcbiAgICB9KVxuICB9XG4gIHJldHVybiBjb250cmFjdHMucmVzb2x2ZU1vZHVsZShtb2R1bGUsIGAke3Jlc29sdmVkWzBdfS4ke3Jlc29sdmVkWzFdfS4ke3Jlc29sdmVkWzJdfWApXG59XG5cbi8qKlxuICogRmFpbHMgZGV0ZXJtaW5pc3RpY2FsbHkgd2hlbiBjYW5vbmljYWwgb3BlcmF0aW9uIGRlcGVuZGVuY2llcyBvciBzZWxlY3RlZCBwcm92aWRlclxuICogbW9kdWxlIGRlcGVuZGVuY2llcyBjeWNsZS5cbiAqIEBwYXJhbSB7U3RkbGliQ29udHJhY3RSZWdpc3RyeX0gY29udHJhY3RzIC0gQ2Fub25pY2FsIGNvbnRyYWN0IHJlZ2lzdHJ5LlxuICogQHBhcmFtIHtNYXA8c3RyaW5nLCBWZXJzaW9uUmFuZ2U+fSByYW5nZXMgLSBDb21iaW5lZCByYW5nZXMgcGVyIG1vZHVsZS5cbiAqIEBwYXJhbSB7TWFwPHN0cmluZywgU2V0PHN0cmluZz4+fSB1c2VkT3BlcmF0aW9ucyAtIFVzZWQgb3BlcmF0aW9ucyBwZXIgbW9kdWxlLlxuICogQHBhcmFtIHtNYXA8c3RyaW5nLCBTdGRsaWJQcm92aWRlclJlY29yZD59IHNlbGVjdGVkUHJvdmlkZXJzIC0gU2VsZWN0ZWQgcHJvdmlkZXIgcGVyIG1vZHVsZS5cbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5mdW5jdGlvbiBhc3NlcnRBY3ljbGljKGNvbnRyYWN0cywgcmFuZ2VzLCB1c2VkT3BlcmF0aW9ucywgc2VsZWN0ZWRQcm92aWRlcnMpIHtcbiAgLyoqIEB0eXBlIHtNYXA8c3RyaW5nLCBzdHJpbmdbXT59ICovXG4gIGNvbnN0IGVkZ2VzID0gbmV3IE1hcCgpXG5cbiAgZm9yIChjb25zdCBtb2R1bGUgb2YgWy4uLnVzZWRPcGVyYXRpb25zLmtleXMoKV0uc29ydCgpKSB7XG4gICAgY29uc3QgY29udHJhY3QgPSByZXNvbHZlTW9kdWxlVmVyc2lvbihjb250cmFjdHMsIG1vZHVsZSwgcmFuZ2VzLmdldChtb2R1bGUpID8/IHVuaXZlcnNhbFJhbmdlKVxuICAgIGNvbnN0IGRlY2xhcmVkID0gbmV3IE1hcChjb250cmFjdC5vcGVyYXRpb25zLm1hcCgoe2RlcGVuZGVuY2llcywgbmFtZX0pID0+IFtuYW1lLCBkZXBlbmRlbmNpZXNdKSlcbiAgICBjb25zdCB1c2VkID0gLyoqIEB0eXBlIHtTZXQ8c3RyaW5nPn0gKi8gKHVzZWRPcGVyYXRpb25zLmdldChtb2R1bGUpKVxuXG4gICAgZm9yIChjb25zdCBvcGVyYXRpb24gb2YgWy4uLnVzZWRdLnNvcnQoKSkge1xuICAgICAgY29uc3Qgbm9kZUtleSA9IGAke21vZHVsZX1cXHUwMDAwJHtvcGVyYXRpb259YFxuICAgICAgY29uc3QgdGFyZ2V0cyA9IC8qKiBAdHlwZSB7c3RyaW5nW119ICovIChlZGdlcy5nZXQobm9kZUtleSkgPz8gW10pXG5cbiAgICAgIGZvciAoY29uc3QgZGVwZW5kZW5jeSBvZiAvKiogQHR5cGUge3ttb2R1bGU6IHN0cmluZywgb3BlcmF0aW9uOiBzdHJpbmd9W119ICovIChkZWNsYXJlZC5nZXQob3BlcmF0aW9uKSkpIHtcbiAgICAgICAgdGFyZ2V0cy5wdXNoKGAke2RlcGVuZGVuY3kubW9kdWxlfVxcdTAwMDAke2RlcGVuZGVuY3kub3BlcmF0aW9ufWApXG4gICAgICB9XG4gICAgICBlZGdlcy5zZXQobm9kZUtleSwgdGFyZ2V0cy5zb3J0KCkpXG4gICAgfVxuICAgIGNvbnN0IG1vZHVsZU5vZGVLZXkgPSBgJHttb2R1bGV9XFx1MDAwMFxcdTAwMDBgXG4gICAgY29uc3QgbW9kdWxlVGFyZ2V0cyA9IC8qKiBAdHlwZSB7c3RyaW5nW119ICovIChlZGdlcy5nZXQobW9kdWxlTm9kZUtleSkgPz8gW10pXG5cbiAgICBmb3IgKGNvbnN0IGRlcGVuZGVuY3kgb2YgY29udHJhY3QuZGVwZW5kZW5jaWVzKSBtb2R1bGVUYXJnZXRzLnB1c2goYCR7ZGVwZW5kZW5jeS5tb2R1bGV9XFx1MDAwMFxcdTAwMDBgKVxuICAgIGVkZ2VzLnNldChtb2R1bGVOb2RlS2V5LCBtb2R1bGVUYXJnZXRzLnNvcnQoKSlcbiAgfVxuICBmb3IgKGNvbnN0IG1vZHVsZSBvZiBbLi4uc2VsZWN0ZWRQcm92aWRlcnMua2V5cygpXS5zb3J0KCkpIHtcbiAgICBjb25zdCBwcm92aWRlciA9IC8qKiBAdHlwZSB7U3RkbGliUHJvdmlkZXJSZWNvcmR9ICovIChzZWxlY3RlZFByb3ZpZGVycy5nZXQobW9kdWxlKSlcbiAgICBjb25zdCBub2RlS2V5ID0gYCR7bW9kdWxlfVxcdTAwMDBcXHUwMDAwYFxuICAgIGNvbnN0IHRhcmdldHMgPSAvKiogQHR5cGUge3N0cmluZ1tdfSAqLyAoZWRnZXMuZ2V0KG5vZGVLZXkpID8/IFtdKVxuXG4gICAgZm9yIChjb25zdCBkZXBlbmRlbmN5IG9mIHByb3ZpZGVyLmRlcGVuZGVuY2llcykge1xuICAgICAgdGFyZ2V0cy5wdXNoKGAke2RlcGVuZGVuY3kubW9kdWxlfVxcdTAwMDBcXHUwMDAwYClcbiAgICB9XG4gICAgZWRnZXMuc2V0KG5vZGVLZXksIHRhcmdldHMuc29ydCgpKVxuICB9XG4gIC8qKiBAdHlwZSB7TWFwPHN0cmluZywgbnVtYmVyPn0gKi9cbiAgY29uc3QgY29sb3JzID0gbmV3IE1hcCgpXG4gIC8qKlxuICAgKiBXYWxrcyB0aGUgZGVwZW5kZW5jeSBlZGdlcyBpbiBkZXRlcm1pbmlzdGljIG9yZGVyLCByZWplY3RpbmcgY3ljbGVzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbm9kZUtleSAtIE5vZGUga2V5LlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIGZ1bmN0aW9uIHZpc2l0KG5vZGVLZXkpIHtcbiAgICBjb2xvcnMuc2V0KG5vZGVLZXksIDEpXG5cbiAgICBmb3IgKGNvbnN0IHRhcmdldCBvZiAvKiogQHR5cGUge3N0cmluZ1tdfSAqLyAoZWRnZXMuZ2V0KG5vZGVLZXkpID8/IFtdKSkge1xuICAgICAgY29uc3QgY29sb3IgPSBjb2xvcnMuZ2V0KHRhcmdldCkgPz8gMFxuXG4gICAgICBpZiAoY29sb3IgPT0gMSkgdGhyb3cgbmV3IFNlbWFudGlmb2xkRGlhZ25vc3RpYyh7XG4gICAgICAgIGNvZGU6IFwiU1RETElCX1BST1ZJREVSX0NZQ0xFXCIsXG4gICAgICAgIGxhbmd1YWdlOiB0YXJnZXQuc3BsaXQoXCJcXHUwMDAwXCIpWzBdLFxuICAgICAgICBtZXNzYWdlOiBcIkNhbm9uaWNhbCBzdGRsaWIgZGVwZW5kZW5jaWVzIGZvcm0gYSBjeWNsZS5cIlxuICAgICAgfSlcbiAgICAgIGlmIChjb2xvciA9PSAwKSB2aXNpdCh0YXJnZXQpXG4gICAgfVxuICAgIGNvbG9ycy5zZXQobm9kZUtleSwgMilcbiAgfVxuXG4gIGZvciAoY29uc3Qgbm9kZUtleSBvZiBbLi4uZWRnZXMua2V5cygpXS5zb3J0KCkpIHtcbiAgICBpZiAoKGNvbG9ycy5nZXQobm9kZUtleSkgPz8gMCkgPT0gMCkgdmlzaXQobm9kZUtleSlcbiAgfVxufVxuXG4vKipcbiAqIE5vcm1hbGl6ZXMgYSBkZWNsYXJlZCBkZXBlbmRlbmN5IHJhbmdlLCBhY2NlcHRpbmcgY2Fub25pY2FsIHN0cmluZ3Mgb3IgcGFyc2VkIHJhbmdlcy5cbiAqIEBwYXJhbSB7dW5rbm93bn0gdmFsdWUgLSBDYW5kaWRhdGUgcmFuZ2UuXG4gKiBAcmV0dXJucyB7VmVyc2lvblJhbmdlfSBIYWxmLW9wZW4gcmFuZ2UuXG4gKi9cbmZ1bmN0aW9uIGFzVmVyc2lvblJhbmdlKHZhbHVlKSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT0gXCJzdHJpbmdcIikge1xuICAgIGNvbnN0IHBhcnNlZCA9IHBhcnNlU3RkbGliVmVyc2lvblJhbmdlKHZhbHVlKVxuXG4gICAgaWYgKHBhcnNlZCA9PT0gbnVsbCkgbWFsZm9ybWVkUmFuZ2UodmFsdWUpXG4gICAgcmV0dXJuIHBhcnNlZFxuICB9XG4gIGlmIChpc1BsYWluT2JqZWN0KHZhbHVlKSAmJiBBcnJheS5pc0FycmF5KHZhbHVlLmxvd2VyKSAmJiB2YWx1ZS5sb3dlci5sZW5ndGggPT0gMyAmJlxuICAgIHZhbHVlLmxvd2VyLmV2ZXJ5KChwYXJ0KSA9PiBOdW1iZXIuaXNJbnRlZ2VyKHBhcnQpKSAmJlxuICAgICh2YWx1ZS51cHBlciA9PT0gbnVsbCB8fCAoQXJyYXkuaXNBcnJheSh2YWx1ZS51cHBlcikgJiYgdmFsdWUudXBwZXIubGVuZ3RoID09IDMgJiZcbiAgICAgIHZhbHVlLnVwcGVyLmV2ZXJ5KChwYXJ0KSA9PiBOdW1iZXIuaXNJbnRlZ2VyKHBhcnQpKSkpKSB7XG4gICAgcmV0dXJuIHtsb3dlcjogLyoqIEB0eXBlIHtbbnVtYmVyLCBudW1iZXIsIG51bWJlcl19ICovICh2YWx1ZS5sb3dlciksIHVwcGVyOiB2YWx1ZS51cHBlciA9PT0gbnVsbCA/IG51bGwgOiAvKiogQHR5cGUge1tudW1iZXIsIG51bWJlciwgbnVtYmVyXX0gKi8gKHZhbHVlLnVwcGVyKX1cbiAgfVxuICByZXR1cm4gbWFsZm9ybWVkUmFuZ2UoU3RyaW5nKHZhbHVlKSlcbn1cblxuLyoqXG4gKiBFbmNvZGVzIG9uZSBoYWxmLW9wZW4gcmFuZ2UgZGV0ZXJtaW5pc3RpY2FsbHkuXG4gKiBAcGFyYW0ge1ZlcnNpb25SYW5nZX0gcmFuZ2UgLSBIYWxmLW9wZW4gcmFuZ2UuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBTdGFibGUga2V5LlxuICovXG5mdW5jdGlvbiByYW5nZUtleShyYW5nZSkge1xuICByZXR1cm4gYCR7cmFuZ2UubG93ZXIuam9pbihcIi5cIil9Li4ke3JhbmdlLnVwcGVyID09PSBudWxsID8gXCJcIiA6IHJhbmdlLnVwcGVyLmpvaW4oXCIuXCIpfWBcbn1cblxuLyoqXG4gKiBUaHJvd3MgYSBtYWxmb3JtZWQtdmVyc2lvbi1yYW5nZSBkaWFnbm9zdGljLlxuICogQHBhcmFtIHtzdHJpbmd9IHJhbmdlIC0gQ2FuZGlkYXRlIHJhbmdlLlxuICogQHJldHVybnMge25ldmVyfSBBbHdheXMgdGhyb3dzLlxuICovXG5mdW5jdGlvbiBtYWxmb3JtZWRSYW5nZShyYW5nZSkge1xuICB0aHJvdyBuZXcgU2VtYW50aWZvbGREaWFnbm9zdGljKHtcbiAgICBjb2RlOiBcIlNURExJQl9WRVJTSU9OX01BTEZPUk1FRFwiLFxuICAgIGxhbmd1YWdlOiBcInN0ZGxpYlwiLFxuICAgIG1lc3NhZ2U6IGBTdGRsaWIgdmVyc2lvbiByYW5nZSAnJHtyYW5nZX0nIGlzIG5vdCBjYW5vbmljYWwuYFxuICB9KVxufVxuXG4vKipcbiAqIFRocm93cyBhbiB1bmRlY2xhcmVkLW9wZXJhdGlvbiBkaWFnbm9zdGljLlxuICogQHBhcmFtIHtzdHJpbmd9IG1vZHVsZSAtIENhbm9uaWNhbCBtb2R1bGUgaWRlbnRpdHkuXG4gKiBAcGFyYW0ge3N0cmluZ30gb3BlcmF0aW9uIC0gTWlzc2luZyBvcGVyYXRpb24uXG4gKiBAcmV0dXJucyB7bmV2ZXJ9IEFsd2F5cyB0aHJvd3MuXG4gKi9cbmZ1bmN0aW9uIHVuZGVjbGFyZWRPcGVyYXRpb24obW9kdWxlLCBvcGVyYXRpb24pIHtcbiAgdGhyb3cgbmV3IFNlbWFudGlmb2xkRGlhZ25vc3RpYyh7XG4gICAgY29kZTogXCJTVERMSUJfT1BFUkFUSU9OX1VOREVDTEFSRURcIixcbiAgICBsYW5ndWFnZTogbW9kdWxlLFxuICAgIG1lc3NhZ2U6IGBPcGVyYXRpb24gJyR7b3BlcmF0aW9ufScgaXMgbm90IGRlY2xhcmVkIGJ5IGNhbm9uaWNhbCBtb2R1bGUgJyR7bW9kdWxlfScuYFxuICB9KVxufVxuXG4vKipcbiAqIFRocm93cyBhIHJlcXVpcmVtZW50LXNoYXBlIGRpYWdub3N0aWMuXG4gKiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZSAtIEZhaWx1cmUgZGV0YWlsLlxuICogQHJldHVybnMge25ldmVyfSBBbHdheXMgdGhyb3dzLlxuICovXG5mdW5jdGlvbiBpbnZhbGlkUmVxdWlyZW1lbnQobWVzc2FnZSkge1xuICB0aHJvdyBuZXcgU2VtYW50aWZvbGREaWFnbm9zdGljKHtjb2RlOiBcIlNURExJQl9DT05UUkFDVF9JTlZBTElEXCIsIGxhbmd1YWdlOiBcInN0ZGxpYlwiLCBtZXNzYWdlfSlcbn1cblxuLyoqXG4gKiBDaGVja3MgZm9yIGFuIG9yZGluYXJ5IHN0cmluZy1rZXllZCBvYmplY3QuXG4gKiBAcGFyYW0ge3Vua25vd259IHZhbHVlIC0gQ2FuZGlkYXRlIHZhbHVlLlxuICogQHJldHVybnMge3ZhbHVlIGlzIFJlY29yZDxzdHJpbmcsIHVua25vd24+fSBXaGV0aGVyIHRoZSB2YWx1ZSBpcyBhIHBsYWluIG9iamVjdC5cbiAqL1xuZnVuY3Rpb24gaXNQbGFpbk9iamVjdCh2YWx1ZSkge1xuICBpZiAodHlwZW9mIHZhbHVlICE9IFwib2JqZWN0XCIgfHwgdmFsdWUgPT09IG51bGwpIHJldHVybiBmYWxzZVxuICBjb25zdCBwcm90b3R5cGUgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YodmFsdWUpXG5cbiAgcmV0dXJuIHByb3RvdHlwZSA9PT0gT2JqZWN0LnByb3RvdHlwZSB8fCBwcm90b3R5cGUgPT09IG51bGxcbn1cblxuLyoqXG4gKiBEZWVwLWZyZWV6ZXMgYSBkZXRhY2hlZCB2YWx1ZS5cbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge1R9IHZhbHVlIC0gRGV0YWNoZWQgdmFsdWUuXG4gKiBAcmV0dXJucyB7UmVhZG9ubHk8VD59IEZyb3plbiB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gZGVlcEZyZWV6ZSh2YWx1ZSkge1xuICBpZiAodHlwZW9mIHZhbHVlICE9IFwib2JqZWN0XCIgfHwgdmFsdWUgPT09IG51bGwgfHwgT2JqZWN0LmlzRnJvemVuKHZhbHVlKSkgcmV0dXJuIC8qKiBAdHlwZSB7UmVhZG9ubHk8VD59ICovICh2YWx1ZSlcbiAgT2JqZWN0LmZyZWV6ZSh2YWx1ZSlcblxuICBmb3IgKGNvbnN0IHByb3BlcnR5IG9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHZhbHVlKSkge1xuICAgIGRlZXBGcmVlemUoLyoqIEB0eXBlIHt1bmtub3dufSAqLyAoKC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgdW5rbm93bj59ICovICh2YWx1ZSkpW3Byb3BlcnR5XSkpXG4gIH1cbiAgcmV0dXJuIC8qKiBAdHlwZSB7UmVhZG9ubHk8VD59ICovICh2YWx1ZSlcbn1cbiJdfQ==
@@ -0,0 +1,72 @@
1
+ export { protectedEntryName } from "./semantic/stdlib.js";
2
+ export type StdlibProviderRecord = {
3
+ /**
4
+ * - Generated provider artifact declaration.
5
+ */
6
+ artifact: {
7
+ mediaType: string;
8
+ path: string;
9
+ };
10
+ /**
11
+ * - Canonical module dependencies with declared ranges.
12
+ */
13
+ dependencies: readonly {
14
+ module: string;
15
+ range: string;
16
+ }[];
17
+ /**
18
+ * - Stable provider identity rooted at the target.
19
+ */
20
+ identity: string;
21
+ /**
22
+ * - Operation to protected native entry name.
23
+ */
24
+ nativeEntries: Readonly<Record<string, string>>;
25
+ /**
26
+ * - Exactly one provided canonical module.
27
+ */
28
+ provides: readonly {
29
+ module: string;
30
+ operations: string[];
31
+ version: string;
32
+ }[];
33
+ /**
34
+ * - Closed target runtime/provider profile.
35
+ */
36
+ runtimeProfile: string;
37
+ /**
38
+ * - Adopted target language identity.
39
+ */
40
+ target: string;
41
+ };
42
+ export type StdlibProviderRegistry = {
43
+ /**
44
+ * - Registered provider records in stable order.
45
+ */
46
+ records: readonly StdlibProviderRecord[];
47
+ /**
48
+ * - Exact provider lookup.
49
+ */
50
+ providersFor: {
51
+ (target: string, module: string, version: string): readonly StdlibProviderRecord[];
52
+ };
53
+ };
54
+ /**
55
+ * Creates the versioned target host stdlib provider registry.
56
+ * @param {unknown} records - Ordered provider records; built-in providers by default.
57
+ * @returns {Readonly<StdlibProviderRegistry>} Frozen registry.
58
+ */
59
+ export declare function createStdlibProviderRegistry(records?: unknown): Readonly<StdlibProviderRegistry>;
60
+ /**
61
+ * Lists the built-in target host providers for the probe contract in stable target order.
62
+ * @returns {readonly StdlibProviderRecord[]} Frozen provider records.
63
+ */
64
+ export declare function listStdlibProviders(): readonly StdlibProviderRecord[];
65
+ /**
66
+ * Authoritative built-in provider lookup keyed by exact target, module, and version.
67
+ * @type {{providersFor(target: string, module: string, version: string): readonly StdlibProviderRecord[]}}
68
+ */
69
+ export declare const stdlibProviderRegistry: {
70
+ providersFor(target: string, module: string, version: string): readonly StdlibProviderRecord[];
71
+ };
72
+ //# sourceMappingURL=stdlib-providers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stdlib-providers.d.ts","sourceRoot":"","sources":["../../src/stdlib-providers.js"],"names":[],"mappings":"AAcA,OAAO,EAAC,kBAAkB,EAAC,MAAM,sBAAsB,CAAA;AAGpD,YAAS,oBAAoB,GAC7B;;;;IAA8C,QAAQ,EAA3C;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAC,CAC5C;;;;IAAuD,YAAY,EAAxD,SAAS;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAC,EAAE,CACrD;;;;IAAmB,QAAQ,EAAhB,MAAM,CACjB;;;;IAA6C,aAAa,EAA/C,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAC3C;;;;IAA+E,QAAQ,EAA5E,SAAS;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,EAAE,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAC,EAAE,CAC7E;;;;IAAmB,cAAc,EAAtB,MAAM,CACjB;;;;IAAmB,MAAM,EAAd,MAAM,CACnB;CAAA,CAAA;AAGE,YAAS,sBAAsB,GAC/B;;;;IAA4C,OAAO,EAAxC,SAAS,oBAAoB,EAAE,CAC1C;;;;IAAiG,YAAY,EAAlG;QAAC,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,SAAS,oBAAoB,EAAE,CAAA;KAAC,CACjG;CAAA,CAAA;AA8BD;;;;GAIG;AACH,wBAAgB,4BAA4B,CAAC,OAAO,GAHzC,OAGoE,GAFlE,QAAQ,CAAC,sBAAsB,CAAC,CA2B5C;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,IAFtB,SAAS,oBAAoB,EAAE,CAI3C;AAED;;;GAGG;AACH,eAAO,MAAM,sBAAsB,EAFzB;IAAC,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,SAAS,oBAAoB,EAAE,CAAA;CAMxG,CAAA"}