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,32 @@
1
+ // @ts-check
2
+ /** Qualified edition-2021 support. Every token is checked by the Rust frontend before collapse. */
3
+ export const rustRuntime = `#![allow(dead_code, unused_variables, unused_mut, unused_assignments, unused_parens, unconditional_recursion, non_snake_case)]
4
+ fn semantifold_print_integer(value: i64) { println!("{}", value); }
5
+ fn semantifold_print_boolean(value: bool) { println!("{}", value); }
6
+ fn semantifold_print_string(value: String) { println!("{}", value); }
7
+ fn semantifold_integer_add(left: i64, right: i64) -> i64 {
8
+ let (result, overflow): (i64, bool) = left.overflowing_add(right);
9
+ if overflow { eprintln!("semantifold: integer overflow"); std::process::exit(70); }
10
+ return result;
11
+ }
12
+ fn semantifold_integer_subtract(left: i64, right: i64) -> i64 {
13
+ let (result, overflow): (i64, bool) = left.overflowing_sub(right);
14
+ if overflow { eprintln!("semantifold: integer overflow"); std::process::exit(70); }
15
+ return result;
16
+ }
17
+ fn semantifold_integer_multiply(left: i64, right: i64) -> i64 {
18
+ let (result, overflow): (i64, bool) = left.overflowing_mul(right);
19
+ if overflow { eprintln!("semantifold: integer overflow"); std::process::exit(70); }
20
+ return result;
21
+ }
22
+ fn semantifold_integer_negate(value: i64) -> i64 {
23
+ let (result, overflow): (i64, bool) = value.overflowing_neg();
24
+ if overflow { eprintln!("semantifold: integer overflow"); std::process::exit(70); }
25
+ return result;
26
+ }
27
+ `;
28
+ /** Actual manifest qualified with Cargo 1.98.1 on Ubuntu 24.04 and 26.04. */
29
+ export const rustManifest = '[package]\nname = "semantifold-generated"\nversion = "0.0.0"\nedition = "2021"\nrust-version = "1.98.1"\npublish = false\nbuild = false\n\n[profile.dev]\noverflow-checks = true\npanic = "abort"\n\n[profile.release]\noverflow-checks = true\npanic = "abort"\n';
30
+ /** Cargo-generated bytes, SHA-256 185a41f6648ef49c8e7721f3321604abf05fae11c7007f823121c17fe48eec64. */
31
+ export const rustLockfile = '# This file is automatically @generated by Cargo.\n# It is not intended for manual editing.\nversion = 4\n\n[[package]]\nname = "semantifold-generated"\nversion = "0.0.0"\n';
32
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVzdC1ydW50aW1lLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2JhY2tlbmRzL3J1c3QtcnVudGltZS5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZO0FBRVosbUdBQW1HO0FBQ25HLE1BQU0sQ0FBQyxNQUFNLFdBQVcsR0FBRzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0NBd0IxQixDQUFBO0FBRUQsNkVBQTZFO0FBQzdFLE1BQU0sQ0FBQyxNQUFNLFlBQVksR0FBRyxtUUFBbVEsQ0FBQTtBQUUvUix1R0FBdUc7QUFDdkcsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFHLDhLQUE4SyxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbi8qKiBRdWFsaWZpZWQgZWRpdGlvbi0yMDIxIHN1cHBvcnQuIEV2ZXJ5IHRva2VuIGlzIGNoZWNrZWQgYnkgdGhlIFJ1c3QgZnJvbnRlbmQgYmVmb3JlIGNvbGxhcHNlLiAqL1xuZXhwb3J0IGNvbnN0IHJ1c3RSdW50aW1lID0gYCMhW2FsbG93KGRlYWRfY29kZSwgdW51c2VkX3ZhcmlhYmxlcywgdW51c2VkX211dCwgdW51c2VkX2Fzc2lnbm1lbnRzLCB1bnVzZWRfcGFyZW5zLCB1bmNvbmRpdGlvbmFsX3JlY3Vyc2lvbiwgbm9uX3NuYWtlX2Nhc2UpXVxuZm4gc2VtYW50aWZvbGRfcHJpbnRfaW50ZWdlcih2YWx1ZTogaTY0KSB7IHByaW50bG4hKFwie31cIiwgdmFsdWUpOyB9XG5mbiBzZW1hbnRpZm9sZF9wcmludF9ib29sZWFuKHZhbHVlOiBib29sKSB7IHByaW50bG4hKFwie31cIiwgdmFsdWUpOyB9XG5mbiBzZW1hbnRpZm9sZF9wcmludF9zdHJpbmcodmFsdWU6IFN0cmluZykgeyBwcmludGxuIShcInt9XCIsIHZhbHVlKTsgfVxuZm4gc2VtYW50aWZvbGRfaW50ZWdlcl9hZGQobGVmdDogaTY0LCByaWdodDogaTY0KSAtPiBpNjQge1xuICAgIGxldCAocmVzdWx0LCBvdmVyZmxvdyk6IChpNjQsIGJvb2wpID0gbGVmdC5vdmVyZmxvd2luZ19hZGQocmlnaHQpO1xuICAgIGlmIG92ZXJmbG93IHsgZXByaW50bG4hKFwic2VtYW50aWZvbGQ6IGludGVnZXIgb3ZlcmZsb3dcIik7IHN0ZDo6cHJvY2Vzczo6ZXhpdCg3MCk7IH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuZm4gc2VtYW50aWZvbGRfaW50ZWdlcl9zdWJ0cmFjdChsZWZ0OiBpNjQsIHJpZ2h0OiBpNjQpIC0+IGk2NCB7XG4gICAgbGV0IChyZXN1bHQsIG92ZXJmbG93KTogKGk2NCwgYm9vbCkgPSBsZWZ0Lm92ZXJmbG93aW5nX3N1YihyaWdodCk7XG4gICAgaWYgb3ZlcmZsb3cgeyBlcHJpbnRsbiEoXCJzZW1hbnRpZm9sZDogaW50ZWdlciBvdmVyZmxvd1wiKTsgc3RkOjpwcm9jZXNzOjpleGl0KDcwKTsgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG5mbiBzZW1hbnRpZm9sZF9pbnRlZ2VyX211bHRpcGx5KGxlZnQ6IGk2NCwgcmlnaHQ6IGk2NCkgLT4gaTY0IHtcbiAgICBsZXQgKHJlc3VsdCwgb3ZlcmZsb3cpOiAoaTY0LCBib29sKSA9IGxlZnQub3ZlcmZsb3dpbmdfbXVsKHJpZ2h0KTtcbiAgICBpZiBvdmVyZmxvdyB7IGVwcmludGxuIShcInNlbWFudGlmb2xkOiBpbnRlZ2VyIG92ZXJmbG93XCIpOyBzdGQ6OnByb2Nlc3M6OmV4aXQoNzApOyB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmZuIHNlbWFudGlmb2xkX2ludGVnZXJfbmVnYXRlKHZhbHVlOiBpNjQpIC0+IGk2NCB7XG4gICAgbGV0IChyZXN1bHQsIG92ZXJmbG93KTogKGk2NCwgYm9vbCkgPSB2YWx1ZS5vdmVyZmxvd2luZ19uZWcoKTtcbiAgICBpZiBvdmVyZmxvdyB7IGVwcmludGxuIShcInNlbWFudGlmb2xkOiBpbnRlZ2VyIG92ZXJmbG93XCIpOyBzdGQ6OnByb2Nlc3M6OmV4aXQoNzApOyB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmBcblxuLyoqIEFjdHVhbCBtYW5pZmVzdCBxdWFsaWZpZWQgd2l0aCBDYXJnbyAxLjk4LjEgb24gVWJ1bnR1IDI0LjA0IGFuZCAyNi4wNC4gKi9cbmV4cG9ydCBjb25zdCBydXN0TWFuaWZlc3QgPSAnW3BhY2thZ2VdXFxubmFtZSA9IFwic2VtYW50aWZvbGQtZ2VuZXJhdGVkXCJcXG52ZXJzaW9uID0gXCIwLjAuMFwiXFxuZWRpdGlvbiA9IFwiMjAyMVwiXFxucnVzdC12ZXJzaW9uID0gXCIxLjk4LjFcIlxcbnB1Ymxpc2ggPSBmYWxzZVxcbmJ1aWxkID0gZmFsc2VcXG5cXG5bcHJvZmlsZS5kZXZdXFxub3ZlcmZsb3ctY2hlY2tzID0gdHJ1ZVxcbnBhbmljID0gXCJhYm9ydFwiXFxuXFxuW3Byb2ZpbGUucmVsZWFzZV1cXG5vdmVyZmxvdy1jaGVja3MgPSB0cnVlXFxucGFuaWMgPSBcImFib3J0XCJcXG4nXG5cbi8qKiBDYXJnby1nZW5lcmF0ZWQgYnl0ZXMsIFNIQS0yNTYgMTg1YTQxZjY2NDhlZjQ5YzhlNzcyMWYzMzIxNjA0YWJmMDVmYWUxMWM3MDA3ZjgyMzEyMWMxN2ZlNDhlZWM2NC4gKi9cbmV4cG9ydCBjb25zdCBydXN0TG9ja2ZpbGUgPSAnIyBUaGlzIGZpbGUgaXMgYXV0b21hdGljYWxseSBAZ2VuZXJhdGVkIGJ5IENhcmdvLlxcbiMgSXQgaXMgbm90IGludGVuZGVkIGZvciBtYW51YWwgZWRpdGluZy5cXG52ZXJzaW9uID0gNFxcblxcbltbcGFja2FnZV1dXFxubmFtZSA9IFwic2VtYW50aWZvbGQtZ2VuZXJhdGVkXCJcXG52ZXJzaW9uID0gXCIwLjAuMFwiXFxuJ1xuIl19
@@ -0,0 +1,9 @@
1
+ /** Qualified legacy Rust grammar input limit, including support source. */
2
+ export declare const maximumRustSourceLength = 32767;
3
+ /**
4
+ * Rejects statically unrepresentable owned values before constructing any artifacts.
5
+ * @param {import("../semantic/types.js").SemanticModule} module - Fully validated semantics.
6
+ * @returns {void}
7
+ */
8
+ export declare function validateRustValues(module: import("../semantic/types.js").SemanticModule): void;
9
+ //# sourceMappingURL=rust-validation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rust-validation.d.ts","sourceRoot":"","sources":["../../../src/backends/rust-validation.js"],"names":[],"mappings":"AAIA,2EAA2E;AAC3E,eAAO,MAAM,uBAAuB,QAAQ,CAAA;AA2D5C;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAH9B,OAAO,sBAAsB,EAAE,cAGD,GAF5B,IAAI,CAOhB"}
@@ -0,0 +1,78 @@
1
+ // @ts-check
2
+ import { unsupportedCapability } from "../diagnostic.js";
3
+ /** Qualified legacy Rust grammar input limit, including support source. */
4
+ export const maximumRustSourceLength = 32767;
5
+ /** Propagates known owned UTF-8 lengths to reject impossible native allocations before emission. */
6
+ class RustValueValidator {
7
+ /**
8
+ * Validates each expression without folding or changing the semantic graph.
9
+ * @param {import("../semantic/types.js").Expression} expression - Validated expression.
10
+ * @param {Map<string, bigint | undefined>} sizes - Known lexical string byte sizes.
11
+ * @returns {bigint | undefined} Proven result size when known.
12
+ */
13
+ size(expression, sizes) {
14
+ if (expression.kind == "StringLiteral")
15
+ return BigInt(Buffer.byteLength(expression.value, "utf8"));
16
+ if (expression.kind == "IdentifierExpression")
17
+ return sizes.get(expression.name);
18
+ if (expression.kind == "CallExpression") {
19
+ for (const argument of expression.arguments)
20
+ this.size(argument, sizes);
21
+ }
22
+ else if (expression.kind == "UnaryExpression")
23
+ this.size(expression.operand, sizes);
24
+ else if (expression.kind == "BinaryExpression") {
25
+ const left = this.size(expression.left, sizes);
26
+ const right = this.size(expression.right, sizes);
27
+ if (expression.operation == "StringConcat") {
28
+ if ((left ?? 0n) + (right ?? 0n) > 9223372036854775807n) {
29
+ unsupportedCapability("rust", "known owned string size exceeds the qualified signed-64-bit allocation limit", expression.location);
30
+ }
31
+ if (left !== undefined && right !== undefined)
32
+ return left + right;
33
+ }
34
+ }
35
+ return undefined;
36
+ }
37
+ /**
38
+ * Follows value copies and independent branches, retaining only equal outgoing size proofs.
39
+ * @param {import("../semantic/types.js").Block} block - Lexical block.
40
+ * @param {Map<string, bigint | undefined>} inherited - Visible sizes.
41
+ * @returns {Map<string, bigint | undefined>} Outgoing size proofs.
42
+ */
43
+ block(block, inherited) {
44
+ const sizes = new Map(inherited);
45
+ for (const statement of block.statements) {
46
+ if (statement.kind == "LocalDeclaration")
47
+ sizes.set(statement.name, this.size(statement.initializer, sizes));
48
+ else if (statement.kind == "AssignmentStatement")
49
+ sizes.set(statement.target.name, this.size(statement.expression, sizes));
50
+ else if (statement.kind == "IfStatement") {
51
+ this.size(statement.condition, sizes);
52
+ const left = this.block(statement.consequent, sizes);
53
+ const right = statement.alternate ? this.block(statement.alternate, sizes) : sizes;
54
+ for (const name of sizes.keys())
55
+ sizes.set(name, left.get(name) === right.get(name) ? left.get(name) : undefined);
56
+ }
57
+ else if (statement.kind == "ExpressionStatement" || statement.kind == "PrintStatement" ||
58
+ statement.kind == "ReturnStatement") {
59
+ const expression = statement.expression;
60
+ if (expression)
61
+ this.size(expression, sizes);
62
+ }
63
+ }
64
+ return sizes;
65
+ }
66
+ }
67
+ /**
68
+ * Rejects statically unrepresentable owned values before constructing any artifacts.
69
+ * @param {import("../semantic/types.js").SemanticModule} module - Fully validated semantics.
70
+ * @returns {void}
71
+ */
72
+ export function validateRustValues(module) {
73
+ const validator = new RustValueValidator();
74
+ for (const declaration of module.functions)
75
+ validator.block(declaration.body, new Map());
76
+ validator.block(module.entryPoint.body, new Map());
77
+ }
78
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVzdC12YWxpZGF0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2JhY2tlbmRzL3J1c3QtdmFsaWRhdGlvbi5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZO0FBRVosT0FBTyxFQUFDLHFCQUFxQixFQUFDLE1BQU0sa0JBQWtCLENBQUE7QUFFdEQsMkVBQTJFO0FBQzNFLE1BQU0sQ0FBQyxNQUFNLHVCQUF1QixHQUFHLEtBQUssQ0FBQTtBQUU1QyxvR0FBb0c7QUFDcEcsTUFBTSxrQkFBa0I7SUFDdEI7Ozs7O09BS0c7SUFDSCxJQUFJLENBQUMsVUFBVSxFQUFFLEtBQUs7UUFDcEIsSUFBSSxVQUFVLENBQUMsSUFBSSxJQUFJLGVBQWU7WUFBRSxPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQTtRQUNsRyxJQUFJLFVBQVUsQ0FBQyxJQUFJLElBQUksc0JBQXNCO1lBQUUsT0FBTyxLQUFLLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUNoRixJQUFJLFVBQVUsQ0FBQyxJQUFJLElBQUksZ0JBQWdCLEVBQUUsQ0FBQztZQUN4QyxLQUFLLE1BQU0sUUFBUSxJQUFJLFVBQVUsQ0FBQyxTQUFTO2dCQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFBO1FBQ3pFLENBQUM7YUFBTSxJQUFJLFVBQVUsQ0FBQyxJQUFJLElBQUksaUJBQWlCO1lBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFBO2FBQ2hGLElBQUksVUFBVSxDQUFDLElBQUksSUFBSSxrQkFBa0IsRUFBRSxDQUFDO1lBQy9DLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FB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LElBQUksTUFBTSxDQUFDLFNBQVM7UUFBRSxTQUFTLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsSUFBSSxHQUFHLEVBQUUsQ0FBQyxDQUFBO0lBQ3hGLFNBQVMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxHQUFHLEVBQUUsQ0FBQyxDQUFBO0FBQ3BELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0IHt1bnN1cHBvcnRlZENhcGFiaWxpdHl9IGZyb20gXCIuLi9kaWFnbm9zdGljLmpzXCJcblxuLyoqIFF1YWxpZmllZCBsZWdhY3kgUnVzdCBncmFtbWFyIGlucHV0IGxpbWl0LCBpbmNsdWRpbmcgc3VwcG9ydCBzb3VyY2UuICovXG5leHBvcnQgY29uc3QgbWF4aW11bVJ1c3RTb3VyY2VMZW5ndGggPSAzMjc2N1xuXG4vKiogUHJvcGFnYXRlcyBrbm93biBvd25lZCBVVEYtOCBsZW5ndGhzIHRvIHJlamVjdCBpbXBvc3NpYmxlIG5hdGl2ZSBhbGxvY2F0aW9ucyBiZWZvcmUgZW1pc3Npb24uICovXG5jbGFzcyBSdXN0VmFsdWVWYWxpZGF0b3Ige1xuICAvKipcbiAgICogVmFsaWRhdGVzIGVhY2ggZXhwcmVzc2lvbiB3aXRob3V0IGZvbGRpbmcgb3IgY2hhbmdpbmcgdGhlIHNlbWFudGljIGdyYXBoLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLkV4cHJlc3Npb259IGV4cHJlc3Npb24gLSBWYWxpZGF0ZWQgZXhwcmVzc2lvbi5cbiAgICogQHBhcmFtIHtNYXA8c3RyaW5nLCBiaWdpbnQgfCB1bmRlZmluZWQ+fSBzaXplcyAtIEtub3duIGxleGljYWwgc3RyaW5nIGJ5dGUgc2l6ZXMuXG4gICAqIEByZXR1cm5zIHtiaWdpbnQgfCB1bmRlZmluZWR9IFByb3ZlbiByZXN1bHQgc2l6ZSB3aGVuIGtub3duLlxuICAgKi9cbiAgc2l6ZShleHByZXNzaW9uLCBzaXplcykge1xuICAgIGlmIChleHByZXNzaW9uLmtpbmQgPT0gXCJTdHJpbmdMaXRlcmFsXCIpIHJldHVybiBCaWdJbnQoQnVmZmVyLmJ5dGVMZW5ndGgoZXhwcmVzc2lvbi52YWx1ZSwgXCJ1dGY4XCIpKVxuICAgIGlmIChleHByZXNzaW9uLmtpbmQgPT0gXCJJZGVudGlmaWVyRXhwcmVzc2lvblwiKSByZXR1cm4gc2l6ZXMuZ2V0KGV4cHJlc3Npb24ubmFtZSlcbiAgICBpZiAoZXhwcmVzc2lvbi5raW5kID09IFwiQ2FsbEV4cHJlc3Npb25cIikge1xuICAgICAgZm9yIChjb25zdCBhcmd1bWVudCBvZiBleHByZXNzaW9uLmFyZ3VtZW50cykgdGhpcy5zaXplKGFyZ3VtZW50LCBzaXplcylcbiAgICB9IGVsc2UgaWYgKGV4cHJlc3Npb24ua2luZCA9PSBcIlVuYXJ5RXhwcmVzc2lvblwiKSB0aGlzLnNpemUoZXhwcmVzc2lvbi5vcGVyYW5kLCBzaXplcylcbiAgICBlbHNlIGlmIChleHByZXNzaW9uLmtpbmQgPT0gXCJCaW5hcnlFeHByZXNzaW9uXCIpIHtcbiAgICAgIGNvbnN0IGxlZnQgPSB0aGlzLnNpemUoZXhwcmVzc2lvbi5sZWZ0LCBzaXplcylcbiAgICAgIGNvbnN0IHJpZ2h0ID0gdGhpcy5zaXplKGV4cHJlc3Npb24ucmlnaHQsIHNpemVzKVxuXG4gICAgICBpZiAoZXhwcmVzc2lvbi5vcGVyYXRpb24gPT0gXCJTdHJpbmdDb25jYXRcIikge1xuICAgICAgICBpZiAoKGxlZnQgPz8gMG4pICsgKHJpZ2h0ID8/IDBuKSA+IDkyMjMzNzIwMzY4NTQ3NzU4MDduKSB7XG4gICAgICAgICAgdW5zdXBwb3J0ZWRDYXBhYmlsaXR5KFwicnVzdFwiLCBcImtub3duIG93bmVkIHN0cmluZyBzaXplIGV4Y2VlZHMgdGhlIHF1YWxpZmllZCBzaWduZWQtNjQtYml0IGFsbG9jYXRpb24gbGltaXRcIiwgZXhwcmVzc2lvbi5sb2NhdGlvbilcbiAgICAgICAgfVxuICAgICAgICBpZiAobGVmdCAhPT0gdW5kZWZpbmVkICYmIHJpZ2h0ICE9PSB1bmRlZmluZWQpIHJldHVybiBsZWZ0ICsgcmlnaHRcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZFxuICB9XG5cbiAgLyoqXG4gICAqIEZvbGxvd3MgdmFsdWUgY29waWVzIGFuZCBpbmRlcGVuZGVudCBicmFuY2hlcywgcmV0YWluaW5nIG9ubHkgZXF1YWwgb3V0Z29pbmcgc2l6ZSBwcm9vZnMuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuQmxvY2t9IGJsb2NrIC0gTGV4aWNhbCBibG9jay5cbiAgICogQHBhcmFtIHtNYXA8c3RyaW5nLCBiaWdpbnQgfCB1bmRlZmluZWQ+fSBpbmhlcml0ZWQgLSBWaXNpYmxlIHNpemVzLlxuICAgKiBAcmV0dXJucyB7TWFwPHN0cmluZywgYmlnaW50IHwgdW5kZWZpbmVkPn0gT3V0Z29pbmcgc2l6ZSBwcm9vZnMuXG4gICAqL1xuICBibG9jayhibG9jaywgaW5oZXJpdGVkKSB7XG4gICAgY29uc3Qgc2l6ZXMgPSBuZXcgTWFwKGluaGVyaXRlZClcblxuICAgIGZvciAoY29uc3Qgc3RhdGVtZW50IG9mIGJsb2NrLnN0YXRlbWVudHMpIHtcbiAgICAgIGlmIChzdGF0ZW1lbnQua2luZCA9PSBcIkxvY2FsRGVjbGFyYXRpb25cIikgc2l6ZXMuc2V0KHN0YXRlbWVudC5uYW1lLCB0aGlzLnNpemUoc3RhdGVtZW50LmluaXRpYWxpemVyLCBzaXplcykpXG4gICAgICBlbHNlIGlmIChzdGF0ZW1lbnQua2luZCA9PSBcIkFzc2lnbm1lbnRTdGF0ZW1lbnRcIikgc2l6ZXMuc2V0KHN0YXRlbWVudC50YXJnZXQubmFtZSwgdGhpcy5zaXplKHN0YXRlbWVudC5leHByZXNzaW9uLCBzaXplcykpXG4gICAgICBlbHNlIGlmIChzdGF0ZW1lbnQua2luZCA9PSBcIklmU3RhdGVtZW50XCIpIHtcbiAgICAgICAgdGhpcy5zaXplKHN0YXRlbWVudC5jb25kaXRpb24sIHNpemVzKVxuICAgICAgICBjb25zdCBsZWZ0ID0gdGhpcy5ibG9jayhzdGF0ZW1lbnQuY29uc2VxdWVudCwgc2l6ZXMpXG4gICAgICAgIGNvbnN0IHJpZ2h0ID0gc3RhdGVtZW50LmFsdGVybmF0ZSA/IHRoaXMuYmxvY2soc3RhdGVtZW50LmFsdGVybmF0ZSwgc2l6ZXMpIDogc2l6ZXNcblxuICAgICAgICBmb3IgKGNvbnN0IG5hbWUgb2Ygc2l6ZXMua2V5cygpKSBzaXplcy5zZXQobmFtZSwgbGVmdC5nZXQobmFtZSkgPT09IHJpZ2h0LmdldChuYW1lKSA/IGxlZnQuZ2V0KG5hbWUpIDogdW5kZWZpbmVkKVxuICAgICAgfSBlbHNlIGlmIChzdGF0ZW1lbnQua2luZCA9PSBcIkV4cHJlc3Npb25TdGF0ZW1lbnRcIiB8fCBzdGF0ZW1lbnQua2luZCA9PSBcIlByaW50U3RhdGVtZW50XCIgfHxcbiAgICAgICAgc3RhdGVtZW50LmtpbmQgPT0gXCJSZXR1cm5TdGF0ZW1lbnRcIikge1xuICAgICAgICBjb25zdCBleHByZXNzaW9uID0gc3RhdGVtZW50LmV4cHJlc3Npb25cblxuICAgICAgICBpZiAoZXhwcmVzc2lvbikgdGhpcy5zaXplKGV4cHJlc3Npb24sIHNpemVzKVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc2l6ZXNcbiAgfVxufVxuXG4vKipcbiAqIFJlamVjdHMgc3RhdGljYWxseSB1bnJlcHJlc2VudGFibGUgb3duZWQgdmFsdWVzIGJlZm9yZSBjb25zdHJ1Y3RpbmcgYW55IGFydGlmYWN0cy5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNNb2R1bGV9IG1vZHVsZSAtIEZ1bGx5IHZhbGlkYXRlZCBzZW1hbnRpY3MuXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlUnVzdFZhbHVlcyhtb2R1bGUpIHtcbiAgY29uc3QgdmFsaWRhdG9yID0gbmV3IFJ1c3RWYWx1ZVZhbGlkYXRvcigpXG5cbiAgZm9yIChjb25zdCBkZWNsYXJhdGlvbiBvZiBtb2R1bGUuZnVuY3Rpb25zKSB2YWxpZGF0b3IuYmxvY2soZGVjbGFyYXRpb24uYm9keSwgbmV3IE1hcCgpKVxuICB2YWxpZGF0b3IuYmxvY2sobW9kdWxlLmVudHJ5UG9pbnQuYm9keSwgbmV3IE1hcCgpKVxufVxuIl19
@@ -0,0 +1,24 @@
1
+ export type SemanticModule = import("../semantic/types.js").SemanticModule;
2
+ export type SemanticNode = import("../semantic/types.js").SemanticNode;
3
+ export type Expression = import("../semantic/types.js").Expression;
4
+ export type Scalar = import("../semantic/types.js").SemanticTypeName;
5
+ /**
6
+ * Produces a complete deterministic offline Cargo project after full validation and size preflight.
7
+ * @param {{filename?: string, mapDirective?: unknown, module: SemanticModule, sourceMapFilename?: unknown, sources?: {filename: string, content: string, language?: import("../semantic/types.js").SemanticLanguage}[]}} input - Artifact-set request.
8
+ * @returns {{artifacts: import("../semantic/types.js").GeneratedSetArtifact[], target: string}} Complete candidate set.
9
+ */
10
+ export declare function generateRustProject({ filename, mapDirective, module, sourceMapFilename, sources }: {
11
+ filename?: string;
12
+ mapDirective?: unknown;
13
+ module: SemanticModule;
14
+ sourceMapFilename?: unknown;
15
+ sources?: {
16
+ filename: string;
17
+ content: string;
18
+ language?: import("../semantic/types.js").SemanticLanguage;
19
+ }[];
20
+ }): {
21
+ artifacts: import("../semantic/types.js").GeneratedSetArtifact[];
22
+ target: string;
23
+ };
24
+ //# sourceMappingURL=rust.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rust.d.ts","sourceRoot":"","sources":["../../../src/backends/rust.js"],"names":[],"mappings":"AAWI,YAAyD,cAAc,GAA7D,OAAO,sBAAsB,EAAE,cAAc,CAAgB;AACvE,YAAuD,YAAY,GAAzD,OAAO,sBAAsB,EAAE,YAAY,CAAc;AACnE,YAAqD,UAAU,GAArD,OAAO,sBAAsB,EAAE,UAAU,CAAY;AAC/D,YAA2D,MAAM,GAAvD,OAAO,sBAAsB,EAAE,gBAAgB,CAAQ;AAUrE;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,EAAC,QAAQ,EAAE,YAAY,EAAE,MAAM,EAAE,iBAAiB,EAAE,OAAO,EAAC,EAHrF;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,cAAc,CAAC;IAAC,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,OAAO,sBAAsB,EAAE,gBAAgB,CAAA;KAAC,EAAE,CAAA;CAGvH,GAFnF;IAAC,SAAS,EAAE,OAAO,sBAAsB,EAAE,oBAAoB,EAAE,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAC,CA8B9F"}
@@ -0,0 +1,344 @@
1
+ // @ts-check
2
+ import { unsupportedCapability } from "../diagnostic.js";
3
+ import { finalizeMapping, toSourceMapV3 } from "../mapping.js";
4
+ import { validateBackendModule } from "./shared.js";
5
+ import { validateNativeGraph } from "./native-validation.js";
6
+ import { maximumRustSourceLength, validateRustValues } from "./rust-validation.js";
7
+ import { rustLockfile, rustManifest, rustRuntime } from "./rust-runtime.js";
8
+ import { emitScalarType } from "./scalars.js";
9
+ import { SourceWriter } from "./writer.js";
10
+ /** @typedef {import("../semantic/types.js").SemanticModule} SemanticModule */
11
+ /** @typedef {import("../semantic/types.js").SemanticNode} SemanticNode */
12
+ /** @typedef {import("../semantic/types.js").Expression} Expression */
13
+ /** @typedef {import("../semantic/types.js").SemanticTypeName} Scalar */
14
+ const operators = new Map([
15
+ ["IntegerAdd", "semantifold_integer_add"], ["IntegerSubtract", "semantifold_integer_subtract"],
16
+ ["IntegerMultiply", "semantifold_integer_multiply"], ["IntegerEqual", "=="], ["IntegerNotEqual", "!="],
17
+ ["IntegerLessThan", "<"], ["IntegerLessThanOrEqual", "<="], ["IntegerGreaterThan", ">"], ["IntegerGreaterThanOrEqual", ">="],
18
+ ["BooleanEqual", "=="], ["BooleanNotEqual", "!="], ["BooleanAnd", "&&"], ["BooleanOr", "||"],
19
+ ["StringConcat", "+"], ["StringEqual", "=="], ["StringNotEqual", "!="]
20
+ ]);
21
+ /**
22
+ * Produces a complete deterministic offline Cargo project after full validation and size preflight.
23
+ * @param {{filename?: string, mapDirective?: unknown, module: SemanticModule, sourceMapFilename?: unknown, sources?: {filename: string, content: string, language?: import("../semantic/types.js").SemanticLanguage}[]}} input - Artifact-set request.
24
+ * @returns {{artifacts: import("../semantic/types.js").GeneratedSetArtifact[], target: string}} Complete candidate set.
25
+ */
26
+ export function generateRustProject({ filename, mapDirective, module, sourceMapFilename, sources }) {
27
+ validateNativeGraph(module, "rust");
28
+ validateBackendModule(module, "rust");
29
+ validateRustValues(module);
30
+ if (filename !== undefined && filename != "src/main.rs")
31
+ unsupportedCapability("rust", "artifact filename other than src/main.rs", module.location);
32
+ if (mapDirective !== undefined || sourceMapFilename !== undefined)
33
+ unsupportedCapability("rust", "source-map filename or directive option", module.location);
34
+ new RustEmitter(module).program(module);
35
+ const writer = new SourceWriter({ filename: "src/main.rs", language: "rust", module, sources });
36
+ new RustEmitter(module, writer).program(module);
37
+ const mapping = finalizeMapping(writer.finish());
38
+ const root = mapping.nodes.find(node => node.path == "");
39
+ if (!root)
40
+ throw new Error("Validated Rust module omitted root provenance.");
41
+ const origin = root.origin;
42
+ const relatedOrigins = origin.kind == "source" ? [{ location: origin.location, nodeId: root.id, role: "module", sourceId: origin.sourceId }] :
43
+ (origin.kind == "derived" ? origin.origins : origin.relatedOrigins).map(item => ({ ...item, nodeId: item.nodeId ?? root.id, role: item.role ?? "module" }));
44
+ return { target: "rust", artifacts: [{
45
+ path: "Cargo.toml", role: "manifest", ownership: "generated", contentKind: "text", mediaType: "text/plain", content: rustManifest,
46
+ provenance: { kind: "synthetic", reason: "Fixed dependency-free edition-2021 Cargo package, Rust 1.98.1 minimum and matching dev/release abort/overflow profiles.", relatedOrigins }
47
+ }, {
48
+ path: "Cargo.lock", role: "support", ownership: "generated", contentKind: "text", mediaType: "text/plain", content: rustLockfile,
49
+ provenance: { kind: "synthetic", reason: "Exact dependency-free format-4 lockfile generated and qualified with Cargo 1.98.1.", relatedOrigins }
50
+ }, {
51
+ path: "src/main.rs", role: "entry", ownership: "generated", contentKind: "text", mediaType: "text/x-rust", content: mapping.generated.content,
52
+ provenance: { kind: "text", mapping, sourceMap: toSourceMapV3(mapping) }
53
+ }] };
54
+ }
55
+ /** Emits native left-to-right expressions with explicit owned String copy boundaries. */
56
+ class RustEmitter {
57
+ /**
58
+ * Binds validated result types and an optional writer for the size-only preflight.
59
+ * @param {SemanticModule} module - Complete validated semantics.
60
+ * @param {SourceWriter} [writer] - Absent during size preflight.
61
+ */
62
+ constructor(module, writer) {
63
+ this.writer = writer;
64
+ /** @type {Map<string, Scalar>} */
65
+ this.functions = new Map(module.functions.map(declaration => [declaration.name, rustScalarType(declaration.returnType, declaration.location)]));
66
+ this.length = 0;
67
+ this.location = module.location;
68
+ }
69
+ /**
70
+ * Bounds exact source length before any public artifact or writer is exposed.
71
+ * @param {string} text - Next text chunk.
72
+ * @param {SemanticNode} node - Related semantic origin.
73
+ * @returns {void}
74
+ */
75
+ checkSize(text, node) {
76
+ this.length += text.length;
77
+ if (this.length > maximumRustSourceLength)
78
+ unsupportedCapability("rust", "generated program exceeds the frozen Rust parser's 32767 UTF-16 input limit", "location" in node ? node.location : this.location);
79
+ }
80
+ /**
81
+ * Emits target-owned syntax with explicit related semantic provenance.
82
+ * @param {string} text - Rust syntax.
83
+ * @param {SemanticNode} node - Related node.
84
+ * @param {string} path - Semantic occurrence.
85
+ * @param {string} [reason] - Synthetic syntax purpose.
86
+ * @returns {void}
87
+ */
88
+ synthetic(text, node, path, reason = "Rust declaration and expression syntax") {
89
+ this.checkSize(text, node);
90
+ this.writer?.synthetic(text, reason, [node], [path]);
91
+ }
92
+ /**
93
+ * Emits an original semantic token or declaration anchor.
94
+ * @param {string} text - Target token.
95
+ * @param {SemanticNode} node - Original node.
96
+ * @param {string} path - Occurrence path.
97
+ * @param {string} [role] - Original parser role.
98
+ * @returns {void}
99
+ */
100
+ mapped(text, node, path, role) {
101
+ this.checkSize(text, node);
102
+ this.writer?.mapped(text, { mappingKind: role ? "exact" : "anchor", node, path, ...(role ? { role } : {}) });
103
+ }
104
+ /**
105
+ * Resolves an already validated expression's native scalar representation.
106
+ * @param {Expression} expression - Validated expression.
107
+ * @param {Map<string, Scalar>} bindings - Lexical types.
108
+ * @returns {Scalar} Result scalar.
109
+ */
110
+ type(expression, bindings) {
111
+ if (expression.kind == "IntegerLiteral")
112
+ return "integer";
113
+ if (expression.kind == "BooleanLiteral")
114
+ return "boolean";
115
+ if (expression.kind == "StringLiteral")
116
+ return "string";
117
+ if (expression.kind == "UnaryExpression" || expression.kind == "BinaryExpression")
118
+ return expression.type;
119
+ if (expression.kind != "CallExpression" && expression.kind != "IdentifierExpression") {
120
+ return unsupportedCapability("rust", "collection expression reached scalar emission", expression.location);
121
+ }
122
+ const type = expression.kind == "CallExpression" ? this.functions.get(expression.callee) : bindings.get(expression.name);
123
+ if (!type)
124
+ throw new Error("Validated Rust expression lost its scalar type.");
125
+ return type;
126
+ }
127
+ /**
128
+ * Emits fixed support, crate-root functions and the parameterless entry point.
129
+ * @param {SemanticModule} module - Validated module.
130
+ * @returns {void}
131
+ */
132
+ program(module) {
133
+ this.synthetic(rustRuntime, module, "", "Exact Rust scalar, print and overflow support");
134
+ module.functions.forEach((declaration, index) => {
135
+ const path = `/functions/${index}`;
136
+ this.synthetic("\n", declaration, path);
137
+ this.mapped("fn", declaration, path);
138
+ this.synthetic(" ", declaration, path);
139
+ this.mapped(declaration.name, declaration, path, "name");
140
+ this.synthetic("(", declaration, path);
141
+ declaration.parameters.forEach((parameter, parameterIndex) => {
142
+ const parameterPath = `${path}/parameters/${parameterIndex}`;
143
+ if (parameterIndex)
144
+ this.synthetic(", ", parameter, parameterPath);
145
+ this.mapped(parameter.name, parameter, parameterPath, "name");
146
+ this.synthetic(": ", parameter, parameterPath);
147
+ this.mapped(emitScalarType("rust", parameter.type), parameter.type, `${parameterPath}/type`, "type");
148
+ });
149
+ this.synthetic(") -> ", declaration, path);
150
+ this.mapped(emitScalarType("rust", declaration.returnType), declaration.returnType, `${path}/returnType`, "type");
151
+ this.synthetic(" {\n", declaration, path);
152
+ this.block(declaration.body, `${path}/body`, " ", new Map(declaration.parameters.map(parameter => [
153
+ parameter.name, rustScalarType(parameter.type, parameter.location)
154
+ ])));
155
+ this.synthetic("}\n", declaration, path);
156
+ });
157
+ this.synthetic("\nfn main() {\n", module.entryPoint, "/entryPoint");
158
+ this.block(module.entryPoint.body, "/entryPoint/body", " ", new Map());
159
+ this.synthetic("}\n", module.entryPoint, "/entryPoint");
160
+ }
161
+ /**
162
+ * Emits statements in order with independent branch binding environments.
163
+ * @param {import("../semantic/types.js").Block} block - Semantic block.
164
+ * @param {string} path - Occurrence path.
165
+ * @param {string} indent - Current indentation.
166
+ * @param {Map<string, Scalar>} inherited - Visible lexical types.
167
+ * @param {number} [depth] - Exact generated CST block depth, root source file at zero.
168
+ * @returns {void}
169
+ */
170
+ block(block, path, indent, inherited, depth = 2) {
171
+ if (depth + 1 > 512)
172
+ unsupportedCapability("rust", "generated Rust CST exceeds the 512-level traversal limit", block.location);
173
+ const bindings = new Map(inherited);
174
+ block.statements.forEach((statement, index) => {
175
+ this.statement(statement, `${path}/statements/${index}`, indent, bindings, depth);
176
+ if (statement.kind == "LocalDeclaration")
177
+ bindings.set(statement.name, rustScalarType(statement.type, statement.location));
178
+ });
179
+ }
180
+ /**
181
+ * Emits one semantic statement, copying String values except for terminal owned returns.
182
+ * @param {import("../semantic/types.js").Statement} statement - Statement.
183
+ * @param {string} path - Occurrence path.
184
+ * @param {string} indent - Indentation.
185
+ * @param {Map<string, Scalar>} bindings - Visible types.
186
+ * @param {number} depth - Enclosing generated CST block depth.
187
+ * @returns {void}
188
+ */
189
+ statement(statement, path, indent, bindings, depth) {
190
+ this.synthetic(indent, statement, path);
191
+ if (statement.kind == "ExpressionStatement")
192
+ throw new TypeError("Rust Task 005 expression statement reached emission.");
193
+ if (statement.kind == "LocalDeclaration") {
194
+ this.mapped(statement.mutable ? "let mut" : "let", statement, path);
195
+ this.synthetic(" ", statement, path);
196
+ this.mapped(statement.name, statement, path, "name");
197
+ this.synthetic(": ", statement, path);
198
+ this.mapped(emitScalarType("rust", statement.type), statement.type, `${path}/type`, "type");
199
+ this.synthetic(" ", statement, path);
200
+ this.mapped("=", statement, path, "operator");
201
+ this.synthetic(" ", statement, path);
202
+ this.expression(statement.initializer, `${path}/initializer`, bindings, true, depth + 2);
203
+ }
204
+ else if (statement.kind == "AssignmentStatement") {
205
+ this.mapped(statement.target.name, statement.target, `${path}/target`, "name");
206
+ this.synthetic(" ", statement, path);
207
+ this.mapped("=", statement, path, "operator");
208
+ this.synthetic(" ", statement, path);
209
+ this.expression(statement.expression, `${path}/expression`, bindings, true, depth + 3);
210
+ }
211
+ else if (statement.kind == "ReturnStatement") {
212
+ if (!statement.expression)
213
+ throw new TypeError("Rust bare return reached emission.");
214
+ this.mapped("return", statement, path);
215
+ this.synthetic(" ", statement, path);
216
+ this.expression(statement.expression, `${path}/expression`, bindings, false, depth + 3);
217
+ }
218
+ else if (statement.kind == "PrintStatement") {
219
+ this.mapped(`semantifold_print_${this.type(statement.expression, bindings)}`, statement, path);
220
+ this.synthetic("(", statement, path);
221
+ this.expression(statement.expression, `${path}/expression`, bindings, true, depth + 4);
222
+ this.synthetic(")", statement, path);
223
+ }
224
+ else if (statement.kind == "IfStatement") {
225
+ this.mapped("if", statement, path);
226
+ this.synthetic(" ", statement, path);
227
+ this.expression(statement.condition, `${path}/condition`, bindings, true, depth + 3);
228
+ this.synthetic(" {\n", statement, path);
229
+ this.block(statement.consequent, `${path}/consequent`, indent + " ", bindings, depth + 3);
230
+ this.synthetic(indent + "}", statement, path);
231
+ if (statement.alternate) {
232
+ this.mapped(" else ", statement, path);
233
+ this.synthetic("{\n", statement, path);
234
+ this.block(statement.alternate, `${path}/alternate`, indent + " ", bindings, depth + 4);
235
+ this.synthetic(indent + "}", statement, path);
236
+ }
237
+ this.synthetic("\n", statement, path);
238
+ return;
239
+ }
240
+ else {
241
+ throw new TypeError("Unsupported Rust statement reached emission.");
242
+ }
243
+ this.synthetic(";\n", statement, path);
244
+ }
245
+ /**
246
+ * Emits ordinary Rust left-to-right and short-circuit expressions without temporary reordering.
247
+ * @param {Expression} expression - Expression occurrence.
248
+ * @param {string} path - Occurrence path.
249
+ * @param {Map<string, Scalar>} bindings - Lexical types.
250
+ * @param {boolean} [copy] - Whether an identifier crosses an owned value-copy boundary.
251
+ * @param {number} [depth] - Exact generated CST expression depth.
252
+ * @returns {void}
253
+ */
254
+ expression(expression, path, bindings, copy = true, depth = 0) {
255
+ const leafDepth = expression.kind == "StringLiteral" ? 3 : expression.kind == "IdentifierExpression" && copy && this.type(expression, bindings) == "string" ? 2 :
256
+ expression.kind == "BooleanLiteral" ? 1 : 0;
257
+ if (depth + leafDepth > 512)
258
+ unsupportedCapability("rust", "generated Rust CST exceeds the 512-level traversal limit", expression.location);
259
+ if (expression.kind == "IdentifierExpression") {
260
+ this.mapped(expression.name, expression, path, "name");
261
+ if (copy && this.type(expression, bindings) == "string")
262
+ this.synthetic(".clone()", expression, path, "Owned String value copy");
263
+ }
264
+ else if (expression.kind == "BooleanLiteral")
265
+ this.mapped(String(expression.value), expression, path, "literal");
266
+ else if (expression.kind == "IntegerLiteral") {
267
+ this.mapped(String(expression.value), expression, path, "literal");
268
+ this.synthetic("i64", expression, path, "Exact signed-64-bit scalar suffix");
269
+ }
270
+ else if (expression.kind == "StringLiteral") {
271
+ this.synthetic("String::from(", expression, path, "Owned UTF-8 String construction");
272
+ let literal = '"';
273
+ for (const character of expression.value) {
274
+ const codePoint = /** @type {number} */ (character.codePointAt(0));
275
+ if (character == '"')
276
+ literal += '\\"';
277
+ else if (character == "\\")
278
+ literal += "\\\\";
279
+ else if (codePoint < 32 || codePoint == 127 || codePoint == 0x2028 || codePoint == 0x2029)
280
+ literal += `\\u{${codePoint.toString(16)}}`;
281
+ else
282
+ literal += character;
283
+ }
284
+ this.mapped(literal + '"', expression, path, "literal");
285
+ this.synthetic(")", expression, path, "Owned UTF-8 String construction");
286
+ }
287
+ else if (expression.kind == "CallExpression") {
288
+ this.mapped(expression.callee, expression, path, "callee");
289
+ this.synthetic("(", expression, path);
290
+ expression.arguments.forEach((argument, index) => {
291
+ if (index)
292
+ this.synthetic(", ", expression, path);
293
+ this.expression(argument, `${path}/arguments/${index}`, bindings, true, depth + 2);
294
+ });
295
+ this.synthetic(")", expression, path);
296
+ }
297
+ else if (expression.kind == "UnaryExpression") {
298
+ this.mapped(expression.operation == "IntegerNegate" ? "semantifold_integer_negate" : "!", expression, path, "operator");
299
+ this.synthetic("(", expression, path);
300
+ this.expression(expression.operand, `${path}/operand`, bindings, true, depth + 2);
301
+ this.synthetic(")", expression, path);
302
+ }
303
+ else {
304
+ if (expression.kind != "BinaryExpression") {
305
+ return unsupportedCapability("rust", "collection expression reached scalar emission", expression.location);
306
+ }
307
+ const token = operators.get(expression.operation);
308
+ if (!token)
309
+ throw new Error("Unsupported operation passed Rust validation.");
310
+ const helper = token.startsWith("semantifold_");
311
+ const comparison = expression.operation == "StringEqual" || expression.operation == "StringNotEqual";
312
+ if (helper)
313
+ this.mapped(token, expression, path, "operator");
314
+ this.synthetic("(", expression, path);
315
+ this.expression(expression.left, `${path}/left`, bindings, !comparison, depth + 2);
316
+ if (helper)
317
+ this.synthetic(", ", expression, path);
318
+ else {
319
+ this.synthetic(" ", expression, path);
320
+ this.mapped(token, expression, path, "operator");
321
+ this.synthetic(" ", expression, path);
322
+ }
323
+ if (expression.operation == "StringConcat")
324
+ this.synthetic("&(", expression.right, `${path}/right`, "Borrowed String concatenation operand");
325
+ this.expression(expression.right, `${path}/right`, bindings, !comparison && expression.operation != "StringConcat", depth + (expression.operation == "StringConcat" ? 4 : 2));
326
+ if (expression.operation == "StringConcat")
327
+ this.synthetic(")", expression.right, `${path}/right`, "Borrowed String concatenation operand");
328
+ this.synthetic(")", expression, path);
329
+ }
330
+ }
331
+ }
332
+ /**
333
+ * Narrows a type after Rust collection capability rejection.
334
+ * @param {import("../semantic/types.js").SemanticFunctionReturnType} type - Semantic type.
335
+ * @param {import("../semantic/types.js").SourceLocation} location - Owning location.
336
+ * @returns {Scalar} Scalar type.
337
+ */
338
+ function rustScalarType(type, location) {
339
+ if (type.kind != "TypeReference" || type.name == "void") {
340
+ return unsupportedCapability("rust", "collection or void type reached scalar emission", location);
341
+ }
342
+ return type.name;
343
+ }
344
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9iYWNrZW5kcy9ydXN0LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLEVBQUMscUJBQXFCLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQTtBQUN0RCxPQUFPLEVBQUMsZUFBZSxFQUFFLGFBQWEsRUFBQyxNQUFNLGVBQWUsQ0FBQTtBQUM1RCxPQUFPLEVBQUMscUJBQXFCLEVBQUMsTUFBTSxhQUFhLENBQUE7QUFDakQsT0FBTyxFQUFDLG1CQUFtQixFQUFDLE1BQU0sd0JBQXdCLENBQUE7QUFDMUQsT0FBTyxFQUFDLHVCQUF1QixFQUFFLGtCQUFrQixFQUFDLE1BQU0sc0JBQXNCLENBQUE7QUFDaEYsT0FBTyxFQUFDLFlBQVksRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUFDLE1BQU0sbUJBQW1CLENBQUE7QUFDekUsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLGNBQWMsQ0FBQTtBQUMzQyxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sYUFBYSxDQUFBO0FBRXhDLDhFQUE4RTtBQUM5RSwwRUFBMEU7QUFDMUUsc0VBQXNFO0FBQ3RFLHdFQUF3RTtBQUV4RSxNQUFNLFNBQVMsR0FBRyxJQUFJLEdBQUcsQ0FBQztJQUN4QixDQUFDLFlBQVksRUFBRSx5QkFBeUIsQ0FBQyxFQUFFLENBQUMsaUJBQWlCLEVBQUUsOEJBQThCLENBQUM7SUFDOUYsQ0FBQyxpQkFBaUIsRUFBRSw4QkFBOEIsQ0FBQyxFQUFFLENBQUMsY0FBYyxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsaUJBQWlCLEVBQUUsSUFBSSxDQUFDO0lBQ3RHLENBQUMsaUJBQWlCLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyx3QkFBd0IsRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLG9CQUFvQixFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsMkJBQTJCLEVBQUUsSUFBSSxDQUFDO0lBQzVILENBQUMs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SUFBSSxDQUFDLENBQUE7WUFDcEMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUE7WUFDcEQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLElBQUksQ0FBQyxDQUFBO1lBQ3JDLElBQUksQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUUsU0FBUyxDQUFDLElBQUksRUFBRSxHQUFHLElBQUksT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFBO1lBQzNGLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLFNBQVMsRUFBRSxJQUFJLENBQUMsQ0FBQTtZQUNwQyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLFVBQVUsQ0FBQyxDQUFBO1lBQzdDLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLFNBQVMsRUFBRSxJQUFJLENBQUMsQ0FBQTtZQUNwQyxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxXQUFXLEVBQUUsR0FBRyxJQUFJLGNBQWMsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQTtRQUMxRixDQUFDO2FBQU0sSUFBSSxTQUFTLENBQUMsSUFBSSxJQUFJLHFCQUFxQixFQUFFLENBQUM7WUFDbkQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsTUFBTSxFQUFFLEdBQUcsSUFBSSxTQUFTLEVBQUUsTUFBTSxDQUFDLENBQUE7WUFDOUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsU0FBUyxFQUFFLElBQUksQ0FBQyxDQUFBO1lBQ3BDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsVUFBVSxDQUFDLENBQUE7WUFDN0MsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsU0FBUyxFQUFFLElBQUksQ0FBQyxDQUFBO1lBQ3BDLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLFVBQVUsRUFBRSxHQUFHLElBQUksYUFBYSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFBO1FBQ3hGLENBQUM7YUFBTSxJQUFJLFNBQVMsQ0FBQyxJQUFJLElBQUksaUJBQWlCLEVBQUUsQ0FBQztZQUMvQyxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVU7Z0JBQUUsTUFBTSxJQUFJLFNBQVMsQ0FBQyxvQ0FBb0MsQ0FBQyxDQUFBO1lBQ3BGLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLFNBQVMsRUFBRSxJQUFJLENBQUMsQ0FBQTtZQUN0QyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxTQUFTLEVBQUUsSUFBSSxDQUFDLENBQUE7WUFDcEMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsVUFBVSxFQUFFLEdBQUcsSUFBSSxhQUFhLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUE7UUFDekYsQ0FBQzthQUFNLElBQUksU0FBUyxDQUFDLElBQUksSUFBSSxnQkFBZ0IsRUFBRSxDQUFDO1lBQzlDLElBQUksQ0FBQyxNQUFNLENBQUMscUJBQXFCLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsRUFBRSxRQUFRLENBQUMsRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLENBQUMsQ0FBQTtZQUM5RixJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxTQUFTLEVBQUUsSUFBSSxDQUFDLENBQUE7WUFDcEMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsVUFBVSxFQUFFLEdBQUcsSUFBSSxhQUFhLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUE7WUFDdEYsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsU0FBUyxFQUFFLElBQUksQ0FBQyxDQUFBO1FBQ3RDLENBQUM7YUFBTSxJQUFJLFNBQVMsQ0FBQyxJQUFJLElBQUksYUFBYSxFQUFFLENBQUM7WUFDM0MsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLElBQUksQ0FBQyxDQUFBO1lBQ2xDLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLFNBQVMsRUFBRSxJQUFJLENBQUMsQ0FBQTtZQUNwQyxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxTQUFTLEVBQUUsR0FBRyxJQUFJLFlBQVksRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQTtZQUNwRixJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxTQUFTLEVBQUUsSUFBSSxDQUFDLENBQUE7WUFDdkMsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsVUFBVSxFQUFFLEdBQUcsSUFBSSxhQUFhLEVBQUUsTUFBTSxHQUFHLE1BQU0sRUFBRSxRQUFRLEVBQUUsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFBO1lBQzVGLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLEdBQUcsRUFBRSxTQUFTLEVBQUUsSUFBSSxDQUFDLENBQUE7WUFDN0MsSUFBSSxTQUFTLENBQUMsU0FBUyxFQUFFLENBQUM7Z0JBQ3hCLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLFNBQVMsRUFBRSxJQUFJLENBQUMsQ0FBQTtnQkFDdEMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsU0FBUyxFQUFFLElBQUksQ0FBQyxDQUFBO2dCQUN0QyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxTQUFTLEVBQUUsR0FBRyxJQUFJLFlBQVksRUFBRSxNQUFNLEdBQUcsTUFBTSxFQUFFLFFBQVEsRUFBRSxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUE7Z0JBQzFGLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLEdBQUcs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QUF1QyxDQUFDLENBQUE7WUFDM0ksSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsVUFBVSxFQUFFLElBQUksQ0FBQyxDQUFBO1FBQ3ZDLENBQUM7SUFDSCxDQUFDO0NBQ0Y7QUFFRDs7Ozs7R0FLRztBQUNILFNBQVMsY0FBYyxDQUFDLElBQUksRUFBRSxRQUFRO0lBQ3BDLElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxlQUFlLElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxNQUFNLEVBQUUsQ0FBQztRQUN4RCxPQUFPLHFCQUFxQixDQUFDLE1BQU0sRUFBRSxpREFBaUQsRUFBRSxRQUFRLENBQUMsQ0FBQTtJQUNuRyxDQUFDO0lBRUQsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFBO0FBQ2xCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0IHt1bnN1cHBvcnRlZENhcGFiaWxpdHl9IGZyb20gXCIuLi9kaWFnbm9zdGljLmpzXCJcbmltcG9ydCB7ZmluYWxpemVNYXBwaW5nLCB0b1NvdXJjZU1hcFYzfSBmcm9tIFwiLi4vbWFwcGluZy5qc1wiXG5pbXBvcnQge3ZhbGlkYXRlQmFja2VuZE1vZHVsZX0gZnJvbSBcIi4vc2hhcmVkLmpzXCJcbmltcG9ydCB7dmFsaWRhdGVOYXRpdmVHcmFwaH0gZnJvbSBcIi4vbmF0aXZlLXZhbGlkYXRpb24uanNcIlxuaW1wb3J0IHttYXhpbXVtUnVzdFNvdXJjZUxlbmd0aCwgdmFsaWRhdGVSdXN0VmFsdWVzfSBmcm9tIFwiLi9ydXN0LXZhbGlkYXRpb24uanNcIlxuaW1wb3J0IHtydXN0TG9ja2ZpbGUsIHJ1c3RNYW5pZmVzdCwgcnVzdFJ1bnRpbWV9IGZyb20gXCIuL3J1c3QtcnVudGltZS5qc1wiXG5pbXBvcnQge2VtaXRTY2FsYXJUeXBlfSBmcm9tIFwiLi9zY2FsYXJzLmpzXCJcbmltcG9ydCB7U291cmNlV3JpdGVyfSBmcm9tIFwiLi93cml0ZXIuanNcIlxuXG4vKiogQHR5cGVkZWYge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljTW9kdWxlfSBTZW1hbnRpY01vZHVsZSAqL1xuLyoqIEB0eXBlZGVmIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY05vZGV9IFNlbWFudGljTm9kZSAqL1xuLyoqIEB0eXBlZGVmIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5FeHByZXNzaW9ufSBFeHByZXNzaW9uICovXG4vKiogQHR5cGVkZWYge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljVHlwZU5hbWV9IFNjYWxhciAqL1xuXG5jb25zdCBvcGVyYXRvcnMgPSBuZXcgTWFwKFtcbiAgW1wiSW50ZWdlckFkZFwiLCBcInNlbWFudGlmb2xkX2ludGVnZXJfYWRkXCJdLCBbXCJJbnRlZ2VyU3VidHJhY3RcIiwgXCJzZW1hbnRpZm9sZF9pbnRlZ2VyX3N1YnRyYWN0XCJdLFxuICBbXCJJbnRlZ2VyTXVsdGlwbHlcIiwgXCJzZW1hbnRpZm9sZF9pbnRlZ2VyX211bHRpcGx5XCJdLCBbXCJJbnRlZ2VyRXF1YWxcIiwgXCI9PVwiXSwgW1wiSW50ZWdlck5vdEVxdWFsXCIsIFwiIT1cIl0sXG4gIFtcIkludGVnZXJMZXNzVGhhblwiLCBcIjxcIl0sIFtcIkludGVnZXJMZXNzVGhhbk9yRXF1YWxcIiwgXCI8PVwiXSwgW1wiSW50ZWdlckdyZWF0ZXJUaGFuXCIsIFwiPlwiXSwgW1wiSW50ZWdlckdyZWF0ZXJUaGFuT3JFcXVhbFwiLCBcIj49XCJdLFxuICBbXCJCb29sZWFuRXF1YWxcIiwgXCI9PVwiXSwgW1wiQm9vbGVhbk5vdEVxdWFsXCIsIFwiIT1cIl0sIFtcIkJvb2xlYW5BbmRcIiwgXCImJlwiXSwgW1wiQm9vbGVhbk9yXCIsIFwifHxcIl0sXG4gIFtcIlN0cmluZ0NvbmNhdFwiLCBcIitcIl0sIFtcIlN0cmluZ0VxdWFsXCIsIFwiPT1cIl0sIFtcIlN0cmluZ05vdEVxdWFsXCIsIFwiIT1cIl1cbl0pXG5cbi8qKlxuICogUHJvZHVjZXMgYSBjb21wbGV0ZSBkZXRlcm1pbmlzdGljIG9mZmxpbmUgQ2FyZ28gcHJvamVjdCBhZnRlciBmdWxsIHZhbGlkYXRpb24gYW5kIHNpemUgcHJlZmxpZ2h0LlxuICogQHBhcmFtIHt7ZmlsZW5hbWU/OiBzdHJpbmcsIG1hcERpcmVjdGl2ZT86IHVua25vd24sIG1vZHVsZTogU2VtYW50aWNNb2R1bGUsIHNvdXJjZU1hcEZpbGVuYW1lPzogdW5rbm93biwgc291cmNlcz86IHtmaWxlbmFtZTogc3RyaW5nLCBjb250ZW50OiBzdHJpbmcsIGxhbmd1YWdlPzogaW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNMYW5ndWFnZX1bXX19IGlucHV0IC0gQXJ0aWZhY3Qtc2V0IHJlcXVlc3QuXG4gKiBAcmV0dXJucyB7e2FydGlmYWN0czogaW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuR2VuZXJhdGVkU2V0QXJ0aWZhY3RbXSwgdGFyZ2V0OiBzdHJpbmd9fSBDb21wbGV0ZSBjYW5kaWRhdGUgc2V0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVSdXN0UHJvamVjdCh7ZmlsZW5hbWUsIG1hcERpcmVjdGl2ZSwgbW9kdWxlLCBzb3VyY2VNYXBGaWxlbmFtZSwgc291cmNlc30pIHtcbiAgdmFsaWRhdGVOYXRpdmVHcmFwaChtb2R1bGUsIFwicnVzdFwiKVxuICB2YWxpZGF0ZUJhY2tlbmRNb2R1bGUobW9kdWxlLCBcInJ1c3RcIilcbiAgdmFsaWRhdGVSdXN0VmFsdWVzKG1vZHVsZSlcbiAgaWYgKGZpbGVuYW1lICE9PSB1bmRlZmluZWQgJiYgZmlsZW5hbWUgIT0gXCJzcmMvbWFpbi5yc1wiKSB1bnN1cHBvcnRlZENhcGFiaWxpdHkoXCJydXN0XCIsIFwiYXJ0aWZhY3QgZmlsZW5hbWUgb3RoZXIgdGhhbiBzcmMvbWFpbi5yc1wiLCBtb2R1bGUubG9jYXRpb24pXG4gIGlmIChtYXBEaXJlY3RpdmUgIT09IHVuZGVmaW5lZCB8fCBzb3VyY2VNYXBGaWxlbmFtZSAhPT0gdW5kZWZpbmVkKSB1bnN1cHBvcnRlZENhcGFiaWxpdHkoXCJydXN0XCIsIFwic291cmNlLW1hcCBmaWxlbmFtZSBvciBkaXJlY3RpdmUgb3B0aW9uXCIsIG1vZHVsZS5sb2NhdGlvbilcbiAgbmV3IFJ1c3RFbWl0dGVyKG1vZHVsZSkucHJvZ3JhbShtb2R1bGUpXG4gIGNvbnN0IHdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoe2ZpbGVuYW1lOiBcInNyYy9tYWluLnJzXCIsIGxhbmd1YWdlOiBcInJ1c3RcIiwgbW9kdWxlLCBzb3VyY2VzfSlcblxuICBuZXcgUnVzdEVtaXR0ZXIobW9kdWxlLCB3cml0ZXIpLnByb2dyYW0obW9kdWxlKVxuICBjb25zdCBtYXBwaW5nID0gZmluYWxpemVNYXBwaW5nKHdyaXRlci5maW5pc2goKSlcbiAgY29uc3Qgcm9vdCA9IG1hcHBpbmcubm9kZXMuZmluZChub2RlID0+IG5vZGUucGF0aCA9PSBcIlwiKVxuXG4gIGlmICghcm9vdCkgdGhyb3cgbmV3IEVycm9yKFwiVmFsaWRhdGVkIFJ1c3QgbW9kdWxlIG9taXR0ZWQgcm9vdCBwcm92ZW5hbmNlLlwiKVxuICBjb25zdCBvcmlnaW4gPSByb290Lm9yaWdpblxuICBjb25zdCByZWxhdGVkT3JpZ2lucyA9IG9yaWdpbi5raW5kID09IFwic291cmNlXCIgPyBbe2xvY2F0aW9uOiBvcmlnaW4ubG9jYXRpb24sIG5vZGVJZDogcm9vdC5pZCwgcm9sZTogXCJtb2R1bGVcIiwgc291cmNlSWQ6IG9yaWdpbi5zb3VyY2VJZH1dIDpcbiAgICAob3JpZ2luLmtpbmQgPT0gXCJkZXJpdmVkXCIgPyBvcmlnaW4ub3JpZ2lucyA6IG9yaWdpbi5yZWxhdGVkT3JpZ2lucykubWFwKGl0ZW0gPT4gKHsuLi5pdGVtLCBub2RlSWQ6IGl0ZW0ubm9kZUlkID8/IHJvb3QuaWQsIHJvbGU6IGl0ZW0ucm9sZSA/PyBcIm1vZHVsZVwifSkpXG5cbiAgcmV0dXJuIHt0YXJnZXQ6IFwicnVzdFwiLCBhcnRpZmFjdHM6IFt7XG4gICAgcGF0aDogXCJDYXJnby50b21sXCIsIHJvbGU6IFwibWFuaWZlc3RcIiwgb3duZXJzaGlwOiBcImdlbmVyYXRlZFwiLCBjb250ZW50S2luZDogXCJ0ZXh0XCIsIG1lZGlhVHlwZTogXCJ0ZXh0L3BsYWluXCIsIGNvbnRlbnQ6IHJ1c3RNYW5pZmVzdCxcbiAgICBwcm92ZW5hbmNlOiB7a2luZDogXCJzeW50aGV0aWNcIiwgcmVhc29uOiBcIkZpeGVkIGRlcGVuZGVuY3ktZnJlZSBlZGl0aW9uLTIwMjEgQ2FyZ28gcGFja2FnZSwgUnVzdCAxLjk4LjEgbWluaW11bSBhbmQgbWF0Y2hpbmcgZGV2L3JlbGVhc2UgYWJvcnQvb3ZlcmZsb3cgcHJvZmlsZXMuXCIsIHJlbGF0ZWRPcmlnaW5zfVxuICB9LCB7XG4gICAgcGF0aDogXCJDYXJnby5sb2NrXCIsIHJvbGU6IFwic3VwcG9ydFwiLCBvd25lcnNoaXA6IFwiZ2VuZXJhdGVkXCIsIGNvbnRlbnRLaW5kOiBcInRleHRcIiwgbWVkaWFUeXBlOiBcInRleHQvcGxhaW5cIiwgY29udGVudDogcnVzdExvY2tmaWxlLFxuICAgIHByb3ZlbmFuY2U6IHtraW5kOiBcInN5bnRoZXRpY1wiLCByZWFzb246IFwiRXhhY3QgZGVwZW5kZW5jeS1mcmVlIGZvcm1hdC00IGxvY2tmaWxlIGdlbmVyYXRlZCBhbmQgcXVhbGlmaWVkIHdpdGggQ2FyZ28gMS45OC4xLlwiLCByZWxhdGVkT3JpZ2luc31cbiAgfSwge1xuICAgIHBhdGg6IFwic3JjL21haW4ucnNcIiwgcm9sZTogXCJlbnRyeVwiLCBvd25lcnNoaXA6IFwiZ2VuZXJhdGVkXCIsIGNvbnRlbnRLaW5kOiBcInRleHRcIiwgbWVkaWFUeXBlOiBcInRleHQveC1ydXN0XCIsIGNvbnRlbnQ6IG1hcHBpbmcuZ2VuZXJhdGVkLmNvbnRlbnQsXG4gICAgcHJvdmVuYW5jZToge2tpbmQ6IFwidGV4dFwiLCBtYXBwaW5nLCBzb3VyY2VNYXA6IHRvU291cmNlTWFwVjMobWFwcGluZyl9XG4gIH1dfVxufVxuXG4vKiogRW1pdHMgbmF0aXZlIGxlZnQtdG8tcmlnaHQgZXhwcmVzc2lvbnMgd2l0aCBleHBsaWNpdCBvd25lZCBTdHJpbmcgY29weSBib3VuZGFyaWVzLiAqL1xuY2xhc3MgUnVzdEVtaXR0ZXIge1xuICAvKipcbiAgICogQmluZHMgdmFsaWRhdGVkIHJlc3VsdCB0eXBlcyBhbmQgYW4gb3B0aW9uYWwgd3JpdGVyIGZvciB0aGUgc2l6ZS1vbmx5IHByZWZsaWdodC5cbiAgICogQHBhcmFtIHtTZW1hbnRpY01vZHVsZX0gbW9kdWxlIC0gQ29tcGxldGUgdmFsaWRhdGVkIHNlbWFudGljcy5cbiAgICogQHBhcmFtIHtTb3VyY2VXcml0ZXJ9IFt3cml0ZXJdIC0gQWJzZW50IGR1cmluZyBzaXplIHByZWZsaWdodC5cbiAgICovXG4gIGNvbnN0cnVjdG9yKG1vZHVsZSwgd3JpdGVyKSB7XG4gICAgdGhpcy53cml0ZXIgPSB3cml0ZXJcbiAgICAvKiogQHR5cGUge01hcDxzdHJpbmcsIFNjYWxhcj59ICovXG4gICAgdGhpcy5mdW5jdGlvbnMgPSBuZXcgTWFwKG1vZHVsZS5mdW5jdGlvbnMubWFwKGRlY2xhcmF0aW9uID0+IFtkZWNsYXJhdGlvbi5uYW1lLCBydXN0U2NhbGFyVHlwZShkZWNsYXJhdGlvbi5yZXR1cm5UeXBlLCBkZWNsYXJhdGlvbi5sb2NhdGlvbildKSlcbiAgICB0aGlzLmxlbmd0aCA9IDBcbiAgICB0aGlzLmxvY2F0aW9uID0gbW9kdWxlLmxvY2F0aW9uXG4gIH1cblxuICAvKipcbiAgICogQm91bmRzIGV4YWN0IHNvdXJjZSBsZW5ndGggYmVmb3JlIGFueSBwdWJsaWMgYXJ0aWZhY3Qgb3Igd3JpdGVyIGlzIGV4cG9zZWQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0IC0gTmV4dCB0ZXh0IGNodW5rLlxuICAgKiBAcGFyYW0ge1NlbWFudGljTm9kZX0gbm9kZSAtIFJlbGF0ZWQgc2VtYW50aWMgb3JpZ2luLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIGNoZWNrU2l6ZSh0ZXh0LCBub2RlKSB7XG4gICAgdGhpcy5sZW5ndGggKz0gdGV4dC5sZW5ndGhcbiAgICBpZiAodGhpcy5sZW5ndGggPiBtYXhpbXVtUnVzdFNvdXJjZUxlbmd0aCkgdW5zdXBwb3J0ZWRDYXBhYmlsaXR5KFwicnVzdFwiLCBcImdlbmVyYXRlZCBwcm9ncmFtIGV4Y2VlZHMgdGhlIGZyb3plbiBSdXN0IHBhcnNlcidzIDMyNzY3IFVURi0xNiBpbnB1dCBsaW1pdFwiLFxuICAgICAgXCJsb2NhdGlvblwiIGluIG5vZGUgPyBub2RlLmxvY2F0aW9uIDogdGhpcy5sb2NhdGlvbilcbiAgfVxuXG4gIC8qKlxuICAgKiBFbWl0cyB0YXJnZXQtb3duZWQgc3ludGF4IHdpdGggZXhwbGljaXQgcmVsYXRlZCBzZW1hbnRpYyBwcm92ZW5hbmNlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGV4dCAtIFJ1c3Qgc3ludGF4LlxuICAgKiBAcGFyYW0ge1NlbWFudGljTm9kZX0gbm9kZSAtIFJlbGF0ZWQgbm9kZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggLSBTZW1hbnRpYyBvY2N1cnJlbmNlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW3JlYXNvbl0gLSBTeW50aGV0aWMgc3ludGF4IHB1cnBvc2UuXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgc3ludGhldGljKHRleHQsIG5vZGUsIHBhdGgsIHJlYXNvbiA9IFwiUnVzdCBkZWNsYXJhdGlvbiBhbmQgZXhwcmVzc2lvbiBzeW50YXhcIikge1xuICAgIHRoaXMuY2hlY2tTaXplKHRleHQsIG5vZGUpXG4gICAgdGhpcy53cml0ZXI/LnN5bnRoZXRpYyh0ZXh0LCByZWFzb24sIFtub2RlXSwgW3BhdGhdKVxuICB9XG5cbiAgLyoqXG4gICAqIEVtaXRzIGFuIG9yaWdpbmFsIHNlbWFudGljIHRva2VuIG9yIGRlY2xhcmF0aW9uIGFuY2hvci5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRleHQgLSBUYXJnZXQgdG9rZW4uXG4gICAqIEBwYXJhbSB7U2VtYW50aWNOb2RlfSBub2RlIC0gT3JpZ2luYWwgbm9kZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggLSBPY2N1cnJlbmNlIHBhdGguXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbcm9sZV0gLSBPcmlnaW5hbCBwYXJzZXIgcm9sZS5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBtYXBwZWQodGV4dCwgbm9kZSwgcGF0aCwgcm9sZSkge1xuICAgIHRoaXMuY2hlY2tTaXplKHRleHQsIG5vZGUpXG4gICAgdGhpcy53cml0ZXI/Lm1hcHBlZCh0ZXh0LCB7bWFwcGluZ0tpbmQ6IHJvbGUgPyBcImV4YWN0XCIgOiBcImFuY2hvclwiLCBub2RlLCBwYXRoLCAuLi4ocm9sZSA/IHtyb2xlfSA6IHt9KX0pXG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZXMgYW4gYWxyZWFkeSB2YWxpZGF0ZWQgZXhwcmVzc2lvbidzIG5hdGl2ZSBzY2FsYXIgcmVwcmVzZW50YXRpb24uXG4gICAqIEBwYXJhbSB7RXhwcmVzc2lvbn0gZXhwcmVzc2lvbiAtIFZhbGlkYXRlZCBleHByZXNzaW9uLlxuICAgKiBAcGFyYW0ge01hcDxzdHJpbmcsIFNjYWxhcj59IGJpbmRpbmdzIC0gTGV4aWNhbCB0eXBlcy5cbiAgICogQHJldHVybnMge1NjYWxhcn0gUmVzdWx0IHNjYWxhci5cbiAgICovXG4gIHR5cGUoZXhwcmVzc2lvbiwgYmluZGluZ3MpIHtcbiAgICBpZiAoZXhwcmVzc2lvbi5raW5kID09IFwiSW50ZWdlckxpdGVyYWxcIikgcmV0dXJuIFwiaW50ZWdlclwiXG4gICAgaWYgKGV4cHJlc3Npb24ua2luZCA9PSBcIkJvb2xlYW5MaXRlcmFsXCIpIHJldHVybiBcImJvb2xlYW5cIlxuICAgIGlmIChleHByZXNzaW9uLmtpbmQgPT0gXCJTdHJpbmdMaXRlcmFsXCIpIHJldHVybiBcInN0cmluZ1wiXG4gICAgaWYgKGV4cHJlc3Npb24ua2luZCA9PSBcIlVuYXJ5RXhwcmVzc2lvblwiIHx8IGV4cHJlc3Npb24ua2luZCA9PSBcIkJpbmFyeUV4cHJlc3Npb25cIikgcmV0dXJuIGV4cHJlc3Npb24udHlwZVxuICAgIGlmIChleHByZXNzaW9uLmtpbmQgIT0gXCJDYWxsRXhwcmVzc2lvblwiICYmIGV4cHJlc3Npb24ua2luZCAhPSBcIklkZW50aWZpZXJFeHByZXNzaW9uXCIpIHtcbiAgICAgIHJldHVybiB1bnN1cHBvcnRlZENhcGFiaWxpdHkoXCJydXN0XCIsIFwiY29sbGVjdGlvbiBleHByZXNzaW9uIHJlYWNoZWQgc2NhbGFyIGVtaXNzaW9uXCIsIGV4cHJlc3Npb24ubG9jYXRpb24pXG4gICAgfVxuICAgIGNvbnN0IHR5cGUgPSBleHByZXNzaW9uLmtpbmQgPT0gXCJDYWxsRXhwcmVzc2lvblwiID8gdGhpcy5mdW5jdGlvbnMuZ2V0KGV4cHJlc3Npb24uY2FsbGVlKSA6IGJpbmRpbmdzLmdldChleHByZXNzaW9uLm5hbWUpXG5cbiAgICBpZiAoIXR5cGUpIHRocm93IG5ldyBFcnJvcihcIlZhbGlkYXRlZCBSdXN0IGV4cHJlc3Npb24gbG9zdCBpdHMgc2NhbGFyIHR5cGUuXCIpXG4gICAgcmV0dXJuIHR5cGVcbiAgfVxuXG4gIC8qKlxuICAgKiBFbWl0cyBmaXhlZCBzdXBwb3J0LCBjcmF0ZS1yb290IGZ1bmN0aW9ucyBhbmQgdGhlIHBhcmFtZXRlcmxlc3MgZW50cnkgcG9pbnQuXG4gICAqIEBwYXJhbSB7U2VtYW50aWNNb2R1bGV9IG1vZHVsZSAtIFZhbGlkYXRlZCBtb2R1bGUuXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgcHJvZ3JhbShtb2R1bGUpIHtcbiAgICB0aGlzLnN5bnRoZXRpYyhydXN0UnVudGltZSwgbW9kdWxlLCBcIlwiLCBcIkV4YWN0IFJ1c3Qgc2NhbGFyLCBwcmludCBhbmQgb3ZlcmZsb3cgc3VwcG9ydFwiKVxuICAgIG1vZHVsZS5mdW5jdGlvbnMuZm9yRWFjaCgoZGVjbGFyYXRpb24sIGluZGV4KSA9PiB7XG4gICAgICBjb25zdCBwYXRoID0gYC9mdW5jdGlvbnMvJHtpbmRleH1gXG5cbiAgICAgIHRoaXMuc3ludGhldGljKFwiXFxuXCIsIGRlY2xhcmF0aW9uLCBwYXRoKVxuICAgICAgdGhpcy5tYXBwZWQoXCJmblwiLCBkZWNsYXJhdGlvbiwgcGF0aClcbiAgICAgIHRoaXMuc3ludGhldGljKFwiIFwiLCBkZWNsYXJhdGlvbiwgcGF0aClcbiAgICAgIHRoaXMubWFwcGVkKGRlY2xhcmF0aW9uLm5hbWUsIGRlY2xhcmF0aW9uLCBwYXRoLCBcIm5hbWVcIilcbiAgICAgIHRoaXMuc3ludGhldGljKFwiKFwiLCBkZWNsYXJhdGlvbiwgcGF0aClcbiAgICAgIGRlY2xhcmF0aW9uLnBhcmFtZXRlcnMuZm9yRWFjaCgocGFyYW1ldGVyLCBwYXJhbWV0ZXJJbmRleCkgPT4ge1xuICAgICAgICBjb25zdCBwYXJhbWV0ZXJQYXRoID0gYCR7cGF0aH0vcGFyYW1ldGVycy8ke3BhcmFtZXRlckluZGV4fWBcblxuICAgICAgICBpZiAocGFyYW1ldGVySW5kZXgpIHRoaXMuc3ludGhldGljKFwiLCBcIiwgcGFyYW1ldGVyLCBwYXJhbWV0ZXJQYXRoKVxuICAgICAgICB0aGlzLm1hcHBlZChwYXJhbWV0ZXIubmFtZSwgcGFyYW1ldGVyLCBwYXJhbWV0ZXJQYXRoLCBcIm5hbWVcIilcbiAgICAgICAgdGhpcy5zeW50aGV0aWMoXCI6IFwiLCBwYXJhbWV0ZXIsIHBhcmFtZXRlclBhdGgpXG4gICAgICAgIHRoaXMubWFwcGVkKGVtaXRTY2FsYXJUeXBlKFwicnVzdFwiLCBwYXJhbWV0ZXIudHlwZSksIHBhcmFtZXRlci50eXBlLCBgJHtwYXJhbWV0ZXJQYXRofS90eXBlYCwgXCJ0eXBlXCIpXG4gICAgICB9KVxuICAgICAgdGhpcy5zeW50aGV0aWMoXCIpIC0+IFwiLCBkZWNsYXJhdGlvbiwgcGF0aClcbiAgICAgIHRoaXMubWFwcGVkKGVtaXRTY2FsYXJUeXBlKFwicnVzdFwiLCBkZWNsYXJhdGlvbi5yZXR1cm5UeXBlKSwgZGVjbGFyYXRpb24ucmV0dXJuVHlwZSwgYCR7cGF0aH0vcmV0dXJuVHlwZWAsIFwidHlwZVwiKVxuICAgICAgdGhpcy5zeW50aGV0aWMoXCIge1xcblwiLCBkZWNsYXJhdGlvbiwgcGF0aClcbiAgICAgIHRoaXMuYmxvY2soZGVjbGFyYXRpb24uYm9keSwgYCR7cGF0aH0vYm9keWAsIFwiICAgIFwiLCBuZXcgTWFwKGRlY2xhcmF0aW9uLnBhcmFtZXRlcnMubWFwKHBhcmFtZXRlciA9PiBbXG4gICAgICAgIHBhcmFtZXRlci5uYW1lLCBydXN0U2NhbGFyVHlwZShwYXJhbWV0ZXIudHlwZSwgcGFyYW1ldGVyLmxvY2F0aW9uKVxuICAgICAgXSkpKVxuICAgICAgdGhpcy5zeW50aGV0aWMoXCJ9XFxuXCIsIGRlY2xhcmF0aW9uLCBwYXRoKVxuICAgIH0pXG4gICAgdGhpcy5zeW50aGV0aWMoXCJcXG5mbiBtYWluKCkge1xcblwiLCBtb2R1bGUuZW50cnlQb2ludCwgXCIvZW50cnlQb2ludFwiKVxuICAgIHRoaXMuYmxvY2sobW9kdWxlLmVudHJ5UG9pbnQuYm9keSwgXCIvZW50cnlQb2ludC9ib2R5XCIsIFwiICAgIFwiLCBuZXcgTWFwKCkpXG4gICAgdGhpcy5zeW50aGV0aWMoXCJ9XFxuXCIsIG1vZHVsZS5lbnRyeVBvaW50LCBcIi9lbnRyeVBvaW50XCIpXG4gIH1cblxuICAvKipcbiAgICogRW1pdHMgc3RhdGVtZW50cyBpbiBvcmRlciB3aXRoIGluZGVwZW5kZW50IGJyYW5jaCBiaW5kaW5nIGVudmlyb25tZW50cy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5CbG9ja30gYmxvY2sgLSBTZW1hbnRpYyBibG9jay5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggLSBPY2N1cnJlbmNlIHBhdGguXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBpbmRlbnQgLSBDdXJyZW50IGluZGVudGF0aW9uLlxuICAgKiBAcGFyYW0ge01hcDxzdHJpbmcsIFNjYWxhcj59IGluaGVyaXRlZCAtIFZpc2libGUgbGV4aWNhbCB0eXBlcy5cbiAgICogQHBhcmFtIHtudW1iZXJ9IFtkZXB0aF0gLSBFeGFjdCBnZW5lcmF0ZWQgQ1NUIGJsb2NrIGRlcHRoLCByb290IHNvdXJjZSBmaWxlIGF0IHplcm8uXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgYmxvY2soYmxvY2ssIHBhdGgsIGluZGVudCwgaW5oZXJpdGVkLCBkZXB0aCA9IDIpIHtcbiAgICBpZiAoZGVwdGggKyAxID4gNTEyKSB1bnN1cHBvcnRlZENhcGFiaWxpdHkoXCJydXN0XCIsIFwiZ2VuZXJhdGVkIFJ1c3QgQ1NUIGV4Y2VlZHMgdGhlIDUxMi1sZXZlbCB0cmF2ZXJzYWwgbGltaXRcIiwgYmxvY2subG9jYXRpb24pXG4gICAgY29uc3QgYmluZGluZ3MgPSBuZXcgTWFwKGluaGVyaXRlZClcblxuICAgIGJsb2NrLnN0YXRlbWVudHMuZm9yRWFjaCgoc3RhdGVtZW50LCBpbmRleCkgPT4ge1xuICAgICAgdGhpcy5zdGF0ZW1lbnQoc3RhdGVtZW50LCBgJHtwYXRofS9zdGF0ZW1lbnRzLyR7aW5kZXh9YCwgaW5kZW50LCBiaW5kaW5ncywgZGVwdGgpXG4gICAgICBpZiAoc3RhdGVtZW50LmtpbmQgPT0gXCJMb2NhbERlY2xhcmF0aW9uXCIpIGJpbmRpbmdzLnNldChzdGF0ZW1lbnQubmFtZSwgcnVzdFNjYWxhclR5cGUoc3RhdGVtZW50LnR5cGUsIHN0YXRlbWVudC5sb2NhdGlvbikpXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBFbWl0cyBvbmUgc2VtYW50aWMgc3RhdGVtZW50LCBjb3B5aW5nIFN0cmluZyB2YWx1ZXMgZXhjZXB0IGZvciB0ZXJtaW5hbCBvd25lZCByZXR1cm5zLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlN0YXRlbWVudH0gc3RhdGVtZW50IC0gU3RhdGVtZW50LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aCAtIE9jY3VycmVuY2UgcGF0aC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGluZGVudCAtIEluZGVudGF0aW9uLlxuICAgKiBAcGFyYW0ge01hcDxzdHJpbmcsIFNjYWxhcj59IGJpbmRpbmdzIC0gVmlzaWJsZSB0eXBlcy5cbiAgICogQHBhcmFtIHtudW1iZXJ9IGRlcHRoIC0gRW5jbG9zaW5nIGdlbmVyYXRlZCBDU1QgYmxvY2sgZGVwdGguXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgc3RhdGVtZW50KHN0YXRlbWVudCwgcGF0aCwgaW5kZW50LCBiaW5kaW5ncywgZGVwdGgpIHtcbiAgICB0aGlzLnN5bnRoZXRpYyhpbmRlbnQsIHN0YXRlbWVudCwgcGF0aClcbiAgICBpZiAoc3RhdGVtZW50LmtpbmQgPT0gXCJFeHByZXNzaW9uU3RhdGVtZW50XCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJSdXN0IFRhc2sgMDA1IGV4cHJlc3Npb24gc3RhdGVtZW50IHJlYWNoZWQgZW1pc3Npb24uXCIpXG4gICAgaWYgKHN0YXRlbWVudC5raW5kID09IFwiTG9jYWxEZWNsYXJhdGlvblwiKSB7XG4gICAgICB0aGlzLm1hcHBlZChzdGF0ZW1lbnQubXV0YWJsZSA/IFwibGV0IG11dFwiIDogXCJsZXRcIiwgc3RhdGVtZW50LCBwYXRoKVxuICAgICAgdGhpcy5zeW50aGV0aWMoXCIgXCIsIHN0YXRlbWVudCwgcGF0aClcbiAgICAgIHRoaXMubWFwcGVkKHN0YXRlbWVudC5uYW1lLCBzdGF0ZW1lbnQsIHBhdGgsIFwibmFtZVwiKVxuICAgICAgdGhpcy5zeW50aGV0aWMoXCI6IFwiLCBzdGF0ZW1lbnQsIHBhdGgpXG4gICAgICB0aGlzLm1hcHBlZChlbWl0U2NhbGFyVHlwZShcInJ1c3RcIiwgc3RhdGVtZW50LnR5cGUpLCBzdGF0ZW1lbnQudHlwZSwgYCR7cGF0aH0vdHlwZWAsIFwidHlwZVwiKVxuICAgICAgdGhpcy5zeW50aGV0aWMoXCIgXCIsIHN0YXRlbWVudCwgcGF0aClcbiAgICAgIHRoaXMubWFwcGVkKFwiPVwiLCBzdGF0ZW1lbnQsIHBhdGgsIFwib3BlcmF0b3JcIilcbiAgICAgIHRoaXMuc3ludGhldGljKFwiIFwiLCBzdGF0ZW1lbnQsIHBhdGgpXG4gICAgICB0aGlzLmV4cHJlc3Npb24oc3RhdGVtZW50LmluaXRpYWxpemVyLCBgJHtwYXRofS9pbml0aWFsaXplcmAsIGJpbmRpbmdzLCB0cnVlLCBkZXB0aCArIDIpXG4gICAgfSBlbHNlIGlmIChzdGF0ZW1lbnQua2luZCA9PSBcIkFzc2lnbm1lbnRTdGF0ZW1lbnRcIikge1xuICAgICAgdGhpcy5tYXBwZWQoc3RhdGVtZW50LnRhcmdldC5uYW1lLCBzdGF0ZW1lbnQudGFyZ2V0LCBgJHtwYXRofS90YXJnZXRgLCBcIm5hbWVcIilcbiAgICAgIHRoaXMuc3ludGhldGljKFwiIFwiLCBzdGF0ZW1lbnQsIHBhdGgpXG4gICAgICB0aGlzLm1hcHBlZChcIj1cIiwgc3RhdGVtZW50LCBwYXRoLCBcIm9wZXJhdG9yXCIpXG4gICAgICB0aGlzLnN5bnRoZXRpYyhcIiBcIiwgc3RhdGVtZW50LCBwYXRoKVxuICAgICAgdGhpcy5leHByZXNzaW9uKHN0YXRlbWVudC5leHByZXNzaW9uLCBgJHtwYXRofS9leHByZXNzaW9uYCwgYmluZGluZ3MsIHRydWUsIGRlcHRoICsgMylcbiAgICB9IGVsc2UgaWYgKHN0YXRlbWVudC5raW5kID09IFwiUmV0dXJuU3RhdGVtZW50XCIpIHtcbiAgICAgIGlmICghc3RhdGVtZW50LmV4cHJlc3Npb24pIHRocm93IG5ldyBUeXBlRXJyb3IoXCJSdXN0IGJhcmUgcmV0dXJuIHJlYWNoZWQgZW1pc3Npb24uXCIpXG4gICAgICB0aGlzLm1hcHBlZChcInJldHVyblwiLCBzdGF0ZW1lbnQsIHBhdGgpXG4gICAgICB0aGlzLnN5bnRoZXRpYyhcIiBcIiwgc3RhdGVtZW50LCBwYXRoKVxuICAgICAgdGhpcy5leHByZXNzaW9uKHN0YXRlbWVudC5leHByZXNzaW9uLCBgJHtwYXRofS9leHByZXNzaW9uYCwgYmluZGluZ3MsIGZhbHNlLCBkZXB0aCArIDMpXG4gICAgfSBlbHNlIGlmIChzdGF0ZW1lbnQua2luZCA9PSBcIlByaW50U3RhdGVtZW50XCIpIHtcbiAgICAgIHRoaXMubWFwcGVkKGBzZW1hbnRpZm9sZF9wcmludF8ke3RoaXMudHlwZShzdGF0ZW1lbnQuZXhwcmVzc2lvbiwgYmluZGluZ3MpfWAsIHN0YXRlbWVudCwgcGF0aClcbiAgICAgIHRoaXMuc3ludGhldGljKFwiKFwiLCBzdGF0ZW1lbnQsIHBhdGgpXG4gICAgICB0aGlzLmV4cHJlc3Npb24oc3RhdGVtZW50LmV4cHJlc3Npb24sIGAke3BhdGh9L2V4cHJlc3Npb25gLCBiaW5kaW5ncywgdHJ1ZSwgZGVwdGggKyA0KVxuICAgICAgdGhpcy5zeW50aGV0aWMoXCIpXCIsIHN0YXRlbWVudCwgcGF0aClcbiAgICB9IGVsc2UgaWYgKHN0YXRlbWVudC5raW5kID09IFwiSWZTdGF0ZW1lbnRcIikge1xuICAgICAgdGhpcy5tYXBwZWQoXCJpZlwiLCBzdGF0ZW1lbnQsIHBhdGgpXG4gICAgICB0aGlzLnN5bnRoZXRpYyhcIiBcIiwgc3RhdGVtZW50LCBwYXRoKVxuICAgICAgdGhpcy5leHByZXNzaW9uKHN0YXRlbWVudC5jb25kaXRpb24sIGAke3BhdGh9L2NvbmRpdGlvbmAsIGJpbmRpbmdzLCB0cnVlLCBkZXB0aCArIDMpXG4gICAgICB0aGlzLnN5bnRoZXRpYyhcIiB7XFxuXCIsIHN0YXRlbWVudCwgcGF0aClcbiAgICAgIHRoaXMuYmxvY2soc3RhdGVtZW50LmNvbnNlcXVlbnQsIGAke3BhdGh9L2NvbnNlcXVlbnRgLCBpbmRlbnQgKyBcIiAgICBcIiwgYmluZGluZ3MsIGRlcHRoICsgMylcbiAgICAgIHRoaXMuc3ludGhldGljKGluZGVudCArIFwifVwiLCBzdGF0ZW1lbnQsIHBhdGgpXG4gICAgICBpZiAoc3RhdGVtZW50LmFsdGVybmF0ZSkge1xuICAgICAgICB0aGlzLm1hcHBlZChcIiBlbHNlIFwiLCBzdGF0ZW1lbnQsIHBhdGgpXG4gICAgICAgIHRoaXMuc3ludGhldGljKFwie1xcblwiLCBzdGF0ZW1lbnQsIHBhdGgpXG4gICAgICAgIHRoaXMuYmxvY2soc3RhdGVtZW50LmFsdGVybmF0ZSwgYCR7cGF0aH0vYWx0ZXJuYXRlYCwgaW5kZW50ICsgXCIgICAgXCIsIGJpbmRpbmdzLCBkZXB0aCArIDQpXG4gICAgICAgIHRoaXMuc3ludGhldGljKGluZGVudCArIFwifVwiLCBzdGF0ZW1lbnQsIHBhdGgpXG4gICAgICB9XG4gICAgICB0aGlzLnN5bnRoZXRpYyhcIlxcblwiLCBzdGF0ZW1lbnQsIHBhdGgpXG4gICAgICByZXR1cm5cbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlVuc3VwcG9ydGVkIFJ1c3Qgc3RhdGVtZW50IHJlYWNoZWQgZW1pc3Npb24uXCIpXG4gICAgfVxuICAgIHRoaXMuc3ludGhldGljKFwiO1xcblwiLCBzdGF0ZW1lbnQsIHBhdGgpXG4gIH1cblxuICAvKipcbiAgICogRW1pdHMgb3JkaW5hcnkgUnVzdCBsZWZ0LXRvLXJpZ2h0IGFuZCBzaG9ydC1jaXJjdWl0IGV4cHJlc3Npb25zIHdpdGhvdXQgdGVtcG9yYXJ5IHJlb3JkZXJpbmcuXG4gICAqIEBwYXJhbSB7RXhwcmVzc2lvbn0gZXhwcmVzc2lvbiAtIEV4cHJlc3Npb24gb2NjdXJyZW5jZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggLSBPY2N1cnJlbmNlIHBhdGguXG4gICAqIEBwYXJhbSB7TWFwPHN0cmluZywgU2NhbGFyPn0gYmluZGluZ3MgLSBMZXhpY2FsIHR5cGVzLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtjb3B5XSAtIFdoZXRoZXIgYW4gaWRlbnRpZmllciBjcm9zc2VzIGFuIG93bmVkIHZhbHVlLWNvcHkgYm91bmRhcnkuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbZGVwdGhdIC0gRXhhY3QgZ2VuZXJhdGVkIENTVCBleHByZXNzaW9uIGRlcHRoLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIGV4cHJlc3Npb24oZXhwcmVzc2lvbiwgcGF0aCwgYmluZGluZ3MsIGNvcHkgPSB0cnVlLCBkZXB0aCA9IDApIHtcbiAgICBjb25zdCBsZWFmRGVwdGggPSBleHByZXNzaW9uLmtpbmQgPT0gXCJTdHJpbmdMaXRlcmFsXCIgPyAzIDogZXhwcmVzc2lvbi5raW5kID09IFwiSWRlbnRpZmllckV4cHJlc3Npb25cIiAmJiBjb3B5ICYmIHRoaXMudHlwZShleHByZXNzaW9uLCBiaW5kaW5ncykgPT0gXCJzdHJpbmdcIiA/IDIgOlxuICAgICAgZXhwcmVzc2lvbi5raW5kID09IFwiQm9vbGVhbkxpdGVyYWxcIiA/IDEgOiAwXG5cbiAgICBpZiAoZGVwdGggKyBsZWFmRGVwdGggPiA1MTIpIHVuc3VwcG9ydGVkQ2FwYWJpbGl0eShcInJ1c3RcIiwgXCJnZW5lcmF0ZWQgUnVzdCBDU1QgZXhjZWVkcyB0aGUgNTEyLWxldmVsIHRyYXZlcnNhbCBsaW1pdFwiLCBleHByZXNzaW9uLmxvY2F0aW9uKVxuICAgIGlmIChleHByZXNzaW9uLmtpbmQgPT0gXCJJZGVudGlmaWVyRXhwcmVzc2lvblwiKSB7XG4gICAgICB0aGlzLm1hcHBlZChleHByZXNzaW9uLm5hbWUsIGV4cHJlc3Npb24sIHBhdGgsIFwibmFtZVwiKVxuICAgICAgaWYgKGNvcHkgJiYgdGhpcy50eXBlKGV4cHJlc3Npb24sIGJpbmRpbmdzKSA9PSBcInN0cmluZ1wiKSB0aGlzLnN5bnRoZXRpYyhcIi5jbG9uZSgpXCIsIGV4cHJlc3Npb24sIHBhdGgsIFwiT3duZWQgU3RyaW5nIHZhbHVlIGNvcHlcIilcbiAgICB9IGVsc2UgaWYgKGV4cHJlc3Npb24ua2luZCA9PSBcIkJvb2xlYW5MaXRlcmFsXCIpIHRoaXMubWFwcGVkKFN0cmluZyhleHByZXNzaW9uLnZhbHVlKSwgZXhwcmVzc2lvbiwgcGF0aCwgXCJsaXRlcmFsXCIpXG4gICAgZWxzZSBpZiAoZXhwcmVzc2lvbi5raW5kID09IFwiSW50ZWdlckxpdGVyYWxcIikge1xuICAgICAgdGhpcy5tYXBwZWQoU3RyaW5nKGV4cHJlc3Npb24udmFsdWUpLCBleHByZXNzaW9uLCBwYXRoLCBcImxpdGVyYWxcIilcbiAgICAgIHRoaXMuc3ludGhldGljKFwiaTY0XCIsIGV4cHJlc3Npb24sIHBhdGgsIFwiRXhhY3Qgc2lnbmVkLTY0LWJpdCBzY2FsYXIgc3VmZml4XCIpXG4gICAgfSBlbHNlIGlmIChleHByZXNzaW9uLmtpbmQgPT0gXCJTdHJpbmdMaXRlcmFsXCIpIHtcbiAgICAgIHRoaXMuc3ludGhldGljKFwiU3RyaW5nOjpmcm9tKFwiLCBleHByZXNzaW9uLCBwYXRoLCBcIk93bmVkIFVURi04IFN0cmluZyBjb25zdHJ1Y3Rpb25cIilcbiAgICAgIGxldCBsaXRlcmFsID0gJ1wiJ1xuXG4gICAgICBmb3IgKGNvbnN0IGNoYXJhY3RlciBvZiBleHByZXNzaW9uLnZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNvZGVQb2ludCA9IC8qKiBAdHlwZSB7bnVtYmVyfSAqLyAoY2hhcmFjdGVyLmNvZGVQb2ludEF0KDApKVxuXG4gICAgICAgIGlmIChjaGFyYWN0ZXIgPT0gJ1wiJykgbGl0ZXJhbCArPSAnXFxcXFwiJ1xuICAgICAgICBlbHNlIGlmIChjaGFyYWN0ZXIgPT0gXCJcXFxcXCIpIGxpdGVyYWwgKz0gXCJcXFxcXFxcXFwiXG4gICAgICAgIGVsc2UgaWYgKGNvZGVQb2ludCA8IDMyIHx8IGNvZGVQb2ludCA9PSAxMjcgfHwgY29kZVBvaW50ID09IDB4MjAyOCB8fCBjb2RlUG9pbnQgPT0gMHgyMDI5KSBsaXRlcmFsICs9IGBcXFxcdXske2NvZGVQb2ludC50b1N0cmluZygxNil9fWBcbiAgICAgICAgZWxzZSBsaXRlcmFsICs9IGNoYXJhY3RlclxuICAgICAgfVxuICAgICAgdGhpcy5tYXBwZWQobGl0ZXJhbCArICdcIicsIGV4cHJlc3Npb24sIHBhdGgsIFwibGl0ZXJhbFwiKVxuICAgICAgdGhpcy5zeW50aGV0aWMoXCIpXCIsIGV4cHJlc3Npb24sIHBhdGgsIFwiT3duZWQgVVRGLTggU3RyaW5nIGNvbnN0cnVjdGlvblwiKVxuICAgIH0gZWxzZSBpZiAoZXhwcmVzc2lvbi5raW5kID09IFwiQ2FsbEV4cHJlc3Npb25cIikge1xuICAgICAgdGhpcy5tYXBwZWQoZXhwcmVzc2lvbi5jYWxsZWUsIGV4cHJlc3Npb24sIHBhdGgsIFwiY2FsbGVlXCIpXG4gICAgICB0aGlzLnN5bnRoZXRpYyhcIihcIiwgZXhwcmVzc2lvbiwgcGF0aClcbiAgICAgIGV4cHJlc3Npb24uYXJndW1lbnRzLmZvckVhY2goKGFyZ3VtZW50LCBpbmRleCkgPT4ge1xuICAgICAgICBpZiAoaW5kZXgpIHRoaXMuc3ludGhldGljKFwiLCBcIiwgZXhwcmVzc2lvbiwgcGF0aClcbiAgICAgICAgdGhpcy5leHByZXNzaW9uKGFyZ3VtZW50LCBgJHtwYXRofS9hcmd1bWVudHMvJHtpbmRleH1gLCBiaW5kaW5ncywgdHJ1ZSwgZGVwdGggKyAyKVxuICAgICAgfSlcbiAgICAgIHRoaXMuc3ludGhldGljKFwiKVwiLCBleHByZXNzaW9uLCBwYXRoKVxuICAgIH0gZWxzZSBpZiAoZXhwcmVzc2lvbi5raW5kID09IFwiVW5hcnlFeHByZXNzaW9uXCIpIHtcbiAgICAgIHRoaXMubWFwcGVkKGV4cHJlc3Npb24ub3BlcmF0aW9uID09IFwiSW50ZWdlck5lZ2F0ZVwiID8gXCJzZW1hbnRpZm9sZF9pbnRlZ2VyX25lZ2F0ZVwiIDogXCIhXCIsIGV4cHJlc3Npb24sIHBhdGgsIFwib3BlcmF0b3JcIilcbiAgICAgIHRoaXMuc3ludGhldGljKFwiKFwiLCBleHByZXNzaW9uLCBwYXRoKVxuICAgICAgdGhpcy5leHByZXNzaW9uKGV4cHJlc3Npb24ub3BlcmFuZCwgYCR7cGF0aH0vb3BlcmFuZGAsIGJpbmRpbmdzLCB0cnVlLCBkZXB0aCArIDIpXG4gICAgICB0aGlzLnN5bnRoZXRpYyhcIilcIiwgZXhwcmVzc2lvbiwgcGF0aClcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGV4cHJlc3Npb24ua2luZCAhPSBcIkJpbmFyeUV4cHJlc3Npb25cIikge1xuICAgICAgICByZXR1cm4gdW5zdXBwb3J0ZWRDYXBhYmlsaXR5KFwicnVzdFwiLCBcImNvbGxlY3Rpb24gZXhwcmVzc2lvbiByZWFjaGVkIHNjYWxhciBlbWlzc2lvblwiLCBleHByZXNzaW9uLmxvY2F0aW9uKVxuICAgICAgfVxuICAgICAgY29uc3QgdG9rZW4gPSBvcGVyYXRvcnMuZ2V0KGV4cHJlc3Npb24ub3BlcmF0aW9uKVxuXG4gICAgICBpZiAoIXRva2VuKSB0aHJvdyBuZXcgRXJyb3IoXCJVbnN1cHBvcnRlZCBvcGVyYXRpb24gcGFzc2VkIFJ1c3QgdmFsaWRhdGlvbi5cIilcbiAgICAgIGNvbnN0IGhlbHBlciA9IHRva2VuLnN0YXJ0c1dpdGgoXCJzZW1hbnRpZm9sZF9cIilcbiAgICAgIGNvbnN0IGNvbXBhcmlzb24gPSBleHByZXNzaW9uLm9wZXJhdGlvbiA9PSBcIlN0cmluZ0VxdWFsXCIgfHwgZXhwcmVzc2lvbi5vcGVyYXRpb24gPT0gXCJTdHJpbmdOb3RFcXVhbFwiXG5cbiAgICAgIGlmIChoZWxwZXIpIHRoaXMubWFwcGVkKHRva2VuLCBleHByZXNzaW9uLCBwYXRoLCBcIm9wZXJhdG9yXCIpXG4gICAgICB0aGlzLnN5bnRoZXRpYyhcIihcIiwgZXhwcmVzc2lvbiwgcGF0aClcbiAgICAgIHRoaXMuZXhwcmVzc2lvbihleHByZXNzaW9uLmxlZnQsIGAke3BhdGh9L2xlZnRgLCBiaW5kaW5ncywgIWNvbXBhcmlzb24sIGRlcHRoICsgMilcbiAgICAgIGlmIChoZWxwZXIpIHRoaXMuc3ludGhldGljKFwiLCBcIiwgZXhwcmVzc2lvbiwgcGF0aClcbiAgICAgIGVsc2Uge1xuICAgICAgICB0aGlzLnN5bnRoZXRpYyhcIiBcIiwgZXhwcmVzc2lvbiwgcGF0aClcbiAgICAgICAgdGhpcy5tYXBwZWQodG9rZW4sIGV4cHJlc3Npb24sIHBhdGgsIFwib3BlcmF0b3JcIilcbiAgICAgICAgdGhpcy5zeW50aGV0aWMoXCIgXCIsIGV4cHJlc3Npb24sIHBhdGgpXG4gICAgICB9XG4gICAgICBpZiAoZXhwcmVzc2lvbi5vcGVyYXRpb24gPT0gXCJTdHJpbmdDb25jYXRcIikgdGhpcy5zeW50aGV0aWMoXCImKFwiLCBleHByZXNzaW9uLnJpZ2h0LCBgJHtwYXRofS9yaWdodGAsIFwiQm9ycm93ZWQgU3RyaW5nIGNvbmNhdGVuYXRpb24gb3BlcmFuZFwiKVxuICAgICAgdGhpcy5leHByZXNzaW9uKGV4cHJlc3Npb24ucmlnaHQsIGAke3BhdGh9L3JpZ2h0YCwgYmluZGluZ3MsICFjb21wYXJpc29uICYmIGV4cHJlc3Npb24ub3BlcmF0aW9uICE9IFwiU3RyaW5nQ29uY2F0XCIsXG4gICAgICAgIGRlcHRoICsgKGV4cHJlc3Npb24ub3BlcmF0aW9uID09IFwiU3RyaW5nQ29uY2F0XCIgPyA0IDogMikpXG4gICAgICBpZiAoZXhwcmVzc2lvbi5vcGVyYXRpb24gPT0gXCJTdHJpbmdDb25jYXRcIikgdGhpcy5zeW50aGV0aWMoXCIpXCIsIGV4cHJlc3Npb24ucmlnaHQsIGAke3BhdGh9L3JpZ2h0YCwgXCJCb3Jyb3dlZCBTdHJpbmcgY29uY2F0ZW5hdGlvbiBvcGVyYW5kXCIpXG4gICAgICB0aGlzLnN5bnRoZXRpYyhcIilcIiwgZXhwcmVzc2lvbiwgcGF0aClcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBOYXJyb3dzIGEgdHlwZSBhZnRlciBSdXN0IGNvbGxlY3Rpb24gY2FwYWJpbGl0eSByZWplY3Rpb24uXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljRnVuY3Rpb25SZXR1cm5UeXBlfSB0eXBlIC0gU2VtYW50aWMgdHlwZS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gT3duaW5nIGxvY2F0aW9uLlxuICogQHJldHVybnMge1NjYWxhcn0gU2NhbGFyIHR5cGUuXG4gKi9cbmZ1bmN0aW9uIHJ1c3RTY2FsYXJUeXBlKHR5cGUsIGxvY2F0aW9uKSB7XG4gIGlmICh0eXBlLmtpbmQgIT0gXCJUeXBlUmVmZXJlbmNlXCIgfHwgdHlwZS5uYW1lID09IFwidm9pZFwiKSB7XG4gICAgcmV0dXJuIHVuc3VwcG9ydGVkQ2FwYWJpbGl0eShcInJ1c3RcIiwgXCJjb2xsZWN0aW9uIG9yIHZvaWQgdHlwZSByZWFjaGVkIHNjYWxhciBlbWlzc2lvblwiLCBsb2NhdGlvbilcbiAgfVxuXG4gIHJldHVybiB0eXBlLm5hbWVcbn1cbiJdfQ==