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.
- package/README.md +61 -15
- package/build/index.d.ts +52 -2
- package/build/index.d.ts.map +1 -1
- package/build/index.js +60 -8
- package/build/src/artifact-path.d.ts +23 -1
- package/build/src/artifact-path.d.ts.map +1 -1
- package/build/src/artifact-path.js +45 -3
- package/build/src/artifacts.d.ts.map +1 -1
- package/build/src/artifacts.js +66 -1
- package/build/src/backends/android.d.ts +49 -0
- package/build/src/backends/android.d.ts.map +1 -0
- package/build/src/backends/android.js +1274 -0
- package/build/src/backends/c-validation.d.ts.map +1 -1
- package/build/src/backends/c-validation.js +7 -3
- package/build/src/backends/cpp-validation.d.ts.map +1 -1
- package/build/src/backends/cpp-validation.js +7 -3
- package/build/src/backends/csharp.js +7 -1
- package/build/src/backends/dart-runtime.d.ts +2 -0
- package/build/src/backends/dart-runtime.d.ts.map +1 -0
- package/build/src/backends/dart-runtime.js +41 -0
- package/build/src/backends/dart.d.ts +20 -0
- package/build/src/backends/dart.d.ts.map +1 -0
- package/build/src/backends/dart.js +321 -0
- package/build/src/backends/effects.d.ts +60 -0
- package/build/src/backends/effects.d.ts.map +1 -0
- package/build/src/backends/effects.js +746 -0
- package/build/src/backends/go.js +18 -4
- package/build/src/backends/identifiers.d.ts +36 -4
- package/build/src/backends/identifiers.d.ts.map +1 -1
- package/build/src/backends/identifiers.js +160 -10
- package/build/src/backends/index.d.ts.map +1 -1
- package/build/src/backends/index.js +27 -4
- package/build/src/backends/ios.d.ts +68 -0
- package/build/src/backends/ios.d.ts.map +1 -0
- package/build/src/backends/ios.js +1503 -0
- package/build/src/backends/java.d.ts.map +1 -1
- package/build/src/backends/java.js +429 -36
- package/build/src/backends/javascript.d.ts +6 -0
- package/build/src/backends/javascript.d.ts.map +1 -1
- package/build/src/backends/javascript.js +380 -24
- package/build/src/backends/kotlin-runtime.d.ts +3 -0
- package/build/src/backends/kotlin-runtime.d.ts.map +1 -0
- package/build/src/backends/kotlin-runtime.js +29 -0
- package/build/src/backends/kotlin.d.ts +33 -0
- package/build/src/backends/kotlin.d.ts.map +1 -0
- package/build/src/backends/kotlin.js +138 -0
- package/build/src/backends/native-validation.d.ts +2 -2
- package/build/src/backends/native-validation.d.ts.map +1 -1
- package/build/src/backends/native-validation.js +2 -2
- package/build/src/backends/ordered-expressions.d.ts.map +1 -1
- package/build/src/backends/ordered-expressions.js +39 -7
- package/build/src/backends/php-stdlib-support.d.ts +19 -0
- package/build/src/backends/php-stdlib-support.d.ts.map +1 -0
- package/build/src/backends/php-stdlib-support.js +227 -0
- package/build/src/backends/php.d.ts.map +1 -1
- package/build/src/backends/php.js +448 -33
- package/build/src/backends/program.d.ts +83 -0
- package/build/src/backends/program.d.ts.map +1 -0
- package/build/src/backends/program.js +1309 -0
- package/build/src/backends/python.js +7 -1
- package/build/src/backends/ruby.d.ts.map +1 -1
- package/build/src/backends/ruby.js +310 -24
- package/build/src/backends/rust-runtime.d.ts +7 -0
- package/build/src/backends/rust-runtime.d.ts.map +1 -0
- package/build/src/backends/rust-runtime.js +32 -0
- package/build/src/backends/rust-validation.d.ts +9 -0
- package/build/src/backends/rust-validation.d.ts.map +1 -0
- package/build/src/backends/rust-validation.js +78 -0
- package/build/src/backends/rust.d.ts +24 -0
- package/build/src/backends/rust.d.ts.map +1 -0
- package/build/src/backends/rust.js +344 -0
- package/build/src/backends/scalars.d.ts +14 -6
- package/build/src/backends/scalars.d.ts.map +1 -1
- package/build/src/backends/scalars.js +167 -17
- package/build/src/backends/shared.d.ts +23 -4
- package/build/src/backends/shared.d.ts.map +1 -1
- package/build/src/backends/shared.js +2174 -62
- package/build/src/backends/stdlib-support.d.ts +14 -0
- package/build/src/backends/stdlib-support.d.ts.map +1 -0
- package/build/src/backends/stdlib-support.js +237 -0
- package/build/src/backends/swift-runtime.d.ts +3 -0
- package/build/src/backends/swift-runtime.d.ts.map +1 -0
- package/build/src/backends/swift-runtime.js +14 -0
- package/build/src/backends/swift.d.ts +8 -0
- package/build/src/backends/swift.d.ts.map +1 -0
- package/build/src/backends/swift.js +127 -0
- package/build/src/backends/typescript.d.ts.map +1 -1
- package/build/src/backends/typescript.js +344 -24
- package/build/src/backends/wasm.d.ts +43 -0
- package/build/src/backends/wasm.d.ts.map +1 -0
- package/build/src/backends/wasm.js +2164 -0
- package/build/src/backends/writer.d.ts +255 -4
- package/build/src/backends/writer.d.ts.map +1 -1
- package/build/src/backends/writer.js +491 -3
- package/build/src/diagnostic.d.ts +4 -3
- package/build/src/diagnostic.d.ts.map +1 -1
- package/build/src/diagnostic.js +5 -3
- package/build/src/frontends/c.d.ts.map +1 -1
- package/build/src/frontends/c.js +5 -3
- package/build/src/frontends/cpp.d.ts.map +1 -1
- package/build/src/frontends/cpp.js +5 -3
- package/build/src/frontends/csharp.d.ts.map +1 -1
- package/build/src/frontends/csharp.js +7 -3
- package/build/src/frontends/dart.d.ts +10 -0
- package/build/src/frontends/dart.d.ts.map +1 -0
- package/build/src/frontends/dart.js +913 -0
- package/build/src/frontends/index.d.ts +3 -1
- package/build/src/frontends/index.d.ts.map +1 -1
- package/build/src/frontends/index.js +15 -5
- package/build/src/frontends/java.d.ts +110 -1
- package/build/src/frontends/java.d.ts.map +1 -1
- package/build/src/frontends/java.js +1725 -70
- package/build/src/frontends/javascript-typescript.d.ts +69 -1
- package/build/src/frontends/javascript-typescript.d.ts.map +1 -1
- package/build/src/frontends/javascript-typescript.js +1825 -93
- package/build/src/frontends/kotlin.d.ts +10 -0
- package/build/src/frontends/kotlin.d.ts.map +1 -0
- package/build/src/frontends/kotlin.js +685 -0
- package/build/src/frontends/php.d.ts +118 -1
- package/build/src/frontends/php.d.ts.map +1 -1
- package/build/src/frontends/php.js +1583 -76
- package/build/src/frontends/program.d.ts +74 -0
- package/build/src/frontends/program.d.ts.map +1 -0
- package/build/src/frontends/program.js +989 -0
- package/build/src/frontends/ruby.d.ts +68 -1
- package/build/src/frontends/ruby.d.ts.map +1 -1
- package/build/src/frontends/ruby.js +1446 -101
- package/build/src/frontends/rust-parser.d.ts +11 -0
- package/build/src/frontends/rust-parser.d.ts.map +1 -0
- package/build/src/frontends/rust-parser.js +15 -0
- package/build/src/frontends/rust.d.ts +14 -0
- package/build/src/frontends/rust.d.ts.map +1 -0
- package/build/src/frontends/rust.js +715 -0
- package/build/src/frontends/scalars.d.ts +10 -0
- package/build/src/frontends/scalars.d.ts.map +1 -1
- package/build/src/frontends/scalars.js +28 -2
- package/build/src/frontends/swift.d.ts +10 -0
- package/build/src/frontends/swift.d.ts.map +1 -0
- package/build/src/frontends/swift.js +860 -0
- package/build/src/frontends/types.d.ts +186 -0
- package/build/src/frontends/types.d.ts.map +1 -0
- package/build/src/frontends/types.js +634 -0
- package/build/src/language-registry.d.ts +46 -4
- package/build/src/language-registry.d.ts.map +1 -1
- package/build/src/language-registry.js +177 -13
- package/build/src/mapping.d.ts +2 -2
- package/build/src/mapping.d.ts.map +1 -1
- package/build/src/mapping.js +31 -10
- package/build/src/semantic/capabilities.d.ts +66 -0
- package/build/src/semantic/capabilities.d.ts.map +1 -0
- package/build/src/semantic/capabilities.js +649 -0
- package/build/src/semantic/effects.d.ts +26 -0
- package/build/src/semantic/effects.d.ts.map +1 -0
- package/build/src/semantic/effects.js +764 -0
- package/build/src/semantic/generics.d.ts +23 -0
- package/build/src/semantic/generics.d.ts.map +1 -0
- package/build/src/semantic/generics.js +61 -0
- package/build/src/semantic/lifetime.d.ts +37 -0
- package/build/src/semantic/lifetime.d.ts.map +1 -0
- package/build/src/semantic/lifetime.js +527 -0
- package/build/src/semantic/provenance.d.ts +9 -2
- package/build/src/semantic/provenance.d.ts.map +1 -1
- package/build/src/semantic/provenance.js +462 -20
- package/build/src/semantic/scalars.d.ts +11 -0
- package/build/src/semantic/scalars.d.ts.map +1 -1
- package/build/src/semantic/scalars.js +16 -1
- package/build/src/semantic/stdlib.d.ts +254 -0
- package/build/src/semantic/stdlib.d.ts.map +1 -0
- package/build/src/semantic/stdlib.js +880 -0
- package/build/src/semantic/types.d.ts +3108 -178
- package/build/src/semantic/types.d.ts.map +1 -1
- package/build/src/semantic/types.js +730 -15
- package/build/src/semantic/validate.d.ts +85 -5
- package/build/src/semantic/validate.d.ts.map +1 -1
- package/build/src/semantic/validate.js +2576 -98
- package/build/src/stdlib-facades.d.ts +304 -0
- package/build/src/stdlib-facades.d.ts.map +1 -0
- package/build/src/stdlib-facades.js +1167 -0
- package/build/src/stdlib-negotiation.d.ts +69 -0
- package/build/src/stdlib-negotiation.d.ts.map +1 -0
- package/build/src/stdlib-negotiation.js +403 -0
- package/build/src/stdlib-providers.d.ts +72 -0
- package/build/src/stdlib-providers.d.ts.map +1 -0
- package/build/src/stdlib-providers.js +339 -0
- package/build/src/toolchains.d.ts +55 -1
- package/build/src/toolchains.d.ts.map +1 -1
- package/build/src/toolchains.js +15 -4
- package/docs/android.md +79 -0
- package/docs/architecture.md +47 -13
- package/docs/dart.md +60 -0
- package/docs/goals.md +3 -3
- package/docs/ios.md +121 -0
- package/docs/kotlin.md +42 -0
- package/docs/language-support.md +238 -26
- package/docs/multi-file-modules.md +52 -0
- package/docs/parser-qualification.md +121 -8
- package/docs/plans/2026-09-05-standard-library-portability.md +10 -10
- package/docs/rust.md +88 -0
- package/docs/source-maps.md +17 -7
- package/docs/specification.md +5 -0
- package/docs/standard-library-portability.md +39 -8
- package/docs/swift.md +44 -0
- package/docs/testing.md +381 -4
- package/docs/webassembly.md +52 -0
- package/index.js +66 -8
- package/node_modules/semantifold-tree-sitter-legacy-internal/README.md +2 -2
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/LICENSE +21 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/README.md +45 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/binding.gyp +30 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/bindings/node/binding.cc +20 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/bindings/node/binding_test.js +9 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/bindings/node/index.d.ts +28 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/bindings/node/index.js +11 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/grammar.js +1630 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/package.json +64 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/prebuilds/darwin-arm64/tree-sitter-rust.node +0 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/prebuilds/darwin-x64/tree-sitter-rust.node +0 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/prebuilds/linux-arm64/tree-sitter-rust.node +0 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/prebuilds/linux-x64/tree-sitter-rust.node +0 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/prebuilds/win32-arm64/tree-sitter-rust.node +0 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/prebuilds/win32-x64/tree-sitter-rust.node +0 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/queries/highlights.scm +159 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/queries/injections.scm +9 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/queries/tags.scm +60 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/src/grammar.json +9405 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/src/node-types.json +5399 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/src/parser.c +192569 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/src/scanner.c +393 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/src/tree_sitter/alloc.h +54 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/src/tree_sitter/array.h +290 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/src/tree_sitter/parser.h +266 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/tree-sitter-rust.wasm +0 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/tree-sitter.json +53 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/package.json +3 -2
- package/node_modules/semantifold-tree-sitter-legacy-internal/src/c.js +5 -4
- package/package.json +5 -2
- package/src/artifact-path.js +47 -2
- package/src/artifacts.js +67 -0
- package/src/backends/android.js +1370 -0
- package/src/backends/c-validation.js +6 -1
- package/src/backends/cpp-validation.js +6 -1
- package/src/backends/csharp.js +3 -0
- package/src/backends/dart-runtime.js +41 -0
- package/src/backends/dart.js +326 -0
- package/src/backends/effects.js +705 -0
- package/src/backends/go.js +14 -2
- package/src/backends/identifiers.js +166 -9
- package/src/backends/index.js +27 -2
- package/src/backends/ios.js +1612 -0
- package/src/backends/java.js +454 -36
- package/src/backends/javascript.js +389 -23
- package/src/backends/kotlin-runtime.js +29 -0
- package/src/backends/kotlin.js +144 -0
- package/src/backends/native-validation.js +1 -1
- package/src/backends/ordered-expressions.js +40 -6
- package/src/backends/php-stdlib-support.js +239 -0
- package/src/backends/php.js +469 -32
- package/src/backends/program.js +1408 -0
- package/src/backends/python.js +3 -0
- package/src/backends/ruby.js +326 -23
- package/src/backends/rust-runtime.js +34 -0
- package/src/backends/rust-validation.js +75 -0
- package/src/backends/rust.js +335 -0
- package/src/backends/scalars.js +141 -16
- package/src/backends/shared.js +2314 -115
- package/src/backends/stdlib-support.js +234 -0
- package/src/backends/swift-runtime.js +14 -0
- package/src/backends/swift.js +132 -0
- package/src/backends/typescript.js +349 -23
- package/src/backends/wasm.js +2208 -0
- package/src/backends/writer.js +545 -2
- package/src/diagnostic.js +4 -2
- package/src/frontends/c.js +4 -2
- package/src/frontends/cpp.js +4 -2
- package/src/frontends/csharp.js +4 -2
- package/src/frontends/dart.js +963 -0
- package/src/frontends/index.js +14 -4
- package/src/frontends/java.js +1977 -69
- package/src/frontends/javascript-typescript.js +2046 -102
- package/src/frontends/kotlin.js +713 -0
- package/src/frontends/php.js +1725 -79
- package/src/frontends/program.js +1062 -0
- package/src/frontends/ruby.js +1624 -98
- package/src/frontends/rust-parser.js +18 -0
- package/src/frontends/rust.js +714 -0
- package/src/frontends/scalars.js +31 -1
- package/src/frontends/swift.js +893 -0
- package/src/frontends/types.js +750 -0
- package/src/language-registry.js +182 -12
- package/src/mapping.js +33 -9
- package/src/semantic/capabilities.js +671 -0
- package/src/semantic/effects.js +737 -0
- package/src/semantic/generics.js +58 -0
- package/src/semantic/lifetime.js +517 -0
- package/src/semantic/provenance.js +412 -19
- package/src/semantic/scalars.js +17 -0
- package/src/semantic/stdlib.js +921 -0
- package/src/semantic/types.js +810 -14
- package/src/semantic/validate.js +2934 -209
- package/src/stdlib-facades.js +1211 -0
- package/src/stdlib-negotiation.js +446 -0
- package/src/stdlib-providers.js +377 -0
- 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==
|