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
package/build/src/toolchains.js
CHANGED
|
@@ -8,17 +8,26 @@ import { exceededOwnedDeadline, executeFileWithDeadline } from "./subprocess.js"
|
|
|
8
8
|
import { isSupportedTimeoutMs, maximumTimeoutMs } from "./timeout.js";
|
|
9
9
|
const defaultTimeoutMs = 10_000;
|
|
10
10
|
export const canonicalToolchains = deepFreeze({
|
|
11
|
+
dart: definition("dart", "SEMANTIFOLD_DART", ["--version"], /^Dart SDK version: 3\.13\.3 \(stable\) \(Tue Sep 1 01:07:17 2026 -0700\) on "linux_x64"$/u),
|
|
11
12
|
php: definition("php", "SEMANTIFOLD_PHP", ["--version"], /^PHP 8\./u),
|
|
13
|
+
php82: definition("php", "SEMANTIFOLD_PHP", ["--version"], /^PHP (?:8\.(?:[2-9]|[1-9][0-9]+)|(?:9|[1-9][0-9]+)\.[0-9]+)\./u),
|
|
12
14
|
ruby: definition("ruby", "SEMANTIFOLD_RUBY", ["--version"], /^ruby 3\./u),
|
|
13
15
|
node: definition("node", "SEMANTIFOLD_NODE", ["--version"], /^v24\./u),
|
|
14
16
|
tsc: definition("tsc", "SEMANTIFOLD_TSC", ["--version"], /^Version 7\./u),
|
|
15
17
|
javac: definition("javac", "SEMANTIFOLD_JAVAC", ["-version"], /^javac (?:1[7-9]|2[0-9])\./u),
|
|
16
18
|
java: definition("java", "SEMANTIFOLD_JAVA", ["-version"], /^(?:openjdk|java) version "(?:1[7-9]|2[0-9])\./u),
|
|
19
|
+
java25: definition("java", "SEMANTIFOLD_JAVA", ["-version"], /^openjdk version "25\.0\.4" 2026-07-21\nOpenJDK Runtime Environment \(build 25\.0\.4\+7-1-((?:24|26)\.04)-Ubuntu\)\nOpenJDK 64-Bit Server VM \(build 25\.0\.4\+7-1-\1-Ubuntu, mixed mode, sharing\)$/u),
|
|
20
|
+
kotlinc: definition("kotlinc", "SEMANTIFOLD_KOTLINC", ["-version"], /^info: kotlinc-jvm 2\.4\.20 \(JRE 25\.0\.4\+7-1-(?:24|26)\.04-Ubuntu\)$/u),
|
|
17
21
|
python: definition("python3", "SEMANTIFOLD_PYTHON", ["--version"], /^Python 3\./u),
|
|
18
22
|
dotnet: definition("dotnet", "SEMANTIFOLD_DOTNET", ["--version"], /^10\./u),
|
|
19
23
|
go: definition("go", "SEMANTIFOLD_GO", ["version"], /^go version go1\.26\.\d+ linux\/amd64$/u),
|
|
20
24
|
clangpp: definition("clang++", "SEMANTIFOLD_CLANGPP", ["--version"], /^Ubuntu clang version 21\.1\.8 [^\n]+\nTarget: x86_64-pc-linux-gnu\n/u),
|
|
21
|
-
clang: definition("clang", "SEMANTIFOLD_CLANG", ["--version"], /^Ubuntu clang version 21\.1\.8 [^\n]+\nTarget: x86_64-pc-linux-gnu\n/u)
|
|
25
|
+
clang: definition("clang", "SEMANTIFOLD_CLANG", ["--version"], /^Ubuntu clang version 21\.1\.8 [^\n]+\nTarget: x86_64-pc-linux-gnu\n/u),
|
|
26
|
+
rustc: definition("rustc", "SEMANTIFOLD_RUSTC", ["--version", "--verbose"], /^rustc 1\.98\.1 \(48a229cea 2026-09-01\)\nbinary: rustc\ncommit-hash: 48a229ceaefd4985c50990b14116b6d856af0985\ncommit-date: 2026-09-01\nhost: x86_64-unknown-linux-gnu\nrelease: 1\.98\.1\nLLVM version: 22\.1\.8$/u),
|
|
27
|
+
cargo: definition("cargo", "SEMANTIFOLD_CARGO", ["--version", "--verbose"], /^cargo 1\.98\.1 \(797e8a9bc 2026-08-05\)\nrelease: 1\.98\.1\ncommit-hash: 797e8a9bca276c1c9f9f738d2a20f484fa4eea9d\ncommit-date: 2026-08-05\nhost: x86_64-unknown-linux-gnu\n/u),
|
|
28
|
+
swiftc: definition("swiftc", "SEMANTIFOLD_SWIFTC", ["--driver-mode=swiftc", "--version"], /^Swift version 6\.3\.3 \(swift-6\.3\.3-RELEASE\)\nTarget: x86_64-unknown-linux-gnu$/u),
|
|
29
|
+
"wasm-validate": definition("wasm-validate", "SEMANTIFOLD_WASM_VALIDATE", ["--version"], /^1\.0\.36$/u),
|
|
30
|
+
chromium: definition("chromium", "SEMANTIFOLD_CHROMIUM", ["--version"], /^Google Chrome 152\.0\.7977\.82$/u)
|
|
22
31
|
});
|
|
23
32
|
/**
|
|
24
33
|
* Discovers one repository-declared canonical toolchain.
|
|
@@ -63,7 +72,7 @@ export async function discoverCanonicalToolchain(id, options = {}) {
|
|
|
63
72
|
* @param {Readonly<Record<string, string | undefined>>} [input.environment] - Explicit discovery environment.
|
|
64
73
|
* @param {string} input.id - Toolchain ID.
|
|
65
74
|
* @param {string} [input.override] - Configured absolute executable path.
|
|
66
|
-
* @param {RegExp} [input.supportedVersion] - Full
|
|
75
|
+
* @param {RegExp} [input.supportedVersion] - Full selected-stream version policy.
|
|
67
76
|
* @param {number} [input.timeoutMs] - Version command timeout.
|
|
68
77
|
* @param {string[]} input.versionArguments - Exact version argument array.
|
|
69
78
|
* @returns {Promise<import("./semantic/types.js").DiscoveredToolchain>} Discovered tool.
|
|
@@ -125,7 +134,9 @@ export async function discoverToolchain(input) {
|
|
|
125
134
|
});
|
|
126
135
|
}
|
|
127
136
|
const { stderr, stdout } = result;
|
|
128
|
-
const
|
|
137
|
+
const normalizedStdout = stdout.trim();
|
|
138
|
+
const normalizedStderr = stderr.trim();
|
|
139
|
+
const versionOutput = normalizedStdout.length > 0 ? normalizedStdout : normalizedStderr;
|
|
129
140
|
const version = versionOutput.split(/\r?\n/u)[0] ?? "";
|
|
130
141
|
if (version.length == 0) {
|
|
131
142
|
throw new SemantifoldDiagnostic({
|
|
@@ -414,4 +425,4 @@ function deepFreeze(value) {
|
|
|
414
425
|
deepFreeze(nested);
|
|
415
426
|
return Object.freeze(value);
|
|
416
427
|
}
|
|
417
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9vbGNoYWlucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90b29sY2hhaW5zLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLEVBQUMsU0FBUyxJQUFJLFdBQVcsRUFBQyxNQUFNLFNBQVMsQ0FBQTtBQUNoRCxPQUFPLEVBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQTtBQUN2RCxPQUFPLElBQUksTUFBTSxXQUFXLENBQUE7QUFDNUIsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLFlBQVksQ0FBQTtBQUN2QyxPQUFPLEVBQUMscUJBQXFCLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQTtBQUNyRCxPQUFPLEVBQUMscUJBQXFCLEVBQUUsdUJBQXVCLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQTtBQUM5RSxPQUFPLEVBQUMsb0JBQW9CLEVBQUUsZ0JBQWdCLEVBQUMsTUFBTSxjQUFjLENBQUE7QUFFbkUsTUFBTSxnQkFBZ0IsR0FBRyxNQUFNLENBQUE7QUFFL0IsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQUcsVUFBVSxDQUFDO0lBQzVDLEdBQUcsRUFBRSxVQUFVLENBQUMsS0FBSyxFQUFFLGlCQUFpQixFQUFFLENBQUMsV0FBVyxDQUFDLEVBQUUsV0FBVyxDQUFDO0lBQ3JFLElBQUksRUFBRSxVQUFVLENBQUMsTUFBTSxFQUFFLGtCQUFrQixFQUFFLENBQUMsV0FBVyxDQUFDLEVBQUUsWUFBWSxDQUFDO0lBQ3pFLElBQUksRUFBRSxVQUFVLENBQUMsTUFBTSxFQUFFLGtCQUFrQixFQUFFLENBQUMsV0FBVyxDQUFDLEVBQUUsU0FBUyxDQUFDO0lBQ3RFLEdBQUcsRUFBRSxVQUFVLENBQUMsS0FBSyxFQUFFLGlCQUFpQixFQUFFLENBQUMsV0FBVyxDQUFDLEVBQUUsZUFBZSxDQUFDO0lBQ3pFLEtBQUssRUFBRSxVQUFVLENBQUMsT0FBTyxFQUFFLG1CQUFtQixFQUFF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LENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFBO0FBQzdCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0IHtjb25zdGFudHMgYXMgZnNDb25zdGFudHN9IGZyb20gXCJub2RlOmZzXCJcbmltcG9ydCB7YWNjZXNzLCByZWFscGF0aCwgc3RhdH0gZnJvbSBcIm5vZGU6ZnMvcHJvbWlzZXNcIlxuaW1wb3J0IHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiXG5pbXBvcnQge2lzRGVuc2VBcnJheX0gZnJvbSBcIi4vYXJyYXkuanNcIlxuaW1wb3J0IHtTZW1hbnRpZm9sZERpYWdub3N0aWN9IGZyb20gXCIuL2RpYWdub3N0aWMuanNcIlxuaW1wb3J0IHtleGNlZWRlZE93bmVkRGVhZGxpbmUsIGV4ZWN1dGVGaWxlV2l0aERlYWRsaW5lfSBmcm9tIFwiLi9zdWJwcm9jZXNzLmpzXCJcbmltcG9ydCB7aXNTdXBwb3J0ZWRUaW1lb3V0TXMsIG1heGltdW1UaW1lb3V0TXN9IGZyb20gXCIuL3RpbWVvdXQuanNcIlxuXG5jb25zdCBkZWZhdWx0VGltZW91dE1zID0gMTBfMDAwXG5cbmV4cG9ydCBjb25zdCBjYW5vbmljYWxUb29sY2hhaW5zID0gZGVlcEZyZWV6ZSh7XG4gIHBocDogZGVmaW5pdGlvbihcInBocFwiLCBcIlNFTUFOVElGT0xEX1BIUFwiLCBbXCItLXZlcnNpb25cIl0sIC9eUEhQIDhcXC4vdSksXG4gIHJ1Ynk6IGRlZmluaXRpb24oXCJydWJ5XCIsIFwiU0VNQU5USUZPTERfUlVCWVwiLCBbXCItLXZlcnNpb25cIl0sIC9ecnVieSAzXFwuL3UpLFxuICBub2RlOiBkZWZpbml0aW9uKFwibm9kZVwiLCBcIlNFTUFOVElGT0xEX05PREVcIiwgW1wiLS12ZXJzaW9uXCJdLCAvXnYyNFxcLi91KSxcbiAgdHNjOiBkZWZpbml0aW9uKFwidHNjXCIsIFwiU0VNQU5USUZPTERfVFNDXCIsIFtcIi0tdmVyc2lvblwiXSwgL15WZXJzaW9uIDdcXC4vdSksXG4gIGphdmFjOiBkZWZpbml0aW9uKFwiamF2YWNcIiwgXCJTRU1BTlRJRk9MRF9KQVZBQ1wiLCBbXCItdmVyc2lvblwiXSwgL15qYXZhYyAoPzoxWzctOV18MlswLTldKVxcLi91KSxcbiAgamF2YTogZGVmaW5pdGlvbihcImphdmFcIiwgXCJTRU1BTlRJRk9MRF9KQVZBXCIsIFtcIi12ZXJzaW9uXCJdLCAvXig/Om9wZW5qZGt8amF2YSkgdmVyc2lvbiBcIig/OjFbNy05XXwyWzAtOV0pXFwuL3UpLFxuICBweXRob246IGRlZmluaXRpb24oXCJweXRob24zXCIsIFwiU0VNQU5USUZPTERfUFlUSE9OXCIsIFtcIi0tdmVyc2lvblwiXSwgL15QeXRob24gM1xcLi91KSxcbiAgZG90bmV0OiBkZWZpbml0aW9uKFwiZG90bmV0XCIsIFwiU0VNQU5USUZPTERfRE9UTkVUXCIsIFtcIi0tdmVyc2lvblwiXSwgL14xMFxcLi91KSxcbiAgZ286IGRlZmluaXRpb24oXCJnb1wiLCBcIlNFTUFOVElGT0xEX0dPXCIsIFtcInZlcnNpb25cIl0sIC9eZ28gdmVyc2lvbiBnbzFcXC4yNlxcLlxcZCsgbGludXhcXC9hbWQ2NCQvdSksXG4gIGNsYW5ncHA6IGRlZmluaXRpb24oXCJjbGFuZysrXCIsIFwiU0VNQU5USUZPTERfQ0xBTkdQUFwiLCBbXCItLXZlcnNpb25cIl0sIC9eVWJ1bnR1IGNsYW5nIHZlcnNpb24gMjFcXC4xXFwuOCBbXlxcbl0rXFxuVGFyZ2V0OiB4ODZfNjQtcGMtbGludXgtZ251XFxuL3UpLFxuICBjbGFuZzogZGVmaW5pdGlvbihcImNsYW5nXCIsIFwiU0VNQU5USUZPTERfQ0xBTkdcIiwgW1wiLS12ZXJzaW9uXCJdLCAvXlVidW50dSBjbGFuZyB2ZXJzaW9uIDIxXFwuMVxcLjggW15cXG5dK1xcblRhcmdldDogeDg2XzY0LXBjLWxpbnV4LWdudVxcbi91KVxufSlcblxuLyoqXG4gKiBEaXNjb3ZlcnMgb25lIHJlcG9zaXRvcnktZGVjbGFyZWQgY2Fub25pY2FsIHRvb2xjaGFpbi5cbiAqIEBwYXJhbSB7a2V5b2YgdHlwZW9mIGNhbm9uaWNhbFRvb2xjaGFpbnN9IGlkIC0gQ2Fub25pY2FsIHRvb2xjaGFpbiBJRC5cbiAqIEBwYXJhbSB7e2Vudmlyb25tZW50PzogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPj4sIG92ZXJyaWRlPzogc3RyaW5nLCB0aW1lb3V0TXM/OiBudW1iZXJ9fSBbb3B0aW9uc10gLSBEaXNjb3Zlcnkgb3B0aW9ucy5cbiAqIEByZXR1cm5zIHtQcm9taXNlPGltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuRGlzY292ZXJlZFRvb2xjaGFpbj59IEV4YWN0IGV4ZWN1dGFibGUgYW5kIHZlcnNpb24uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkaXNjb3ZlckNhbm9uaWNhbFRvb2xjaGFpbihpZCwgb3B0aW9ucyA9IHt9KSB7XG4gIGlmICh0eXBlb2YgaWQgIT0gXCJzdHJpbmdcIiB8fCBpZC5sZW5ndGggPT0gMCkge1xuICAgIGludmFsaWRUb29sY2hhaW4oXCJDYW5vbmljYWwgdG9vbGNoYWluIElEIG11c3QgYmUgYSBub24tZW1wdHkgcHJpbWl0aXZlIHN0cmluZy5cIiwgXCJ0b29sY2hhaW5cIilcbiAgfVxuICBpZiAoIWlzUGxhaW5PYmplY3Qob3B0aW9ucykpIGludmFsaWRUb29sY2hhaW4oXCJDYW5vbmljYWwgdG9vbGNoYWluIG9wdGlvbnMgbXVzdCBiZSBhbiBvYmplY3QuXCIsIGlkKVxuICBjb25zdCBkZWZpbml0aW9uID0gT2JqZWN0Lmhhc093bihjYW5vbmljYWxUb29sY2hhaW5zLCBpZClcbiAgICA/IGNhbm9uaWNhbFRvb2xjaGFpbnNbLyoqIEB0eXBlIHtrZXlvZiB0eXBlb2YgY2Fub25pY2FsVG9vbGNoYWluc30gKi8gKGlkKV1cbiAgICA6IHVuZGVmaW5lZFxuXG4gIGlmICghZGVmaW5pdGlvbikgaW52YWxpZFRvb2xjaGFpbihgVW5rbm93biBjYW5vbmljYWwgdG9vbGNoYWluICcke2lkfScuYCwgaWQpXG4gIGNvbnN0IGNvbmZpZ3VyYXRpb25FbnZpcm9ubWVudCA9IG9wdGlvbnMuZW52aXJvbm1lbnQgPT09IHVuZGVmaW5lZFxuICAgID8gdW5kZWZpbmVkXG4gICAgOiBzbmFwc2hvdEVudmlyb25tZW50KG9wdGlvbnMuZW52aXJvbm1lbnQsIGlkKVxuICBjb25zdCBlbnZpcm9ubWVudCA9IGNvbmZpZ3VyYXRpb25FbnZpcm9ubWVudCA/PyBkZWZhdWx0RW52aXJvbm1lbnQoKVxuICBjb25zdCBjb25maWd1cmVkID0gb3B0aW9ucy5vdmVycmlkZSA9PT0gdW5kZWZpbmVkXG4gICAgPyBjb25maWd1cmF0aW9uRW52aXJvbm1lbnQgPT09IHVuZGVmaW5lZFxuICAgICAgPyBwcm9jZXNzLmVudltkZWZpbml0aW9uLm92ZXJyaWRlRW52aXJvbm1lbnRWYXJpYWJsZV1cbiAgICAgIDogY29uZmlndXJhdGlvbkVudmlyb25tZW50W2RlZmluaXRpb24ub3ZlcnJpZGVFbnZpcm9ubWVudFZhcmlhYmxlXVxuICAgIDogb3B0aW9ucy5vdmVycmlkZVxuXG4gIHJldHVybiBkaXNjb3ZlclRvb2xjaGFpbih7XG4gICAgY2Fub25pY2FsQ29tbWFuZDogZGVmaW5pdGlvbi5jYW5vbmljYWxDb21tYW5kLFxuICAgIGVudmlyb25tZW50LFxuICAgIGlkLFxuICAgIG92ZXJyaWRlOiBjb25maWd1cmVkLFxuICAgIHN1cHBvcnRlZFZlcnNpb246IGRlZmluaXRpb24uc3VwcG9ydGVkVmVyc2lvbixcbiAgICB0aW1lb3V0TXM6IG9wdGlvbnMudGltZW91dE1zLFxuICAgIHZlcnNpb25Bcmd1bWVudHM6IGRlZmluaXRpb24udmVyc2lvbkFyZ3VtZW50c1xuICB9KVxufVxuXG4vKipcbiAqIFJlc29sdmVzIGFuZCB2ZXJzaW9ucyBvbmUgY29uZmlndXJlZCBvciBjYW5vbmljYWwgZXhlY3V0YWJsZSB3aXRob3V0IGludm9raW5nIGEgc2hlbGwuXG4gKiBAcGFyYW0ge29iamVjdH0gaW5wdXQgLSBEaXNjb3ZlcnkgcmVxdWVzdC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBpbnB1dC5jYW5vbmljYWxDb21tYW5kIC0gQ2Fub25pY2FsIFBBVEggY29tbWFuZC5cbiAqIEBwYXJhbSB7UmVhZG9ubHk8UmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPj59IFtpbnB1dC5lbnZpcm9ubWVudF0gLSBFeHBsaWNpdCBkaXNjb3ZlcnkgZW52aXJvbm1lbnQuXG4gKiBAcGFyYW0ge3N0cmluZ30gaW5wdXQuaWQgLSBUb29sY2hhaW4gSUQuXG4gKiBAcGFyYW0ge3N0cmluZ30gW2lucHV0Lm92ZXJyaWRlXSAtIENvbmZpZ3VyZWQgYWJzb2x1dGUgZXhlY3V0YWJsZSBwYXRoLlxuICogQHBhcmFtIHtSZWdFeHB9IFtpbnB1dC5zdXBwb3J0ZWRWZXJzaW9uXSAtIEZ1bGwgY2FwdHVyZWQtb3V0cHV0IHZlcnNpb24gcG9saWN5LlxuICogQHBhcmFtIHtudW1iZXJ9IFtpbnB1dC50aW1lb3V0TXNdIC0gVmVyc2lvbiBjb21tYW5kIHRpbWVvdXQuXG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBpbnB1dC52ZXJzaW9uQXJndW1lbnRzIC0gRXhhY3QgdmVyc2lvbiBhcmd1bWVudCBhcnJheS5cbiAqIEByZXR1cm5zIHtQcm9taXNlPGltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuRGlzY292ZXJlZFRvb2xjaGFpbj59IERpc2NvdmVyZWQgdG9vbC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRpc2NvdmVyVG9vbGNoYWluKGlucHV0KSB7XG4gIGlmICghaXNQbGFpbk9iamVjdChpbnB1dCkpIGludmFsaWRUb29sY2hhaW4oXCJUb29sY2hhaW4gZGlzY292ZXJ5IHJlcXVpcmVzIGEgcmVxdWVzdCBvYmplY3QuXCIsIFwidG9vbGNoYWluXCIpXG4gIGNvbnN0IHZlcnNpb25Bcmd1bWVudENhbmRpZGF0ZSA9IGlucHV0LnZlcnNpb25Bcmd1bWVudHNcbiAgY29uc3QgdmVyc2lvbkFyZ3VtZW50cyA9IGlzRGVuc2VBcnJheSh2ZXJzaW9uQXJndW1lbnRDYW5kaWRhdGUpID8gWy4uLnZlcnNpb25Bcmd1bWVudENhbmRpZGF0ZV0gOiB1bmRlZmluZWRcbiAgY29uc3QgY2FuZGlkYXRlID0ge1xuICAgIGNhbm9uaWNhbENvbW1hbmQ6IGlucHV0LmNhbm9uaWNhbENvbW1hbmQsXG4gICAgZW52aXJvbm1lbnQ6IGlucHV0LmVudmlyb25tZW50ID09PSB1bmRlZmluZWQgPyBkZWZhdWx0RW52aXJvbm1lbnQoKSA6IGlucHV0LmVudmlyb25tZW50LFxuICAgIGlkOiBpbnB1dC5pZCxcbiAgICBvdmVycmlkZTogaW5wdXQub3ZlcnJpZGUsXG4gICAgc3VwcG9ydGVkVmVyc2lvbjogaW5wdXQuc3VwcG9ydGVkVmVyc2lvbixcbiAgICB0aW1lb3V0TXM6IGlucHV0LnRpbWVvdXRNcyA9PT0gdW5kZWZpbmVkID8gZGVmYXVsdFRpbWVvdXRNcyA6IGlucHV0LnRpbWVvdXRNcyxcbiAgICB2ZXJzaW9uQXJndW1lbnRzXG4gIH1cblxuICB2YWxpZGF0ZURpc2NvdmVyeShjYW5kaWRhdGUpXG4gIGNvbnN0IGNhbm9uaWNhbENvbW1hbmQgPSAvKiogQHR5cGUge3N0cmluZ30gKi8gKGNhbmRpZGF0ZS5jYW5vbmljYWxDb21tYW5kKVxuICBjb25zdCBlbnZpcm9ubWVudCA9IC8qKiBAdHlwZSB7UmVhZG9ubHk8UmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPj59ICovIChjYW5kaWRhdGUuZW52aXJvbm1lbnQpXG4gIGNvbnN0IGlkID0gLyoqIEB0eXBlIHtzdHJpbmd9ICovIChjYW5kaWRhdGUuaWQpXG4gIGNvbnN0IG92ZXJyaWRlID0gLyoqIEB0eXBlIHtzdHJpbmcgfCB1bmRlZmluZWR9ICovIChjYW5kaWRhdGUub3ZlcnJpZGUpXG4gIGNvbnN0IHN1cHBvcnRlZFZlcnNpb24gPSBjYW5kaWRhdGUuc3VwcG9ydGVkVmVyc2lvbiBpbnN0YW5jZW9mIFJlZ0V4cFxuICAgID8gbmV3IFJlZ0V4cChjYW5kaWRhdGUuc3VwcG9ydGVkVmVyc2lvbi5zb3VyY2UsIGNhbmRpZGF0ZS5zdXBwb3J0ZWRWZXJzaW9uLmZsYWdzKVxuICAgIDogdW5kZWZpbmVkXG4gIGNvbnN0IHRpbWVvdXRNcyA9IC8qKiBAdHlwZSB7bnVtYmVyfSAqLyAoY2FuZGlkYXRlLnRpbWVvdXRNcylcbiAgY29uc3QgdmFsaWRhdGVkVmVyc2lvbkFyZ3VtZW50cyA9IC8qKiBAdHlwZSB7c3RyaW5nW119ICovIChjYW5kaWRhdGUudmVyc2lvbkFyZ3VtZW50cylcbiAgY29uc3Qgbm9ybWFsaXplZEVudmlyb25tZW50ID0gZGV0ZXJtaW5pc3RpY0Vudmlyb25tZW50KGVudmlyb25tZW50KVxuICBjb25zdCB7ZXhlY3V0YWJsZSwgc291cmNlfSA9IG92ZXJyaWRlID09PSB1bmRlZmluZWRcbiAgICA/IGF3YWl0IHJlc29sdmVDYW5vbmljYWwoaWQsIGNhbm9uaWNhbENvbW1hbmQsIG5vcm1hbGl6ZWRFbnZpcm9ubWVudC5QQVRIID8/IFwiXCIpXG4gICAgOiB7ZXhlY3V0YWJsZTogYXdhaXQgcmVzb2x2ZU92ZXJyaWRlKGlkLCBvdmVycmlkZSwgY2Fub25pY2FsQ29tbWFuZCksIHNvdXJjZTogLyoqIEB0eXBlIHtjb25zdH0gKi8gKFwib3ZlcnJpZGVcIil9XG4gIC8qKiBAdHlwZSB7e3N0ZG91dDogc3RyaW5nLCBzdGRlcnI6IHN0cmluZ319ICovXG4gIGxldCByZXN1bHRcblxuICB0cnkge1xuICAgIHJlc3VsdCA9IGF3YWl0IGV4ZWN1dGVGaWxlV2l0aERlYWRsaW5lKHtcbiAgICAgIGFyZ3VtZW50czogdmFsaWRhdGVkVmVyc2lvbkFyZ3VtZW50cyxcbiAgICAgIGVudmlyb25tZW50OiBub3JtYWxpemVkRW52aXJvbm1lbnQsXG4gICAgICBleGVjdXRhYmxlLFxuICAgICAgbWF4QnVmZmVyOiAxMDI0ICogMTAyNCxcbiAgICAgIHRpbWVvdXRNc1xuICAgIH0pXG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc3QgcHJvY2Vzc0Vycm9yID0gcHJvY2Vzc0Vycm9yRmllbGRzKGVycm9yKVxuICAgIGNvbnN0IHRpbWVkT3V0ID0gZXhjZWVkZWRPd25lZERlYWRsaW5lKGVycm9yKVxuXG4gICAgdGhyb3cgbmV3IFNlbWFudGlmb2xkRGlhZ25vc3RpYyh7XG4gICAgICAuLi5wcm9jZXNzRXJyb3IsXG4gICAgICBjYXVzZTogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yIDogdW5kZWZpbmVkLFxuICAgICAgY29kZTogdGltZWRPdXQgPyBcIlRPT0xfVkVSU0lPTl9USU1FT1VUXCIgOiBcIlRPT0xfVkVSU0lPTl9GQUlMVVJFXCIsXG4gICAgICBjb21tYW5kOiBjYW5vbmljYWxDb21tYW5kLFxuICAgICAgZXhlY3V0YWJsZSxcbiAgICAgIGxhbmd1YWdlOiBpZCxcbiAgICAgIG1lc3NhZ2U6IHRpbWVkT3V0XG4gICAgICAgID8gYFZlcnNpb24gY29tbWFuZCBmb3IgJyR7ZXhlY3V0YWJsZX0nIGV4Y2VlZGVkICR7dGltZW91dE1zfW1zLmBcbiAgICAgICAgOiBgVmVyc2lvbiBjb21tYW5kIGZvciAnJHtleGVjdXRhYmxlfScgZmFpbGVkLmAsXG4gICAgICBzdGRlcnI6IHByb2Nlc3NFcnJvci5zdGRlcnIsXG4gICAgICBzdGRvdXQ6IHByb2Nlc3NFcnJvci5zdGRvdXRcbiAgICB9KVxuICB9XG5cbiAgY29uc3Qge3N0ZGVyciwgc3Rkb3V0fSA9IHJlc3VsdFxuICBjb25zdCB2ZXJzaW9uT3V0cHV0ID0gW3N0ZG91dCwgc3RkZXJyXS5maWx0ZXIoKHZhbHVlKSA9PiB2YWx1ZS5sZW5ndGggPiAwKS5qb2luKFwiXFxuXCIpLnRyaW0oKVxuICBjb25zdCB2ZXJzaW9uID0gdmVyc2lvbk91dHB1dC5zcGxpdCgvXFxyP1xcbi91KVswXSA/PyBcIlwiXG5cbiAgaWYgKHZlcnNpb24ubGVuZ3RoID09IDApIHtcbiAgICB0aHJvdyBuZXcgU2VtYW50aWZvbGREaWFnbm9zdGljKHtcbiAgICAgIGNvZGU6IFwiVE9PTF9WRVJTSU9OX0ZBSUxVUkVcIixcbiAgICAgIGNvbW1hbmQ6IGNhbm9uaWNhbENvbW1hbmQsXG4gICAgICBleGVjdXRhYmxlLFxuICAgICAgbGFuZ3VhZ2U6IGlkLFxuICAgICAgbWVzc2FnZTogYFZlcnNpb24gY29tbWFuZCBmb3IgJyR7ZXhlY3V0YWJsZX0nIHJldHVybmVkIG5vIHZlcnNpb24gb3V0cHV0LmAsXG4gICAgICBzdGRlcnIsXG4gICAgICBzdGRvdXRcbiAgICB9KVxuICB9XG4gIGlmIChzdXBwb3J0ZWRWZXJzaW9uICYmICFzdXBwb3J0ZWRWZXJzaW9uLnRlc3QodmVyc2lvbk91dHB1dCkpIHtcbiAgICB0aHJvdyBuZXcgU2VtYW50aWZvbGREaWFnbm9zdGljKHtcbiAgICAgIGNvZGU6IFwiVE9PTF9VTlNVUFBPUlRFRF9WRVJTSU9OXCIsXG4gICAgICBjb21tYW5kOiBjYW5vbmljYWxDb21tYW5kLFxuICAgICAgZXhlY3V0YWJsZSxcbiAgICAgIGxhbmd1YWdlOiBpZCxcbiAgICAgIG1lc3NhZ2U6IGBFeGVjdXRhYmxlICcke2V4ZWN1dGFibGV9JyByZXBvcnRlZCB1bnN1cHBvcnRlZCB2ZXJzaW9uICcke3ZlcnNpb259Jy5gLFxuICAgICAgc3RkZXJyLFxuICAgICAgc3Rkb3V0LFxuICAgICAgdmVyc2lvblxuICAgIH0pXG4gIH1cblxuICByZXR1cm4gZGVlcEZyZWV6ZSh7XG4gICAgY29tbWFuZDogY2Fub25pY2FsQ29tbWFuZCxcbiAgICBleGVjdXRhYmxlLFxuICAgIGlkLFxuICAgIHNvdXJjZSxcbiAgICB2ZXJzaW9uLFxuICAgIHZlcnNpb25Bcmd1bWVudHM6IHZhbGlkYXRlZFZlcnNpb25Bcmd1bWVudHMsXG4gICAgdmVyc2lvbk91dHB1dFxuICB9KVxufVxuXG4vKipcbiAqIEJ1aWxkcyBvbmUgY2Fub25pY2FsIGltbXV0YWJsZSB0b29sY2hhaW4gZGVjbGFyYXRpb24uXG4gKiBAcGFyYW0ge3N0cmluZ30gY2Fub25pY2FsQ29tbWFuZCAtIFBBVEggY29tbWFuZC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBvdmVycmlkZUVudmlyb25tZW50VmFyaWFibGUgLSBDb25maWd1cmVkIG92ZXJyaWRlIHZhcmlhYmxlLlxuICogQHBhcmFtIHtzdHJpbmdbXX0gdmVyc2lvbkFyZ3VtZW50cyAtIEV4YWN0IHZlcnNpb24gYXJndW1lbnRzLlxuICogQHBhcmFtIHtSZWdFeHB9IHN1cHBvcnRlZFZlcnNpb24gLSBTdXBwb3J0ZWQgdmVyc2lvbiBvdXRwdXQuXG4gKiBAcmV0dXJucyB7e2Nhbm9uaWNhbENvbW1hbmQ6IHN0cmluZywgb3ZlcnJpZGVFbnZpcm9ubWVudFZhcmlhYmxlOiBzdHJpbmcsIHN1cHBvcnRlZFZlcnNpb246IFJlZ0V4cCwgdmVyc2lvbkFyZ3VtZW50czogc3RyaW5nW119fSBEZWNsYXJhdGlvbi5cbiAqL1xuZnVuY3Rpb24gZGVmaW5pdGlvbihjYW5vbmljYWxDb21tYW5kLCBvdmVycmlkZUVudmlyb25tZW50VmFyaWFibGUsIHZlcnNpb25Bcmd1bWVudHMsIHN1cHBvcnRlZFZlcnNpb24pIHtcbiAgcmV0dXJuIHtjYW5vbmljYWxDb21tYW5kLCBvdmVycmlkZUVudmlyb25tZW50VmFyaWFibGUsIHN1cHBvcnRlZFZlcnNpb24sIHZlcnNpb25Bcmd1bWVudHN9XG59XG5cbi8qKlxuICogVmFsaWRhdGVzIHRvb2wgZGlzY292ZXJ5IGJlZm9yZSBmaWxlc3lzdGVtIG9yIHByb2Nlc3MgYWNjZXNzLlxuICogQHBhcmFtIHt7XG4gKiAgIGNhbm9uaWNhbENvbW1hbmQ6IHVua25vd24sXG4gKiAgIGVudmlyb25tZW50OiB1bmtub3duLFxuICogICBpZDogdW5rbm93bixcbiAqICAgb3ZlcnJpZGU6IHVua25vd24sXG4gKiAgIHN1cHBvcnRlZFZlcnNpb246IHVua25vd24sXG4gKiAgIHRpbWVvdXRNczogdW5rbm93bixcbiAqICAgdmVyc2lvbkFyZ3VtZW50czogdW5rbm93blxuICogfX0gaW5wdXQgLSBDYW5kaWRhdGUgZGlzY292ZXJ5IGZpZWxkcy5cbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5mdW5jdGlvbiB2YWxpZGF0ZURpc2NvdmVyeShpbnB1dCkge1xuICBpZiAodHlwZW9mIGlucHV0LmlkICE9IFwic3RyaW5nXCIgfHwgaW5wdXQuaWQubGVuZ3RoID09IDAgfHxcbiAgICB0eXBlb2YgaW5wdXQuY2Fub25pY2FsQ29tbWFuZCAhPSBcInN0cmluZ1wiIHx8IGlucHV0LmNhbm9uaWNhbENvbW1hbmQubGVuZ3RoID09IDAgfHxcbiAgICBpbnB1dC5jYW5vbmljYWxDb21tYW5kLmluY2x1ZGVzKFwiL1wiKSB8fCBpbnB1dC5jYW5vbmljYWxDb21tYW5kLmluY2x1ZGVzKFwiXFxcXFwiKSB8fCBpbnB1dC5jYW5vbmljYWxDb21tYW5kLmluY2x1ZGVzKFwiXFwwXCIpIHx8XG4gICAgIWlzRGVuc2VBcnJheShpbnB1dC52ZXJzaW9uQXJndW1lbnRzKSB8fCAhaW5wdXQudmVyc2lvbkFyZ3VtZW50cy5ldmVyeSh2YWxpZEFyZ3VtZW50KSB8fFxuICAgICFpc0Vudmlyb25tZW50KGlucHV0LmVudmlyb25tZW50KSB8fCAhaXNTdXBwb3J0ZWRUaW1lb3V0TXMoaW5wdXQudGltZW91dE1zKSB8fFxuICAgIChpbnB1dC5vdmVycmlkZSAhPT0gdW5kZWZpbmVkICYmICh0eXBlb2YgaW5wdXQub3ZlcnJpZGUgIT0gXCJzdHJpbmdcIiB8fCAhcGF0aC5pc0Fic29sdXRlKGlucHV0Lm92ZXJyaWRlKSB8fCBpbnB1dC5vdmVycmlkZS5pbmNsdWRlcyhcIlxcMFwiKSkpIHx8XG4gICAgKGlucHV0LnN1cHBvcnRlZFZlcnNpb24gIT09IHVuZGVmaW5lZCAmJiAoIShpbnB1dC5zdXBwb3J0ZWRWZXJzaW9uIGluc3RhbmNlb2YgUmVnRXhwKSB8fCBpbnB1dC5zdXBwb3J0ZWRWZXJzaW9uLmdsb2JhbCB8fCBpbnB1dC5zdXBwb3J0ZWRWZXJzaW9uLnN0aWNreSkpKSB7XG4gICAgaW52YWxpZFRvb2xjaGFpbihgVG9vbGNoYWluIGRpc2NvdmVyeSByZXF1aXJlcyBhIGNhbm9uaWNhbCBiYXNlbmFtZSwgYWJzb2x1dGUgb3ZlcnJpZGUsIGFyZ3VtZW50IGFycmF5LCBlbnZpcm9ubWVudCwgYW5kIHRpbWVvdXQgZnJvbSAxIHRocm91Z2ggJHttYXhpbXVtVGltZW91dE1zfW1zLmAsXG4gICAgICB0eXBlb2YgaW5wdXQuaWQgPT0gXCJzdHJpbmdcIiA/IGlucHV0LmlkIDogXCJ0b29sY2hhaW5cIilcbiAgfVxufVxuXG4vKipcbiAqIFJlc29sdmVzIG9uZSB1bmFtYmlndW91cyBjYW5vbmljYWwgY29tbWFuZCBmcm9tIGFuIGV4cGxpY2l0IFBBVEguXG4gKiBAcGFyYW0ge3N0cmluZ30gaWQgLSBUb29sY2hhaW4gSUQuXG4gKiBAcGFyYW0ge3N0cmluZ30gY29tbWFuZCAtIENhbm9uaWNhbCBjb21tYW5kLlxuICogQHBhcmFtIHtzdHJpbmd9IHBhdGhWYWx1ZSAtIEV4cGxpY2l0IFBBVEguXG4gKiBAcmV0dXJucyB7UHJvbWlzZTx7ZXhlY3V0YWJsZTogc3RyaW5nLCBzb3VyY2U6IFwiY2Fub25pY2FsXCJ9Pn0gRXhhY3QgZXhlY3V0YWJsZS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZUNhbm9uaWNhbChpZCwgY29tbWFuZCwgcGF0aFZhbHVlKSB7XG4gIGNvbnN0IG1hdGNoZXMgPSBuZXcgTWFwKClcblxuICBmb3IgKGNvbnN0IGRpcmVjdG9yeSBvZiBwYXRoVmFsdWUuc3BsaXQocGF0aC5kZWxpbWl0ZXIpKSB7XG4gICAgaWYgKGRpcmVjdG9yeS5sZW5ndGggPT0gMCB8fCAhcGF0aC5pc0Fic29sdXRlKGRpcmVjdG9yeSkpIGNvbnRpbnVlXG4gICAgY29uc3QgY2FuZGlkYXRlID0gcGF0aC5qb2luKGRpcmVjdG9yeSwgY29tbWFuZClcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBleGFjdCA9IGF3YWl0IHJlc29sdmVFeGVjdXRhYmxlRmlsZShjYW5kaWRhdGUpXG5cbiAgICAgIGlmIChleGFjdCAhPSB1bmRlZmluZWQpIG1hdGNoZXMuc2V0KGV4YWN0LCBleGFjdClcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIEEgUEFUSCBjYW5kaWRhdGUgaXMgYWJzZW50IG9yIG5vbi1leGVjdXRhYmxlOyBkaXNjb3ZlcnkgY29udGludWVzIGRldGVybWluaXN0aWNhbGx5LlxuICAgIH1cbiAgfVxuXG4gIGlmIChtYXRjaGVzLnNpemUgPT0gMCkge1xuICAgIHRocm93IG5ldyBTZW1hbnRpZm9sZERpYWdub3N0aWMoe1xuICAgICAgY29kZTogXCJUT09MX05PVF9GT1VORFwiLFxuICAgICAgY29tbWFuZCxcbiAgICAgIGxhbmd1YWdlOiBpZCxcbiAgICAgIG1lc3NhZ2U6IGBDYW5vbmljYWwgY29tbWFuZCAnJHtjb21tYW5kfScgd2FzIG5vdCBmb3VuZCBhcyBhbiBleGVjdXRhYmxlIG9uIFBBVEguYFxuICAgIH0pXG4gIH1cbiAgaWYgKG1hdGNoZXMuc2l6ZSA+IDEpIHtcbiAgICB0aHJvdyBuZXcgU2VtYW50aWZvbGREaWFnbm9zdGljKHtcbiAgICAgIGNvZGU6IFwiVE9PTF9BTUJJR1VPVVNcIixcbiAgICAgIGNvbW1hbmQsXG4gICAgICBsYW5ndWFnZTogaWQsXG4gICAgICBtZXNzYWdlOiBgQ2Fub25pY2FsIGNvbW1hbmQgJyR7Y29tbWFuZH0nIHJlc29sdmVzIHRvIG11bHRpcGxlIGV4ZWN1dGFibGVzOiAke1suLi5tYXRjaGVzLmtleXMoKV0uam9pbihcIiwgXCIpfS5gXG4gICAgfSlcbiAgfVxuXG4gIHJldHVybiB7ZXhlY3V0YWJsZTogLyoqIEB0eXBlIHtzdHJpbmd9ICovIChbLi4ubWF0Y2hlcy5rZXlzKCldWzBdKSwgc291cmNlOiAvKiogQHR5cGUge2NvbnN0fSAqLyAoXCJjYW5vbmljYWxcIil9XG59XG5cbi8qKlxuICogUmVzb2x2ZXMgb25lIGNvbmZpZ3VyZWQgYWJzb2x1dGUgZXhlY3V0YWJsZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBpZCAtIFRvb2xjaGFpbiBJRC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBvdmVycmlkZSAtIEFic29sdXRlIG92ZXJyaWRlLlxuICogQHBhcmFtIHtzdHJpbmd9IGNvbW1hbmQgLSBDYW5vbmljYWwgY29tbWFuZC5cbiAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZz59IEV4YWN0IGV4ZWN1dGFibGUgcGF0aC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZU92ZXJyaWRlKGlkLCBvdmVycmlkZSwgY29tbWFuZCkge1xuICAvKiogQHR5cGUge0Vycm9yIHwgdW5kZWZpbmVkfSAqL1xuICBsZXQgY2F1c2VcblxuICB0cnkge1xuICAgIGNvbnN0IGV4YWN0ID0gYXdhaXQgcmVzb2x2ZUV4ZWN1dGFibGVGaWxlKG92ZXJyaWRlKVxuXG4gICAgaWYgKGV4YWN0ICE9IHVuZGVmaW5lZCkgcmV0dXJuIGV4YWN0XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY2F1c2UgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IgOiB1bmRlZmluZWRcbiAgfVxuXG4gIHRocm93IG5ldyBTZW1hbnRpZm9sZERpYWdub3N0aWMoe1xuICAgIGNhdXNlLFxuICAgIGNvZGU6IFwiVE9PTF9OT1RfRk9VTkRcIixcbiAgICBjb21tYW5kLFxuICAgIGV4ZWN1dGFibGU6IG92ZXJyaWRlLFxuICAgIGxhbmd1YWdlOiBpZCxcbiAgICBtZXNzYWdlOiBgQ29uZmlndXJlZCBleGVjdXRhYmxlICcke292ZXJyaWRlfScgaXMgbWlzc2luZyBvciBub3QgZXhlY3V0YWJsZS5gXG4gIH0pXG59XG5cbi8qKlxuICogUmVzb2x2ZXMgb25lIGNhbmRpZGF0ZSB0byBhbiBleGVjdXRhYmxlIHJlZ3VsYXIgZmlsZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBjYW5kaWRhdGUgLSBDYW5kaWRhdGUgcGF0aC5cbiAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD59IEV4YWN0IHJlZ3VsYXIgZXhlY3V0YWJsZSwgaWYgdGhlIGZpbGUgdHlwZSBpcyB2YWxpZC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZUV4ZWN1dGFibGVGaWxlKGNhbmRpZGF0ZSkge1xuICBjb25zdCBleGFjdCA9IGF3YWl0IHJlYWxwYXRoKGNhbmRpZGF0ZSlcbiAgY29uc3Qgc3RhdHVzID0gYXdhaXQgc3RhdChleGFjdClcblxuICBpZiAoIXN0YXR1cy5pc0ZpbGUoKSkgcmV0dXJuIHVuZGVmaW5lZFxuICBhd2FpdCBhY2Nlc3MoZXhhY3QsIGZzQ29uc3RhbnRzLlhfT0spXG5cbiAgcmV0dXJuIGV4YWN0XG59XG5cbi8qKlxuICogUHJvZHVjZXMgdGhlIG1pbmltYWwgZGV0ZXJtaW5pc3RpYyBwcm9jZXNzIGVudmlyb25tZW50LlxuICogQHBhcmFtIHtSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+Pn0gZW52aXJvbm1lbnQgLSBFeHBsaWNpdCBpbnB1dHMuXG4gKiBAcmV0dXJucyB7UmVhZG9ubHk8UmVjb3JkPHN0cmluZywgc3RyaW5nPj59IE5vcm1hbGl6ZWQgZW52aXJvbm1lbnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZXRlcm1pbmlzdGljRW52aXJvbm1lbnQoZW52aXJvbm1lbnQgPSBkZWZhdWx0RW52aXJvbm1lbnQoKSkge1xuICBjb25zdCBlbnRyaWVzID0gZW52aXJvbm1lbnRFbnRyaWVzKGVudmlyb25tZW50KVxuXG4gIGlmIChlbnRyaWVzID09IHVuZGVmaW5lZCkgaW52YWxpZFRvb2xjaGFpbihcIlByb2Nlc3MgZW52aXJvbm1lbnQgbXVzdCBiZSBhIHBsYWluIG93bi1wcm9wZXJ0eSBkYXRhIHJlY29yZCBvZiBzdHJpbmcgb3IgdW5kZWZpbmVkIHZhbHVlcy5cIiwgXCJlbnZpcm9ubWVudFwiKVxuICAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIHN0cmluZz59ICovXG4gIGNvbnN0IG5vcm1hbGl6ZWQgPSBPYmplY3QuY3JlYXRlKG51bGwpXG5cbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgZW50cmllcykge1xuICAgIGlmICghL15bQS1aYS16X11bQS1aYS16MC05X10qJC91LnRlc3Qoa2V5KSB8fCBrZXkuaW5jbHVkZXMoXCJcXDBcIikgfHwgKHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUuaW5jbHVkZXMoXCJcXDBcIikpKSB7XG4gICAgICBpbnZhbGlkVG9vbGNoYWluKFwiUHJvY2VzcyBlbnZpcm9ubWVudCBjb250YWlucyBhbiBpbnZhbGlkIGtleSBvciB2YWx1ZS5cIiwgXCJlbnZpcm9ubWVudFwiKVxuICAgIH1cbiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkgbm9ybWFsaXplZFtrZXldID0gdmFsdWVcbiAgfVxuICBub3JtYWxpemVkLkxBTkcgPSBcIkMuVVRGLThcIlxuICBub3JtYWxpemVkLkxDX0FMTCA9IFwiQy5VVEYtOFwiXG4gIG5vcm1hbGl6ZWQuVFogPSBcIlVUQ1wiXG4gIG5vcm1hbGl6ZWQuUEFUSCA/Pz0gXCIvdXNyL2xvY2FsL2JpbjovdXNyL2JpbjovYmluXCJcblxuICByZXR1cm4gT2JqZWN0LmZyZWV6ZShub3JtYWxpemVkKVxufVxuXG4vKipcbiAqIFJldGFpbnMgb25seSBleGVjdXRhYmxlIGxvb2t1cCBmcm9tIHRoZSBhbWJpZW50IGVudmlyb25tZW50LlxuICogQHJldHVybnMge1JlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4+fSBNaW5pbWFsIGRlZmF1bHQgZW52aXJvbm1lbnQuXG4gKi9cbmZ1bmN0aW9uIGRlZmF1bHRFbnZpcm9ubWVudCgpIHtcbiAgcmV0dXJuIHtQQVRIOiBwcm9jZXNzLmVudi5QQVRIfVxufVxuXG4vKipcbiAqIE5hcnJvd3Mgc3RhYmxlIGZpZWxkcyBmcm9tIGEgdmVyc2lvbiBzdWJwcm9jZXNzIHJlamVjdGlvbi5cbiAqIEBwYXJhbSB7dW5rbm93bn0gZXJyb3IgLSBQcm9jZXNzIHJlamVjdGlvbi5cbiAqIEByZXR1cm5zIHt7ZXhpdENvZGU6IG51bWJlciB8IHVuZGVmaW5lZCwgc2lnbmFsOiBzdHJpbmcgfCB1bmRlZmluZWQsIHN0ZGVycjogc3RyaW5nLCBzdGRvdXQ6IHN0cmluZ319IFN0YWJsZSBmaWVsZHMuXG4gKi9cbmZ1bmN0aW9uIHByb2Nlc3NFcnJvckZpZWxkcyhlcnJvcikge1xuICBpZiAoIWVycm9yIHx8IHR5cGVvZiBlcnJvciAhPSBcIm9iamVjdFwiKSByZXR1cm4ge2V4aXRDb2RlOiB1bmRlZmluZWQsIHNpZ25hbDogdW5kZWZpbmVkLCBzdGRlcnI6IFwiXCIsIHN0ZG91dDogXCJcIn1cbiAgY29uc3QgdmFsdWUgPSAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIHVua25vd24+fSAqLyAoZXJyb3IpXG5cbiAgcmV0dXJuIHtcbiAgICBleGl0Q29kZTogdHlwZW9mIHZhbHVlLmNvZGUgPT0gXCJudW1iZXJcIiA/IHZhbHVlLmNvZGUgOiB1bmRlZmluZWQsXG4gICAgc2lnbmFsOiB0eXBlb2YgdmFsdWUuc2lnbmFsID09IFwic3RyaW5nXCIgPyB2YWx1ZS5zaWduYWwgOiB1bmRlZmluZWQsXG4gICAgc3RkZXJyOiB0eXBlb2YgdmFsdWUuc3RkZXJyID09IFwic3RyaW5nXCIgPyB2YWx1ZS5zdGRlcnIgOiBcIlwiLFxuICAgIHN0ZG91dDogdHlwZW9mIHZhbHVlLnN0ZG91dCA9PSBcInN0cmluZ1wiID8gdmFsdWUuc3Rkb3V0IDogXCJcIlxuICB9XG59XG5cbi8qKlxuICogQ2hlY2tzIG9uZSBzaGVsbC1mcmVlIGFyZ3VtZW50LlxuICogQHBhcmFtIHt1bmtub3dufSB2YWx1ZSAtIENhbmRpZGF0ZSBhcmd1bWVudC5cbiAqIEByZXR1cm5zIHt2YWx1ZSBpcyBzdHJpbmd9IFdoZXRoZXIgdGhlIGFyZ3VtZW50IGlzIHNhZmUgdG8gcGFzcyBkaXJlY3RseS5cbiAqL1xuZnVuY3Rpb24gdmFsaWRBcmd1bWVudCh2YWx1ZSkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09IFwic3RyaW5nXCIgJiYgIXZhbHVlLmluY2x1ZGVzKFwiXFwwXCIpXG59XG5cbi8qKlxuICogQ2hlY2tzIGV4cGxpY2l0IHByb2Nlc3MtZW52aXJvbm1lbnQgdmFsdWVzLlxuICogQHBhcmFtIHt1bmtub3dufSB2YWx1ZSAtIENhbmRpZGF0ZSBlbnZpcm9ubWVudC5cbiAqIEByZXR1cm5zIHt2YWx1ZSBpcyBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+Pn0gV2hldGhlciBlbnRyaWVzIGFyZSBzdHJpbmdzIG9yIHVuZGVmaW5lZC5cbiAqL1xuZnVuY3Rpb24gaXNFbnZpcm9ubWVudCh2YWx1ZSkge1xuICByZXR1cm4gZW52aXJvbm1lbnRFbnRyaWVzKHZhbHVlKSAhPSB1bmRlZmluZWRcbn1cblxuLyoqXG4gKiBEZXRhY2hlcyBhbiBleHBsaWNpdCBlbnZpcm9ubWVudCBiZWZvcmUgY2Fub25pY2FsIG92ZXJyaWRlIGxvb2t1cCBjYW4geWllbGQuXG4gKiBAcGFyYW0ge3Vua25vd259IHZhbHVlIC0gQ2FuZGlkYXRlIGVudmlyb25tZW50IHJlY29yZC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBpZCAtIFRvb2xjaGFpbiBpZGVudGl0eS5cbiAqIEByZXR1cm5zIHtSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+Pn0gT3duZWQgZW52aXJvbm1lbnQgZGF0YS5cbiAqL1xuZnVuY3Rpb24gc25hcHNob3RFbnZpcm9ubWVudCh2YWx1ZSwgaWQpIHtcbiAgY29uc3QgZW50cmllcyA9IGVudmlyb25tZW50RW50cmllcyh2YWx1ZSlcblxuICBpZiAoZW50cmllcyA9PSB1bmRlZmluZWQpIHtcbiAgICBpbnZhbGlkVG9vbGNoYWluKFwiQ2Fub25pY2FsIHRvb2xjaGFpbiBlbnZpcm9ubWVudCBtdXN0IGJlIGEgcGxhaW4gb3duLXByb3BlcnR5IGRhdGEgcmVjb3JkIG9mIHN0cmluZyBvciB1bmRlZmluZWQgdmFsdWVzLlwiLCBpZClcbiAgfVxuICAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD59ICovXG4gIGNvbnN0IHNuYXBzaG90ID0gT2JqZWN0LmNyZWF0ZShudWxsKVxuXG4gIGZvciAoY29uc3QgW2tleSwgZW50cnldIG9mIGVudHJpZXMpIHNuYXBzaG90W2tleV0gPSBlbnRyeVxuXG4gIHJldHVybiBPYmplY3QuZnJlZXplKHNuYXBzaG90KVxufVxuXG4vKipcbiAqIFJlYWRzIG9ubHkgZW51bWVyYWJsZSBvd24gZGF0YSBwcm9wZXJ0aWVzIGZyb20gYW4gb3JkaW5hcnkgb3IgbnVsbC1wcm90b3R5cGUgcmVjb3JkLlxuICogQHBhcmFtIHt1bmtub3dufSB2YWx1ZSAtIENhbmRpZGF0ZSBlbnZpcm9ubWVudCByZWNvcmQuXG4gKiBAcmV0dXJucyB7W3N0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkXVtdIHwgdW5kZWZpbmVkfSBEZXRhY2hlZCBlbnRyaWVzIHdoZW4gdmFsaWQuXG4gKi9cbmZ1bmN0aW9uIGVudmlyb25tZW50RW50cmllcyh2YWx1ZSkge1xuICBpZiAodHlwZW9mIHZhbHVlICE9IFwib2JqZWN0XCIgfHwgdmFsdWUgPT0gbnVsbCB8fCBBcnJheS5pc0FycmF5KHZhbHVlKSkgcmV0dXJuIHVuZGVmaW5lZFxuXG4gIHRyeSB7XG4gICAgY29uc3QgcHJvdG90eXBlID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHZhbHVlKVxuXG4gICAgaWYgKHByb3RvdHlwZSAhPT0gT2JqZWN0LnByb3RvdHlwZSAmJiBwcm90b3R5cGUgIT09IG51bGwpIHJldHVybiB1bmRlZmluZWRcbiAgICAvKiogQHR5cGUge1tzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZF1bXX0gKi9cbiAgICBjb25zdCBlbnRyaWVzID0gW11cblxuICAgIGZvciAoY29uc3Qga2V5IG9mIFJlZmxlY3Qub3duS2V5cyh2YWx1ZSkpIHtcbiAgICAgIGlmICh0eXBlb2Yga2V5ICE9IFwic3RyaW5nXCIpIHJldHVybiB1bmRlZmluZWRcbiAgICAgIGNvbnN0IGRlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHZhbHVlLCBrZXkpXG5cbiAgICAgIGlmIChkZXNjcmlwdG9yID09IHVuZGVmaW5lZCB8fCAhZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8ICEoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIHx8XG4gICAgICAgIChkZXNjcmlwdG9yLnZhbHVlICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIGRlc2NyaXB0b3IudmFsdWUgIT0gXCJzdHJpbmdcIikpIHJldHVybiB1bmRlZmluZWRcbiAgICAgIGVudHJpZXMucHVzaChba2V5LCBkZXNjcmlwdG9yLnZhbHVlXSlcbiAgICB9XG5cbiAgICByZXR1cm4gZW50cmllc1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkXG4gIH1cbn1cblxuLyoqXG4gKiBDaGVja3MgZm9yIGFuIG9yZGluYXJ5IHN0cmluZy1rZXllZCBvYmplY3QuXG4gKiBAcGFyYW0ge3Vua25vd259IHZhbHVlIC0gQ2FuZGlkYXRlIHZhbHVlLlxuICogQHJldHVybnMge3ZhbHVlIGlzIFJlY29yZDxzdHJpbmcsIHVua25vd24+fSBXaGV0aGVyIHRoZSB2YWx1ZSBpcyBhIHBsYWluIG9iamVjdC5cbiAqL1xuZnVuY3Rpb24gaXNQbGFpbk9iamVjdCh2YWx1ZSkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09IFwib2JqZWN0XCIgJiYgdmFsdWUgIT0gbnVsbCAmJiAhQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgT2JqZWN0LmdldFByb3RvdHlwZU9mKHZhbHVlKSA9PSBPYmplY3QucHJvdG90eXBlXG59XG5cbi8qKlxuICogVGhyb3dzIGEgbm9ybWFsaXplZCBkaXNjb3ZlcnktY29uZmlndXJhdGlvbiBkaWFnbm9zdGljLlxuICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2UgLSBGYWlsdXJlIGRldGFpbC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBpZCAtIFRvb2xjaGFpbiBpZGVudGl0eS5cbiAqIEByZXR1cm5zIHtuZXZlcn0gQWx3YXlzIHRocm93cy5cbiAqL1xuZnVuY3Rpb24gaW52YWxpZFRvb2xjaGFpbihtZXNzYWdlLCBpZCkge1xuICB0aHJvdyBuZXcgU2VtYW50aWZvbGREaWFnbm9zdGljKHtjb2RlOiBcIklOVkFMSURfVE9PTENIQUlOXCIsIGxhbmd1YWdlOiBpZCwgbWVzc2FnZX0pXG59XG5cbi8qKlxuICogRGVlcGx5IGZyZWV6ZXMgY2Fub25pY2FsIGRlY2xhcmF0aW9ucyBhbmQgZGlzY292ZXJ5IHJlc3VsdHMuXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtUfSB2YWx1ZSAtIFRvb2xjaGFpbi1vd25lZCB2YWx1ZS5cbiAqIEByZXR1cm5zIHtUfSBGcm96ZW4gdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIGRlZXBGcmVlemUodmFsdWUpIHtcbiAgaWYgKCF2YWx1ZSB8fCB0eXBlb2YgdmFsdWUgIT0gXCJvYmplY3RcIiB8fCBPYmplY3QuaXNGcm96ZW4odmFsdWUpKSByZXR1cm4gdmFsdWVcblxuICBmb3IgKGNvbnN0IG5lc3RlZCBvZiBPYmplY3QudmFsdWVzKHZhbHVlKSkgZGVlcEZyZWV6ZShuZXN0ZWQpXG5cbiAgcmV0dXJuIE9iamVjdC5mcmVlemUodmFsdWUpXG59XG4iXX0=
|
|
428
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9vbGNoYWlucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90b29sY2hhaW5zLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLEVBQUMsU0FBUyxJQUFJLFdBQVcsRUFBQyxNQUFNLFNBQVMsQ0FBQTtBQUNoRCxPQUFPLEVBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQTtBQUN2RCxPQUFPLElBQUksTUFBTSxXQUFXLENBQUE7QUFDNUIsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLFlBQVksQ0FBQTtBQUN2QyxPQUFPLEVBQUMscUJBQXFCLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQTtBQUNyRCxPQUFPLEVBQUMscUJBQXFCLEVBQUUsdUJBQXVCLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQTtBQUM5RSxPQUFPLEVBQUMsb0JBQW9CLEVBQUUsZ0JBQWdCLEVBQUMsTUFBTSxjQUFjLENBQUE7QUFFbkUsTUFBTSxnQkFBZ0IsR0FBRyxNQUFNLENBQUE7QUFFL0IsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQUcsVUFBVSxDQUFDO0lBQzVDLElBQUksRUFBRSxVQUFVLENBQUMsTUFBTSxFQUFFLGtCQUFrQixFQUFFLENBQUMsV0FBVyxDQUFDLEVBQ3hELDJGQUEyRixDQUFDO0lBQzlGLEdBQUcsRUFBRSxVQUFVLENBQUMsS0FBSyxFQUFFLGlCQUFpQixFQUFFLENBQUMsV0FBVyxDQUFDLEVBQUUsV0FBVyxDQUFDO0lBQ3JFLEtBQUssRUFBRSxVQUFVLENBQUMsS0FBSyxFQUFFLGlCQUFpQixFQUFFLENBQUMsV0FBVyxDQUFDLEVBQUUsZ0VBQWdFLENBQUM7SUFDNUgsSUFBSSxFQUFFLFVBQVUsQ0FBQyxNQUFNLEVBQUUsa0JBQWtCLEVBQUUsQ0FBQyxXQUFXLENBQUMsRUFBRSxZQUFZLENBQUM7SUFDekUsSUFBSSxFQUFFLFVBQVUsQ0FBQyxNQUFNLEVBQUUsa0JBQWtC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RSxPQUFPLFNBQVMsQ0FBQTtZQUMzRixPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFBO1FBQ3ZDLENBQUM7UUFFRCxPQUFPLE9BQU8sQ0FBQTtJQUNoQixDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1AsT0FBTyxTQUFTLENBQUE7SUFDbEIsQ0FBQztBQUNILENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBUyxhQUFhLENBQUMsS0FBSztJQUMxQixPQUFPLE9BQU8sS0FBSyxJQUFJLFFBQVEsSUFBSSxLQUFLLElBQUksSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxTQUFTLENBQUE7QUFDL0gsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsU0FBUyxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsRUFBRTtJQUNuQyxNQUFNLElBQUkscUJBQXFCLENBQUMsRUFBQyxJQUFJLEVBQUUsbUJBQW1CLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQUMsQ0FBQyxDQUFBO0FBQ3JGLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILFNBQVMsVUFBVSxDQUFDLEtBQUs7SUFDdkIsSUFBSSxDQUFDLEtBQUssSUFBSSxPQUFPLEtBQUssSUFBSSxRQUFRLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7UUFBRSxPQUFPLEtBQUssQ0FBQTtJQUU5RSxLQUFLLE1BQU0sTUFBTSxJQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDO1FBQUUsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFBO0lBRTdELE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQTtBQUM3QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCB7Y29uc3RhbnRzIGFzIGZzQ29uc3RhbnRzfSBmcm9tIFwibm9kZTpmc1wiXG5pbXBvcnQge2FjY2VzcywgcmVhbHBhdGgsIHN0YXR9IGZyb20gXCJub2RlOmZzL3Byb21pc2VzXCJcbmltcG9ydCBwYXRoIGZyb20gXCJub2RlOnBhdGhcIlxuaW1wb3J0IHtpc0RlbnNlQXJyYXl9IGZyb20gXCIuL2FycmF5LmpzXCJcbmltcG9ydCB7U2VtYW50aWZvbGREaWFnbm9zdGljfSBmcm9tIFwiLi9kaWFnbm9zdGljLmpzXCJcbmltcG9ydCB7ZXhjZWVkZWRPd25lZERlYWRsaW5lLCBleGVjdXRlRmlsZVdpdGhEZWFkbGluZX0gZnJvbSBcIi4vc3VicHJvY2Vzcy5qc1wiXG5pbXBvcnQge2lzU3VwcG9ydGVkVGltZW91dE1zLCBtYXhpbXVtVGltZW91dE1zfSBmcm9tIFwiLi90aW1lb3V0LmpzXCJcblxuY29uc3QgZGVmYXVsdFRpbWVvdXRNcyA9IDEwXzAwMFxuXG5leHBvcnQgY29uc3QgY2Fub25pY2FsVG9vbGNoYWlucyA9IGRlZXBGcmVlemUoe1xuICBkYXJ0OiBkZWZpbml0aW9uKFwiZGFydFwiLCBcIlNFTUFOVElGT0xEX0RBUlRcIiwgW1wiLS12ZXJzaW9uXCJdLFxuICAgIC9eRGFydCBTREsgdmVyc2lvbjogM1xcLjEzXFwuMyBcXChzdGFibGVcXCkgXFwoVHVlIFNlcCAxIDAxOjA3OjE3IDIwMjYgLTA3MDBcXCkgb24gXCJsaW51eF94NjRcIiQvdSksXG4gIHBocDogZGVmaW5pdGlvbihcInBocFwiLCBcIlNFTUFOVElGT0xEX1BIUFwiLCBbXCItLXZlcnNpb25cIl0sIC9eUEhQIDhcXC4vdSksXG4gIHBocDgyOiBkZWZpbml0aW9uKFwicGhwXCIsIFwiU0VNQU5USUZPTERfUEhQXCIsIFtcIi0tdmVyc2lvblwiXSwgL15QSFAgKD86OFxcLig/OlsyLTldfFsxLTldWzAtOV0rKXwoPzo5fFsxLTldWzAtOV0rKVxcLlswLTldKylcXC4vdSksXG4gIHJ1Ynk6IGRlZmluaXRpb24oXCJydWJ5XCIsIFwiU0VNQU5USUZPTERfUlVCWVwiLCBbXCItLXZlcnNpb25cIl0sIC9ecnVieSAzXFwuL3UpLFxuICBub2RlOiBkZWZpbml0aW9uKFwibm9kZVwiLCBcIlNFTUFOVElGT0xEX05PREVcIiwgW1wiLS12ZXJzaW9uXCJdLCAvXnYyNFxcLi91KSxcbiAgdHNjOiBkZWZpbml0aW9uKFwidHNjXCIsIFwiU0VNQU5USUZPTERfVFNDXCIsIFtcIi0tdmVyc2lvblwiXSwgL15WZXJzaW9uIDdcXC4vdSksXG4gIGphdmFjOiBkZWZpbml0aW9uKFwiamF2YWNcIiwgXCJTRU1BTlRJRk9MRF9KQVZBQ1wiLCBbXCItdmVyc2lvblwiXSwgL15qYXZhYyAoPzoxWzctOV18MlswLTldKVxcLi91KSxcbiAgamF2YTogZGVmaW5pdGlvbihcImphdmFcIiwgXCJTRU1BTlRJRk9MRF9KQVZBXCIsIFtcIi12ZXJzaW9uXCJdLCAvXig/Om9wZW5qZGt8amF2YSkgdmVyc2lvbiBcIig/OjFbNy05XXwyWzAtOV0pXFwuL3UpLFxuICBqYXZhMjU6IGRlZmluaXRpb24oXCJqYXZhXCIsIFwiU0VNQU5USUZPTERfSkFWQVwiLCBbXCItdmVyc2lvblwiXSxcbiAgICAvXm9wZW5qZGsgdmVyc2lvbiBcIjI1XFwuMFxcLjRcIiAyMDI2LTA3LTIxXFxuT3BlbkpESyBSdW50aW1lIEVudmlyb25tZW50IFxcKGJ1aWxkIDI1XFwuMFxcLjRcXCs3LTEtKCg/OjI0fDI2KVxcLjA0KS1VYnVudHVcXClcXG5PcGVuSkRLIDY0LUJpdCBTZXJ2ZXIgVk0gXFwoYnVpbGQgMjVcXC4wXFwuNFxcKzctMS1cXDEtVWJ1bnR1LCBtaXhlZCBtb2RlLCBzaGFyaW5nXFwpJC91KSxcbiAga290bGluYzogZGVmaW5pdGlvbihcImtvdGxpbmNcIiwgXCJTRU1BTlRJRk9MRF9LT1RMSU5DXCIsIFtcIi12ZXJzaW9uXCJdLCAvXmluZm86IGtvdGxpbmMtanZtIDJcXC40XFwuMjAgXFwoSlJFIDI1XFwuMFxcLjRcXCs3LTEtKD86MjR8MjYpXFwuMDQtVWJ1bnR1XFwpJC91KSxcbiAgcHl0aG9uOiBkZWZpbml0aW9uKFwicHl0aG9uM1wiLCBcIlNFTUFOVElGT0xEX1BZVEhPTlwiLCBbXCItLXZlcnNpb25cIl0sIC9eUHl0aG9uIDNcXC4vdSksXG4gIGRvdG5ldDogZGVmaW5pdGlvbihcImRvdG5ldFwiLCBcIlNFTUFOVElGT0xEX0RPVE5FVFwiLCBbXCItLXZlcnNpb25cIl0sIC9eMTBcXC4vdSksXG4gIGdvOiBkZWZpbml0aW9uKFwiZ29cIiwgXCJTRU1BTlRJRk9MRF9HT1wiLCBbXCJ2ZXJzaW9uXCJdLCAvXmdvIHZlcnNpb24gZ28xXFwuMjZcXC5cXGQrIGxpbnV4XFwvYW1kNjQkL3UpLFxuICBjbGFuZ3BwOiBkZWZpbml0aW9uKFwiY2xhbmcrK1wiLCBcIlNFTUFOVElGT0xEX0NMQU5HUFBcIiwgW1wiLS12ZXJzaW9uXCJdLCAvXlVidW50dSBjbGFuZyB2ZXJzaW9uIDIxXFwuMVxcLjggW15cXG5dK1xcblRhcmdldDogeDg2XzY0LXBjLWxpbnV4LWdudVxcbi91KSxcbiAgY2xhbmc6IGRlZmluaXRpb24oXCJjbGFuZ1wiLCBcIlNFTUFOVElGT0xEX0NMQU5HXCIsIFtcIi0tdmVyc2lvblwiXSwgL15VYnVudHUgY2xhbmcgdmVyc2lvbiAyMVxcLjFcXC44IFteXFxuXStcXG5UYXJnZXQ6IHg4Nl82NC1wYy1saW51eC1nbnVcXG4vdSksXG4gIHJ1c3RjOiBkZWZpbml0aW9uKFwicnVzdGNcIiwgXCJTRU1BTlRJRk9MRF9SVVNUQ1wiLCBbXCItLXZlcnNpb25cIiwgXCItLXZlcmJvc2VcIl0sIC9ecnVzdGMgMVxcLjk4XFwuMSBcXCg0OGEyMjljZWEgMjAyNi0wOS0wMVxcKVxcbmJpbmFyeTogcnVzdGNcXG5jb21taXQtaGFzaDogNDhhMjI5Y2VhZWZkNDk4NWM1MDk5MGIxNDExNmI2ZDg1NmFmMDk4NVxcbmNvbW1pdC1kYXRlOiAyMDI2LTA5LTAxXFxuaG9zdDogeDg2XzY0LXVua25vd24tbGludXgtZ251XFxucmVsZWFzZTogMVxcLjk4XFwuMVxcbkxMVk0gdmVyc2lvbjogMjJcXC4xXFwuOCQvdSksXG4gIGNhcmdvOiBkZWZpbml0aW9uKFwiY2FyZ29cIiwgXCJTRU1BTlRJRk9MRF9DQVJHT1wiLCBbXCItLXZlcnNpb25cIiwgXCItLXZlcmJvc2VcIl0sIC9eY2FyZ28gMVxcLjk4XFwuMSBcXCg3OTdlOGE5YmMgMjAyNi0wOC0wNVxcKVxcbnJlbGVhc2U6IDFcXC45OFxcLjFcXG5jb21taXQtaGFzaDogNzk3ZThhOWJjYTI3NmMxYzlmOWY3MzhkMmEyMGY0ODRmYTRlZWE5ZFxcbmNvbW1pdC1kYXRlOiAyMDI2LTA4LTA1XFxuaG9zdDogeDg2XzY0LXVua25vd24tbGludXgtZ251XFxuL3UpLFxuICBzd2lmdGM6IGRlZmluaXRpb24oXCJzd2lmdGNcIiwgXCJTRU1BTlRJRk9MRF9TV0lGVENcIiwgW1wiLS1kcml2ZXItbW9kZT1zd2lmdGNcIiwgXCItLXZlcnNpb25cIl0sIC9eU3dpZnQgdmVyc2lvbiA2XFwuM1xcLjMgXFwoc3dpZnQtNlxcLjNcXC4zLVJFTEVBU0VcXClcXG5UYXJnZXQ6IHg4Nl82NC11bmtub3duLWxpbnV4LWdudSQvdSksXG4gIFwid2FzbS12YWxpZGF0ZVwiOiBkZWZpbml0aW9uKFwid2FzbS12YWxpZGF0ZVwiLCBcIlNFTUFOVElGT0xEX1dBU01fVkFMSURBVEVcIiwgW1wiLS12ZXJzaW9uXCJdLCAvXjFcXC4wXFwuMzYkL3UpLFxuICBjaHJvbWl1bTogZGVmaW5pdGlvbihcImNocm9taXVtXCIsIFwiU0VNQU5USUZPTERfQ0hST01JVU1cIiwgW1wiLS12ZXJzaW9uXCJdLCAvXkdvb2dsZSBDaHJvbWUgMTUyXFwuMFxcLjc5NzdcXC44MiQvdSlcbn0pXG5cbi8qKlxuICogRGlzY292ZXJzIG9uZSByZXBvc2l0b3J5LWRlY2xhcmVkIGNhbm9uaWNhbCB0b29sY2hhaW4uXG4gKiBAcGFyYW0ge2tleW9mIHR5cGVvZiBjYW5vbmljYWxUb29sY2hhaW5zfSBpZCAtIENhbm9uaWNhbCB0b29sY2hhaW4gSUQuXG4gKiBAcGFyYW0ge3tlbnZpcm9ubWVudD86IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4+LCBvdmVycmlkZT86IHN0cmluZywgdGltZW91dE1zPzogbnVtYmVyfX0gW29wdGlvbnNdIC0gRGlzY292ZXJ5IG9wdGlvbnMuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLkRpc2NvdmVyZWRUb29sY2hhaW4+fSBFeGFjdCBleGVjdXRhYmxlIGFuZCB2ZXJzaW9uLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZGlzY292ZXJDYW5vbmljYWxUb29sY2hhaW4oaWQsIG9wdGlvbnMgPSB7fSkge1xuICBpZiAodHlwZW9mIGlkICE9IFwic3RyaW5nXCIgfHwgaWQubGVuZ3RoID09IDApIHtcbiAgICBpbnZhbGlkVG9vbGNoYWluKFwiQ2Fub25pY2FsIHRvb2xjaGFpbiBJRCBtdXN0IGJlIGEgbm9uLWVtcHR5IHByaW1pdGl2ZSBzdHJpbmcuXCIsIFwidG9vbGNoYWluXCIpXG4gIH1cbiAgaWYgKCFpc1BsYWluT2JqZWN0KG9wdGlvbnMpKSBpbnZhbGlkVG9vbGNoYWluKFwiQ2Fub25pY2FsIHRvb2xjaGFpbiBvcHRpb25zIG11c3QgYmUgYW4gb2JqZWN0LlwiLCBpZClcbiAgY29uc3QgZGVmaW5pdGlvbiA9IE9iamVjdC5oYXNPd24oY2Fub25pY2FsVG9vbGNoYWlucywgaWQpXG4gICAgPyBjYW5vbmljYWxUb29sY2hhaW5zWy8qKiBAdHlwZSB7a2V5b2YgdHlwZW9mIGNhbm9uaWNhbFRvb2xjaGFpbnN9ICovIChpZCldXG4gICAgOiB1bmRlZmluZWRcblxuICBpZiAoIWRlZmluaXRpb24pIGludmFsaWRUb29sY2hhaW4oYFVua25vd24gY2Fub25pY2FsIHRvb2xjaGFpbiAnJHtpZH0nLmAsIGlkKVxuICBjb25zdCBjb25maWd1cmF0aW9uRW52aXJvbm1lbnQgPSBvcHRpb25zLmVudmlyb25tZW50ID09PSB1bmRlZmluZWRcbiAgICA/IHVuZGVmaW5lZFxuICAgIDogc25hcHNob3RFbnZpcm9ubWVudChvcHRpb25zLmVudmlyb25tZW50LCBpZClcbiAgY29uc3QgZW52aXJvbm1lbnQgPSBjb25maWd1cmF0aW9uRW52aXJvbm1lbnQgPz8gZGVmYXVsdEVudmlyb25tZW50KClcbiAgY29uc3QgY29uZmlndXJlZCA9IG9wdGlvbnMub3ZlcnJpZGUgPT09IHVuZGVmaW5lZFxuICAgID8gY29uZmlndXJhdGlvbkVudmlyb25tZW50ID09PSB1bmRlZmluZWRcbiAgICAgID8gcHJvY2Vzcy5lbnZbZGVmaW5pdGlvbi5vdmVycmlkZUVudmlyb25tZW50VmFyaWFibGVdXG4gICAgICA6IGNvbmZpZ3VyYXRpb25FbnZpcm9ubWVudFtkZWZpbml0aW9uLm92ZXJyaWRlRW52aXJvbm1lbnRWYXJpYWJsZV1cbiAgICA6IG9wdGlvbnMub3ZlcnJpZGVcblxuICByZXR1cm4gZGlzY292ZXJUb29sY2hhaW4oe1xuICAgIGNhbm9uaWNhbENvbW1hbmQ6IGRlZmluaXRpb24uY2Fub25pY2FsQ29tbWFuZCxcbiAgICBlbnZpcm9ubWVudCxcbiAgICBpZCxcbiAgICBvdmVycmlkZTogY29uZmlndXJlZCxcbiAgICBzdXBwb3J0ZWRWZXJzaW9uOiBkZWZpbml0aW9uLnN1cHBvcnRlZFZlcnNpb24sXG4gICAgdGltZW91dE1zOiBvcHRpb25zLnRpbWVvdXRNcyxcbiAgICB2ZXJzaW9uQXJndW1lbnRzOiBkZWZpbml0aW9uLnZlcnNpb25Bcmd1bWVudHNcbiAgfSlcbn1cblxuLyoqXG4gKiBSZXNvbHZlcyBhbmQgdmVyc2lvbnMgb25lIGNvbmZpZ3VyZWQgb3IgY2Fub25pY2FsIGV4ZWN1dGFibGUgd2l0aG91dCBpbnZva2luZyBhIHNoZWxsLlxuICogQHBhcmFtIHtvYmplY3R9IGlucHV0IC0gRGlzY292ZXJ5IHJlcXVlc3QuXG4gKiBAcGFyYW0ge3N0cmluZ30gaW5wdXQuY2Fub25pY2FsQ29tbWFuZCAtIENhbm9uaWNhbCBQQVRIIGNvbW1hbmQuXG4gKiBAcGFyYW0ge1JlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4+fSBbaW5wdXQuZW52aXJvbm1lbnRdIC0gRXhwbGljaXQgZGlzY292ZXJ5IGVudmlyb25tZW50LlxuICogQHBhcmFtIHtzdHJpbmd9IGlucHV0LmlkIC0gVG9vbGNoYWluIElELlxuICogQHBhcmFtIHtzdHJpbmd9IFtpbnB1dC5vdmVycmlkZV0gLSBDb25maWd1cmVkIGFic29sdXRlIGV4ZWN1dGFibGUgcGF0aC5cbiAqIEBwYXJhbSB7UmVnRXhwfSBbaW5wdXQuc3VwcG9ydGVkVmVyc2lvbl0gLSBGdWxsIHNlbGVjdGVkLXN0cmVhbSB2ZXJzaW9uIHBvbGljeS5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbaW5wdXQudGltZW91dE1zXSAtIFZlcnNpb24gY29tbWFuZCB0aW1lb3V0LlxuICogQHBhcmFtIHtzdHJpbmdbXX0gaW5wdXQudmVyc2lvbkFyZ3VtZW50cyAtIEV4YWN0IHZlcnNpb24gYXJndW1lbnQgYXJyYXkuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLkRpc2NvdmVyZWRUb29sY2hhaW4+fSBEaXNjb3ZlcmVkIHRvb2wuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkaXNjb3ZlclRvb2xjaGFpbihpbnB1dCkge1xuICBpZiAoIWlzUGxhaW5PYmplY3QoaW5wdXQpKSBpbnZhbGlkVG9vbGNoYWluKFwiVG9vbGNoYWluIGRpc2NvdmVyeSByZXF1aXJlcyBhIHJlcXVlc3Qgb2JqZWN0LlwiLCBcInRvb2xjaGFpblwiKVxuICBjb25zdCB2ZXJzaW9uQXJndW1lbnRDYW5kaWRhdGUgPSBpbnB1dC52ZXJzaW9uQXJndW1lbnRzXG4gIGNvbnN0IHZlcnNpb25Bcmd1bWVudHMgPSBpc0RlbnNlQXJyYXkodmVyc2lvbkFyZ3VtZW50Q2FuZGlkYXRlKSA/IFsuLi52ZXJzaW9uQXJndW1lbnRDYW5kaWRhdGVdIDogdW5kZWZpbmVkXG4gIGNvbnN0IGNhbmRpZGF0ZSA9IHtcbiAgICBjYW5vbmljYWxDb21tYW5kOiBpbnB1dC5jYW5vbmljYWxDb21tYW5kLFxuICAgIGVudmlyb25tZW50OiBpbnB1dC5lbnZpcm9ubWVudCA9PT0gdW5kZWZpbmVkID8gZGVmYXVsdEVudmlyb25tZW50KCkgOiBpbnB1dC5lbnZpcm9ubWVudCxcbiAgICBpZDogaW5wdXQuaWQsXG4gICAgb3ZlcnJpZGU6IGlucHV0Lm92ZXJyaWRlLFxuICAgIHN1cHBvcnRlZFZlcnNpb246IGlucHV0LnN1cHBvcnRlZFZlcnNpb24sXG4gICAgdGltZW91dE1zOiBpbnB1dC50aW1lb3V0TXMgPT09IHVuZGVmaW5lZCA/IGRlZmF1bHRUaW1lb3V0TXMgOiBpbnB1dC50aW1lb3V0TXMsXG4gICAgdmVyc2lvbkFyZ3VtZW50c1xuICB9XG5cbiAgdmFsaWRhdGVEaXNjb3ZlcnkoY2FuZGlkYXRlKVxuICBjb25zdCBjYW5vbmljYWxDb21tYW5kID0gLyoqIEB0eXBlIHtzdHJpbmd9ICovIChjYW5kaWRhdGUuY2Fub25pY2FsQ29tbWFuZClcbiAgY29uc3QgZW52aXJvbm1lbnQgPSAvKiogQHR5cGUge1JlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4+fSAqLyAoY2FuZGlkYXRlLmVudmlyb25tZW50KVxuICBjb25zdCBpZCA9IC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAoY2FuZGlkYXRlLmlkKVxuICBjb25zdCBvdmVycmlkZSA9IC8qKiBAdHlwZSB7c3RyaW5nIHwgdW5kZWZpbmVkfSAqLyAoY2FuZGlkYXRlLm92ZXJyaWRlKVxuICBjb25zdCBzdXBwb3J0ZWRWZXJzaW9uID0gY2FuZGlkYXRlLnN1cHBvcnRlZFZlcnNpb24gaW5zdGFuY2VvZiBSZWdFeHBcbiAgICA/IG5ldyBSZWdFeHAoY2FuZGlkYXRlLnN1cHBvcnRlZFZlcnNpb24uc291cmNlLCBjYW5kaWRhdGUuc3VwcG9ydGVkVmVyc2lvbi5mbGFncylcbiAgICA6IHVuZGVmaW5lZFxuICBjb25zdCB0aW1lb3V0TXMgPSAvKiogQHR5cGUge251bWJlcn0gKi8gKGNhbmRpZGF0ZS50aW1lb3V0TXMpXG4gIGNvbnN0IHZhbGlkYXRlZFZlcnNpb25Bcmd1bWVudHMgPSAvKiogQHR5cGUge3N0cmluZ1tdfSAqLyAoY2FuZGlkYXRlLnZlcnNpb25Bcmd1bWVudHMpXG4gIGNvbnN0IG5vcm1hbGl6ZWRFbnZpcm9ubWVudCA9IGRldGVybWluaXN0aWNFbnZpcm9ubWVudChlbnZpcm9ubWVudClcbiAgY29uc3Qge2V4ZWN1dGFibGUsIHNvdXJjZX0gPSBvdmVycmlkZSA9PT0gdW5kZWZpbmVkXG4gICAgPyBhd2FpdCByZXNvbHZlQ2Fub25pY2FsKGlkLCBjYW5vbmljYWxDb21tYW5kLCBub3JtYWxpemVkRW52aXJvbm1lbnQuUEFUSCA/PyBcIlwiKVxuICAgIDoge2V4ZWN1dGFibGU6IGF3YWl0IHJlc29sdmVPdmVycmlkZShpZCwgb3ZlcnJpZGUsIGNhbm9uaWNhbENvbW1hbmQpLCBzb3VyY2U6IC8qKiBAdHlwZSB7Y29uc3R9ICovIChcIm92ZXJyaWRlXCIpfVxuICAvKiogQHR5cGUge3tzdGRvdXQ6IHN0cmluZywgc3RkZXJyOiBzdHJpbmd9fSAqL1xuICBsZXQgcmVzdWx0XG5cbiAgdHJ5IHtcbiAgICByZXN1bHQgPSBhd2FpdCBleGVjdXRlRmlsZVdpdGhEZWFkbGluZSh7XG4gICAgICBhcmd1bWVudHM6IHZhbGlkYXRlZFZlcnNpb25Bcmd1bWVudHMsXG4gICAgICBlbnZpcm9ubWVudDogbm9ybWFsaXplZEVudmlyb25tZW50LFxuICAgICAgZXhlY3V0YWJsZSxcbiAgICAgIG1heEJ1ZmZlcjogMTAyNCAqIDEwMjQsXG4gICAgICB0aW1lb3V0TXNcbiAgICB9KVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnN0IHByb2Nlc3NFcnJvciA9IHByb2Nlc3NFcnJvckZpZWxkcyhlcnJvcilcbiAgICBjb25zdCB0aW1lZE91dCA9IGV4Y2VlZGVkT3duZWREZWFkbGluZShlcnJvcilcblxuICAgIHRocm93IG5ldyBTZW1hbnRpZm9sZERpYWdub3N0aWMoe1xuICAgICAgLi4ucHJvY2Vzc0Vycm9yLFxuICAgICAgY2F1c2U6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvciA6IHVuZGVmaW5lZCxcbiAgICAgIGNvZGU6IHRpbWVkT3V0ID8gXCJUT09MX1ZFUlNJT05fVElNRU9VVFwiIDogXCJUT09MX1ZFUlNJT05fRkFJTFVSRVwiLFxuICAgICAgY29tbWFuZDogY2Fub25pY2FsQ29tbWFuZCxcbiAgICAgIGV4ZWN1dGFibGUsXG4gICAgICBsYW5ndWFnZTogaWQsXG4gICAgICBtZXNzYWdlOiB0aW1lZE91dFxuICAgICAgICA/IGBWZXJzaW9uIGNvbW1hbmQgZm9yICcke2V4ZWN1dGFibGV9JyBleGNlZWRlZCAke3RpbWVvdXRNc31tcy5gXG4gICAgICAgIDogYFZlcnNpb24gY29tbWFuZCBmb3IgJyR7ZXhlY3V0YWJsZX0nIGZhaWxlZC5gLFxuICAgICAgc3RkZXJyOiBwcm9jZXNzRXJyb3Iuc3RkZXJyLFxuICAgICAgc3Rkb3V0OiBwcm9jZXNzRXJyb3Iuc3Rkb3V0XG4gICAgfSlcbiAgfVxuXG4gIGNvbnN0IHtzdGRlcnIsIHN0ZG91dH0gPSByZXN1bHRcbiAgY29uc3Qgbm9ybWFsaXplZFN0ZG91dCA9IHN0ZG91dC50cmltKClcbiAgY29uc3Qgbm9ybWFsaXplZFN0ZGVyciA9IHN0ZGVyci50cmltKClcbiAgY29uc3QgdmVyc2lvbk91dHB1dCA9IG5vcm1hbGl6ZWRTdGRvdXQubGVuZ3RoID4gMCA/IG5vcm1hbGl6ZWRTdGRvdXQgOiBub3JtYWxpemVkU3RkZXJyXG4gIGNvbnN0IHZlcnNpb24gPSB2ZXJzaW9uT3V0cHV0LnNwbGl0KC9cXHI/XFxuL3UpWzBdID8/IFwiXCJcblxuICBpZiAodmVyc2lvbi5sZW5ndGggPT0gMCkge1xuICAgIHRocm93IG5ldyBTZW1hbnRpZm9sZERpYWdub3N0aWMoe1xuICAgICAgY29kZTogXCJUT09MX1ZFUlNJT05fRkFJTFVSRVwiLFxuICAgICAgY29tbWFuZDogY2Fub25pY2FsQ29tbWFuZCxcbiAgICAgIGV4ZWN1dGFibGUsXG4gICAgICBsYW5ndWFnZTogaWQsXG4gICAgICBtZXNzYWdlOiBgVmVyc2lvbiBjb21tYW5kIGZvciAnJHtleGVjdXRhYmxlfScgcmV0dXJuZWQgbm8gdmVyc2lvbiBvdXRwdXQuYCxcbiAgICAgIHN0ZGVycixcbiAgICAgIHN0ZG91dFxuICAgIH0pXG4gIH1cbiAgaWYgKHN1cHBvcnRlZFZlcnNpb24gJiYgIXN1cHBvcnRlZFZlcnNpb24udGVzdCh2ZXJzaW9uT3V0cHV0KSkge1xuICAgIHRocm93IG5ldyBTZW1hbnRpZm9sZERpYWdub3N0aWMoe1xuICAgICAgY29kZTogXCJUT09MX1VOU1VQUE9SVEVEX1ZFUlNJT05cIixcbiAgICAgIGNvbW1hbmQ6IGNhbm9uaWNhbENvbW1hbmQsXG4gICAgICBleGVjdXRhYmxlLFxuICAgICAgbGFuZ3VhZ2U6IGlkLFxuICAgICAgbWVzc2FnZTogYEV4ZWN1dGFibGUgJyR7ZXhlY3V0YWJsZX0nIHJlcG9ydGVkIHVuc3VwcG9ydGVkIHZlcnNpb24gJyR7dmVyc2lvbn0nLmAsXG4gICAgICBzdGRlcnIsXG4gICAgICBzdGRvdXQsXG4gICAgICB2ZXJzaW9uXG4gICAgfSlcbiAgfVxuXG4gIHJldHVybiBkZWVwRnJlZXplKHtcbiAgICBjb21tYW5kOiBjYW5vbmljYWxDb21tYW5kLFxuICAgIGV4ZWN1dGFibGUsXG4gICAgaWQsXG4gICAgc291cmNlLFxuICAgIHZlcnNpb24sXG4gICAgdmVyc2lvbkFyZ3VtZW50czogdmFsaWRhdGVkVmVyc2lvbkFyZ3VtZW50cyxcbiAgICB2ZXJzaW9uT3V0cHV0XG4gIH0pXG59XG5cbi8qKlxuICogQnVpbGRzIG9uZSBjYW5vbmljYWwgaW1tdXRhYmxlIHRvb2xjaGFpbiBkZWNsYXJhdGlvbi5cbiAqIEBwYXJhbSB7c3RyaW5nfSBjYW5vbmljYWxDb21tYW5kIC0gUEFUSCBjb21tYW5kLlxuICogQHBhcmFtIHtzdHJpbmd9IG92ZXJyaWRlRW52aXJvbm1lbnRWYXJpYWJsZSAtIENvbmZpZ3VyZWQgb3ZlcnJpZGUgdmFyaWFibGUuXG4gKiBAcGFyYW0ge3N0cmluZ1tdfSB2ZXJzaW9uQXJndW1lbnRzIC0gRXhhY3QgdmVyc2lvbiBhcmd1bWVudHMuXG4gKiBAcGFyYW0ge1JlZ0V4cH0gc3VwcG9ydGVkVmVyc2lvbiAtIFN1cHBvcnRlZCB2ZXJzaW9uIG91dHB1dC5cbiAqIEByZXR1cm5zIHt7Y2Fub25pY2FsQ29tbWFuZDogc3RyaW5nLCBvdmVycmlkZUVudmlyb25tZW50VmFyaWFibGU6IHN0cmluZywgc3VwcG9ydGVkVmVyc2lvbjogUmVnRXhwLCB2ZXJzaW9uQXJndW1lbnRzOiBzdHJpbmdbXX19IERlY2xhcmF0aW9uLlxuICovXG5mdW5jdGlvbiBkZWZpbml0aW9uKGNhbm9uaWNhbENvbW1hbmQsIG92ZXJyaWRlRW52aXJvbm1lbnRWYXJpYWJsZSwgdmVyc2lvbkFyZ3VtZW50cywgc3VwcG9ydGVkVmVyc2lvbikge1xuICByZXR1cm4ge2Nhbm9uaWNhbENvbW1hbmQsIG92ZXJyaWRlRW52aXJvbm1lbnRWYXJpYWJsZSwgc3VwcG9ydGVkVmVyc2lvbiwgdmVyc2lvbkFyZ3VtZW50c31cbn1cblxuLyoqXG4gKiBWYWxpZGF0ZXMgdG9vbCBkaXNjb3ZlcnkgYmVmb3JlIGZpbGVzeXN0ZW0gb3IgcHJvY2VzcyBhY2Nlc3MuXG4gKiBAcGFyYW0ge3tcbiAqICAgY2Fub25pY2FsQ29tbWFuZDogdW5rbm93bixcbiAqICAgZW52aXJvbm1lbnQ6IHVua25vd24sXG4gKiAgIGlkOiB1bmtub3duLFxuICogICBvdmVycmlkZTogdW5rbm93bixcbiAqICAgc3VwcG9ydGVkVmVyc2lvbjogdW5rbm93bixcbiAqICAgdGltZW91dE1zOiB1bmtub3duLFxuICogICB2ZXJzaW9uQXJndW1lbnRzOiB1bmtub3duXG4gKiB9fSBpbnB1dCAtIENhbmRpZGF0ZSBkaXNjb3ZlcnkgZmllbGRzLlxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlRGlzY292ZXJ5KGlucHV0KSB7XG4gIGlmICh0eXBlb2YgaW5wdXQuaWQgIT0gXCJzdHJpbmdcIiB8fCBpbnB1dC5pZC5sZW5ndGggPT0gMCB8fFxuICAgIHR5cGVvZiBpbnB1dC5jYW5vbmljYWxDb21tYW5kICE9IFwic3RyaW5nXCIgfHwgaW5wdXQuY2Fub25pY2FsQ29tbWFuZC5sZW5ndGggPT0gMCB8fFxuICAgIGlucHV0LmNhbm9uaWNhbENvbW1hbmQuaW5jbHVkZXMoXCIvXCIpIHx8IGlucHV0LmNhbm9uaWNhbENvbW1hbmQuaW5jbHVkZXMoXCJcXFxcXCIpIHx8IGlucHV0LmNhbm9uaWNhbENvbW1hbmQuaW5jbHVkZXMoXCJcXDBcIikgfHxcbiAgICAhaXNEZW5zZUFycmF5KGlucHV0LnZlcnNpb25Bcmd1bWVudHMpIHx8ICFpbnB1dC52ZXJzaW9uQXJndW1lbnRzLmV2ZXJ5KHZhbGlkQXJndW1lbnQpIHx8XG4gICAgIWlzRW52aXJvbm1lbnQoaW5wdXQuZW52aXJvbm1lbnQpIHx8ICFpc1N1cHBvcnRlZFRpbWVvdXRNcyhpbnB1dC50aW1lb3V0TXMpIHx8XG4gICAgKGlucHV0Lm92ZXJyaWRlICE9PSB1bmRlZmluZWQgJiYgKHR5cGVvZiBpbnB1dC5vdmVycmlkZSAhPSBcInN0cmluZ1wiIHx8ICFwYXRoLmlzQWJzb2x1dGUoaW5wdXQub3ZlcnJpZGUpIHx8IGlucHV0Lm92ZXJyaWRlLmluY2x1ZGVzKFwiXFwwXCIpKSkgfHxcbiAgICAoaW5wdXQuc3VwcG9ydGVkVmVyc2lvbiAhPT0gdW5kZWZpbmVkICYmICghKGlucHV0LnN1cHBvcnRlZFZlcnNpb24gaW5zdGFuY2VvZiBSZWdFeHApIHx8IGlucHV0LnN1cHBvcnRlZFZlcnNpb24uZ2xvYmFsIHx8IGlucHV0LnN1cHBvcnRlZFZlcnNpb24uc3RpY2t5KSkpIHtcbiAgICBpbnZhbGlkVG9vbGNoYWluKGBUb29sY2hhaW4gZGlzY292ZXJ5IHJlcXVpcmVzIGEgY2Fub25pY2FsIGJhc2VuYW1lLCBhYnNvbHV0ZSBvdmVycmlkZSwgYXJndW1lbnQgYXJyYXksIGVudmlyb25tZW50LCBhbmQgdGltZW91dCBmcm9tIDEgdGhyb3VnaCAke21heGltdW1UaW1lb3V0TXN9bXMuYCxcbiAgICAgIHR5cGVvZiBpbnB1dC5pZCA9PSBcInN0cmluZ1wiID8gaW5wdXQuaWQgOiBcInRvb2xjaGFpblwiKVxuICB9XG59XG5cbi8qKlxuICogUmVzb2x2ZXMgb25lIHVuYW1iaWd1b3VzIGNhbm9uaWNhbCBjb21tYW5kIGZyb20gYW4gZXhwbGljaXQgUEFUSC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBpZCAtIFRvb2xjaGFpbiBJRC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBjb21tYW5kIC0gQ2Fub25pY2FsIGNvbW1hbmQuXG4gKiBAcGFyYW0ge3N0cmluZ30gcGF0aFZhbHVlIC0gRXhwbGljaXQgUEFUSC5cbiAqIEByZXR1cm5zIHtQcm9taXNlPHtleGVjdXRhYmxlOiBzdHJpbmcsIHNvdXJjZTogXCJjYW5vbmljYWxcIn0+fSBFeGFjdCBleGVjdXRhYmxlLlxuICovXG5hc3luYyBmdW5jdGlvbiByZXNvbHZlQ2Fub25pY2FsKGlkLCBjb21tYW5kLCBwYXRoVmFsdWUpIHtcbiAgY29uc3QgbWF0Y2hlcyA9IG5ldyBNYXAoKVxuXG4gIGZvciAoY29uc3QgZGlyZWN0b3J5IG9mIHBhdGhWYWx1ZS5zcGxpdChwYXRoLmRlbGltaXRlcikpIHtcbiAgICBpZiAoZGlyZWN0b3J5Lmxlbmd0aCA9PSAwIHx8ICFwYXRoLmlzQWJzb2x1dGUoZGlyZWN0b3J5KSkgY29udGludWVcbiAgICBjb25zdCBjYW5kaWRhdGUgPSBwYXRoLmpvaW4oZGlyZWN0b3J5LCBjb21tYW5kKVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGV4YWN0ID0gYXdhaXQgcmVzb2x2ZUV4ZWN1dGFibGVGaWxlKGNhbmRpZGF0ZSlcblxuICAgICAgaWYgKGV4YWN0ICE9IHVuZGVmaW5lZCkgbWF0Y2hlcy5zZXQoZXhhY3QsIGV4YWN0KVxuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gQSBQQVRIIGNhbmRpZGF0ZSBpcyBhYnNlbnQgb3Igbm9uLWV4ZWN1dGFibGU7IGRpc2NvdmVyeSBjb250aW51ZXMgZGV0ZXJtaW5pc3RpY2FsbHkuXG4gICAgfVxuICB9XG5cbiAgaWYgKG1hdGNoZXMuc2l6ZSA9PSAwKSB7XG4gICAgdGhyb3cgbmV3IFNlbWFudGlmb2xkRGlhZ25vc3RpYyh7XG4gICAgICBjb2RlOiBcIlRPT0xfTk9UX0ZPVU5EXCIsXG4gICAgICBjb21tYW5kLFxuICAgICAgbGFuZ3VhZ2U6IGlkLFxuICAgICAgbWVzc2FnZTogYENhbm9uaWNhbCBjb21tYW5kICcke2NvbW1hbmR9JyB3YXMgbm90IGZvdW5kIGFzIGFuIGV4ZWN1dGFibGUgb24gUEFUSC5gXG4gICAgfSlcbiAgfVxuICBpZiAobWF0Y2hlcy5zaXplID4gMSkge1xuICAgIHRocm93IG5ldyBTZW1hbnRpZm9sZERpYWdub3N0aWMoe1xuICAgICAgY29kZTogXCJUT09MX0FNQklHVU9VU1wiLFxuICAgICAgY29tbWFuZCxcbiAgICAgIGxhbmd1YWdlOiBpZCxcbiAgICAgIG1lc3NhZ2U6IGBDYW5vbmljYWwgY29tbWFuZCAnJHtjb21tYW5kfScgcmVzb2x2ZXMgdG8gbXVsdGlwbGUgZXhlY3V0YWJsZXM6ICR7Wy4uLm1hdGNoZXMua2V5cygpXS5qb2luKFwiLCBcIil9LmBcbiAgICB9KVxuICB9XG5cbiAgcmV0dXJuIHtleGVjdXRhYmxlOiAvKiogQHR5cGUge3N0cmluZ30gKi8gKFsuLi5tYXRjaGVzLmtleXMoKV1bMF0pLCBzb3VyY2U6IC8qKiBAdHlwZSB7Y29uc3R9ICovIChcImNhbm9uaWNhbFwiKX1cbn1cblxuLyoqXG4gKiBSZXNvbHZlcyBvbmUgY29uZmlndXJlZCBhYnNvbHV0ZSBleGVjdXRhYmxlLlxuICogQHBhcmFtIHtzdHJpbmd9IGlkIC0gVG9vbGNoYWluIElELlxuICogQHBhcmFtIHtzdHJpbmd9IG92ZXJyaWRlIC0gQWJzb2x1dGUgb3ZlcnJpZGUuXG4gKiBAcGFyYW0ge3N0cmluZ30gY29tbWFuZCAtIENhbm9uaWNhbCBjb21tYW5kLlxuICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nPn0gRXhhY3QgZXhlY3V0YWJsZSBwYXRoLlxuICovXG5hc3luYyBmdW5jdGlvbiByZXNvbHZlT3ZlcnJpZGUoaWQsIG92ZXJyaWRlLCBjb21tYW5kKSB7XG4gIC8qKiBAdHlwZSB7RXJyb3IgfCB1bmRlZmluZWR9ICovXG4gIGxldCBjYXVzZVxuXG4gIHRyeSB7XG4gICAgY29uc3QgZXhhY3QgPSBhd2FpdCByZXNvbHZlRXhlY3V0YWJsZUZpbGUob3ZlcnJpZGUpXG5cbiAgICBpZiAoZXhhY3QgIT0gdW5kZWZpbmVkKSByZXR1cm4gZXhhY3RcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjYXVzZSA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvciA6IHVuZGVmaW5lZFxuICB9XG5cbiAgdGhyb3cgbmV3IFNlbWFudGlmb2xkRGlhZ25vc3RpYyh7XG4gICAgY2F1c2UsXG4gICAgY29kZTogXCJUT09MX05PVF9GT1VORFwiLFxuICAgIGNvbW1hbmQsXG4gICAgZXhlY3V0YWJsZTogb3ZlcnJpZGUsXG4gICAgbGFuZ3VhZ2U6IGlkLFxuICAgIG1lc3NhZ2U6IGBDb25maWd1cmVkIGV4ZWN1dGFibGUgJyR7b3ZlcnJpZGV9JyBpcyBtaXNzaW5nIG9yIG5vdCBleGVjdXRhYmxlLmBcbiAgfSlcbn1cblxuLyoqXG4gKiBSZXNvbHZlcyBvbmUgY2FuZGlkYXRlIHRvIGFuIGV4ZWN1dGFibGUgcmVndWxhciBmaWxlLlxuICogQHBhcmFtIHtzdHJpbmd9IGNhbmRpZGF0ZSAtIENhbmRpZGF0ZSBwYXRoLlxuICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPn0gRXhhY3QgcmVndWxhciBleGVjdXRhYmxlLCBpZiB0aGUgZmlsZSB0eXBlIGlzIHZhbGlkLlxuICovXG5hc3luYyBmdW5jdGlvbiByZXNvbHZlRXhlY3V0YWJsZUZpbGUoY2FuZGlkYXRlKSB7XG4gIGNvbnN0IGV4YWN0ID0gYXdhaXQgcmVhbHBhdGgoY2FuZGlkYXRlKVxuICBjb25zdCBzdGF0dXMgPSBhd2FpdCBzdGF0KGV4YWN0KVxuXG4gIGlmICghc3RhdHVzLmlzRmlsZSgpKSByZXR1cm4gdW5kZWZpbmVkXG4gIGF3YWl0IGFjY2VzcyhleGFjdCwgZnNDb25zdGFudHMuWF9PSylcblxuICByZXR1cm4gZXhhY3Rcbn1cblxuLyoqXG4gKiBQcm9kdWNlcyB0aGUgbWluaW1hbCBkZXRlcm1pbmlzdGljIHByb2Nlc3MgZW52aXJvbm1lbnQuXG4gKiBAcGFyYW0ge1JlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4+fSBlbnZpcm9ubWVudCAtIEV4cGxpY2l0IGlucHV0cy5cbiAqIEByZXR1cm5zIHtSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+Pn0gTm9ybWFsaXplZCBlbnZpcm9ubWVudC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRldGVybWluaXN0aWNFbnZpcm9ubWVudChlbnZpcm9ubWVudCA9IGRlZmF1bHRFbnZpcm9ubWVudCgpKSB7XG4gIGNvbnN0IGVudHJpZXMgPSBlbnZpcm9ubWVudEVudHJpZXMoZW52aXJvbm1lbnQpXG5cbiAgaWYgKGVudHJpZXMgPT0gdW5kZWZpbmVkKSBpbnZhbGlkVG9vbGNoYWluKFwiUHJvY2VzcyBlbnZpcm9ubWVudCBtdXN0IGJlIGEgcGxhaW4gb3duLXByb3BlcnR5IGRhdGEgcmVjb3JkIG9mIHN0cmluZyBvciB1bmRlZmluZWQgdmFsdWVzLlwiLCBcImVudmlyb25tZW50XCIpXG4gIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgc3RyaW5nPn0gKi9cbiAgY29uc3Qgbm9ybWFsaXplZCA9IE9iamVjdC5jcmVhdGUobnVsbClcblxuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBlbnRyaWVzKSB7XG4gICAgaWYgKCEvXltBLVphLXpfXVtBLVphLXowLTlfXSokL3UudGVzdChrZXkpIHx8IGtleS5pbmNsdWRlcyhcIlxcMFwiKSB8fCAodmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZS5pbmNsdWRlcyhcIlxcMFwiKSkpIHtcbiAgICAgIGludmFsaWRUb29sY2hhaW4oXCJQcm9jZXNzIGVudmlyb25tZW50IGNvbnRhaW5zIGFuIGludmFsaWQga2V5IG9yIHZhbHVlLlwiLCBcImVudmlyb25tZW50XCIpXG4gICAgfVxuICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSBub3JtYWxpemVkW2tleV0gPSB2YWx1ZVxuICB9XG4gIG5vcm1hbGl6ZWQuTEFORyA9IFwiQy5VVEYtOFwiXG4gIG5vcm1hbGl6ZWQuTENfQUxMID0gXCJDLlVURi04XCJcbiAgbm9ybWFsaXplZC5UWiA9IFwiVVRDXCJcbiAgbm9ybWFsaXplZC5QQVRIID8/PSBcIi91c3IvbG9jYWwvYmluOi91c3IvYmluOi9iaW5cIlxuXG4gIHJldHVybiBPYmplY3QuZnJlZXplKG5vcm1hbGl6ZWQpXG59XG5cbi8qKlxuICogUmV0YWlucyBvbmx5IGV4ZWN1dGFibGUgbG9va3VwIGZyb20gdGhlIGFtYmllbnQgZW52aXJvbm1lbnQuXG4gKiBAcmV0dXJucyB7UmVhZG9ubHk8UmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPj59IE1pbmltYWwgZGVmYXVsdCBlbnZpcm9ubWVudC5cbiAqL1xuZnVuY3Rpb24gZGVmYXVsdEVudmlyb25tZW50KCkge1xuICByZXR1cm4ge1BBVEg6IHByb2Nlc3MuZW52LlBBVEh9XG59XG5cbi8qKlxuICogTmFycm93cyBzdGFibGUgZmllbGRzIGZyb20gYSB2ZXJzaW9uIHN1YnByb2Nlc3MgcmVqZWN0aW9uLlxuICogQHBhcmFtIHt1bmtub3dufSBlcnJvciAtIFByb2Nlc3MgcmVqZWN0aW9uLlxuICogQHJldHVybnMge3tleGl0Q29kZTogbnVtYmVyIHwgdW5kZWZpbmVkLCBzaWduYWw6IHN0cmluZyB8IHVuZGVmaW5lZCwgc3RkZXJyOiBzdHJpbmcsIHN0ZG91dDogc3RyaW5nfX0gU3RhYmxlIGZpZWxkcy5cbiAqL1xuZnVuY3Rpb24gcHJvY2Vzc0Vycm9yRmllbGRzKGVycm9yKSB7XG4gIGlmICghZXJyb3IgfHwgdHlwZW9mIGVycm9yICE9IFwib2JqZWN0XCIpIHJldHVybiB7ZXhpdENvZGU6IHVuZGVmaW5lZCwgc2lnbmFsOiB1bmRlZmluZWQsIHN0ZGVycjogXCJcIiwgc3Rkb3V0OiBcIlwifVxuICBjb25zdCB2YWx1ZSA9IC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgdW5rbm93bj59ICovIChlcnJvcilcblxuICByZXR1cm4ge1xuICAgIGV4aXRDb2RlOiB0eXBlb2YgdmFsdWUuY29kZSA9PSBcIm51bWJlclwiID8gdmFsdWUuY29kZSA6IHVuZGVmaW5lZCxcbiAgICBzaWduYWw6IHR5cGVvZiB2YWx1ZS5zaWduYWwgPT0gXCJzdHJpbmdcIiA/IHZhbHVlLnNpZ25hbCA6IHVuZGVmaW5lZCxcbiAgICBzdGRlcnI6IHR5cGVvZiB2YWx1ZS5zdGRlcnIgPT0gXCJzdHJpbmdcIiA/IHZhbHVlLnN0ZGVyciA6IFwiXCIsXG4gICAgc3Rkb3V0OiB0eXBlb2YgdmFsdWUuc3Rkb3V0ID09IFwic3RyaW5nXCIgPyB2YWx1ZS5zdGRvdXQgOiBcIlwiXG4gIH1cbn1cblxuLyoqXG4gKiBDaGVja3Mgb25lIHNoZWxsLWZyZWUgYXJndW1lbnQuXG4gKiBAcGFyYW0ge3Vua25vd259IHZhbHVlIC0gQ2FuZGlkYXRlIGFyZ3VtZW50LlxuICogQHJldHVybnMge3ZhbHVlIGlzIHN0cmluZ30gV2hldGhlciB0aGUgYXJndW1lbnQgaXMgc2FmZSB0byBwYXNzIGRpcmVjdGx5LlxuICovXG5mdW5jdGlvbiB2YWxpZEFyZ3VtZW50KHZhbHVlKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gXCJzdHJpbmdcIiAmJiAhdmFsdWUuaW5jbHVkZXMoXCJcXDBcIilcbn1cblxuLyoqXG4gKiBDaGVja3MgZXhwbGljaXQgcHJvY2Vzcy1lbnZpcm9ubWVudCB2YWx1ZXMuXG4gKiBAcGFyYW0ge3Vua25vd259IHZhbHVlIC0gQ2FuZGlkYXRlIGVudmlyb25tZW50LlxuICogQHJldHVybnMge3ZhbHVlIGlzIFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4+fSBXaGV0aGVyIGVudHJpZXMgYXJlIHN0cmluZ3Mgb3IgdW5kZWZpbmVkLlxuICovXG5mdW5jdGlvbiBpc0Vudmlyb25tZW50KHZhbHVlKSB7XG4gIHJldHVybiBlbnZpcm9ubWVudEVudHJpZXModmFsdWUpICE9IHVuZGVmaW5lZFxufVxuXG4vKipcbiAqIERldGFjaGVzIGFuIGV4cGxpY2l0IGVudmlyb25tZW50IGJlZm9yZSBjYW5vbmljYWwgb3ZlcnJpZGUgbG9va3VwIGNhbiB5aWVsZC5cbiAqIEBwYXJhbSB7dW5rbm93bn0gdmFsdWUgLSBDYW5kaWRhdGUgZW52aXJvbm1lbnQgcmVjb3JkLlxuICogQHBhcmFtIHtzdHJpbmd9IGlkIC0gVG9vbGNoYWluIGlkZW50aXR5LlxuICogQHJldHVybnMge1JlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4+fSBPd25lZCBlbnZpcm9ubWVudCBkYXRhLlxuICovXG5mdW5jdGlvbiBzbmFwc2hvdEVudmlyb25tZW50KHZhbHVlLCBpZCkge1xuICBjb25zdCBlbnRyaWVzID0gZW52aXJvbm1lbnRFbnRyaWVzKHZhbHVlKVxuXG4gIGlmIChlbnRyaWVzID09IHVuZGVmaW5lZCkge1xuICAgIGludmFsaWRUb29sY2hhaW4oXCJDYW5vbmljYWwgdG9vbGNoYWluIGVudmlyb25tZW50IG11c3QgYmUgYSBwbGFpbiBvd24tcHJvcGVydHkgZGF0YSByZWNvcmQgb2Ygc3RyaW5nIG9yIHVuZGVmaW5lZCB2YWx1ZXMuXCIsIGlkKVxuICB9XG4gIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPn0gKi9cbiAgY29uc3Qgc25hcHNob3QgPSBPYmplY3QuY3JlYXRlKG51bGwpXG5cbiAgZm9yIChjb25zdCBba2V5LCBlbnRyeV0gb2YgZW50cmllcykgc25hcHNob3Rba2V5XSA9IGVudHJ5XG5cbiAgcmV0dXJuIE9iamVjdC5mcmVlemUoc25hcHNob3QpXG59XG5cbi8qKlxuICogUmVhZHMgb25seSBlbnVtZXJhYmxlIG93biBkYXRhIHByb3BlcnRpZXMgZnJvbSBhbiBvcmRpbmFyeSBvciBudWxsLXByb3RvdHlwZSByZWNvcmQuXG4gKiBAcGFyYW0ge3Vua25vd259IHZhbHVlIC0gQ2FuZGlkYXRlIGVudmlyb25tZW50IHJlY29yZC5cbiAqIEByZXR1cm5zIHtbc3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWRdW10gfCB1bmRlZmluZWR9IERldGFjaGVkIGVudHJpZXMgd2hlbiB2YWxpZC5cbiAqL1xuZnVuY3Rpb24gZW52aXJvbm1lbnRFbnRyaWVzKHZhbHVlKSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT0gXCJvYmplY3RcIiB8fCB2YWx1ZSA9PSBudWxsIHx8IEFycmF5LmlzQXJyYXkodmFsdWUpKSByZXR1cm4gdW5kZWZpbmVkXG5cbiAgdHJ5IHtcbiAgICBjb25zdCBwcm90b3R5cGUgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YodmFsdWUpXG5cbiAgICBpZiAocHJvdG90eXBlICE9PSBPYmplY3QucHJvdG90eXBlICYmIHByb3RvdHlwZSAhPT0gbnVsbCkgcmV0dXJuIHVuZGVmaW5lZFxuICAgIC8qKiBAdHlwZSB7W3N0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkXVtdfSAqL1xuICAgIGNvbnN0IGVudHJpZXMgPSBbXVxuXG4gICAgZm9yIChjb25zdCBrZXkgb2YgUmVmbGVjdC5vd25LZXlzKHZhbHVlKSkge1xuICAgICAgaWYgKHR5cGVvZiBrZXkgIT0gXCJzdHJpbmdcIikgcmV0dXJuIHVuZGVmaW5lZFxuICAgICAgY29uc3QgZGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodmFsdWUsIGtleSlcblxuICAgICAgaWYgKGRlc2NyaXB0b3IgPT0gdW5kZWZpbmVkIHx8ICFkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgIShcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgfHxcbiAgICAgICAgKGRlc2NyaXB0b3IudmFsdWUgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgZGVzY3JpcHRvci52YWx1ZSAhPSBcInN0cmluZ1wiKSkgcmV0dXJuIHVuZGVmaW5lZFxuICAgICAgZW50cmllcy5wdXNoKFtrZXksIGRlc2NyaXB0b3IudmFsdWVdKVxuICAgIH1cblxuICAgIHJldHVybiBlbnRyaWVzXG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB1bmRlZmluZWRcbiAgfVxufVxuXG4vKipcbiAqIENoZWNrcyBmb3IgYW4gb3JkaW5hcnkgc3RyaW5nLWtleWVkIG9iamVjdC5cbiAqIEBwYXJhbSB7dW5rbm93bn0gdmFsdWUgLSBDYW5kaWRhdGUgdmFsdWUuXG4gKiBAcmV0dXJucyB7dmFsdWUgaXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj59IFdoZXRoZXIgdGhlIHZhbHVlIGlzIGEgcGxhaW4gb2JqZWN0LlxuICovXG5mdW5jdGlvbiBpc1BsYWluT2JqZWN0KHZhbHVlKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gXCJvYmplY3RcIiAmJiB2YWx1ZSAhPSBudWxsICYmICFBcnJheS5pc0FycmF5KHZhbHVlKSAmJiBPYmplY3QuZ2V0UHJvdG90eXBlT2YodmFsdWUpID09IE9iamVjdC5wcm90b3R5cGVcbn1cblxuLyoqXG4gKiBUaHJvd3MgYSBub3JtYWxpemVkIGRpc2NvdmVyeS1jb25maWd1cmF0aW9uIGRpYWdub3N0aWMuXG4gKiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZSAtIEZhaWx1cmUgZGV0YWlsLlxuICogQHBhcmFtIHtzdHJpbmd9IGlkIC0gVG9vbGNoYWluIGlkZW50aXR5LlxuICogQHJldHVybnMge25ldmVyfSBBbHdheXMgdGhyb3dzLlxuICovXG5mdW5jdGlvbiBpbnZhbGlkVG9vbGNoYWluKG1lc3NhZ2UsIGlkKSB7XG4gIHRocm93IG5ldyBTZW1hbnRpZm9sZERpYWdub3N0aWMoe2NvZGU6IFwiSU5WQUxJRF9UT09MQ0hBSU5cIiwgbGFuZ3VhZ2U6IGlkLCBtZXNzYWdlfSlcbn1cblxuLyoqXG4gKiBEZWVwbHkgZnJlZXplcyBjYW5vbmljYWwgZGVjbGFyYXRpb25zIGFuZCBkaXNjb3ZlcnkgcmVzdWx0cy5cbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge1R9IHZhbHVlIC0gVG9vbGNoYWluLW93bmVkIHZhbHVlLlxuICogQHJldHVybnMge1R9IEZyb3plbiB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gZGVlcEZyZWV6ZSh2YWx1ZSkge1xuICBpZiAoIXZhbHVlIHx8IHR5cGVvZiB2YWx1ZSAhPSBcIm9iamVjdFwiIHx8IE9iamVjdC5pc0Zyb3plbih2YWx1ZSkpIHJldHVybiB2YWx1ZVxuXG4gIGZvciAoY29uc3QgbmVzdGVkIG9mIE9iamVjdC52YWx1ZXModmFsdWUpKSBkZWVwRnJlZXplKG5lc3RlZClcblxuICByZXR1cm4gT2JqZWN0LmZyZWV6ZSh2YWx1ZSlcbn1cbiJdfQ==
|
package/docs/android.md
ADDED
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
# Android application target
|
|
2
|
+
|
|
3
|
+
Task 028 adds the target-only `android` application backend. It consumes a parsed semantic module or complete Task 010 program and returns an immutable `GeneratedArtifactSet`; it does not parse Android or Kotlin source, add Android nodes to semantic IR, discover source files, or expose a filesystem writer.
|
|
4
|
+
|
|
5
|
+
```js
|
|
6
|
+
const program = parseProgram({entryModule: "main", sources})
|
|
7
|
+
const project = generateProgramArtifactSet({
|
|
8
|
+
language: "android",
|
|
9
|
+
program,
|
|
10
|
+
role: "application"
|
|
11
|
+
})
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
Every path is below fixed root `generated/android-app`. The set contains pinned settings/root/app Gradle Kotlin scripts, `gradle.properties`, one allowlisted manifest, mapped per-module semantic Kotlin, a checked scalar/output runtime, one `Activity`, one native XML `TextView`, label/theme resources, paired legacy full-backup and Android 12+ data-extraction exclusion resources, one JUnit unit test, a platform-only instrumentation test, and `semantifold-project.json`. There is no Gradle wrapper JAR or distribution, SDK, Maven archive, APK, key, cache, or binary tool in the returned project.
|
|
15
|
+
|
|
16
|
+
## Application contract
|
|
17
|
+
|
|
18
|
+
Configuration is a closed plain record. Unknown keys and public filesystem controls such as `outputDirectory`, `overwrite`, `sourcePath`, `sdkPath`, or `keystore` fail with `INVALID_APPLICATION_INPUT` or `INVALID_APPLICATION_CONFIGURATION` before source rendering.
|
|
19
|
+
|
|
20
|
+
Defaults are:
|
|
21
|
+
|
|
22
|
+
| Field | Default / accepted baseline |
|
|
23
|
+
| --- | --- |
|
|
24
|
+
| `applicationId` | `dev.semantifold.generated` |
|
|
25
|
+
| `namespace` | application ID |
|
|
26
|
+
| `packageName` | namespace |
|
|
27
|
+
| `activityClassName` | `MainActivity` |
|
|
28
|
+
| `productName`, `displayName` | `Semantifold` |
|
|
29
|
+
| `minimumSdk`, `targetSdk`, `compileSdk` | `23`, `35`, `35` |
|
|
30
|
+
| `buildToolsVersion` | `35.0.0` |
|
|
31
|
+
| `versionCode`, `versionName` | `1`, `1.0.0` |
|
|
32
|
+
| `orientation`, `theme` | `unspecified`, `system` |
|
|
33
|
+
|
|
34
|
+
Application/package segments are lowercase Java/Kotlin identifiers and cannot be keywords. The activity is an ASCII upper-camel identifier and cannot shadow an unqualified symbol used by the generated Activity, unit test, or instrumentation scaffold. Labels are trimmed Unicode-scalar strings of at most 64 characters. SDK values are the qualified fixed matrix, version code is positive and Android-bounded, and version name is canonical. The permission allowlist is empty.
|
|
35
|
+
|
|
36
|
+
The manifest contains exactly one exported launcher activity and no permissions, services, receivers, providers, deep links, network/storage access, or background work. It keeps `android:allowBackup="false"`, points `android:fullBackupContent` to the owned `@xml/backup_rules` exclusions for API 23–30, and points `android:dataExtractionRules` to the owned `@xml/data_extraction_rules` cloud-backup/device-transfer exclusions for Android 12+. Both resources exclude every supported storage domain. The activity runs the semantic entry afresh and joins captured output with one LF between printed values. The sole native `TextView` has ID `semantifold_output` and is accessibility-important; its visible text is the accessibility-node text, so no redundant `contentDescription` is generated.
|
|
37
|
+
|
|
38
|
+
## Semantic and provenance boundary
|
|
39
|
+
|
|
40
|
+
The Android backend preflights the complete program using the independent Kotlin backend capability profile. It then emits application-owned namespaced Kotlin modules and threads one output sink through resolved calls. The sink is reset for every entry invocation. Kotlin identifiers, literals, operators, calls, functions, parameters, locals, and statements retain rich Task 015 mappings and Source Map v3 projections to all original source identities and filenames. Gradle, Android manifest, resource, activity, lifecycle, and test syntax remains synthetic or configuration-derived.
|
|
41
|
+
|
|
42
|
+
`SemantifoldAndroidProject` version 1 records exact normalized configuration, the ordered owned path set and hashes, excluded build/cache paths, input hashes, field-to-output ranges, semantic source/module/import/entry identities, synthetic scaffolding, and exact toolchain requirements. Caller resources and assets are detached before return. Binary inputs use full-content byte provenance.
|
|
43
|
+
|
|
44
|
+
Resources are opt-in closed records `{path, content, mediaType, sha256}`. Supported resource paths are `raw/<safe-name>` and PNG/WebP density drawables under `drawable-mdpi`, `drawable-hdpi`, `drawable-xhdpi`, `drawable-xxhdpi`, or `drawable-xxxhdpi`. Assets use safe portable relative paths below `app/src/main/assets`. Traversal, absolute/NUL/Unicode-ambiguous paths, unsupported qualifiers/types, checksum mismatches, generated-file conflicts, duplicate Android identifiers in one resource configuration, case-fold collisions, and file/directory-prefix collisions fail before any artifact set is returned.
|
|
45
|
+
|
|
46
|
+
Generation itself is byte-identical and has no filesystem state, so stale files cannot survive inside its returned ownership list. The repository-private acceptance helper writes only to a caller-created empty mode-0700 temporary directory, uses exclusive file creation, verifies every checksum, refuses symlink/non-empty roots, and is not exported or packed. It is not a durable materializer.
|
|
47
|
+
|
|
48
|
+
## Toolchain and offline acceptance
|
|
49
|
+
|
|
50
|
+
The qualified application lane is independent of the generic Kotlin/JVM compiler lane:
|
|
51
|
+
|
|
52
|
+
- Gradle `8.13`, distribution SHA-256 `20f1b1176237254a6fc204d8434196fa11a4cfb387567519c61556e8710aed78`
|
|
53
|
+
- Android Gradle Plugin `8.11.1`
|
|
54
|
+
- Kotlin Gradle plugin and command-line compiler `2.2.10`, compiler ZIP SHA-256 `302d1d8e671e5c3207e6ed62ff11fb555462a628e22a1158254dcaaf7e7394bc`
|
|
55
|
+
- Eclipse Temurin JDK `21.0.8+9`, archive SHA-256 `f2dc5418092c43003db8f9005c4a286e1c0104fea96ccdd49e8ebd037cac9219`
|
|
56
|
+
- command-line tools build `11076708`, archive SHA-256 `2d2d50857e4eb553af5a6dc3ad507a17adf43d115264b1afc116f95c92e5e258`
|
|
57
|
+
- platform/target API `35`, Build Tools `35.0.0`
|
|
58
|
+
- emulator `35.6.11` build `13610412` and `system-images;android-35;google_apis;x86_64` revision `9`
|
|
59
|
+
|
|
60
|
+
API 35 and Build Tools 35.0.0 are owner-pinned acceptance boundaries rather than ambient latest-version choices. Generated lint keeps warnings as errors and aborts on findings, while disabling only `MissingApplicationIcon` for the deliberately icon-free baseline, `OldTargetApi` for the conflicting moving-latest-target recommendation, and `GradleDependency` for moving compile-SDK and Build-Tools version advice that conflicts with that pinned matrix.
|
|
61
|
+
|
|
62
|
+
Every Android SDK payload is a direct immutable official archive verified before extraction; no mutable package channel participates:
|
|
63
|
+
|
|
64
|
+
| SDK input | Exact archive | SHA-256 |
|
|
65
|
+
| --- | --- | --- |
|
|
66
|
+
| command-line tools | `commandlinetools-linux-11076708_latest.zip` | `2d2d50857e4eb553af5a6dc3ad507a17adf43d115264b1afc116f95c92e5e258` |
|
|
67
|
+
| platform-tools 37.0.1 | `platform-tools_r37.0.1-linux.zip` | `d230f13842f60f782a8645f9c813f8f845bf36089ea7289f28c48f17979313f1` |
|
|
68
|
+
| Android Platform 35 revision 2 | `platform-35_r02.zip` | `0988cacad01b38a18a47bac14a0695f246bc76c1b06c0eeb8eb0dc825ab0c8e0` |
|
|
69
|
+
| Build Tools 35.0.0 | `build-tools_r35_linux.zip` | `bd3a4966912eb8b30ed0d00b0cda6b6543b949d5ffe00bea54c04c81e1561d88` |
|
|
70
|
+
| Emulator 35.6.11 build 13610412 | `emulator-linux_x64-13610412.zip` | `2fe2b56fe93ce75e1d478a40162131381d911c355efeaedb54dd1e0d0897a5cf` |
|
|
71
|
+
| Google APIs x86_64 API-35 revision 9 | `x86_64-35_r09.zip` | `c67b9ba0ff5bc0eb6d046871bfa228af14d4d47b02f0cdae94f048e511b7566e` |
|
|
72
|
+
|
|
73
|
+
The Android repository archives above come from Google's official [`repository2-3.xml`](https://dl.google.com/android/repository/repository2-3.xml) and [`sys-img2-3.xml`](https://dl.google.com/android/repository/sys-img/google_apis/sys-img2-3.xml) package metadata; the emulator build and published SHA-256 come from the official [Android Emulator download archive](https://developer.android.com/studio/emulator_archive). `scripts/bootstrap-android.sh` is the only online preparation stage. It verifies immutable archives, installs them directly, registers the archived emulator through a checked-in exact local-package descriptor, verifies their embedded exact revision metadata, creates the named API-35 AVD, and warms the fixed Gradle cache with a disposable project. `scripts/accept-android.sh` generates a fresh project, creates its ephemeral debug key only inside the private acceptance root, and runs lint, JUnit, debug application assembly, and instrumentation assembly with Gradle `--offline` plus pinned UTF-8, English, UTC, heap, no-daemon, no-parallel, no-build-cache settings. Missing tools, package revisions, or cache content fail with `SEMANTIFOLD_ANDROID_INFRASTRUCTURE` rather than skipping.
|
|
74
|
+
|
|
75
|
+
The only declared Gradle library dependencies are exact non-transitive `testImplementation("junit:junit:4.13.2")` and `testRuntimeOnly("org.hamcrest:hamcrest-core:1.3")`. Hamcrest Core supplies the `org.hamcrest.SelfDescribing` linkage that JUnit's Gradle runner loads before generated test code; it does not enter application compilation or runtime. The generated unit test uses only JUnit's `@Test` annotation, compares the platform list directly, and raises a platform `AssertionError`. Kotlin's implicit stdlib dependency is disabled. Compilation reads the checksum-pinned compiler distribution's `kotlin-stdlib.jar` directly as a compiler task input, not as a Gradle dependency; generated bytecode uses JVM/Android platform facilities and the file is never placed on a runtime configuration or packaging input. Acceptance requires an empty debug runtime dependency graph, exactly JUnit and Hamcrest Core in the unit-test runtime graph, and no JUnit, Hamcrest, `kotlin/jvm/internal`, or `kotlin/collections` payload in the application APK.
|
|
76
|
+
|
|
77
|
+
Real emulator acceptance runs only in TensorBuzz with `/dev/kvm:/dev/kvm`. It fails before startup unless `/dev/kvm` is usable and `emulator -accel-check` affirms acceleration, exclusively locks fixed `emulator-5580` plus its private adb server on port `5581`, never invokes `adb root` or changes KVM permissions, boots with `-accel on -wipe-data -no-snapshot`, installs both APKs, launches the app, and invokes the runner through the explicit `<applicationId>.test` test application ID. Exact UTF-8 output is passed as base64 to platform instrumentation. The test checks the native labelled view, exact text, visibility, class, accessibility importance, absent content description, and activity recreation. CI then stops that emulator, boots a second fresh emulator, reinstalls/relaunches, and repeats. Screenshots/UI XML are always produced; failure also records logcat, adb state, emulator command line, and an exact reason.
|
|
78
|
+
|
|
79
|
+
Local environments without KVM do not attempt software emulation. Release signing, physical devices, accounts, Play Console, publication, Compose, fragments/navigation, WebView, platform channels, NDK/JNI, reflection, permissions, services, storage/networking, and background behavior are outside Task 028.
|
package/docs/architecture.md
CHANGED
|
@@ -4,21 +4,35 @@ Semantifold has three explicit layers.
|
|
|
4
4
|
|
|
5
5
|
Task 018's C path follows these layers through the unchanged root-bundled private legacy CST boundary. `src/frontends/c.js` owns all C trees and exhaustive profile validation. `src/backends/native-validation.js` checks native graph/location limits and `c-validation.js` checks C memory limits; `ordered-expressions.js` plans occurrence-specific evaluation without modifying IR; `c.js` emits mapped `program.c`; and `c-runtime.js` supplies the synthetic immutable-slice/arena header. The C frontend reconstructs candidates only from complete CST regions, resolves them with the existing semantic validator, and compares the original whole CST against the re-parsed canonical backend plan before returning a module. This same-language validation keeps target generation free of parser objects. See the [C profile](c.md).
|
|
6
6
|
|
|
7
|
-
1. Frontend adapters in `src/frontends/` invoke mature language parsers and translate only recognized syntax. Babel owns JavaScript and TypeScript parsing, `php-parser` owns PHP, Prism owns Ruby, Lezer owns Java, and
|
|
8
|
-
2. `src/semantic/` defines the shared JSDoc-typed discriminated representation and one-based, filename-bearing UTF-16 source locations. `provenance.js` indexes exact source content, deterministic semantic paths/node IDs, resolved symbol IDs, parser-token subranges, and closed source/derived/synthetic origins without exposing parser objects.
|
|
9
|
-
3. Source backends in `src/backends/` validate their semantic capabilities before emitting target syntax. Shared validation owns recursive block shape, reachability and all-path
|
|
7
|
+
1. Frontend adapters in `src/frontends/` invoke mature language parsers and translate only recognized syntax. Babel owns JavaScript and TypeScript parsing, `php-parser` owns PHP, Prism owns Ruby, Lezer owns Java, and qualified Tree-sitter bindings and grammars own Python, C#, Go, C, CPP, Rust, Swift, Kotlin, and Dart. Their AST/CST objects never appear in the public API. Adapters enumerate supported children and reject every other parser node; filtering syntax away is not a normalization strategy. Prism node offsets and comment byte ranges are converted from UTF-8 to JavaScript UTF-16 offsets before semantic location construction and metadata source slicing. Tree-sitter adapters reject lone surrogates, exhaustively traverse named/anonymous/comment/directive/error/missing children, and verify reported boundaries through the shared UTF-8-byte-to-UTF-16 converter. The Go adapter additionally collapses only exact `package main`, optional `fmt`, ordered semantic functions, and a final zero-argument `func main()` into the shared module/entry shape; assignment occurrences, not Go's uniformly mutable `var` syntax, determine semantic local mutability.
|
|
8
|
+
2. `src/semantic/` defines the shared JSDoc-typed discriminated representation and one-based, filename-bearing UTF-16 source locations. `provenance.js` indexes exact source content, deterministic semantic paths/node IDs, resolved symbol IDs, parser-token subranges, and closed source/derived/synthetic origins without exposing parser objects. Task 010's `SemanticProgram` adds dependency-first logical modules, a caller-order multi-source registry, explicit import/export nodes, one selected entry module, and stable module-qualified declaration identities; native filenames, package names, and target paths remain outside semantic resolution. Value types are scalar `integer`/`boolean`/`string` references or recursive acyclic `ListType`, unordered string-keyed `MapType`, insertion-ordered `OrderedMapType`, `OptionalType`, nominal `RecordType`, nominal Task 033 `ReferenceType`, and Task 034 linear `OwnedResourceType`/`OwnedReferenceType`; `void` exists only as a callable return. Task 012 adds invariant unbounded declaration-owned `TypeParameter` values, scoped `TypeVariableReference` leaves, and exact ordered arguments on generic record types. Task 011 adds nominal `ErrorType` only for catch bindings and error constructions, never as an ordinary parameter/local/return value. Task 034 adds compiler-authorized capability/resource/failure/operation declarations, complete resolved `EffectCallExpression` sites, and explicit `OwnedMoveExpression`/`OwnedBorrowExpression` nodes. Every function and reference class/member has a deterministic declaration identity; every list, ordered-map, condition-controlled loop, capability member, and effect site has a deterministic module-local identity. Every direct function, constructor, receiver method, and effect call carries exact resolution facts. Literal and access nodes distinguish scalars, collections, presence/absence, nominal values/references/resources, errors, receivers, and private fields. Unary and binary expressions carry a closed semantic `operation` and explicit result `type`, never a source operator symbol. Every function, constructor, method, entry point, branch, loop, try body, and catch body owns a located `Block` containing ordered `Statement` nodes. Statements additionally include exact `ForEachMapStatement`, strict-Boolean precondition `WhileStatement`, identity-resolved `BreakStatement`/`ContinueStatement`, private receiver-field writes, `RaiseStatement`, and one-handler `TryStatement`; general exception constructs have no semantic node. `lifetime.js` retains distinct normal/return/raise/break/continue ownership states and proves every owner terminal or transferred at every reachable scope exit. Task 033 class identity/private state remains single-module semantics; Task 034's effect/resource nodes stay compiler-authorized and single-module by default, Task 035 extends Task 010 `SemanticProgram` with versioned canonical capability modules and negotiated provider link requirements, and Task 036 adds exact facade-resolution evidence plus compiler-owned source/module roles and a complete selected-facade descriptor.
|
|
9
|
+
3. Source and binary backends in `src/backends/` validate their semantic capabilities before emitting target syntax or bytes. Shared validation owns recursive block shape, reachability and all-path abrupt-completion analysis, recursively complete expressions, exhaustive operation/type signatures, function signatures, lexical binding scopes, mutability, declaration-before-use, strict condition/return/argument/initializer/assignment types, fixed-point propagation of nominal unchecked errors, and Task 034 capability/effect/resource graph integrity. `backends/effects.js` rejects unsupported authority/target/context combinations before writer allocation and plans nested eager effects into statement-local collision-safe temporaries in semantic evaluation order. Dependency-first Task 010 validation carries ordinary inferred error sets across resolved function-import identities; both single-module generation and program mode accept compiler-authorized capability modules, while program mode additionally resolves their canonical standard-library contract references and links negotiated target host provider artifacts before any writer allocation. Target-specific validation adds identifier rules, entry-scaffolding name collisions, numeric/memory/resource bounds, and target string representation. The single-module original five retain one fixed compiler-owned Task 034 probe binding, and program mode materializes the same probe behavior as a tree-shaken provider artifact under a protected native binding. Text emitters write through `SourceWriter`; the Wasm encoder writes through an annotated binary writer so every byte range is semantic or explicitly synthetic. A backend either returns a complete executable program/project/application set or raises `UNSUPPORTED_CAPABILITY`; it never silently drops nodes, exposes a partial artifact, or lets an emitter discover malformed shape through a native error.
|
|
10
10
|
|
|
11
|
-
`src/language-registry.js` is the sole ordered dispatch and discovery source. Its deeply frozen records bind implementations to independent frontend, text-backend, binary-backend, application-backend, and interoperability roles. Public descriptors derive role booleans, artifact multiplicity, round-trip support, rich/v3/byte mapping forms, and acceptance stages/toolchains from those records; `supportedLanguages` is the derived compatibility view containing IDs with both a frontend and text backend. Duplicate IDs, unknown record fields, malformed capabilities, and unordered acceptance stages fail as `INVALID_REGISTRY`.
|
|
11
|
+
`src/language-registry.js` is the sole ordered dispatch and discovery source. Its deeply frozen records bind implementations to independent frontend, text-backend, binary-backend, application-backend, and interoperability roles. Public descriptors derive role booleans, semantic feature flags, artifact multiplicity, round-trip support, rich/v3/byte mapping forms, and acceptance stages/toolchains from those records; `generalFunctionsAndCalls` is true for PHP, Ruby, JavaScript, TypeScript, Java, and Dart; every later feature flag remains true only for the original five. `supportedLanguages` is the derived compatibility view containing IDs with both a frontend and text backend. Duplicate IDs, unknown record fields, malformed capabilities, and unordered acceptance stages fail as `INVALID_REGISTRY`.
|
|
12
12
|
|
|
13
|
-
`index.js` is the public boundary. `parse({language, filename, source})` resolves only the frontend role. `generate({language, module})` and `generateArtifact(...)` resolve a single-text backend, validate the full module, and preserve the compatibility source/artifact contracts; they intentionally reject the multiple-artifact C#, Go, and
|
|
13
|
+
`index.js` is the public boundary. `createCapabilityAuthority(input)` validates, detaches, and freezes explicit Task 034 compilation authority. `parse({language, filename, source, capabilityAuthority?})` resolves only the frontend role; omitted authority retains the legacy empty capability set and explicit `null` is malformed. `parseProgram(...)` composes only the original-five parser adapters over an explicit complete source set, resolves declarations by identity, performs no I/O, and accepts the same optional compiler authority so program modules may carry Task 034 capability declarations and a Task 035 standard-library contract descriptor. `createStdlibContractRegistry`, `listStdlibModules`, and `resolveStdlibModule` own the versioned canonical contract registry; `createStdlibProviderRegistry` and `listStdlibProviders` own the target host provider registry; `negotiateStdlibProviders` computes the transitive capability closure; and Task 036's `createStdlibFacadeRegistry`, `listStdlibFacades`, and `resolveStdlibFacade` expose detached versioned source-language facade definitions. `generate({language, module})` and `generateArtifact(...)` resolve a single-text backend, validate the full module, and preserve the compatibility source/artifact contracts; they intentionally reject the multiple-artifact C#, Go, C, Rust, Dart, and Wasm backends. `generateArtifactSet(...)` remains the additive single-module artifact boundary, while `generateProgramArtifactSet(...)` plans and validates a complete original-five program before any writer allocation. An unknown ID is `UNSUPPORTED_LANGUAGE`; a known ID missing the program cohort is `UNSUPPORTED_ROLE`; `UNSUPPORTED_CAPABILITY` remains a backend-with-role rejection of semantic content or target layout. `src/artifacts.js` owns transactional generated-file validation and detached, deeply frozen JSON metadata snapshots, including JSON object keys without prototype interpretation. `src/binary-mapping.js` owns byte provenance, and `src/mapping.js` owns text lookup, serialization, import/composition, and diagnostic remapping.
|
|
14
14
|
|
|
15
|
-
|
|
15
|
+
The [iOS application target](ios.md) is a target-only spoke on that artifact boundary. `src/backends/ios.js` reuses Task 010 project/source ownership and the Task 022 Tasks 001–004 Swift capability profile, validates the complete graph/configuration/asset layout, then emits captured namespaced Swift plus synthetic SwiftUI, unsigned project, test, asset-catalog, and versioned manifest artifacts. Apple lifecycle/configuration/resources do not enter semantic IR, and generation performs no filesystem access. There is no public project materializer: transactional create-only directory publication is deferred because Node's public filesystem API cannot combine atomic no-replace publication with descriptor-relative no-follow staging and cleanup without a separately authorized native boundary. No best-effort writer replaces that guarantee. Linux semantic/tool/packed-generator proofs are implemented; Apple/Xcode/Simulator proof remains explicitly deferred.
|
|
16
16
|
|
|
17
|
-
|
|
17
|
+
The [Android application target](android.md) is a Kotlin/Android spoke on the same boundary. `src/backends/android.js` validates a complete Kotlin-supported semantic module or Task 010 program plus closed Android configuration/resource inputs before writer allocation, then emits mapped namespaced semantic Kotlin and synthetic Gradle/manifest/Activity/native-view/test artifacts under one fixed ownership root. Android lifecycle/UI/build syntax stays outside semantic IR, and generic Kotlin/JVM output is unchanged. Public generation remains in-memory; a repository-private create-only helper materializes only fresh mode-0700 acceptance directories. The actual build is offline, while TensorBuzz alone prepares official caches and runs two clean KVM-accelerated API-35 emulator boots.
|
|
18
18
|
|
|
19
|
-
|
|
19
|
+
`src/toolchains.js` resolves configured absolute overrides or one unambiguous canonical PATH executable, runs a bounded version command, and returns its exact real path and captured version. Alongside language compilers/runtimes, browser Wasm defines exact WABT 1.0.36 and Chrome/Chromium 152.0.7977.82 contracts through `SEMANTIFOLD_WASM_VALIDATE` and `SEMANTIFOLD_CHROMIUM`. `src/acceptance.js` validates all artifacts and ordered stages before filesystem mutation, materializes only safe generated paths in a unique temporary directory, invokes exact executable/argument arrays without a shell, fixes `LANG`, `LC_ALL`, and `TZ`, captures output, distinguishes discovery/version/launch/timeout/nonzero failures, records the precise failed stage, and removes the directory. The browser-specific acceptance owner additionally serves a materialized artifact directory on loopback under strict CSP and owns the headless browser process group. No runner performs tool installation or runtime download.
|
|
20
20
|
|
|
21
|
-
|
|
21
|
+
## Browser WebAssembly target
|
|
22
|
+
|
|
23
|
+
`src/backends/wasm.js` consumes the unchanged semantic module and directly emits core WebAssembly binary version 1. It owns signed-i64 arithmetic traps, canonical i32 Booleans, UTF-8 literal/data layout, fixed memory, the private checked scratch allocator, semantic call-depth guards, the `semantifold.browser.v1` import/export ABI, binary section/index construction, and path-sensitive resource analysis. These are target concerns and add no Wasm nodes, pointers, traps, imports, memory, or JavaScript values to `src/semantic/`.
|
|
24
|
+
|
|
25
|
+
Generation first bounds the caller graph before recursive shared validation, checks known i64 operations module-wide, then performs entry-reachable resource validation. It builds deterministic literal and function indexes, emits all bytes with contiguous `SemantifoldByteMapping` ranges, and validates the completed module with the host standard WebAssembly API. Only then does it construct the ordered module/map/loader/HTML set and frozen ABI metadata. The generated JavaScript starts native streaming immediately while inspecting a response clone, keeps host import behavior locked until import signatures, fixed memory, exports, and absence of a start section pass, and cannot execute semantic operations itself. See the [browser WebAssembly target](webassembly.md).
|
|
26
|
+
|
|
27
|
+
## Standard-library portability
|
|
28
|
+
|
|
29
|
+
Task 034 is the unversioned semantic effect/lifetime foundation. Task 035, delivered through PR #45 and merge `a2aad9d4932bfc6087adc4ff8bca43678c92413c`, adds the versioned canonical contract registry with the built-in `semantifold.task034.resource-probe@1.0.0`, the target host provider registry with its protected native binding, capability negotiation, and transactional program linking. Task 036, delivered through PR #46 and merge `9aba48f9d48bcef4fd4c9275aec14bfcc4f0904c`, adds a bounded original-five qualification facade corpus. Parser-backed module resolution substitutes a facade only after proving its exact native library and symbol identity; the selected portable executable source enters the same frontend and semantic layers as application code and calls only a versioned **canonical Semantifold stdlib contract/capability**, never a target API or pair-specific bridge.
|
|
30
|
+
|
|
31
|
+
Task 037 exercises that architecture in one Ruby-source-to-PHP-target slice. Only an exact literal Ruby `require "socket"` profile can authorize the compiler-owned socket and output facades, genuine two-argument `TCPSocket.new`, zero-argument `gets`/`close`, and one-string unqualified `puts` or `Kernel.puts`. Those facade sources compile through semantic IR and directly require canonical SocketClient, TextStream, Output, and Resource v1 operations. The plural linker resolves only reachable PHP provider modules, qualifies operations by canonical module and operation, and validates source, facade, contract, provider, runtime, namespace, path, provenance, mapping, and complete artifact graphs before returning anything. Application modules receive no capability authority, and importing or calling a facade never propagates it.
|
|
32
|
+
|
|
33
|
+
The PHP provider layer owns opaque native socket handles and is the only generated code permitted to reach `fsockopen`, `fgets`, `feof`, `fclose`, and stdout. It validates host/port, scopes warning capture, converts native failures to the declared canonical errors, distinguishes clean EOF from read failure, incrementally validates UTF-8, preserves LF/CRLF, returns a final unterminated line once, completes short stdout writes, and treats either result of the first close attempt as terminal. Facades remain under `semantifold/facade/ruby/`; provider modules remain under `providers/php/semantifold/`. No Ruby-to-PHP adapter or source-shaped loop rewrite exists.
|
|
34
|
+
|
|
35
|
+
Program artifact generation compiles the application and only its used compatibility modules, then links only the required **target host provider/native binding** modules through the negotiated provider set. Providers implement canonical capabilities with the target's genuine native stdlib behind a protected host-native boundary unavailable to ordinary application and facade code; that isolation also prevents same-language generation from recursively selecting its own compatibility facade. Contract and target validation must finish before any artifact is exposed. Unsupported source identity, source APIs, target capabilities, or semantic mismatches produce located diagnostics rather than partial output.
|
|
22
36
|
|
|
23
37
|
Generated target code may preserve source API class or function names in a collision-safe compatibility namespace or import alias while using valid target syntax. A later backend may replace a facade/provider path with direct idiomatic lowering only when equivalence is proven; it is never the correctness baseline. Linking, tree-shaking, contract precision, namespace rules, and the full compile flow are defined in the [authoritative standard-library portability design](standard-library-portability.md).
|
|
24
38
|
|
|
@@ -38,20 +52,40 @@ Frontend source capabilities and backend target capabilities are intentionally s
|
|
|
38
52
|
|
|
39
53
|
Binary operands evaluate left to right. `BooleanAnd` and `BooleanOr` are short-circuit operations. Equality accepts only two operands of the same supported scalar type and means scalar value equality. Semantic integers are mathematical integers with one unsigned zero; IEEE-754 signed zero is not a distinct semantic value. Backends map meaning rather than copying syntax: PHP concatenation is `.`, Java string equality is `.equals`, JavaScript/TypeScript/PHP equality is strict, and other operations use their target's matching native construct. Because supported operations cannot otherwise distinguish signed zero, JavaScript and TypeScript canonically stringify observable scalar output when a module contains integer negation or multiplication. Their frontends unwrap that exact parser-native output scaffold during generated-source reparse, retaining the original operation tree without constant folding. Every emitted operation is conservatively parenthesized; generated-source reparsing reconstructs the same semantic tree.
|
|
40
54
|
|
|
41
|
-
A source-valid semantic name can be rejected for a target reserved word, and a safe semantic integer can be rejected by Java's narrower `int` range. Java validates literal-only integer operation trees with exact mathematical integers without folding the IR, rejecting known results outside signed 32-bit `int`. C# performs the same proof against signed 64-bit and emits an exact `checked(...)` wrapper for every integer arithmetic/negate operation while the project also enables overflow checking. Go performs the signed-64-bit proof without folding, but non-literal runtime overflow retains native `int64` wrap behavior and remains outside the portable result guarantee.
|
|
55
|
+
A source-valid semantic name can be rejected for a target reserved word, and a safe semantic integer can be rejected by Java's narrower `int` range. Java validates literal-only integer operation trees with exact mathematical integers without folding the IR, rejecting known results outside signed 32-bit `int`. Kotlin rejects known results outside the semantic safe range and routes dynamic arithmetic through private `Math.*Exact` helpers followed by the same bound check. C# performs the same proof against signed 64-bit and emits an exact `checked(...)` wrapper for every integer arithmetic/negate operation while the project also enables overflow checking. Go performs the signed-64-bit proof without folding, but non-literal runtime overflow retains native `int64` wrap behavior and remains outside the portable result guarantee. Dart rejects statically known results outside the semantic safe range and routes dynamic add/subtract/multiply/negate through exact private `BigInt` helpers before conversion to `int`; a private Boolean identity helper prevents analyzer constant-fold warnings without changing short-circuit evaluation. Only the complete canonical support CST authorizes either helper family during generated-source reparse.
|
|
42
56
|
|
|
43
57
|
## Blocks, flow, and bindings
|
|
44
58
|
|
|
45
|
-
Blocks preserve source order, evaluation order, and lexical nesting. Validation walks each statement once in order: an unconditional return makes every following statement in that block unreachable, and an `if` returns on all paths only when both its consequent and present alternate do. A non-void function must end every reachable path in an explicit return; optional alternates and empty blocks are valid only when later control flow remains complete. Entry points may not return a value.
|
|
59
|
+
Blocks preserve source order, evaluation order, and lexical nesting. Validation walks each statement once in order: an unconditional return, raise, break, or continue makes every following statement in that block unreachable, and an `if` returns on all paths only when both its consequent and present alternate do. A non-void function must end every reachable path in an explicit return; optional alternates and empty blocks are valid only when later control flow remains complete. Every loop is conservatively fallthrough-capable, so its body alone cannot satisfy a non-void function return. Entry points may not return a value.
|
|
60
|
+
|
|
61
|
+
Function identity is resolver-owned and exposed as deterministic module-local `function:N` IDs, never parser objects or trusted caller numeric IDs. A complete module signature pass precedes every body, so direct recursion and unambiguous forward or mutual references resolve consistently. Calls bind that identity and exact ordered signature; backend validation rechecks caller-supplied bindings before emission. Each provenance pass creates symbol records for functions, parameters, and locals, records a function symbol's semantic declaration identity, and resolves identifier reads, assignment targets, and calls through lexical function/branch/entry scopes. Module callables, parameters, and locals share one no-shadowing namespace; repeated names are rejected even across disjoint branches in this initial capability. Nested-block declarations do not escape their block. Initializers are validated before declaration and assignment right-hand expressions before the target update, preserving evaluation order and making self-reference a use-before-declaration error.
|
|
62
|
+
|
|
63
|
+
Task006 adds recursive `ListType` and `MapType` value types while retaining scalar `TypeReference` leaves. Lists are finite, homogeneous, ordered, zero-based, and duplicate-preserving; maps are finite homogeneous string-key associations with source-ordered initializer diagnostics but no semantic iteration order. Literal/index/lookup/size nodes are traversed recursively for validation, provenance, symbol resolution, and mapping. Static literal propagation proves bounded reads; only an exact source operation with absence failure can admit an otherwise dynamic read. The IR has no optional result, mutation, deep-freeze promise, or object/record interpretation. Backend capability and target factory/key restrictions are checked before writer or artifact construction.
|
|
46
64
|
|
|
47
|
-
|
|
65
|
+
Task007 adds explicit `OptionalType`, presence/absence construction, simple-identifier presence tests, and proof-checked unwrap. Presence facts are branch-local and invalidated conservatively by assignment. Task008 adds ordered `ForEachStatement` over lists with one immutable body binding and nearest-loop control; it never exposes map order. Task032 resolves every loop and abrupt control to deterministic `loop:N` identities, rejects non-nearest and cross-function targets, and adds `WhileStatement {id, condition, body, location}` with an exact Boolean condition evaluated before each iteration. Repeated conditions see conservative invalidation from body assignments; `continue` reaches the next condition evaluation and every condition loop remains a possible zero-iteration path. Task014 separately adds `OrderedMapType {keyType, valueType, order: "insertion"}`, `OrderedMapLiteral`, and `ForEachMapStatement {map, keyBinding, valueBinding, body, location}`. Unique nonnumeric string keys retain first-insertion order, both loop bindings are immutable and body-scoped, and ordinary Task006 `MapType` remains non-iterable. The source adapters prove exact native ordered construction profiles; target adapters consume only this canonical capability. Java statement lowering creates a collision-safe `LinkedHashMap`, performs source-ordered `put` calls, and immediately seals it behind `Collections.unmodifiableSequencedMap`; unsafe expression positions and any backing escape fail before emission. No sorting, pairwise/name-only rewrite, compatibility-facade coupling, or source-to-target shortcut is involved. Task009 adds parser-neutral nominal `RecordDeclaration`, `RecordField`, `RecordType`, `RecordConstruction`, and `MemberRead` values. Declaration and field identities, ordered arity, nominal type equality, direct-recursion rejection, mediated-recursion representation, and member resolution live in the semantic validator; parser-specific class trees remain in frontends and target declaration/access syntax remains in backends. Task011 adds `ErrorDeclaration`, `ErrorType`, `ErrorConstruction`, `RaiseStatement`, `TryStatement`, immutable `CatchBinding`, and `ErrorMessageRead`. Exact handler identity removes only its matching error from a protected block's escaping set; unmatched errors and errors raised by the handler propagate. A raise, return, break, or continue ends the current block path, while a caught path may resume after the try. Task012 keeps generic typing in this same hub: declaration scopes own stable parameter IDs, recursive validation rejects free/raw/wrong-arity applications, and argument-only first-order unification recursively gathers evidence from list/map/optional argument structure before contextually validating evidence-free nested values after the substitution is complete. Shared recursive substitution and variable detection close call returns, record construction fields, and member reads without mutating declarations. Externally supplied call resolutions must contain dense ordered inferred type arguments, including every nested generic-record identity array. Frontends use those same operations only for parser conversion and conservative syntax classification from parser-known arguments or explicit applications; they preserve an optional binding as a whole when it is direct generic evidence, and never use the expected return type. For parser-known context, a present nonoptional value against `Optional<X>` contributes evidence to `X`, two optionals recurse structurally, and an optional actual against plain `T` remains the whole inferred type. PHP call conversion may use that rule to close recursive documented parameter context from sibling arguments, but any variable left open must have an exact ID owned by the caller's lexical declaration. PHP optional generic-record access becomes a semantic unwrap only through the existing branch-local presence proof. Program rekeying qualifies both declaration and parameter IDs. Type parameters and every reference are ordinary provenance nodes/symbols; target backends receive only canonical types and either emit native syntax or exact documented syntax. No source/target pair adapter or standard-library capability is introduced. Task013 adds no node or validation rule: its spec-only structural comparator excludes locations, provenance, and regenerated declaration IDs while preserving every other modeled field, and its five-by-five round trips freeze the historical Tasks001–008 original-five boundary.
|
|
48
66
|
|
|
49
67
|
## Provenance and generated mappings
|
|
50
68
|
|
|
51
|
-
Frontend offsets remain parser-owned. Babel token positions, php-parser nodes/tokens, Prism byte locations/comment carriers, Lezer syntax nodes, and Tree-sitter Python/C#/Go/C/CPP named and anonymous nodes provide exact function, parameter, local, type, assignment, literal, call, branch, and operator ranges. Every Tree-sitter adapter traverses every child, rejects propagated error/missing recovery, and never substitutes source-text parsing after a rejected tree node. The JavaScript/TypeScript adapter indexes Babel tokens once by start offset, using direct identifier lookup and bounded binary-search token lookup instead of rescanning the full token stream per semantic node. Source normalization converts only coordinates; it never normalizes source content. CRLF and lone CR count as line breaks and parser coordinates become verified UTF-16 offsets.
|
|
69
|
+
Frontend offsets remain parser-owned. Babel token positions, php-parser nodes/tokens, Prism byte locations/comment carriers, Lezer syntax nodes, and Tree-sitter Python/C#/Go/C/CPP/Rust/Swift/Kotlin named and anonymous nodes provide exact function, parameter, local, type, assignment, literal, call, branch, error declaration/construction, catch type/binding, message read, and operator ranges. Every Tree-sitter adapter traverses every child, rejects propagated error/missing recovery, and never substitutes source-text parsing after a rejected tree node. Error declarations and catches receive their own symbols; construction/type and catch-binding message-read references resolve through the same deterministic provenance graph. The JavaScript/TypeScript adapter indexes Babel tokens once by start offset, using direct identifier lookup and bounded binary-search token lookup instead of rescanning the full token stream per semantic node. Source normalization converts only coordinates; it never normalizes source content. CRLF and lone CR count as line breaks and parser coordinates become verified UTF-16 offsets.
|
|
52
70
|
|
|
53
71
|
Each semantic node carries a JSON-safe source-provenance association through reorder, insertion, deletion, cloning, and serialization. Generation rebuilds canonical paths and node/symbol identities from current traversal and validates any serialized caller provenance before use; aggregate path/kind coincidence is never used to associate a different node. Shared caller objects receive deterministic occurrence records keyed by current JSON Pointer, so reused parameters, types, expressions, and valid statements do not collapse distinct emitted locations. Malformed caller registries, including empty source filenames, are discarded before canonical source fallback. This permits legacy and multi-source caller IR while preventing duplicate/stale IDs, mismatched source ownership, or out-of-bounds ranges from becoming semantic authority. The source-aware writer makes all output spans explicit, retains every contextual origin range across composition boundaries, and leaves no coarse legacy emitter path. Rich maps are frozen and indexed after validation; generated, original, node, and symbol queries include contextual related provenance without duplicate spans. See [source provenance and mappings](source-maps.md).
|
|
54
72
|
|
|
55
73
|
## Task019 CPP integration
|
|
56
74
|
|
|
57
75
|
`src/frontends/cpp.js` independently consumes official CPP snapshots and validates exact qualified types, condition clauses, inline support and CPP ordered regions. `src/backends/cpp.js` emits one mapped `program.cpp`; `cpp-runtime.js` owns fixed C++20 libstdc++ support and `cpp-validation.js` proves known owned-value sizes. C and CPP reuse `ordered-expressions.js` for occurrence planning/signatures and `native-validation.js` for bounded graphs, with the owning language preserved in diagnostics. The CPP frontend compares complete CPP CST structure against its canonical CPP output; it never calls the C frontend. The private runtime explicitly selects its official grammar and exports only frozen parser-neutral values. No semantic IR, standalone package identity, parser export, artifact contract or standard-library architecture is expanded. See the [CPP profile](cpp.md).
|
|
76
|
+
|
|
77
|
+
## Rust ownership and Cargo artifacts
|
|
78
|
+
|
|
79
|
+
Task020 adds `rust` through the same role registry, semantic language/provenance union, scalar tables and identifier validation. Its dedicated frontend adapter calls the existing private `parseCst(source, "rust")` boundary; only schema-1 recursively frozen plain data crosses the native runtime boundary. The root binding stays 0.25.1 and the private binding stays 0.21.1 with exact official Rust grammar 0.23.1. There is no pairwise dispatch or new semantic node.
|
|
80
|
+
|
|
81
|
+
The Rust reader accounts for every parser edge and compares all helper CST fields and tokens with exact target-owned support. It records clone and borrow occurrences privately, resolves scalar operations through shared validation, then checks moves in left-to-right evaluation order and joins continuing branch paths. Generated clones never repair illegal source moves. Only exact string construction, clones, concat borrows and print/overflow helpers collapse into existing scalar expressions and statements; arbitrary macros and source-text reparsing are forbidden.
|
|
82
|
+
|
|
83
|
+
The Cargo backend validates the complete graph, types, flow, bindings, reserved/scalar/helper collisions, fixed paths, known numeric/string bounds, source length and expanded CST depth before creating a writer or returning artifacts. A size/depth preflight follows the actual emission rules, including String borrow wrappers. The ordered set is synthetic manifest, synthetic Cargo-qualified format-4 lock, mapped entry source. Generation has no filesystem, network or compiler effects. Native left-to-right operands and short-circuit operators need no ordered temporary lowering. Clones, borrow punctuation and support bodies carry synthetic provenance related to the original nodes; copied identifiers, literals, call and operator tokens retain their original ranges.
|
|
84
|
+
|
|
85
|
+
Rust/Cargo discovery requires the exact qualified 1.98.1 commits and Linux x86-64 host; the verbose Cargo OS/library lines may differ across the qualified Ubuntu bases. Offline acceptance supplies an empty Cargo home and the exact compiler path, separates check/build diagnostics from direct binary and Cargo-run output, and verifies all original artifact hashes after both profiles. Host allocation, stack and output failures remain host failures under `panic = "abort"`, outside portable control flow. [Rust](rust.md) records the complete contract and qualification.
|
|
86
|
+
|
|
87
|
+
## Kotlin/JVM source and runnable JAR
|
|
88
|
+
|
|
89
|
+
Task023 adds `kotlin` through the root Tree-sitter 0.25.1 boundary and the exact ABI-14 Semantifold packaging fork of the community Kotlin grammar. The adapter consumes every CST edge, accepts only explicit Tasks001-004 Kotlin forms, and recognizes generated checked-arithmetic support only when the complete canonical helper CST is present. Parser trees and helper authority remain frontend-private.
|
|
90
|
+
|
|
91
|
+
The backend emits one mapped `Program.kt` and validates its final source through the registered Kotlin frontend before returning it. `generateArtifactSet()` wraps that entry with detached immutable Kotlin2.4/API2.4/JVM25 compiler and `java -jar Program.jar` metadata; it does not create a Gradle project or expose compiler artifacts. Exact `kotlinc` 2.4.20 and OpenJDK25 discovery and real compilation/execution remain acceptance concerns, never generation effects. See the [Kotlin/JVM profile](kotlin.md).
|