semantifold 0.3.0 → 0.4.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 +58 -15
- package/build/index.d.ts +48 -2
- package/build/index.d.ts.map +1 -1
- package/build/index.js +57 -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/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 +154 -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 +23 -0
- package/build/src/backends/kotlin.d.ts.map +1 -0
- package/build/src/backends/kotlin.js +136 -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 +81 -0
- package/build/src/backends/program.d.ts.map +1 -0
- package/build/src/backends/program.js +1308 -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 +2158 -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 +235 -4
- package/build/src/backends/writer.d.ts.map +1 -1
- package/build/src/backends/writer.js +468 -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 +167 -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 +2952 -202
- package/build/src/semantic/types.d.ts.map +1 -1
- package/build/src/semantic/types.js +688 -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/architecture.md +45 -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 +231 -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 +15 -7
- package/docs/standard-library-portability.md +39 -8
- package/docs/swift.md +44 -0
- package/docs/testing.md +366 -4
- package/docs/webassembly.md +52 -0
- package/index.js +63 -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/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 +160 -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 +141 -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 +1407 -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 +2304 -124
- 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 +520 -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 +172 -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 +765 -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
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// @ts-check
|
|
2
|
-
import { emitExpression, requiresCanonicalZeroRendering } from "./shared.js";
|
|
3
|
-
import {
|
|
2
|
+
import { emitExpression, emitType, requiresCanonicalZeroRendering } from "./shared.js";
|
|
3
|
+
import { emitEffectPrefixes, emitEffectSupport } from "./effects.js";
|
|
4
4
|
/**
|
|
5
5
|
* Emits an independently executable JavaScript program with JSDoc types.
|
|
6
6
|
* @param {import("../semantic/types.js").SemanticModule} module - Semantic module.
|
|
@@ -9,31 +9,93 @@ import { emitScalarType } from "./scalars.js";
|
|
|
9
9
|
*/
|
|
10
10
|
export function generateJavaScript(module, writer) {
|
|
11
11
|
const canonicalizeZero = requiresCanonicalZeroRendering(module);
|
|
12
|
+
const records = module.records ?? [];
|
|
13
|
+
const classes = module.classes ?? [];
|
|
14
|
+
const errors = module.errors ?? [];
|
|
15
|
+
emitProgramImports(module, writer);
|
|
16
|
+
emitEffectSupport(writer, module, "javascript");
|
|
17
|
+
errors.forEach((error, errorIndex) => {
|
|
18
|
+
const path = `/errors/${errorIndex}`;
|
|
19
|
+
if (errorIndex > 0)
|
|
20
|
+
writer.synthetic("\n\n", "error declaration separator", [error], [path]);
|
|
21
|
+
if (writer.isDirectlyExported(error.id))
|
|
22
|
+
writer.synthetic("export ", "ESM error export", [error], [path]);
|
|
23
|
+
writer.mapped("class", { mappingKind: "anchor", node: error, path });
|
|
24
|
+
writer.synthetic(" ", "error declaration spacing", [error], [path]);
|
|
25
|
+
writer.mapped(error.name, { mappingKind: "exact", node: error, path, role: "name" });
|
|
26
|
+
writer.synthetic(" extends Error {}", "JavaScript unchecked error scaffolding", [error], [path]);
|
|
27
|
+
});
|
|
28
|
+
if (errors.length > 0)
|
|
29
|
+
writer.synthetic("\n\n", "error/declaration separator", [module]);
|
|
30
|
+
records.forEach((record, recordIndex) => {
|
|
31
|
+
const recordPath = `/records/${recordIndex}`;
|
|
32
|
+
if (recordIndex > 0)
|
|
33
|
+
writer.synthetic("\n\n", "record declaration separator", [record], [recordPath]);
|
|
34
|
+
emitTemplateDocumentation(writer, record.typeParameters ?? [], `${recordPath}/typeParameters`, "JavaScript");
|
|
35
|
+
if (writer.isDirectlyExported(record.id))
|
|
36
|
+
writer.synthetic("export ", "ESM record export", [record], [recordPath]);
|
|
37
|
+
writer.mapped("class", { mappingKind: "anchor", node: record, path: recordPath });
|
|
38
|
+
writer.synthetic(" ", "record declaration spacing", [record], [recordPath]);
|
|
39
|
+
writer.mapped(record.name, { mappingKind: "exact", node: record, path: recordPath, role: "name" });
|
|
40
|
+
writer.synthetic(" {\n /**\n", "JavaScript record constructor scaffolding", [record], [recordPath]);
|
|
41
|
+
record.fields.forEach((field, fieldIndex) => {
|
|
42
|
+
const fieldPath = `${recordPath}/fields/${fieldIndex}`;
|
|
43
|
+
writer.synthetic(" * @param {", "JavaScript record field type scaffolding", [field], [fieldPath]);
|
|
44
|
+
emitType(writer, field.type, `${fieldPath}/type`, "javascript");
|
|
45
|
+
writer.synthetic("} ", "JavaScript record field type scaffolding", [field], [fieldPath]);
|
|
46
|
+
writer.mapped(field.name, { mappingKind: "exact", node: field, path: fieldPath, role: "name" });
|
|
47
|
+
writer.synthetic("\n", "line break", [field], [fieldPath]);
|
|
48
|
+
});
|
|
49
|
+
writer.synthetic(" */\n constructor(", "JavaScript record constructor scaffolding", [record], [recordPath]);
|
|
50
|
+
record.fields.forEach((field, fieldIndex) => {
|
|
51
|
+
if (fieldIndex)
|
|
52
|
+
writer.synthetic(", ", "record field separator", [record], [recordPath]);
|
|
53
|
+
writer.mapped(field.name, { mappingKind: "exact", node: field, path: `${recordPath}/fields/${fieldIndex}`, role: "name" });
|
|
54
|
+
});
|
|
55
|
+
writer.synthetic(") {\n", "JavaScript record constructor scaffolding", [record], [recordPath]);
|
|
56
|
+
record.fields.forEach((field, fieldIndex) => {
|
|
57
|
+
const fieldPath = `${recordPath}/fields/${fieldIndex}`;
|
|
58
|
+
writer.synthetic(" /** @readonly */\n this.", "JavaScript readonly field scaffolding", [field], [fieldPath]);
|
|
59
|
+
writer.mapped(field.name, { mappingKind: "exact", node: field, path: fieldPath, role: "name" });
|
|
60
|
+
writer.synthetic(" = ", "JavaScript record assignment scaffolding", [field], [fieldPath]);
|
|
61
|
+
writer.mapped(field.name, { mappingKind: "exact", node: field, path: fieldPath, role: "name" });
|
|
62
|
+
writer.synthetic(";\n", "JavaScript record assignment terminator", [field], [fieldPath]);
|
|
63
|
+
});
|
|
64
|
+
writer.synthetic(" ({}).constructor.freeze(this)\n }\n}", "JavaScript record immutability scaffolding", [record], [recordPath]);
|
|
65
|
+
});
|
|
66
|
+
if (records.length > 0)
|
|
67
|
+
writer.synthetic("\n\n", "record/function separator", [module]);
|
|
68
|
+
classes.forEach((declaration, classIndex) => {
|
|
69
|
+
if (classIndex > 0)
|
|
70
|
+
writer.synthetic("\n\n", "reference class separator", [declaration], [`/classes/${classIndex}`]);
|
|
71
|
+
emitReferenceClass(writer, declaration, classIndex, canonicalizeZero);
|
|
72
|
+
});
|
|
73
|
+
if (classes.length > 0)
|
|
74
|
+
writer.synthetic("\n\n", "reference class/function separator", [module]);
|
|
12
75
|
module.functions.forEach((declaration, functionIndex) => {
|
|
13
76
|
if (functionIndex > 0)
|
|
14
77
|
writer.synthetic("\n\n", "declaration separator", [declaration]);
|
|
15
78
|
writer.synthetic("/**\n * Generated semantic function.\n", "JavaScript type scaffolding", [declaration]);
|
|
79
|
+
for (const [parameterIndex, parameter] of (declaration.typeParameters ?? []).entries()) {
|
|
80
|
+
writer.synthetic(" * @template ", "JavaScript type parameter scaffolding", [parameter], [`/functions/${functionIndex}/typeParameters/${parameterIndex}`]);
|
|
81
|
+
writer.mapped(parameter.name, {
|
|
82
|
+
mappingKind: "exact", node: parameter, path: `/functions/${functionIndex}/typeParameters/${parameterIndex}`, role: "name"
|
|
83
|
+
});
|
|
84
|
+
writer.synthetic("\n", "line break", [parameter]);
|
|
85
|
+
}
|
|
16
86
|
for (const [parameterIndex, parameter] of declaration.parameters.entries()) {
|
|
17
87
|
const parameterPath = `/functions/${functionIndex}/parameters/${parameterIndex}`;
|
|
18
88
|
writer.synthetic(" * @param {", "JavaScript type scaffolding", [parameter], [parameterPath]);
|
|
19
|
-
writer
|
|
20
|
-
mappingKind: "exact",
|
|
21
|
-
node: parameter.type,
|
|
22
|
-
path: `${parameterPath}/type`,
|
|
23
|
-
role: "type"
|
|
24
|
-
});
|
|
89
|
+
emitType(writer, parameter.type, `${parameterPath}/type`, "javascript");
|
|
25
90
|
writer.synthetic("} ", "JavaScript type scaffolding", [parameter], [parameterPath]);
|
|
26
91
|
writer.mapped(parameter.name, { mappingKind: "exact", node: parameter, path: parameterPath, role: "name" });
|
|
27
92
|
writer.synthetic(" - Semantic parameter.\n", "JavaScript type scaffolding", [parameter], [parameterPath]);
|
|
28
93
|
}
|
|
29
94
|
writer.synthetic(" * @returns {", "JavaScript type scaffolding", [declaration]);
|
|
30
|
-
writer
|
|
31
|
-
mappingKind: "exact",
|
|
32
|
-
node: declaration.returnType,
|
|
33
|
-
path: `/functions/${functionIndex}/returnType`,
|
|
34
|
-
role: "type"
|
|
35
|
-
});
|
|
95
|
+
emitType(writer, declaration.returnType, `/functions/${functionIndex}/returnType`, "javascript");
|
|
36
96
|
writer.synthetic("} Semantic result.\n */\n", "JavaScript type scaffolding", [declaration]);
|
|
97
|
+
if (writer.isDirectlyExported(declaration.id))
|
|
98
|
+
writer.synthetic("export ", "ESM function export", [declaration]);
|
|
37
99
|
writer.mapped("function", { mappingKind: "anchor", node: declaration });
|
|
38
100
|
writer.synthetic(" ", "function spacing", [declaration]);
|
|
39
101
|
writer.mapped(declaration.name, { mappingKind: "exact", node: declaration, role: "name" });
|
|
@@ -55,8 +117,195 @@ export function generateJavaScript(module, writer) {
|
|
|
55
117
|
emitBlock(writer, declaration.body, " ", `/functions/${functionIndex}/body`, canonicalizeZero);
|
|
56
118
|
writer.mapped("}", { mappingKind: "anchor", node: declaration });
|
|
57
119
|
});
|
|
58
|
-
|
|
59
|
-
|
|
120
|
+
emitAliasedExports(module, writer);
|
|
121
|
+
if (!writer.program || writer.isProgramEntry()) {
|
|
122
|
+
writer.synthetic("\n\n", "entry-point separator", [module.entryPoint]);
|
|
123
|
+
emitBlock(writer, module.entryPoint.body, "", "/entryPoint/body", canonicalizeZero);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Emits one native JavaScript private-field reference class.
|
|
128
|
+
* @param {import("./writer.js").SourceWriter} writer - Source-aware writer.
|
|
129
|
+
* @param {import("../semantic/types.js").ClassDeclaration} declaration - Reference class.
|
|
130
|
+
* @param {number} classIndex - Module class index.
|
|
131
|
+
* @param {boolean} canonicalizeZero - Whether scalar output canonicalizes zero.
|
|
132
|
+
* @returns {void}
|
|
133
|
+
*/
|
|
134
|
+
function emitReferenceClass(writer, declaration, classIndex, canonicalizeZero) {
|
|
135
|
+
const path = `/classes/${classIndex}`;
|
|
136
|
+
writer.mapped("class", { mappingKind: "anchor", node: declaration, path });
|
|
137
|
+
writer.synthetic(" ", "reference class spacing", [declaration], [path]);
|
|
138
|
+
writer.mapped(declaration.name, { mappingKind: "exact", node: declaration, path, role: "name" });
|
|
139
|
+
writer.synthetic(" {\n", "reference class open", [declaration], [path]);
|
|
140
|
+
declaration.fields.forEach((field, index) => {
|
|
141
|
+
const fieldPath = `${path}/fields/${index}`;
|
|
142
|
+
writer.synthetic(" /** @type {", "private field type scaffolding", [field], [fieldPath]);
|
|
143
|
+
emitType(writer, field.type, `${fieldPath}/type`, "javascript");
|
|
144
|
+
writer.synthetic("} */\n #", "private field scaffolding", [field], [fieldPath]);
|
|
145
|
+
writer.mapped(field.name, { mappingKind: "exact", node: field, path: fieldPath, role: "name" });
|
|
146
|
+
writer.synthetic("\n", "line break", [field], [fieldPath]);
|
|
147
|
+
});
|
|
148
|
+
const constructor = declaration.constructor;
|
|
149
|
+
const constructorPath = `${path}/constructor`;
|
|
150
|
+
emitJsdoc(writer, constructor.parameters, undefined, `${constructorPath}/parameters`, undefined);
|
|
151
|
+
writer.synthetic(" ", "constructor indentation", [constructor], [constructorPath]);
|
|
152
|
+
writer.mapped("constructor", { mappingKind: "exact", node: constructor, path: constructorPath, role: "constructor" });
|
|
153
|
+
emitBareParameters(writer, constructor.parameters, `${constructorPath}/parameters`);
|
|
154
|
+
writer.synthetic(" {\n", "constructor open", [constructor], [constructorPath]);
|
|
155
|
+
emitBlock(writer, constructor.body, " ", `${constructorPath}/body`, canonicalizeZero);
|
|
156
|
+
writer.synthetic(" }", "constructor close", [constructor], [constructorPath]);
|
|
157
|
+
declaration.methods.forEach((method, index) => {
|
|
158
|
+
const methodPath = `${path}/methods/${index}`;
|
|
159
|
+
writer.synthetic("\n\n", "method spacing", [method], [methodPath]);
|
|
160
|
+
emitJsdoc(writer, method.parameters, method.returnType, `${methodPath}/parameters`, `${methodPath}/returnType`);
|
|
161
|
+
writer.synthetic(" ", "method indentation", [method], [methodPath]);
|
|
162
|
+
writer.mapped(method.name, { mappingKind: "exact", node: method, path: methodPath, role: "name" });
|
|
163
|
+
emitBareParameters(writer, method.parameters, `${methodPath}/parameters`);
|
|
164
|
+
writer.synthetic(" {\n", "method open", [method], [methodPath]);
|
|
165
|
+
emitBlock(writer, method.body, " ", `${methodPath}/body`, canonicalizeZero);
|
|
166
|
+
writer.synthetic(" }", "method close", [method], [methodPath]);
|
|
167
|
+
});
|
|
168
|
+
writer.synthetic("\n", "line break", [declaration], [path]);
|
|
169
|
+
writer.mapped("}", { mappingKind: "anchor", node: declaration, path });
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Emits exact JavaScript callable type documentation.
|
|
173
|
+
* @param {import("./writer.js").SourceWriter} writer - Source-aware writer.
|
|
174
|
+
* @param {import("../semantic/types.js").Parameter[]} parameters - Ordered parameters.
|
|
175
|
+
* @param {import("../semantic/types.js").SemanticFunctionReturnType | undefined} returnType - Optional return type.
|
|
176
|
+
* @param {string} parameterPath - Parameter collection path.
|
|
177
|
+
* @param {string | undefined} returnPath - Return type path.
|
|
178
|
+
* @returns {void}
|
|
179
|
+
*/
|
|
180
|
+
function emitJsdoc(writer, parameters, returnType, parameterPath, returnPath) {
|
|
181
|
+
writer.synthetic("\n /**\n", "JavaScript callable documentation", parameters);
|
|
182
|
+
for (const [index, parameter] of parameters.entries()) {
|
|
183
|
+
writer.synthetic(" * @param {", "parameter type scaffolding", [parameter], [`${parameterPath}/${index}`]);
|
|
184
|
+
emitType(writer, parameter.type, `${parameterPath}/${index}/type`, "javascript");
|
|
185
|
+
writer.synthetic("} ", "parameter documentation", [parameter], [`${parameterPath}/${index}`]);
|
|
186
|
+
writer.mapped(parameter.name, { mappingKind: "exact", node: parameter, path: `${parameterPath}/${index}`, role: "name" });
|
|
187
|
+
writer.synthetic("\n", "line break", [parameter]);
|
|
188
|
+
}
|
|
189
|
+
if (returnType && returnPath) {
|
|
190
|
+
writer.synthetic(" * @returns {", "return type scaffolding", []);
|
|
191
|
+
emitType(writer, returnType, returnPath, "javascript");
|
|
192
|
+
writer.synthetic("}\n", "line break", []);
|
|
193
|
+
}
|
|
194
|
+
writer.synthetic(" */\n", "JavaScript callable documentation close", parameters);
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* Emits one untyped JavaScript parameter list.
|
|
198
|
+
* @param {import("./writer.js").SourceWriter} writer - Source-aware writer.
|
|
199
|
+
* @param {import("../semantic/types.js").Parameter[]} parameters - Ordered parameters.
|
|
200
|
+
* @param {string} path - Parameter collection path.
|
|
201
|
+
* @returns {void}
|
|
202
|
+
*/
|
|
203
|
+
function emitBareParameters(writer, parameters, path) {
|
|
204
|
+
writer.synthetic("(", "parameter list open", parameters);
|
|
205
|
+
parameters.forEach((parameter, index) => {
|
|
206
|
+
if (index)
|
|
207
|
+
writer.synthetic(", ", "parameter separator", parameters);
|
|
208
|
+
writer.mapped(parameter.name, { mappingKind: "exact", node: parameter, path: `${path}/${index}`, role: "name" });
|
|
209
|
+
});
|
|
210
|
+
writer.synthetic(")", "parameter list close", parameters);
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* Emits a standalone JSDoc template block.
|
|
214
|
+
* @param {import("./writer.js").SourceWriter} writer - Source-aware writer.
|
|
215
|
+
* @param {import("../semantic/types.js").TypeParameter[]} parameters - Ordered type parameters.
|
|
216
|
+
* @param {string} path - Type-parameter collection path.
|
|
217
|
+
* @param {string} target - Target label.
|
|
218
|
+
*/
|
|
219
|
+
function emitTemplateDocumentation(writer, parameters, path, target) {
|
|
220
|
+
if (parameters.length == 0)
|
|
221
|
+
return;
|
|
222
|
+
writer.synthetic("/**\n", `${target} type parameter scaffolding`, parameters);
|
|
223
|
+
parameters.forEach((parameter, index) => {
|
|
224
|
+
writer.synthetic(" * @template ", `${target} type parameter scaffolding`, [parameter], [`${path}/${index}`]);
|
|
225
|
+
writer.mapped(parameter.name, { mappingKind: "exact", node: parameter, path: `${path}/${index}`, role: "name" });
|
|
226
|
+
writer.synthetic("\n", "line break", [parameter]);
|
|
227
|
+
});
|
|
228
|
+
writer.synthetic(" */\n", `${target} type parameter scaffolding`, parameters);
|
|
229
|
+
}
|
|
230
|
+
/**
|
|
231
|
+
* Emits grouped named ESM imports for a program module.
|
|
232
|
+
* @param {import("../semantic/types.js").SemanticModule} module - Current module.
|
|
233
|
+
* @param {import("./writer.js").SourceWriter} writer - Source-aware writer.
|
|
234
|
+
*/
|
|
235
|
+
function emitProgramImports(module, writer) {
|
|
236
|
+
if (!writer.program)
|
|
237
|
+
return;
|
|
238
|
+
const imports = /** @type {import("../semantic/types.js").SemanticProgramModule} */ ( /** @type {unknown} */(module)).imports;
|
|
239
|
+
const moduleIds = [...new Set(imports.map(({ moduleId }) => moduleId))];
|
|
240
|
+
for (const moduleId of moduleIds) {
|
|
241
|
+
const selected = imports.filter((item) => item.moduleId == moduleId);
|
|
242
|
+
writer.synthetic("import {", "ESM import declaration", selected);
|
|
243
|
+
selected.forEach((item, index) => {
|
|
244
|
+
const itemPath = `/imports/${imports.indexOf(item)}`;
|
|
245
|
+
const localName = writer.importNameFor(item);
|
|
246
|
+
if (index)
|
|
247
|
+
writer.synthetic(", ", "ESM import separator", selected);
|
|
248
|
+
writer.mapped(item.importedName, { mappingKind: "exact", node: item, path: itemPath, role: "importedName" });
|
|
249
|
+
if (localName != item.importedName) {
|
|
250
|
+
writer.synthetic(" as ", "ESM import alias", [item], [itemPath]);
|
|
251
|
+
writer.mapped(localName, { mappingKind: "exact", node: item, path: itemPath, role: "localName" });
|
|
252
|
+
}
|
|
253
|
+
});
|
|
254
|
+
writer.synthetic("} from ", "ESM import source", selected);
|
|
255
|
+
writer.mapped(JSON.stringify(writer.relativeModuleSpecifier(moduleId, ".js")), {
|
|
256
|
+
mappingKind: "anchor", node: selected[0], path: `/imports/${imports.indexOf(selected[0])}`, role: "path"
|
|
257
|
+
});
|
|
258
|
+
writer.synthetic("\n", "ESM import terminator", selected);
|
|
259
|
+
}
|
|
260
|
+
if (moduleIds.length > 0)
|
|
261
|
+
writer.synthetic("\n", "ESM import separator", [module]);
|
|
262
|
+
emitStdlibProviderImports(module, writer);
|
|
263
|
+
}
|
|
264
|
+
/**
|
|
265
|
+
* Emits the grouped named ESM import for one linked stdlib provider.
|
|
266
|
+
* @param {import("../semantic/types.js").SemanticModule} module - Current module.
|
|
267
|
+
* @param {import("./writer.js").SourceWriter} writer - Source-aware writer.
|
|
268
|
+
*/
|
|
269
|
+
export function emitStdlibProviderImports(module, writer) {
|
|
270
|
+
const names = writer.stdlibProviderImports;
|
|
271
|
+
if (!writer.program || !names || names.length == 0)
|
|
272
|
+
return;
|
|
273
|
+
writer.synthetic("import {", "ESM stdlib provider import declaration", [module]);
|
|
274
|
+
names.forEach((name, index) => {
|
|
275
|
+
if (index)
|
|
276
|
+
writer.synthetic(", ", "ESM stdlib provider import separator", [module]);
|
|
277
|
+
writer.synthetic(name, "ESM stdlib provider import name", [module]);
|
|
278
|
+
});
|
|
279
|
+
writer.synthetic("} from ", "ESM stdlib provider import source", [module]);
|
|
280
|
+
writer.synthetic(JSON.stringify(writer.stdlibProviderSpecifier(".js")), "ESM stdlib provider import path", [module]);
|
|
281
|
+
writer.synthetic("\n", "ESM stdlib provider import terminator", [module]);
|
|
282
|
+
writer.synthetic("\n", "ESM stdlib provider import separator", [module]);
|
|
283
|
+
}
|
|
284
|
+
/**
|
|
285
|
+
* Emits explicit ESM export clauses for source aliases.
|
|
286
|
+
* @param {import("../semantic/types.js").SemanticModule} module - Current module.
|
|
287
|
+
* @param {import("./writer.js").SourceWriter} writer - Source-aware writer.
|
|
288
|
+
*/
|
|
289
|
+
function emitAliasedExports(module, writer) {
|
|
290
|
+
if (!writer.program)
|
|
291
|
+
return;
|
|
292
|
+
const programModule = /** @type {import("../semantic/types.js").SemanticProgramModule} */ ( /** @type {unknown} */(module));
|
|
293
|
+
const aliases = programModule.exports.filter((item) => !writer.isDirectExport(item));
|
|
294
|
+
if (aliases.length == 0)
|
|
295
|
+
return;
|
|
296
|
+
writer.synthetic("\n\nexport {", "ESM aliased exports", [module]);
|
|
297
|
+
aliases.forEach((item, index) => {
|
|
298
|
+
if (index)
|
|
299
|
+
writer.synthetic(", ", "ESM export separator", [module]);
|
|
300
|
+
const declaration = [...programModule.functions, ...programModule.records ?? [], ...programModule.errors ?? []].find(({ id }) => id == item.declarationId);
|
|
301
|
+
if (!declaration)
|
|
302
|
+
throw new RangeError(`Unknown exported declaration '${item.declarationId}'.`);
|
|
303
|
+
const exportPath = `/exports/${programModule.exports.indexOf(item)}`;
|
|
304
|
+
writer.mapped(declaration.name, { mappingKind: "exact", name: declaration.name, node: item, path: exportPath, role: "localName" });
|
|
305
|
+
writer.synthetic(" as ", "ESM aliased export operator", [item], [exportPath]);
|
|
306
|
+
writer.mapped(item.exportedName, { mappingKind: "exact", name: item.exportedName, node: item, path: exportPath, role: "exportedName" });
|
|
307
|
+
});
|
|
308
|
+
writer.synthetic("}", "ESM aliased export close", [module]);
|
|
60
309
|
}
|
|
61
310
|
/**
|
|
62
311
|
* Emits one ordered JavaScript block body.
|
|
@@ -80,12 +329,124 @@ function emitBlock(writer, block, indent, blockPath, canonicalizeZero) {
|
|
|
80
329
|
* @returns {void}
|
|
81
330
|
*/
|
|
82
331
|
function emitStatement(writer, statement, indent, path, canonicalizeZero) {
|
|
332
|
+
emitEffectPrefixes(writer, statement, indent, path, "javascript", (expression, expressionPath) => emitExpression(writer, expression, expressionPath, "javascript", identity));
|
|
83
333
|
if (statement.kind == "LocalDeclaration" || statement.kind == "AssignmentStatement")
|
|
84
334
|
return emitLocal(writer, statement, indent, path);
|
|
85
335
|
writer.synthetic(indent, "indentation", [statement], [path]);
|
|
336
|
+
if (statement.kind == "PrivateFieldWriteStatement") {
|
|
337
|
+
emitExpression(writer, statement.receiver, `${path}/receiver`, "javascript", identity);
|
|
338
|
+
const field = writer.privateFieldForId(statement.field);
|
|
339
|
+
writer.mapped(`.#${field.name}`, { mappingKind: "exact", name: field.name, node: statement, path, role: "member" });
|
|
340
|
+
writer.synthetic(" = ", "private field assignment", [statement], [path]);
|
|
341
|
+
emitExpression(writer, statement.expression, `${path}/expression`, "javascript", identity);
|
|
342
|
+
writer.synthetic("\n", "line break", [statement], [path]);
|
|
343
|
+
return;
|
|
344
|
+
}
|
|
345
|
+
if (statement.kind == "BreakStatement" || statement.kind == "ContinueStatement") {
|
|
346
|
+
writer.mapped(statement.kind == "BreakStatement" ? "break" : "continue", { mappingKind: "exact", node: statement, path });
|
|
347
|
+
writer.synthetic("\n", "line break", [statement], [path]);
|
|
348
|
+
return;
|
|
349
|
+
}
|
|
350
|
+
if (statement.kind == "WhileStatement") {
|
|
351
|
+
writer.mapped("while", { mappingKind: "exact", node: statement, path });
|
|
352
|
+
writer.synthetic(" (", "condition-controlled loop spacing", [statement], [path]);
|
|
353
|
+
emitExpression(writer, statement.condition, `${path}/condition`, "javascript", identity);
|
|
354
|
+
writer.synthetic(") ", "condition-controlled loop spacing", [statement], [path]);
|
|
355
|
+
writer.mapped("{", { mappingKind: "anchor", node: statement.body, path: `${path}/body` });
|
|
356
|
+
writer.synthetic("\n", "line break", [statement], [path]);
|
|
357
|
+
emitBlock(writer, statement.body, `${indent} `, `${path}/body`, canonicalizeZero);
|
|
358
|
+
writer.synthetic(indent, "indentation", [statement], [path]);
|
|
359
|
+
writer.mapped("}", { mappingKind: "anchor", node: statement.body, path: `${path}/body` });
|
|
360
|
+
writer.synthetic("\n", "line break", [statement], [path]);
|
|
361
|
+
return;
|
|
362
|
+
}
|
|
363
|
+
if (statement.kind == "ForEachStatement") {
|
|
364
|
+
writer.mapped("for", { mappingKind: "anchor", node: statement, path });
|
|
365
|
+
writer.synthetic(" (const ", "loop scaffolding", [statement], [path]);
|
|
366
|
+
writer.mapped(statement.valueBinding.name, {
|
|
367
|
+
mappingKind: "exact", node: statement.valueBinding, path: `${path}/valueBinding`, role: "name"
|
|
368
|
+
});
|
|
369
|
+
writer.synthetic(" of ", "loop scaffolding", [statement], [path]);
|
|
370
|
+
emitExpression(writer, statement.list, `${path}/list`, "javascript", identity);
|
|
371
|
+
writer.synthetic(") ", "loop scaffolding", [statement], [path]);
|
|
372
|
+
writer.mapped("{", { mappingKind: "anchor", node: statement.body, path: `${path}/body` });
|
|
373
|
+
writer.synthetic("\n", "line break", [statement], [path]);
|
|
374
|
+
emitBlock(writer, statement.body, `${indent} `, `${path}/body`, canonicalizeZero);
|
|
375
|
+
writer.synthetic(indent, "indentation", [statement], [path]);
|
|
376
|
+
writer.mapped("}", { mappingKind: "anchor", node: statement.body, path: `${path}/body` });
|
|
377
|
+
writer.synthetic("\n", "line break", [statement], [path]);
|
|
378
|
+
return;
|
|
379
|
+
}
|
|
380
|
+
if (statement.kind == "ForEachMapStatement") {
|
|
381
|
+
writer.mapped("for", { mappingKind: "anchor", node: statement, path });
|
|
382
|
+
writer.synthetic(" (const [", "map loop scaffolding", [statement], [path]);
|
|
383
|
+
writer.mapped(statement.keyBinding.name, {
|
|
384
|
+
mappingKind: "exact", node: statement.keyBinding, path: `${path}/keyBinding`, role: "name"
|
|
385
|
+
});
|
|
386
|
+
writer.synthetic(", ", "map iteration binding separator", [statement], [path]);
|
|
387
|
+
writer.mapped(statement.valueBinding.name, {
|
|
388
|
+
mappingKind: "exact", node: statement.valueBinding, path: `${path}/valueBinding`, role: "name"
|
|
389
|
+
});
|
|
390
|
+
writer.synthetic("] of ", "map loop scaffolding", [statement], [path]);
|
|
391
|
+
emitExpression(writer, statement.map, `${path}/map`, "javascript", identity);
|
|
392
|
+
writer.synthetic(") ", "map loop scaffolding", [statement], [path]);
|
|
393
|
+
writer.mapped("{", { mappingKind: "anchor", node: statement.body, path: `${path}/body` });
|
|
394
|
+
writer.synthetic("\n", "line break", [statement], [path]);
|
|
395
|
+
emitBlock(writer, statement.body, `${indent} `, `${path}/body`, canonicalizeZero);
|
|
396
|
+
writer.synthetic(indent, "indentation", [statement], [path]);
|
|
397
|
+
writer.mapped("}", { mappingKind: "anchor", node: statement.body, path: `${path}/body` });
|
|
398
|
+
writer.synthetic("\n", "line break", [statement], [path]);
|
|
399
|
+
return;
|
|
400
|
+
}
|
|
401
|
+
if (statement.kind == "RaiseStatement") {
|
|
402
|
+
const type = statement.error.error;
|
|
403
|
+
const error = writer.errorForId(type.declarationId);
|
|
404
|
+
writer.mapped("throw", { mappingKind: "anchor", node: statement, path });
|
|
405
|
+
writer.synthetic(" new ", "error construction scaffolding", [statement.error], [`${path}/error`]);
|
|
406
|
+
writer.mapped(writer.errorNameForId(type.declarationId), { mappingKind: "exact", name: error.name, node: statement.error, path: `${path}/error`, role: "type" });
|
|
407
|
+
writer.synthetic("(", "error construction open", [statement.error], [`${path}/error`]);
|
|
408
|
+
emitExpression(writer, statement.error.message, `${path}/error/message`, "javascript", identity);
|
|
409
|
+
writer.synthetic(")\n", "error construction close", [statement.error], [`${path}/error`]);
|
|
410
|
+
return;
|
|
411
|
+
}
|
|
412
|
+
if (statement.kind == "TryStatement") {
|
|
413
|
+
const caught = writer.errorForId(statement.catchType.declarationId);
|
|
414
|
+
const targetName = writer.errorNameForId(statement.catchType.declarationId);
|
|
415
|
+
writer.mapped("try", { mappingKind: "anchor", node: statement, path });
|
|
416
|
+
writer.synthetic(" ", "try spacing", [statement], [path]);
|
|
417
|
+
writer.mapped("{", { mappingKind: "anchor", node: statement.body, path: `${path}/body` });
|
|
418
|
+
writer.synthetic("\n", "line break", [statement], [path]);
|
|
419
|
+
emitBlock(writer, statement.body, `${indent} `, `${path}/body`, canonicalizeZero);
|
|
420
|
+
writer.synthetic(indent, "indentation", [statement], [path]);
|
|
421
|
+
writer.mapped("}", { mappingKind: "anchor", node: statement.body, path: `${path}/body` });
|
|
422
|
+
writer.synthetic(" ", "catch spacing", [statement], [path]);
|
|
423
|
+
writer.mapped("catch", { mappingKind: "anchor", node: statement, path, role: "catch" });
|
|
424
|
+
writer.synthetic(" (", "catch binding scaffolding", [statement.catchBinding], [`${path}/catchBinding`]);
|
|
425
|
+
writer.mapped(statement.catchBinding.name, { mappingKind: "exact", node: statement.catchBinding, path: `${path}/catchBinding`, role: "name" });
|
|
426
|
+
writer.synthetic(") {\n", "catch binding scaffolding", [statement.catchBinding], [`${path}/catchBinding`]);
|
|
427
|
+
writer.synthetic(`${indent} if (!(`, "exact catch guard", [statement], [path]);
|
|
428
|
+
writer.mapped(statement.catchBinding.name, { mappingKind: "exact", node: statement.catchBinding, path: `${path}/catchBinding`, role: "name" });
|
|
429
|
+
writer.synthetic(" instanceof ", "exact catch guard", [statement], [path]);
|
|
430
|
+
writer.mapped(targetName, { mappingKind: "exact", name: caught.name, node: statement.catchType, path: `${path}/catchType`, role: "type" });
|
|
431
|
+
writer.synthetic(`)) {\n${indent} throw `, "unmatched error propagation", [statement], [path]);
|
|
432
|
+
writer.mapped(statement.catchBinding.name, { mappingKind: "exact", node: statement.catchBinding, path: `${path}/catchBinding`, role: "name" });
|
|
433
|
+
writer.synthetic(`\n${indent} }\n`, "unmatched error propagation", [statement], [path]);
|
|
434
|
+
emitBlock(writer, statement.catchBody, `${indent} `, `${path}/catchBody`, canonicalizeZero);
|
|
435
|
+
writer.synthetic(indent, "indentation", [statement], [path]);
|
|
436
|
+
writer.mapped("}", { mappingKind: "anchor", node: statement.catchBody, path: `${path}/catchBody` });
|
|
437
|
+
writer.synthetic("\n", "line break", [statement], [path]);
|
|
438
|
+
return;
|
|
439
|
+
}
|
|
86
440
|
if (statement.kind == "ReturnStatement") {
|
|
87
441
|
writer.mapped("return", { mappingKind: "anchor", node: statement, path });
|
|
88
|
-
|
|
442
|
+
if (statement.expression) {
|
|
443
|
+
writer.synthetic(" ", "return spacing", [statement], [path]);
|
|
444
|
+
emitExpression(writer, statement.expression, `${path}/expression`, "javascript", identity);
|
|
445
|
+
}
|
|
446
|
+
writer.synthetic("\n", "line break", [statement], [path]);
|
|
447
|
+
return;
|
|
448
|
+
}
|
|
449
|
+
if (statement.kind == "ExpressionStatement") {
|
|
89
450
|
emitExpression(writer, statement.expression, `${path}/expression`, "javascript", identity);
|
|
90
451
|
writer.synthetic("\n", "line break", [statement], [path]);
|
|
91
452
|
return;
|
|
@@ -145,12 +506,7 @@ function emitLocal(writer, statement, indent, statementPath) {
|
|
|
145
506
|
return;
|
|
146
507
|
}
|
|
147
508
|
writer.synthetic("/** @type {", "JavaScript local type scaffolding", [statement], [statementPath]);
|
|
148
|
-
writer
|
|
149
|
-
mappingKind: "exact",
|
|
150
|
-
node: statement.type,
|
|
151
|
-
path: `${statementPath}/type`,
|
|
152
|
-
role: "type"
|
|
153
|
-
});
|
|
509
|
+
emitType(writer, statement.type, `${statementPath}/type`, "javascript");
|
|
154
510
|
writer.synthetic("} */\n", "JavaScript local type scaffolding", [statement], [statementPath]);
|
|
155
511
|
writer.synthetic(indent, "indentation", [statement], [statementPath]);
|
|
156
512
|
writer.mapped(statement.mutable ? "let" : "const", { mappingKind: "anchor", node: statement, path: statementPath });
|
|
@@ -170,4 +526,4 @@ function emitLocal(writer, statement, indent, statementPath) {
|
|
|
170
526
|
function identity(name) {
|
|
171
527
|
return name;
|
|
172
528
|
}
|
|
173
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiamF2YXNjcmlwdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9iYWNrZW5kcy9qYXZhc2NyaXB0LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLEVBQUMsY0FBYyxFQUFFLDhCQUE4QixFQUFDLE1BQU0sYUFBYSxDQUFBO0FBQzFFLE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxjQUFjLENBQUE7QUFFM0M7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsa0JBQWtCLENBQUMsTUFBTSxFQUFFLE1BQU07SUFDL0MsTUFBTSxnQkFBZ0IsR0FBRyw4QkFBOEIsQ0FBQyxNQUFNLENBQUMsQ0FBQTtJQUUvRCxNQUFNLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFdBQVcsRUFBRSxhQUFhLEVBQUUsRUFBRTtRQUN0RCxJQUFJLGFBQWEsR0FBRyxDQUFDO1lBQUUsTUFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsdUJBQXVCLEVBQUUsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFBO1FBRXZGLE1BQU0sQ0FBQyxTQUFTLENBQUMsd0NBQXdDLEVBQUUsNkJBQTZCLEVBQUUsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFBO1FBQ3hHLEtBQUssTUFBTSxDQUFDLGNBQWMsRUFBRSxTQUFTLENBQUMsSUFBSSxXQUFXLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUM7WUFDM0UsTUFBTSxhQUFhLEdBQUcsY0FBYyxhQUFhLGVBQWUsY0FBYyxFQUFFLENBQUE7WUFFaEYsTUFBTSxDQUFDLFNBQVMsQ0FBQyxhQUFhLEVBQUUsNkJBQTZCLEVBQUUsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUE7WUFDNUYsTUFBTSxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsWUFBWSxFQUFFLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRTtnQkFDMUQsV0FBVyxFQUFFLE9BQU87Z0JB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SUFDbEcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsb0JBQW9CLEVBQUUsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUE7SUFDekUsY0FBYyxDQUFDLE1BQU0sRUFBRSxTQUFTLENBQUMsV0FBVyxFQUFFLEdBQUcsYUFBYSxjQUFjLEVBQUUsWUFBWSxFQUFFLFFBQVEsQ0FBQyxDQUFBO0lBQ3JHLE1BQU0sQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLFlBQVksRUFBRSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQTtBQUNwRSxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQVMsUUFBUSxDQUFDLElBQUk7SUFDcEIsT0FBTyxJQUFJLENBQUE7QUFDYixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCB7ZW1pdEV4cHJlc3Npb24sIHJlcXVpcmVzQ2Fub25pY2FsWmVyb1JlbmRlcmluZ30gZnJvbSBcIi4vc2hhcmVkLmpzXCJcbmltcG9ydCB7ZW1pdFNjYWxhclR5cGV9IGZyb20gXCIuL3NjYWxhcnMuanNcIlxuXG4vKipcbiAqIEVtaXRzIGFuIGluZGVwZW5kZW50bHkgZXhlY3V0YWJsZSBKYXZhU2NyaXB0IHByb2dyYW0gd2l0aCBKU0RvYyB0eXBlcy5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNNb2R1bGV9IG1vZHVsZSAtIFNlbWFudGljIG1vZHVsZS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi93cml0ZXIuanNcIikuU291cmNlV3JpdGVyfSB3cml0ZXIgLSBTb3VyY2UtYXdhcmUgd3JpdGVyLlxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZUphdmFTY3JpcHQobW9kdWxlLCB3cml0ZXIpIHtcbiAgY29uc3QgY2Fub25pY2FsaXplWmVybyA9IHJlcXVpcmVzQ2Fub25pY2FsWmVyb1JlbmRlcmluZyhtb2R1bGUpXG5cbiAgbW9kdWxlLmZ1bmN0aW9ucy5mb3JFYWNoKChkZWNsYXJhdGlvbiwgZnVuY3Rpb25JbmRleCkgPT4ge1xuICAgIGlmIChmdW5jdGlvbkluZGV4ID4gMCkgd3JpdGVyLnN5bnRoZXRpYyhcIlxcblxcblwiLCBcImRlY2xhcmF0aW9uIHNlcGFyYXRvclwiLCBbZGVjbGFyYXRpb25dKVxuXG4gICAgd3JpdGVyLnN5bnRoZXRpYyhcIi8qKlxcbiAqIEdlbmVyYXRlZCBzZW1hbnRpYyBmdW5jdGlvbi5cXG5cIiwgXCJKYXZhU2NyaXB0IHR5cGUgc2NhZmZvbGRpbmdcIiwgW2RlY2xhcmF0aW9uXSlcbiAgICBmb3IgKGNvbnN0IFtwYXJhbWV0ZXJJbmRleCwgcGFyYW1ldGVyXSBvZiBkZWNsYXJhdGlvbi5wYXJhbWV0ZXJzLmVudHJpZXMoKSkge1xuICAgICAgY29uc3QgcGFyYW1ldGVyUGF0aCA9IGAvZnVuY3Rpb25zLyR7ZnVuY3Rpb25JbmRleH0vcGFyYW1ldGVycy8ke3BhcmFtZXRlckluZGV4fWBcblxuICAgICAgd3JpdGVyLnN5bnRoZXRpYyhcIiAqIEBwYXJhbSB7XCIsIFwiSmF2YVNjcmlwdCB0eXBlIHNjYWZmb2xkaW5nXCIsIFtwYXJhbWV0ZXJdLCBbcGFyYW1ldGVyUGF0aF0pXG4gICAgICB3cml0ZXIubWFwcGVkKGVtaXRTY2FsYXJUeXBlKFwiamF2YXNjcmlwdFwiLCBwYXJhbWV0ZXIudHlwZSksIHtcbiAgICAgICAgbWFwcGluZ0tpbmQ6IFwiZXhhY3RcIixcbiAgICAgICAgbm9kZTogcGFyYW1ldGVyLnR5cGUsXG4gICAgICAgIHBhdGg6IGAke3BhcmFtZXRlclBhdGh9L3R5cGVgLFxuICAgICAgICByb2xlOiBcInR5cGVcIlxuICAgICAgfSlcbiAgICAgIHdyaXRlci5zeW50aGV0aWMoXCJ9IFwiLCBcIkphdmFTY3JpcHQgdHlwZSBzY2FmZm9sZGluZ1wiLCBbcGFyYW1ldGVyXSwgW3BhcmFtZXRlclBhdGhdKVxuICAgICAgd3JpdGVyLm1hcHBlZChwYXJhbWV0ZXIubmFtZSwge21hcHBpbmdLaW5kOiBcImV4YWN0XCIsIG5vZGU6IHBhcmFtZXRlciwgcGF0aDogcGFyYW1ldGVyUGF0aCwgcm9sZTogXCJuYW1lXCJ9KVxuICAgICAgd3JpdGVyLnN5bnRoZXRpYyhcIiAtIFNlbWFudGljIHBhcmFtZXRlci5cXG5cIiwgXCJKYXZhU2NyaXB0IHR5cGUgc2NhZmZvbGRpbmdcIiwgW3BhcmFtZXRlcl0sIFtwYXJhbWV0ZXJQYXRoXSlcbiAgICB9XG4gICAgd3JpdGVyLnN5bnRoZXRpYyhcIiAqIEByZXR1cm5zIHtcIiwgXCJKYXZhU2NyaXB0IHR5cGUgc2NhZmZvbGRpbmdcIiwgW2RlY2xhcmF0aW9uXSlcbiAgICB3cml0ZXIubWFwcGVkKGVtaXRTY2FsYXJUeXBlKFwiamF2YXNjcmlwdFwiLCBkZWNsYXJhdGlvbi5yZXR1cm5UeXBlKSwge1xuICAgICAgbWFwcGluZ0tpbmQ6IFwiZXhhY3RcIixcbiAgICAgIG5vZGU6IGRlY2xhcmF0aW9uLnJldHVyblR5cGUsXG4gICAgICBwYXRoOiBgL2Z1bmN0aW9ucy8ke2Z1bmN0aW9uSW5kZXh9L3JldHVyblR5cGVgLFxuICAgICAgcm9sZTogXCJ0eXBlXCJcbiAgICB9KVxuICAgIHdyaXRlci5zeW50aGV0aWMoXCJ9IFNlbWFudGljIHJlc3VsdC5cXG4gKi9cXG5cIiwgXCJKYXZhU2NyaXB0IHR5cGUgc2NhZmZvbGRpbmdcIiwgW2RlY2xhcmF0aW9uXSlcbiAgICB3cml0ZXIubWFwcGVkKFwiZnVuY3Rpb25cIiwge21hcHBpbmdLaW5kOiBcImFuY2hvclwiLCBub2RlOiBkZWNsYXJhdGlvbn0pXG4gICAgd3JpdGVyLnN5bnRoZXRpYyhcIiBcIiwgXCJmdW5jdGlvbiBzcGFjaW5nXCIsIFtkZWNsYXJhdGlvbl0pXG4gICAgd3JpdGVyLm1hcHBlZChkZWNsYXJhdGlvbi5uYW1lLCB7bWFwcGluZ0tpbmQ6IFwiZXhhY3RcIiwgbm9kZTogZGVjbGFyYXRpb24sIHJvbGU6IFwibmFtZVwifSlcbiAgICB3cml0ZXIubWFwcGVkKFwiKFwiLCB7bWFwcGluZ0tpbmQ6IFwiYW5jaG9yXCIsIG5vZGU6IGRlY2xhcmF0aW9ufSlcbiAgICBkZWNsYXJhdGlvbi5wYXJhbWV0ZXJzLmZvckVhY2goKHBhcmFtZXRlciwgaW5kZXgpID0+IHtcbiAgICAgIGlmIChpbmRleCA+IDApIHdyaXRlci5zeW50aGV0aWMoXCIsIFwiLCBcInBhcmFtZXRlciBzZXBhcmF0b3JcIiwgW2RlY2xhcmF0aW9uXSlcbiAgICAgIHdyaXRlci5tYXBwZWQocGFyYW1ldGVyLm5hbWUsIHtcbiAgICAgICAgbWFwcGluZ0tpbmQ6IFwiZXhhY3RcIixcbiAgICAgICAgbm9kZTogcGFyYW1ldGVyLFxuICAgICAgICBwYXRoOiBgL2Z1bmN0aW9ucy8ke2Z1bmN0aW9uSW5kZXh9L3BhcmFtZXRlcnMvJHtpbmRleH1gLFxuICAgICAgICByb2xlOiBcIm5hbWVcIlxuICAgICAgfSlcbiAgICB9KVxuICAgIHdyaXRlci5tYXBwZWQoXCIpXCIsIHttYXBwaW5nS2luZDogXCJhbmNob3JcIiwgbm9kZTogZGVjbGFyYXRpb259KVxuICAgIHdyaXRlci5zeW50aGV0aWMoXCIgXCIsIFwiZnVuY3Rpb24gc3BhY2luZ1wiLCBbZGVjbGFyYXRpb25dKVxuICAgIHdyaXRlci5tYXBwZWQoXCJ7XCIsIHttYXBwaW5nS2luZDogXCJhbmNob3JcIiwgbm9kZTogZGVjbGFyYXRpb259KVxuICAgIHdyaXRlci5zeW50aGV0aWMoXCJcXG5cIiwgXCJsaW5lIGJyZWFrXCIsIFtkZWNsYXJhdGlvbl0pXG5cbiAgICBlbWl0QmxvY2sod3JpdGVyLCBkZWNsYXJhdGlvbi5ib2R5LCBcIiAgXCIsIGAvZnVuY3Rpb25zLyR7ZnVuY3Rpb25JbmRleH0vYm9keWAsIGNhbm9uaWNhbGl6ZVplcm8pXG4gICAgd3JpdGVyLm1hcHBlZChcIn1cIiwge21hcHBpbmdLaW5kOiBcImFuY2hvclwiLCBub2RlOiBkZWNsYXJhdGlvbn0pXG4gIH0pXG5cbiAgd3JpdGVyLnN5bnRoZXRpYyhcIlxcblxcblwiLCBcImVudHJ5LXBvaW50IHNlcGFyYXRvclwiLCBbbW9kdWxlLmVudHJ5UG9pbnRdKVxuICBlbWl0QmxvY2sod3JpdGVyLCBtb2R1bGUuZW50cnlQb2ludC5ib2R5LCBcIlwiLCBcIi9lbnRyeVBvaW50L2JvZHlcIiwgY2Fub25pY2FsaXplWmVybylcbn1cblxuLyoqXG4gKiBFbWl0cyBvbmUgb3JkZXJlZCBKYXZhU2NyaXB0IGJsb2NrIGJvZHkuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vd3JpdGVyLmpzXCIpLlNvdXJjZVdyaXRlcn0gd3JpdGVyIC0gU291cmNlLWF3YXJlIHdyaXRlci5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuQmxvY2t9IGJsb2NrIC0gU2VtYW50aWMgYmxvY2suXG4gKiBAcGFyYW0ge3N0cmluZ30gaW5kZW50IC0gSW5kZW50YXRpb24uXG4gKiBAcGFyYW0ge3N0cmluZ30gYmxvY2tQYXRoIC0gRXhhY3QgSlNPTiBQb2ludGVyIGZvciB0aGUgYmxvY2suXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGNhbm9uaWNhbGl6ZVplcm8gLSBXaGV0aGVyIHByaW50ZWQgaW50ZWdlciB6ZXJvIG11c3QgYmUgY2Fub25pY2FsaXplZC5cbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5mdW5jdGlvbiBlbWl0QmxvY2sod3JpdGVyLCBibG9jaywgaW5kZW50LCBibG9ja1BhdGgsIGNhbm9uaWNhbGl6ZVplcm8pIHtcbiAgYmxvY2suc3RhdGVtZW50cy5mb3JFYWNoKChzdGF0ZW1lbnQsIGluZGV4KSA9PiBlbWl0U3RhdGVtZW50KFxuICAgIHdyaXRlciwgc3RhdGVtZW50LCBpbmRlbnQsIGAke2Jsb2NrUGF0aH0vc3RhdGVtZW50cy8ke2luZGV4fWAsIGNhbm9uaWNhbGl6ZVplcm9cbiAgKSlcbn1cblxuLyoqXG4gKiBFbWl0cyBvbmUgSmF2YVNjcmlwdCBzdGF0ZW1lbnQuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vd3JpdGVyLmpzXCIpLlNvdXJjZVdyaXRlcn0gd3JpdGVyIC0gU291cmNlLWF3YXJlIHdyaXRlci5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU3RhdGVtZW50fSBzdGF0ZW1lbnQgLSBTZW1hbnRpYyBzdGF0ZW1lbnQuXG4gKiBAcGFyYW0ge3N0cmluZ30gaW5kZW50IC0gSW5kZW50YXRpb24uXG4gKiBAcGFyYW0ge3N0cmluZ30gcGF0aCAtIEV4YWN0IHN0YXRlbWVudCBwYXRoLlxuICogQHBhcmFtIHtib29sZWFufSBjYW5vbmljYWxpemVaZXJvIC0gV2hldGhlciBwcmludGVkIGludGVnZXIgemVybyBtdXN0IGJlIGNhbm9uaWNhbGl6ZWQuXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZnVuY3Rpb24gZW1pdFN0YXRlbWVudCh3cml0ZXIsIHN0YXRlbWVudCwgaW5kZW50LCBwYXRoLCBjYW5vbmljYWxpemVaZXJvKSB7XG4gIGlmIChzdGF0ZW1lbnQua2luZCA9PSBcIkxvY2FsRGVjbGFyYXRpb25cIiB8fCBzdGF0ZW1lbnQua2luZCA9PSBcIkFzc2lnbm1lbnRTdGF0ZW1lbnRcIikgcmV0dXJuIGVtaXRMb2NhbCh3cml0ZXIsIHN0YXRlbWVudCwgaW5kZW50LCBwYXRoKVxuXG4gIHdyaXRlci5zeW50aGV0aWMoaW5kZW50LCBcImluZGVudGF0aW9uXCIsIFtzdGF0ZW1lbnRdLCBbcGF0aF0pXG4gIGlmIChzdGF0ZW1lbnQua2luZCA9PSBcIlJldHVyblN0YXRlbWVudFwiKSB7XG4gICAgd3JpdGVyLm1hcHBlZChcInJldHVyblwiLCB7bWFwcGluZ0tpbmQ6IFwiYW5jaG9yXCIsIG5vZGU6IHN0YXRlbWVudCwgcGF0aH0pXG4gICAgd3JpdGVyLnN5bnRoZXRpYyhcIiBcIiwgXCJyZXR1cm4gc3BhY2luZ1wiLCBbc3RhdGVtZW50XSwgW3BhdGhdKVxuICAgIGVtaXRFeHByZXNzaW9uKHdyaXRlciwgc3RhdGVtZW50LmV4cHJlc3Npb24sIGAke3BhdGh9L2V4cHJlc3Npb25gLCBcImphdmFzY3JpcHRcIiwgaWRlbnRpdHkpXG4gICAgd3JpdGVyLnN5bnRoZXRpYyhcIlxcblwiLCBcImxpbmUgYnJlYWtcIiwgW3N0YXRlbWVudF0sIFtwYXRoXSlcbiAgICByZXR1cm5cbiAgfVxuICBpZiAoc3RhdGVtZW50LmtpbmQgPT0gXCJQcmludFN0YXRlbWVudFwiKSB7XG4gICAgd3JpdGVyLm1hcHBlZChcImNvbnNvbGUubG9nXCIsIHttYXBwaW5nS2luZDogXCJhbmNob3JcIiwgbm9kZTogc3RhdGVtZW50LCBwYXRofSlcbiAgICB3cml0ZXIubWFwcGVkKFwiKFwiLCB7bWFwcGluZ0tpbmQ6IFwiYW5jaG9yXCIsIG5vZGU6IHN0YXRlbWVudCwgcGF0aH0pXG4gICAgaWYgKGNhbm9uaWNhbGl6ZVplcm8pIHdyaXRlci5zeW50aGV0aWMoXCIoXCIsIFwiY2Fub25pY2FsIGludGVnZXIgb3V0cHV0XCIsIFtzdGF0ZW1lbnRdLCBbcGF0aF0pXG4gICAgZW1pdEV4cHJlc3Npb24od3JpdGVyLCBzdGF0ZW1lbnQuZXhwcmVzc2lvbiwgYCR7cGF0aH0vZXhwcmVzc2lvbmAsIFwiamF2YXNjcmlwdFwiLCBpZGVudGl0eSlcbiAgICBpZiAoY2Fub25pY2FsaXplWmVybykgd3JpdGVyLnN5bnRoZXRpYyhcIikudG9TdHJpbmcoKVwiLCBcImNhbm9uaWNhbCBpbnRlZ2VyIG91dHB1dFwiLCBbc3RhdGVtZW50XSwgW3BhdGhdKVxuICAgIHdyaXRlci5tYXBwZWQoXCIpXCIsIHttYXBwaW5nS2luZDogXCJhbmNob3JcIiwgbm9kZTogc3RhdGVtZW50LCBwYXRofSlcbiAgICB3cml0ZXIuc3ludGhldGljKFwiXFxuXCIsIFwibGluZSBicmVha1wiLCBbc3RhdGVtZW50XSwgW3BhdGhdKVxuICAgIHJldHVyblxuICB9XG5cbiAgd3JpdGVyLm1hcHBlZChcImlmXCIsIHttYXBwaW5nS2luZDogXCJhbmNob3JcIiwgbm9kZTogc3RhdGVtZW50LCBwYXRofSlcbiAgd3JpdGVyLnN5bnRoZXRpYyhcIiBcIiwgXCJjb25kaXRpb25hbCBzcGFjaW5nXCIsIFtzdGF0ZW1lbnRdLCBbcGF0aF0pXG4gIHdyaXRlci5tYXBwZWQoXCIoXCIsIHttYXBwaW5nS2luZDogXCJhbmNob3JcIiwgbm9kZTogc3RhdGVtZW50LCBwYXRofSlcbiAgZW1pdEV4cHJlc3Npb24od3JpdGVyLCBzdGF0ZW1lbnQuY29uZGl0aW9uLCBgJHtwYXRofS9jb25kaXRpb25gLCBcImphdmFzY3JpcHRcIiwgaWRlbnRpdHkpXG4gIHdyaXRlci5tYXBwZWQoXCIpXCIsIHttYXBwaW5nS2luZDogXCJhbmNob3JcIiwgbm9kZTogc3RhdGVtZW50LCBwYXRofSlcbiAgd3JpdGVyLnN5bnRoZXRpYyhcIiBcIiwgXCJjb25kaXRpb25hbCBzcGFjaW5nXCIsIFtzdGF0ZW1lbnRdLCBbcGF0aF0pXG4gIHdyaXRlci5tYXBwZWQoXCJ7XCIsIHttYXBwaW5nS2luZDogXCJhbmNob3JcIiwgbm9kZTogc3RhdGVtZW50LmNvbnNlcXVlbnQsIHBhdGg6IGAke3BhdGh9L2NvbnNlcXVlbnRgfSlcbiAgd3JpdGVyLnN5bnRoZXRpYyhcIlxcblwiLCBcImxpbmUgYnJlYWtcIiwgW3N0YXRlbWVudF0sIFtwYXRoXSlcbiAgZW1pdEJsb2NrKHdyaXRlciwgc3RhdGVtZW50LmNvbnNlcXVlbnQsIGAke2luZGVudH0gIGAsIGAke3BhdGh9L2NvbnNlcXVlbnRgLCBjYW5vbmljYWxpemVaZXJvKVxuICB3cml0ZXIuc3ludGhldGljKGluZGVudCwgXCJpbmRlbnRhdGlvblwiLCBbc3RhdGVtZW50XSwgW3BhdGhdKVxuICB3cml0ZXIubWFwcGVkKFwifVwiLCB7bWFwcGluZ0tpbmQ6IFwiYW5jaG9yXCIsIG5vZGU6IHN0YXRlbWVudC5jb25zZXF1ZW50LCBwYXRoOiBgJHtwYXRofS9jb25zZXF1ZW50YH0pXG4gIGlmIChzdGF0ZW1lbnQuYWx0ZXJuYXRlKSB7XG4gICAgd3JpdGVyLnN5bnRoZXRpYyhcIiBcIiwgXCJjb25kaXRpb25hbCBzcGFjaW5nXCIsIFtzdGF0ZW1lbnRdLCBbcGF0aF0pXG4gICAgd3JpdGVyLm1hcHBlZChcImVsc2VcIiwge21hcHBpbmdLaW5kOiBcImFuY2hvclwiLCBub2RlOiBzdGF0ZW1lbnQsIHBhdGh9KVxuICAgIHdyaXRlci5zeW50aGV0aWMoXCIgXCIsIFwiY29uZGl0aW9uYWwgc3BhY2luZ1wiLCBbc3RhdGVtZW50XSwgW3BhdGhdKVxuICAgIHdyaXRlci5tYXBwZWQoXCJ7XCIsIHttYXBwaW5nS2luZDogXCJhbmNob3JcIiwgbm9kZTogc3RhdGVtZW50LmFsdGVybmF0ZSwgcGF0aDogYCR7cGF0aH0vYWx0ZXJuYXRlYH0pXG4gICAgd3JpdGVyLnN5bnRoZXRpYyhcIlxcblwiLCBcImxpbmUgYnJlYWtcIiwgW3N0YXRlbWVudF0sIFtwYXRoXSlcbiAgICBlbWl0QmxvY2sod3JpdGVyLCBzdGF0ZW1lbnQuYWx0ZXJuYXRlLCBgJHtpbmRlbnR9ICBgLCBgJHtwYXRofS9hbHRlcm5hdGVgLCBjYW5vbmljYWxpemVaZXJvKVxuICAgIHdyaXRlci5zeW50aGV0aWMoaW5kZW50LCBcImluZGVudGF0aW9uXCIsIFtzdGF0ZW1lbnRdLCBbcGF0aF0pXG4gICAgd3JpdGVyLm1hcHBlZChcIn1cIiwge21hcHBpbmdLaW5kOiBcImFuY2hvclwiLCBub2RlOiBzdGF0ZW1lbnQuYWx0ZXJuYXRlLCBwYXRoOiBgJHtwYXRofS9hbHRlcm5hdGVgfSlcbiAgfVxuICB3cml0ZXIuc3ludGhldGljKFwiXFxuXCIsIFwibGluZSBicmVha1wiLCBbc3RhdGVtZW50XSwgW3BhdGhdKVxufVxuXG4vKipcbiAqIEVtaXRzIG9uZSBKYXZhU2NyaXB0IGxvY2FsIHN0YXRlbWVudCBhbmQgaXRzIEpTRG9jIHR5cGUgY2Fycmllci5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi93cml0ZXIuanNcIikuU291cmNlV3JpdGVyfSB3cml0ZXIgLSBTb3VyY2UtYXdhcmUgd3JpdGVyLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5Mb2NhbFN0YXRlbWVudH0gc3RhdGVtZW50IC0gTG9jYWwgc3RhdGVtZW50LlxuICogQHBhcmFtIHtzdHJpbmd9IGluZGVudCAtIExlYWRpbmcgaW5kZW50YXRpb24uXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RhdGVtZW50UGF0aCAtIEV4YWN0IEpTT04gUG9pbnRlciBmb3IgdGhpcyBzdGF0ZW1lbnQgb2NjdXJyZW5jZS5cbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5mdW5jdGlvbiBlbWl0TG9jYWwod3JpdGVyLCBzdGF0ZW1lbnQsIGluZGVudCwgc3RhdGVtZW50UGF0aCkge1xuICB3cml0ZXIuc3ludGhldGljKGluZGVudCwgXCJpbmRlbnRhdGlvblwiLCBbc3RhdGVtZW50XSwgW3N0YXRlbWVudFBhdGhdKVxuXG4gIGlmIChzdGF0ZW1lbnQua2luZCA9PSBcIkFzc2lnbm1lbnRTdGF0ZW1lbnRcIikge1xuICAgIHdyaXRlci5tYXBwZWQoc3RhdGVtZW50LnRhcmdldC5uYW1lLCB7bWFwcGluZ0tpbmQ6IFwiZXhhY3RcIiwgbm9kZTogc3RhdGVtZW50LnRhcmdldCwgcGF0aDogYCR7c3RhdGVtZW50UGF0aH0vdGFyZ2V0YCwgcm9sZTogXCJuYW1lXCJ9KVxuICAgIHdyaXRlci5zeW50aGV0aWMoXCIgXCIsIFwiYXNzaWdubWVudCBzcGFjaW5nXCIsIFtzdGF0ZW1lbnRdLCBbc3RhdGVtZW50UGF0aF0pXG4gICAgd3JpdGVyLm1hcHBlZChcIj1cIiwge21hcHBpbmdLaW5kOiBcImV4YWN0XCIsIG5vZGU6IHN0YXRlbWVudCwgcGF0aDogc3RhdGVtZW50UGF0aCwgcm9sZTogXCJvcGVyYXRvclwifSlcbiAgICB3cml0ZXIuc3ludGhldGljKFwiIFwiLCBcImFzc2lnbm1lbnQgc3BhY2luZ1wiLCBbc3RhdGVtZW50XSwgW3N0YXRlbWVudFBhdGhdKVxuICAgIGVtaXRFeHByZXNzaW9uKHdyaXRlciwgc3RhdGVtZW50LmV4cHJlc3Npb24sIGAke3N0YXRlbWVudFBhdGh9L2V4cHJlc3Npb25gLCBcImphdmFzY3JpcHRcIiwgaWRlbnRpdHkpXG4gICAgd3JpdGVyLnN5bnRoZXRpYyhcIlxcblwiLCBcImxpbmUgYnJlYWtcIiwgW3N0YXRlbWVudF0sIFtzdGF0ZW1lbnRQYXRoXSlcbiAgICByZXR1cm5cbiAgfVxuXG4gIHdyaXRlci5zeW50aGV0aWMoXCIvKiogQHR5cGUge1wiLCBcIkphdmFTY3JpcHQgbG9jYWwgdHlwZSBzY2FmZm9sZGluZ1wiLCBbc3RhdGVtZW50XSwgW3N0YXRlbWVudFBhdGhdKVxuICB3cml0ZXIubWFwcGVkKGVtaXRTY2FsYXJUeXBlKFwiamF2YXNjcmlwdFwiLCBzdGF0ZW1lbnQudHlwZSksIHtcbiAgICBtYXBwaW5nS2luZDogXCJleGFjdFwiLFxuICAgIG5vZGU6IHN0YXRlbWVudC50eXBlLFxuICAgIHBhdGg6IGAke3N0YXRlbWVudFBhdGh9L3R5cGVgLFxuICAgIHJvbGU6IFwidHlwZVwiXG4gIH0pXG4gIHdyaXRlci5zeW50aGV0aWMoXCJ9ICovXFxuXCIsIFwiSmF2YVNjcmlwdCBsb2NhbCB0eXBlIHNjYWZmb2xkaW5nXCIsIFtzdGF0ZW1lbnRdLCBbc3RhdGVtZW50UGF0aF0pXG4gIHdyaXRlci5zeW50aGV0aWMoaW5kZW50LCBcImluZGVudGF0aW9uXCIsIFtzdGF0ZW1lbnRdLCBbc3RhdGVtZW50UGF0aF0pXG4gIHdyaXRlci5tYXBwZWQoc3RhdGVtZW50Lm11dGFibGUgPyBcImxldFwiIDogXCJjb25zdFwiLCB7bWFwcGluZ0tpbmQ6IFwiYW5jaG9yXCIsIG5vZGU6IHN0YXRlbWVudCwgcGF0aDogc3RhdGVtZW50UGF0aH0pXG4gIHdyaXRlci5zeW50aGV0aWMoXCIgXCIsIFwiZGVjbGFyYXRpb24gc3BhY2luZ1wiLCBbc3RhdGVtZW50XSwgW3N0YXRlbWVudFBhdGhdKVxuICB3cml0ZXIubWFwcGVkKHN0YXRlbWVudC5uYW1lLCB7bWFwcGluZ0tpbmQ6IFwiZXhhY3RcIiwgbm9kZTogc3RhdGVtZW50LCBwYXRoOiBzdGF0ZW1lbnRQYXRoLCByb2xlOiBcIm5hbWVcIn0pXG4gIHdyaXRlci5zeW50aGV0aWMoXCIgXCIsIFwiYXNzaWdubWVudCBzcGFjaW5nXCIsIFtzdGF0ZW1lbnRdLCBbc3RhdGVtZW50UGF0aF0pXG4gIHdyaXRlci5tYXBwZWQoXCI9XCIsIHttYXBwaW5nS2luZDogXCJleGFjdFwiLCBub2RlOiBzdGF0ZW1lbnQsIHBhdGg6IHN0YXRlbWVudFBhdGgsIHJvbGU6IFwib3BlcmF0b3JcIn0pXG4gIHdyaXRlci5zeW50aGV0aWMoXCIgXCIsIFwiYXNzaWdubWVudCBzcGFjaW5nXCIsIFtzdGF0ZW1lbnRdLCBbc3RhdGVtZW50UGF0aF0pXG4gIGVtaXRFeHByZXNzaW9uKHdyaXRlciwgc3RhdGVtZW50LmluaXRpYWxpemVyLCBgJHtzdGF0ZW1lbnRQYXRofS9pbml0aWFsaXplcmAsIFwiamF2YXNjcmlwdFwiLCBpZGVudGl0eSlcbiAgd3JpdGVyLnN5bnRoZXRpYyhcIlxcblwiLCBcImxpbmUgYnJlYWtcIiwgW3N0YXRlbWVudF0sIFtzdGF0ZW1lbnRQYXRoXSlcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGFuIHVuY2hhbmdlZCBKYXZhU2NyaXB0IGlkZW50aWZpZXIuXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIElkZW50aWZpZXIuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBJZGVudGlmaWVyLlxuICovXG5mdW5jdGlvbiBpZGVudGl0eShuYW1lKSB7XG4gIHJldHVybiBuYW1lXG59XG4iXX0=
|
|
529
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiamF2YXNjcmlwdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9iYWNrZW5kcy9qYXZhc2NyaXB0LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLEVBQUMsY0FBYyxFQUFFLFFBQVEsRUFBRSw4QkFBOEIsRUFBQyxNQUFNLGFBQWEsQ0FBQTtBQUNwRixPQUFPLEVBQUMsa0JBQWtCLEVBQUUsaUJBQWlCLEVBQUMsTUFBTSxjQUFjLENBQUE7QUFFbEU7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsa0JBQWtCLENBQUMsTUFBTSxFQUFFLE1BQU07SUFDL0MsTUFBTSxnQkFBZ0IsR0FBRyw4QkFBOEIsQ0FBQyxNQUFNLENBQUMsQ0FBQTtJQUMvRCxNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsT0FBTyxJQUFJLEVBQUUsQ0FBQTtJQUNwQyxNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsT0FBTyxJQUFJLEVBQUUsQ0FBQTtJQUNwQyxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxJQUFJLEVBQUUsQ0FBQTtJQUVsQyxrQkFBa0IsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUE7SUFDbEMsaUJBQWlCLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxZQUFZLENBQUMsQ0FBQTtJQUUvQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxFQUFFLFVBQVUsRUFBRSxFQUFFO1FBQ25DLE1BQU0sSUFBSSxHQUFHLFdBQVcsVUFBVSxFQUFFLENBQUE7UUFFcEMsSUFBSSxVQUFVLEdBQUcsQ0FBQztZQUFFLE1BQU0sQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLDZCQUE2QixFQUFFLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFBO1FBQzVGLElBQUksTUFBTSxDQUFDLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFBRSxNQUFNLENBQUMsU0FBUyxDQUFD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WUFDL0QsTUFBTSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsMENBQTBDLEVBQUUsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUE7WUFDeEYsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLEVBQUMsV0FBVyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBQyxDQUFDLENBQUE7WUFDN0YsTUFBTSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsWUFBWSxFQUFFLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFBO1FBQzVELENBQUMsQ0FBQyxDQUFBO1FBQ0YsTUFBTSxDQUFDLFNBQVMsQ0FBQyx1QkFBdUIsRUFBRSwyQ0FBMkMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQTtRQUM5RyxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssRUFBRSxVQUFVLEVBQUUsRUFBRTtZQUMxQyxJQUFJLFVBQVU7Z0JBQUUsTUFBTSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsd0JBQXdCLEVBQUUsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUE7WUFDeEYsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLEVBQUMsV0FBVyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxHQUFHLFVBQVUsV0FBVyxVQUFVLEVBQUUsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFDLENBQUMsQ0FBQTtRQUMxSCxDQUFDLENBQUMsQ0FBQTtRQUNGLE1BQU0sQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLDJDQUEyQyxFQUFFLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFBO1FBQzlGLE1BQU0s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QyxTQUFTLENBQUMsSUFBSSxFQUFFLEVBQUMsV0FBVyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxhQUFhLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBQyxDQUFDLENBQUE7SUFDekcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsb0JBQW9CLEVBQUUsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUE7SUFDekUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsRUFBQyxXQUFXLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLGFBQWEsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFDLENBQUMsQ0FBQTtJQUNsRyxNQUFNLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxvQkFBb0IsRUFBRSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQTtJQUN6RSxjQUFjLENBQUMsTUFBTSxFQUFFLFNBQVMsQ0FBQyxXQUFXLEVBQUUsR0FBRyxhQUFhLGNBQWMsRUFBRSxZQUFZLEVBQUUsUUFBUSxDQUFDLENBQUE7SUFDckcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsWUFBWSxFQUFFLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFBO0FBQ3BFLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBUyxRQUFRLENBQUMsSUFBSTtJQUNwQixPQUFPLElBQUksQ0FBQTtBQUNiLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0IHtlbWl0RXhwcmVzc2lvbiwgZW1pdFR5cGUsIHJlcXVpcmVzQ2Fub25pY2FsWmVyb1JlbmRlcmluZ30gZnJvbSBcIi4vc2hhcmVkLmpzXCJcbmltcG9ydCB7ZW1pdEVmZmVjdFByZWZpeGVzLCBlbWl0RWZmZWN0U3VwcG9ydH0gZnJvbSBcIi4vZWZmZWN0cy5qc1wiXG5cbi8qKlxuICogRW1pdHMgYW4gaW5kZXBlbmRlbnRseSBleGVjdXRhYmxlIEphdmFTY3JpcHQgcHJvZ3JhbSB3aXRoIEpTRG9jIHR5cGVzLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY01vZHVsZX0gbW9kdWxlIC0gU2VtYW50aWMgbW9kdWxlLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3dyaXRlci5qc1wiKS5Tb3VyY2VXcml0ZXJ9IHdyaXRlciAtIFNvdXJjZS1hd2FyZSB3cml0ZXIuXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlSmF2YVNjcmlwdChtb2R1bGUsIHdyaXRlcikge1xuICBjb25zdCBjYW5vbmljYWxpemVaZXJvID0gcmVxdWlyZXNDYW5vbmljYWxaZXJvUmVuZGVyaW5nKG1vZHVsZSlcbiAgY29uc3QgcmVjb3JkcyA9IG1vZHVsZS5yZWNvcmRzID8/IFtdXG4gIGNvbnN0IGNsYXNzZXMgPSBtb2R1bGUuY2xhc3NlcyA/PyBbXVxuICBjb25zdCBlcnJvcnMgPSBtb2R1bGUuZXJyb3JzID8/IFtdXG5cbiAgZW1pdFByb2dyYW1JbXBvcnRzKG1vZHVsZSwgd3JpdGVyKVxuICBlbWl0RWZmZWN0U3VwcG9ydCh3cml0ZXIsIG1vZHVsZSwgXCJqYXZhc2NyaXB0XCIpXG5cbiAgZXJyb3JzLmZvckVhY2goKGVycm9yLCBlcnJvckluZGV4KSA9PiB7XG4gICAgY29uc3QgcGF0aCA9IGAvZXJyb3JzLyR7ZXJyb3JJbmRleH1gXG5cbiAgICBpZiAoZXJyb3JJbmRleCA+IDApIHdyaXRlci5zeW50aGV0aWMoXCJcXG5cXG5cIiwgXCJlcnJvciBkZWNsYXJhdGlvbiBzZXBhcmF0b3JcIiwgW2Vycm9yXSwgW3BhdGhdKVxuICAgIGlmICh3cml0ZXIuaXNEaXJlY3RseUV4cG9ydGVkKGVycm9yLmlkKSkgd3JpdGVyLnN5bnRoZXRpYyhcImV4cG9ydCBcIiwgXCJFU00gZXJyb3IgZXhwb3J0XCIsIFtlcnJvcl0sIFtwYXRoXSlcbiAgICB3cml0ZXIubWFwcGVkKFwiY2xhc3NcIiwge21hcHBpbmdLaW5kOiBcImFuY2hvclwiLCBub2RlOiBlcnJvciwgcGF0aH0pXG4gICAgd3JpdGVyLnN5bnRoZXRpYyhcIiBcIiwgXCJlcnJvciBkZWNsYXJhdGlvbiBzcGFjaW5nXCIsIFtlcnJvcl0sIFtwYXRoXSlcbiAgICB3cml0ZXIubWFwcGVkKGVycm9yLm5hbWUsIHttYXBwaW5nS2luZDogXCJleGFjdFwiLCBub2RlOiBlcnJvciwgcGF0aCwgcm9sZTogXCJuYW1lXCJ9KVxuICAgIHdyaXRlci5zeW50aGV0aWMoXCIgZXh0ZW5kcyBFcnJvciB7fVwiLCBcIkphdmFTY3JpcHQgdW5jaGVja2VkIGVycm9yIHNjYWZmb2xkaW5nXCIsIFtlcnJvcl0sIFtwYXRoXSlcbiAgfSlcbiAgaWYgKGVycm9ycy5sZW5ndGggPiAwKSB3cml0ZXIuc3ludGhldGljKFwiXFxuXFxuXCIsIFwiZXJyb3IvZGVjbGFyYXRpb24gc2VwYXJhdG9yXCIsIFttb2R1bGVdKVxuXG4gIHJlY29yZHMuZm9yRWFjaCgocmVjb3JkLCByZWNvcmRJbmRleCkgPT4ge1xuICAgIGNvbnN0IHJlY29yZFBhdGggPSBgL3JlY29yZHMvJHtyZWNvcmRJbmRleH1gXG5cbiAgICBpZiAocmVjb3JkSW5kZXggPiAwKSB3cml0ZXIuc3ludGhldGljKFwiXFxuXFxuXCIsIFwicmVjb3JkIGRlY2xhcmF0aW9uIHNlcGFyYXRvclwiLCBbcmVjb3JkXSwgW3JlY29yZFBhdGhdKVxuICAgIGVtaXRUZW1wbGF0ZURvY3VtZW50YXRpb24od3JpdGVyLCByZWNvcmQudHlwZVBhcmFtZXRlcnMgPz8gW10sIGAke3JlY29yZFBhdGh9L3R5cGVQYXJhbWV0ZXJzYCwgXCJKYXZhU2NyaXB0XCIpXG4gICAgaWYgKHdyaXRlci5pc0RpcmVjdGx5RXhwb3J0ZWQocmVjb3JkLmlkKSkgd3JpdGVyLnN5bnRoZXRpYyhcImV4cG9ydCBcIiwgXCJFU00gcmVjb3JkIGV4cG9ydFwiLCBbcmVjb3JkXSwgW3JlY29yZFBhdGhdKVxuICAgIHdyaXRlci5tYXBwZWQoXCJjbGFzc1wiLCB7bWFwcGluZ0tpbmQ6IFwiYW5jaG9yXCIsIG5vZGU6IHJlY29yZCwgcGF0aDogcmVjb3JkUGF0aH0pXG4gICAgd3JpdGVyLnN5bnRoZXRpYyhcIiBcIiwgXCJyZWNvcmQgZGVjbGFyYXRpb24gc3BhY2luZ1wiLCBbcmVjb3JkXSwgW3JlY29yZFBhdGhdKVxuICAgIHdyaXRlci5tYXBwZWQocmVjb3JkLm5hbWUsIHttYXBwaW5nS2luZDogXCJleGFjdFwiLCBub2RlOiByZWNvcmQsIHBhdGg6IHJlY29yZFBhdGgsIHJvbGU6IFwibmFtZVwifSlcbiAgICB3cml0ZXIuc3ludGhldGljKFwiIHtcXG4gIC8qKlxcblwiLCBcIkphdmFTY3JpcHQgcmVjb3JkIGNvbnN0cnVjdG9yIHNjYWZmb2xkaW5nXCIsIFtyZWNvcmRdLCBbcmVjb3JkUGF0aF0pXG4gICAgcmVjb3JkLmZpZWxkcy5mb3JFYWNoKChmaWVsZCwgZmllbGRJbmRleCkgPT4ge1xuICAgICAgY29uc3QgZmllbGRQYXRoID0gYCR7cmVjb3JkUGF0aH0vZmllbGRzLyR7ZmllbGRJbmRleH1gXG5cbiAgICAgIHdyaXRlci5zeW50aGV0aWMoXCIgICAqIEBwYXJhbSB7XCIsIFwiSmF2YVNjcmlwdCByZWNvcmQgZmllbGQgdHlwZSBzY2FmZm9sZGluZ1wiLCBbZmllbGRdLCBbZmllbGRQYXRoXSlcbiAgICAgIGVtaXRUeXBlKHdyaXRlciwgZmllbGQudHlwZSwgYCR7ZmllbGRQYXRofS90eXBlYCwgXCJqYXZhc2NyaXB0XCIpXG4gICAgICB3cml0ZXIuc3ludGhldGljKFwifSBcIiwgXCJKYXZhU2NyaXB0IHJlY29yZCBmaWVsZCB0eXBlIHNjYWZmb2xkaW5nXCIsIFtmaWVsZF0sIFtmaWVsZFBhdGhdKVxuICAgICAgd3JpdGVyLm1hcHBlZChmaWVsZC5uYW1lLCB7bWFwcGluZ0tpbmQ6IFwiZXhhY3RcIiwgbm9kZTogZmllbGQsIHBhdGg6IGZpZWxkUGF0aCwgcm9sZTogXCJuYW1lXCJ9KVxuICAgICAgd3JpdGVyLnN5bnRoZXRpYyhcIlxcblwiLCBcImxpbmUgYnJlYWtcIiwgW2ZpZWxkXSwgW2ZpZWxkUGF0aF0pXG4gICAgfSlcbiAgICB3cml0ZXIuc3ludGhldGljKFwiICAgKi9cXG4gIGNvbnN0cnVjdG9yKFwiLCBcIkphdmFTY3JpcHQgcmVjb3JkIGNvbnN0cnVjdG9yIHNjYWZmb2xkaW5nXCIsIFtyZWNvcmRdLCBbcmVjb3JkUGF0aF0pXG4gICAgcmVjb3JkLmZpZWxkcy5mb3JFYWNoKChmaWVsZCwgZmllbGRJbmRleCkgPT4ge1xuICAgICAgaWYgKGZpZWxkSW5kZXgpIHdyaXRlci5zeW50aGV0aWMoXCIsIFwiLCBcInJlY29yZCBmaWVsZCBzZXBhcmF0b3JcIiwgW3JlY29yZF0sIFtyZWNvcmRQYXRoXSlcbiAgICAgIHdyaXRlci5tYXBwZWQoZmllbGQubmFtZSwge21hcHBpbmdLaW5kOiBcImV4YWN0XCIsIG5vZGU6IGZpZWxkLCBwYXRoOiBgJHtyZWNvcmRQYXRofS9maWVsZHMvJHtmaWVsZEluZGV4fWAsIHJvbGU6IFwibmFtZVwifSlcbiAgICB9KVxuICAgIHdyaXRlci5zeW50aGV0aWMoXCIpIHtcXG5cIiwgXCJKYXZhU2NyaXB0IHJlY29yZCBjb25zdHJ1Y3RvciBzY2FmZm9sZGluZ1wiLCBbcmVjb3JkXSwgW3JlY29yZFBhdGhdKVxuICAgIHJlY29yZC5maWVsZHMuZm9yRWFjaCgoZmllbGQsIGZpZWxkSW5kZXgpID0+IHtcbiAgICAgIGNvbnN0IGZpZWxkUGF0aCA9IGAke3JlY29yZFBhdGh9L2ZpZWxkcy8ke2ZpZWxkSW5kZXh9YFxuXG4gICAgICB3cml0ZXIuc3ludGhldGljKFwiICAgIC8qKiBAcmVhZG9ubHkgKi9cXG4gICAgdGhpcy5cIiwgXCJKYXZhU2NyaXB0IHJlYWRvbmx5IGZpZWxkIHNjYWZmb2xkaW5nXCIsIFtmaWVsZF0sIFtmaWVsZFBhdGhdKVxuICAgICAgd3JpdGVyLm1hcHBlZChmaWVsZC5uYW1lLCB7bWFwcGluZ0tpbmQ6IFwiZXhhY3RcIiwgbm9kZTogZmllbGQsIHBhdGg6IGZpZWxkUGF0aCwgcm9sZTogXCJuYW1lXCJ9KVxuICAgICAgd3JpdGVyLnN5bnRoZXRpYyhcIiA9IFwiLCBcIkphdmFTY3JpcHQgcmVjb3JkIGFzc2lnbm1lbnQgc2NhZmZvbGRpbmdcIiwgW2ZpZWxkXSwgW2ZpZWxkUGF0aF0pXG4gICAgICB3cml0ZXIubWFwcGVkKGZpZWxkLm5hbWUsIHttYXBwaW5nS2luZDogXCJleGFjdFwiLCBub2RlOiBmaWVsZCwgcGF0aDogZmllbGRQYXRoLCByb2xlOiBcIm5hbWVcIn0pXG4gICAgICB3cml0ZXIuc3ludGhldGljKFwiO1xcblwiLCBcIkphdmFTY3JpcHQgcmVjb3JkIGFzc2lnbm1lbnQgdGVybWluYXRvclwiLCBbZmllbGRdLCBbZmllbGRQYXRoXSlcbiAgICB9KVxuICAgIHdyaXRlci5zeW50aGV0aWMoXCIgICAgKHt9KS5jb25zdHJ1Y3Rvci5mcmVlemUodGhpcylcXG4gIH1cXG59XCIsIFwiSmF2YVNjcmlwdCByZWNvcmQgaW1tdXRhYmlsaXR5IHNjYWZmb2xkaW5nXCIsIFtyZWNvcmRdLCBbcmVjb3JkUGF0aF0pXG4gIH0pXG4gIGlmIChyZWNvcmRzLmxlbmd0aCA+IDApIHdyaXRlci5zeW50aGV0aWMoXCJcXG5cXG5cIiwgXCJyZWNvcmQvZnVuY3Rpb24gc2VwYXJhdG9yXCIsIFttb2R1bGVdKVxuXG4gIGNsYXNzZXMuZm9yRWFjaCgoZGVjbGFyYXRpb24sIGNsYXNzSW5kZXgpID0+IHtcbiAgICBpZiAoY2xhc3NJbmRleCA+IDApIHdyaXRlci5zeW50aGV0aWMoXCJcXG5cXG5cIiwgXCJyZWZlcmVuY2UgY2xhc3Mgc2VwYXJhdG9yXCIsIFtkZWNsYXJhdGlvbl0sIFtgL2NsYXNzZXMvJHtjbGFzc0luZGV4fWBdKVxuICAgIGVtaXRSZWZlcmVuY2VDbGFzcyh3cml0ZXIsIGRlY2xhcmF0aW9uLCBjbGFzc0luZGV4LCBjYW5vbmljYWxpemVaZXJvKVxuICB9KVxuICBpZiAoY2xhc3Nlcy5sZW5ndGggPiAwKSB3cml0ZXIuc3ludGhldGljKFwiXFxuXFxuXCIsIFwicmVmZXJlbmNlIGNsYXNzL2Z1bmN0aW9uIHNlcGFyYXRvclwiLCBbbW9kdWxlXSlcblxuICBtb2R1bGUuZnVuY3Rpb25zLmZvckVhY2goKGRlY2xhcmF0aW9uLCBmdW5jdGlvbkluZGV4KSA9PiB7XG4gICAgaWYgKGZ1bmN0aW9uSW5kZXggPiAwKSB3cml0ZXIuc3ludGhldGljKFwiXFxuXFxuXCIsIFwiZGVjbGFyYXRpb24gc2VwYXJhdG9yXCIsIFtkZWNsYXJhdGlvbl0pXG5cbiAgICB3cml0ZXIuc3ludGhldGljKFwiLyoqXFxuICogR2VuZXJhdGVkIHNlbWFudGljIGZ1bmN0aW9uLlxcblwiLCBcIkphdmFTY3JpcHQgdHlwZSBzY2FmZm9sZGluZ1wiLCBbZGVjbGFyYXRpb25dKVxuICAgIGZvciAoY29uc3QgW3BhcmFtZXRlckluZGV4LCBwYXJhbWV0ZXJdIG9mIChkZWNsYXJhdGlvbi50eXBlUGFyYW1ldGVycyA/PyBbXSkuZW50cmllcygpKSB7XG4gICAgICB3cml0ZXIuc3ludGhldGljKFwiICogQHRlbXBsYXRlIFwiLCBcIkphdmFTY3JpcHQgdHlwZSBwYXJhbWV0ZXIgc2NhZmZvbGRpbmdcIiwgW3BhcmFtZXRlcl0sIFtgL2Z1bmN0aW9ucy8ke2Z1bmN0aW9uSW5kZXh9L3R5cGVQYXJhbWV0ZXJzLyR7cGFyYW1ldGVySW5kZXh9YF0pXG4gICAgICB3cml0ZXIubWFwcGVkKHBhcmFtZXRlci5uYW1lLCB7XG4gICAgICAgIG1hcHBpbmdLaW5kOiBcImV4YWN0XCIsIG5vZGU6IHBhcmFtZXRlciwgcGF0aDogYC9mdW5jdGlvbnMvJHtmdW5jdGlvbkluZGV4fS90eXBlUGFyYW1ldGVycy8ke3BhcmFtZXRlckluZGV4fWAsIHJvbGU6IFwibmFtZVwiXG4gICAgICB9KVxuICAgICAgd3JpdGVyLnN5bnRoZXRpYyhcIlxcblwiLCBcImxpbmUgYnJlYWtcIiwgW3BhcmFtZXRlcl0pXG4gICAgfVxuICAgIGZvciAoY29uc3QgW3BhcmFtZXRlckluZGV4LCBwYXJhbWV0ZXJdIG9mIGRlY2xhcmF0aW9uLnBhcmFtZXRlcnMuZW50cmllcygpKSB7XG4gICAgICBjb25zdCBwYXJhbWV0ZXJQYXRoID0gYC9mdW5jdGlvbnMvJHtmdW5jdGlvbkluZGV4fS9wYXJhbWV0ZXJzLyR7cGFyYW1ldGVySW5kZXh9YFxuXG4gICAgICB3cml0ZXIuc3ludGhldGljKFwiICogQHBhcmFtIHtcIiwgXCJKYXZhU2NyaXB0IHR5cGUgc2NhZmZvbGRpbmdcIiwgW3BhcmFtZXRlcl0sIFtwYXJhbWV0ZXJQYXRoXSlcbiAgICAgIGVtaXRUeXBlKHdyaXRlciwgcGFyYW1ldGVyLnR5cGUsIGAke3BhcmFtZXRlclBhdGh9L3R5cGVgLCBcImphdmFzY3JpcHRcIilcbiAgICAgIHdyaXRlci5zeW50aGV0aWMoXCJ9IFwiLCBcIkphdmFTY3JpcHQgdHlwZSBzY2FmZm9sZGluZ1wiLCBbcGFyYW1ldGVyXSwgW3BhcmFtZXRlclBhdGhdKVxuICAgICAgd3JpdGVyLm1hcHBlZChwYXJhbWV0ZXIubmFtZSwge21hcHBpbmdLaW5kOiBcImV4YWN0XCIsIG5vZGU6IHBhcmFtZXRlciwgcGF0aDogcGFyYW1ldGVyUGF0aCwgcm9sZTogXCJuYW1lXCJ9KVxuICAgICAgd3JpdGVyLnN5bnRoZXRpYyhcIiAtIFNlbWFudGljIHBhcmFtZXRlci5cXG5cIiwgXCJKYXZhU2NyaXB0IHR5cGUgc2NhZmZvbGRpbmdcIiwgW3BhcmFtZXRlcl0sIFtwYXJhbWV0ZXJQYXRoXSlcbiAgICB9XG4gICAgd3JpdGVyLnN5bnRoZXRpYyhcIiAqIEByZXR1cm5zIHtcIiwgXCJKYXZhU2NyaXB0IHR5cGUgc2NhZmZvbGRpbmdcIiwgW2RlY2xhcmF0aW9uXSlcbiAgICBlbWl0VHlwZSh3cml0ZXIsIGRlY2xhcmF0aW9uLnJldHVyblR5cGUsIGAvZnVuY3Rpb25zLyR7ZnVuY3Rpb25JbmRleH0vcmV0dXJuVHlwZWAsIFwiamF2YXNjcmlwdFwiKVxuICAgIHdyaXRlci5zeW50aGV0aWMoXCJ9IFNlbWFudGljIHJlc3VsdC5cXG4gKi9cXG5cIiwgXCJKYXZhU2NyaXB0IHR5cGUgc2NhZmZvbGRpbmdcIiwgW2RlY2xhcmF0aW9uXSlcbiAgICBpZiAod3JpdGVyLmlzRGlyZWN0bHlFeHBvcnRlZChkZWNsYXJhdGlvbi5pZCkpIHdyaXRlci5zeW50aGV0aWMoXCJleHBvcnQgXCIsIFwiRVNNIGZ1bmN0aW9uIGV4cG9ydFwiLCBbZGVjbGFyYXRpb25dKVxuICAgIHdyaXRlci5tYXBwZWQoXCJmdW5jdGlvblwiLCB7bWFwcGluZ0tpbmQ6IFwiYW5jaG9yXCIsIG5vZGU6IGRlY2xhcmF0aW9ufSlcbiAgICB3cml0ZXIuc3ludGhldGljKFwiIFwiLCBcImZ1bmN0aW9uIHNwYWNpbmdcIiwgW2RlY2xhcmF0aW9uXSlcbiAgICB3cml0ZXIubWFwcGVkKGRlY2xhcmF0aW9uLm5hbWUsIHttYXBwaW5nS2luZDogXCJleGFjdFwiLCBub2RlOiBkZWNsYXJhdGlvbiwgcm9sZTogXCJuYW1lXCJ9KVxuICAgIHdyaXRlci5tYXBwZWQoXCIoXCIsIHttYXBwaW5nS2luZDogXCJhbmNob3JcIiwgbm9kZTogZGVjbGFyYXRpb259KVxuICAgIGRlY2xhcmF0aW9uLnBhcmFtZXRlcnMuZm9yRWFjaCgocGFyYW1ldGVyLCBpbmRleCkgPT4ge1xuICAgICAgaWYgKGluZGV4ID4gMCkgd3JpdGVyLnN5bnRoZXRpYyhcIiwgXCIsIFwicGFyYW1ldGVyIHNlcGFyYXRvclwiLCBbZGVjbGFyYXRpb25dKVxuICAgICAgd3JpdGVyLm1hcHBlZChwYXJhbWV0ZXIubmFtZSwge1xuICAgICAgICBtYXBwaW5nS2luZDogXCJleGFjdFwiLFxuICAgICAgICBub2RlOiBwYXJhbWV0ZXIsXG4gICAgICAgIHBhdGg6IGAvZnVuY3Rpb25zLyR7ZnVuY3Rpb25JbmRleH0vcGFyYW1ldGVycy8ke2luZGV4fWAsXG4gICAgICAgIHJvbGU6IFwibmFtZVwiXG4gICAgICB9KVxuICAgIH0pXG4gICAgd3JpdGVyLm1hcHBlZChcIilcIiwge21hcHBpbmdLaW5kOiBcImFuY2hvclwiLCBub2RlOiBkZWNsYXJhdGlvbn0pXG4gICAgd3JpdGVyLnN5bnRoZXRpYyhcIiBcIiwgXCJmdW5jdGlvbiBzcGFjaW5nXCIsIFtkZWNsYXJhdGlvbl0pXG4gICAgd3JpdGVyLm1hcHBlZChcIntcIiwge21hcHBpbmdLaW5kOiBcImFuY2hvclwiLCBub2RlOiBkZWNsYXJhdGlvbn0pXG4gICAgd3JpdGVyLnN5bnRoZXRpYyhcIlxcblwiLCBcImxpbmUgYnJlYWtcIiwgW2RlY2xhcmF0aW9uXSlcblxuICAgIGVtaXRCbG9jayh3cml0ZXIsIGRlY2xhcmF0aW9uLmJvZHksIFwiICBcIiwgYC9mdW5jdGlvbnMvJHtmdW5jdGlvbkluZGV4fS9ib2R5YCwgY2Fub25pY2FsaXplWmVybylcbiAgICB3cml0ZXIubWFwcGVkKFwifVwiLCB7bWFwcGluZ0tpbmQ6IFwiYW5jaG9yXCIsIG5vZGU6IGRlY2xhcmF0aW9ufSlcbiAgfSlcblxuICBlbWl0QWxpYXNlZEV4cG9ydHMobW9kdWxlLCB3cml0ZXIpXG4gIGlmICghd3JpdGVyLnByb2dyYW0gfHwgd3JpdGVyLmlzUHJvZ3JhbUVudHJ5KCkpIHtcbiAgICB3cml0ZXIuc3ludGhldGljKFwiXFxuXFxuXCIsIFwiZW50cnktcG9pbnQgc2VwYXJhdG9yXCIsIFttb2R1bGUuZW50cnlQb2ludF0pXG4gICAgZW1pdEJsb2NrKHdyaXRlciwgbW9kdWxlLmVudHJ5UG9pbnQuYm9keSwgXCJcIiwgXCIvZW50cnlQb2ludC9ib2R5XCIsIGNhbm9uaWNhbGl6ZVplcm8pXG4gIH1cbn1cblxuLyoqXG4gKiBFbWl0cyBvbmUgbmF0aXZlIEphdmFTY3JpcHQgcHJpdmF0ZS1maWVsZCByZWZlcmVuY2UgY2xhc3MuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vd3JpdGVyLmpzXCIpLlNvdXJjZVdyaXRlcn0gd3JpdGVyIC0gU291cmNlLWF3YXJlIHdyaXRlci5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuQ2xhc3NEZWNsYXJhdGlvbn0gZGVjbGFyYXRpb24gLSBSZWZlcmVuY2UgY2xhc3MuXG4gKiBAcGFyYW0ge251bWJlcn0gY2xhc3NJbmRleCAtIE1vZHVsZSBjbGFzcyBpbmRleC5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gY2Fub25pY2FsaXplWmVybyAtIFdoZXRoZXIgc2NhbGFyIG91dHB1dCBjYW5vbmljYWxpemVzIHplcm8uXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZnVuY3Rpb24gZW1pdFJlZmVyZW5jZUNsYXNzKHdyaXRlciwgZGVjbGFyYXRpb24sIGNsYXNzSW5kZXgsIGNhbm9uaWNhbGl6ZVplcm8pIHtcbiAgY29uc3QgcGF0aCA9IGAvY2xhc3Nlcy8ke2NsYXNzSW5kZXh9YFxuXG4gIHdyaXRlci5tYXBwZWQoXCJjbGFzc1wiLCB7bWFwcGluZ0tpbmQ6IFwiYW5jaG9yXCIsIG5vZGU6IGRlY2xhcmF0aW9uLCBwYXRofSlcbiAgd3JpdGVyLnN5bnRoZXRpYyhcIiBcIiwgXCJyZWZlcmVuY2UgY2xhc3Mgc3BhY2luZ1wiLCBbZGVjbGFyYXRpb25dLCBbcGF0aF0pXG4gIHdyaXRlci5tYXBwZWQoZGVjbGFyYXRpb24ubmFtZSwge21hcHBpbmdLaW5kOiBcImV4YWN0XCIsIG5vZGU6IGRlY2xhcmF0aW9uLCBwYXRoLCByb2xlOiBcIm5hbWVcIn0pXG4gIHdyaXRlci5zeW50aGV0aWMoXCIge1xcblwiLCBcInJlZmVyZW5jZSBjbGFzcyBvcGVuXCIsIFtkZWNsYXJhdGlvbl0sIFtwYXRoXSlcbiAgZGVjbGFyYXRpb24uZmllbGRzLmZvckVhY2goKGZpZWxkLCBpbmRleCkgPT4ge1xuICAgIGNvbnN0IGZpZWxkUGF0aCA9IGAke3BhdGh9L2ZpZWxkcy8ke2luZGV4fWBcblxuICAgIHdyaXRlci5zeW50aGV0aWMoXCIgIC8qKiBAdHlwZSB7XCIsIFwicHJpdmF0ZSBmaWVsZCB0eXBlIHNjYWZmb2xkaW5nXCIsIFtmaWVsZF0sIFtmaWVsZFBhdGhdKVxuICAgIGVtaXRUeXBlKHdyaXRlciwgZmllbGQudHlwZSwgYCR7ZmllbGRQYXRofS90eXBlYCwgXCJqYXZhc2NyaXB0XCIpXG4gICAgd3JpdGVyLnN5bnRoZXRpYyhcIn0gKi9cXG4gICNcIiwgXCJwcml2YXRlIGZpZWxkIHNjYWZmb2xkaW5nXCIsIFtmaWVsZF0sIFtmaWVsZFBhdGhdKVxuICAgIHdyaXRlci5tYXBwZWQoZmllbGQubmFtZSwge21hcHBpbmdLaW5kOiBcImV4YWN0XCIsIG5vZGU6IGZpZWxkLCBwYXRoOiBmaWVsZFBhdGgsIHJvbGU6IFwibmFtZVwifSlcbiAgICB3cml0ZXIuc3ludGhldGljKFwiXFxuXCIsIFwibGluZSBicmVha1wiLCBbZmllbGRdLCBbZmllbGRQYXRoXSlcbiAgfSlcbiAgY29uc3QgY29uc3RydWN0b3IgPSBkZWNsYXJhdGlvbi5jb25zdHJ1Y3RvclxuICBjb25zdCBjb25zdHJ1Y3RvclBhdGggPSBgJHtwYXRofS9jb25zdHJ1Y3RvcmBcblxuICBlbWl0SnNkb2Mod3JpdGVyLCBjb25zdHJ1Y3Rvci5wYXJhbWV0ZXJzLCB1bmRlZmluZWQsIGAke2NvbnN0cnVjdG9yUGF0aH0vcGFyYW1ldGVyc2AsIHVuZGVmaW5lZClcbiAgd3JpdGVyLnN5bnRoZXRpYyhcIiAgXCIsIFwiY29uc3RydWN0b3IgaW5kZW50YXRpb25cIiwgW2NvbnN0cnVjdG9yXSwgW2NvbnN0cnVjdG9yUGF0aF0pXG4gIHdyaXRlci5tYXBwZWQoXCJjb25zdHJ1Y3RvclwiLCB7bWFwcGluZ0tpbmQ6IFwiZXhhY3RcIiwgbm9kZTogY29uc3RydWN0b3IsIHBhdGg6IGNvbnN0cnVjdG9yUGF0aCwgcm9sZTogXCJjb25zdHJ1Y3RvclwifSlcbiAgZW1pdEJhcmVQYXJhbWV0ZXJzKHdyaXRlciwgY29uc3RydWN0b3IucGFyYW1ldGVycywgYCR7Y29uc3RydWN0b3JQYXRofS9wYXJhbWV0ZXJzYClcbiAgd3JpdGVyLnN5bnRoZXRpYyhcIiB7XFxuXCIsIFwiY29uc3RydWN0b3Igb3BlblwiLCBbY29uc3RydWN0b3JdLCBbY29uc3RydWN0b3JQYXRoXSlcbiAgZW1pdEJsb2NrKHdyaXRlciwgY29uc3RydWN0b3IuYm9keSwgXCIgICAgXCIsIGAke2NvbnN0cnVjdG9yUGF0aH0vYm9keWAsIGNhbm9uaWNhbGl6ZVplcm8pXG4gIHdyaXRlci5zeW50aGV0aWMoXCIgIH1cIiwgXCJjb25zdHJ1Y3RvciBjbG9zZVwiLCBbY29uc3RydWN0b3JdLCBbY29uc3RydWN0b3JQYXRoXSlcbiAgZGVjbGFyYXRpb24ubWV0aG9kcy5mb3JFYWNoKChtZXRob2QsIGluZGV4KSA9PiB7XG4gICAgY29uc3QgbWV0aG9kUGF0aCA9IGAke3BhdGh9L21ldGhvZHMvJHtpbmRleH1gXG5cbiAgICB3cml0ZXIuc3ludGhldGljKFwiXFxuXFxuXCIsIFwibWV0aG9kIHNwYWNpbmdcIiwgW21ldGhvZF0sIFttZXRob2RQYXRoXSlcbiAgICBlbWl0SnNkb2Mod3JpdGVyLCBtZXRob2QucGFyYW1ldGVycywgbWV0aG9kLnJldHVyblR5cGUsIGAke21ldGhvZFBhdGh9L3BhcmFtZXRlcnNgLCBgJHttZXRob2RQYXRofS9yZXR1cm5UeXBlYClcbiAgICB3cml0ZXIuc3ludGhldGljKFwiICBcIiwgXCJtZXRob2QgaW5kZW50YXRpb25cIiwgW21ldGhvZF0sIFttZXRob2RQYXRoXSlcbiAgICB3cml0ZXIubWFwcGVkKG1ldGhvZC5uYW1lLCB7bWFwcGluZ0tpbmQ6IFwiZXhhY3RcIiwgbm9kZTogbWV0aG9kLCBwYXRoOiBtZXRob2RQYXRoLCByb2xlOiBcIm5hbWVcIn0pXG4gICAgZW1pdEJhcmVQYXJhbWV0ZXJzKHdyaXRlciwgbWV0aG9kLnBhcmFtZXRlcnMsIGAke21ldGhvZFBhdGh9L3BhcmFtZXRlcnNgKVxuICAgIHdyaXRlci5zeW50aGV0aWMoXCIge1xcblwiLCBcIm1ldGhvZCBvcGVuXCIsIFttZXRob2RdLCBbbWV0aG9kUGF0aF0pXG4gICAgZW1pdEJsb2NrKHdyaXRlciwgbWV0aG9kLmJvZHksIFwiICAgIFwiLCBgJHttZXRob2RQYXRofS9ib2R5YCwgY2Fub25pY2FsaXplWmVybylcbiAgICB3cml0ZXIuc3ludGhldGljKFwiICB9XCIsIFwibWV0aG9kIGNsb3NlXCIsIFttZXRob2RdLCBbbWV0aG9kUGF0aF0pXG4gIH0pXG4gIHdyaXRlci5zeW50aGV0aWMoXCJcXG5cIiwgXCJsaW5lIGJyZWFrXCIsIFtkZWNsYXJhdGlvbl0sIFtwYXRoXSlcbiAgd3JpdGVyLm1hcHBlZChcIn1cIiwge21hcHBpbmdLaW5kOiBcImFuY2hvclwiLCBub2RlOiBkZWNsYXJhdGlvbiwgcGF0aH0pXG59XG5cbi8qKlxuICogRW1pdHMgZXhhY3QgSmF2YVNjcmlwdCBjYWxsYWJsZSB0eXBlIGRvY3VtZW50YXRpb24uXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vd3JpdGVyLmpzXCIpLlNvdXJjZVdyaXRlcn0gd3JpdGVyIC0gU291cmNlLWF3YXJlIHdyaXRlci5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuUGFyYW1ldGVyW119IHBhcmFtZXRlcnMgLSBPcmRlcmVkIHBhcmFtZXRlcnMuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljRnVuY3Rpb25SZXR1cm5UeXBlIHwgdW5kZWZpbmVkfSByZXR1cm5UeXBlIC0gT3B0aW9uYWwgcmV0dXJuIHR5cGUuXG4gKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1ldGVyUGF0aCAtIFBhcmFtZXRlciBjb2xsZWN0aW9uIHBhdGguXG4gKiBAcGFyYW0ge3N0cmluZyB8IHVuZGVmaW5lZH0gcmV0dXJuUGF0aCAtIFJldHVybiB0eXBlIHBhdGguXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZnVuY3Rpb24gZW1pdEpzZG9jKHdyaXRlciwgcGFyYW1ldGVycywgcmV0dXJuVHlwZSwgcGFyYW1ldGVyUGF0aCwgcmV0dXJuUGF0aCkge1xuICB3cml0ZXIuc3ludGhldGljKFwiXFxuICAvKipcXG5cIiwgXCJKYXZhU2NyaXB0IGNhbGxhYmxlIGRvY3VtZW50YXRpb25cIiwgcGFyYW1ldGVycylcbiAgZm9yIChjb25zdCBbaW5kZXgsIHBhcmFtZXRlcl0gb2YgcGFyYW1ldGVycy5lbnRyaWVzKCkpIHtcbiAgICB3cml0ZXIuc3ludGhldGljKFwiICAgKiBAcGFyYW0ge1wiLCBcInBhcmFtZXRlciB0eXBlIHNjYWZmb2xkaW5nXCIsIFtwYXJhbWV0ZXJdLCBbYCR7cGFyYW1ldGVyUGF0aH0vJHtpbmRleH1gXSlcbiAgICBlbWl0VHlwZSh3cml0ZXIsIHBhcmFtZXRlci50eXBlLCBgJHtwYXJhbWV0ZXJQYXRofS8ke2luZGV4fS90eXBlYCwgXCJqYXZhc2NyaXB0XCIpXG4gICAgd3JpdGVyLnN5bnRoZXRpYyhcIn0gXCIsIFwicGFyYW1ldGVyIGRvY3VtZW50YXRpb25cIiwgW3BhcmFtZXRlcl0sIFtgJHtwYXJhbWV0ZXJQYXRofS8ke2luZGV4fWBdKVxuICAgIHdyaXRlci5tYXBwZWQocGFyYW1ldGVyLm5hbWUsIHttYXBwaW5nS2luZDogXCJleGFjdFwiLCBub2RlOiBwYXJhbWV0ZXIsIHBhdGg6IGAke3BhcmFtZXRlclBhdGh9LyR7aW5kZXh9YCwgcm9sZTogXCJuYW1lXCJ9KVxuICAgIHdyaXRlci5zeW50aGV0aWMoXCJcXG5cIiwgXCJsaW5lIGJyZWFrXCIsIFtwYXJhbWV0ZXJdKVxuICB9XG4gIGlmIChyZXR1cm5UeXBlICYmIHJldHVyblBhdGgpIHtcbiAgICB3cml0ZXIuc3ludGhldGljKFwiICAgKiBAcmV0dXJucyB7XCIsIFwicmV0dXJuIHR5cGUgc2NhZmZvbGRpbmdcIiwgW10pXG4gICAgZW1pdFR5cGUod3JpdGVyLCByZXR1cm5UeXBlLCByZXR1cm5QYXRoLCBcImphdmFzY3JpcHRcIilcbiAgICB3cml0ZXIuc3ludGhldGljKFwifVxcblwiLCBcImxpbmUgYnJlYWtcIiwgW10pXG4gIH1cbiAgd3JpdGVyLnN5bnRoZXRpYyhcIiAgICovXFxuXCIsIFwiSmF2YVNjcmlwdCBjYWxsYWJsZSBkb2N1bWVudGF0aW9uIGNsb3NlXCIsIHBhcmFtZXRlcnMpXG59XG5cbi8qKlxuICogRW1pdHMgb25lIHVudHlwZWQgSmF2YVNjcmlwdCBwYXJhbWV0ZXIgbGlzdC5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi93cml0ZXIuanNcIikuU291cmNlV3JpdGVyfSB3cml0ZXIgLSBTb3VyY2UtYXdhcmUgd3JpdGVyLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5QYXJhbWV0ZXJbXX0gcGFyYW1ldGVycyAtIE9yZGVyZWQgcGFyYW1ldGVycy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIC0gUGFyYW1ldGVyIGNvbGxlY3Rpb24gcGF0aC5cbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5mdW5jdGlvbiBlbWl0QmFyZVBhcmFtZXRlcnMod3JpdGVyLCBwYXJhbWV0ZXJzLCBwYXRoKSB7XG4gIHdyaXRlci5zeW50aGV0aWMoXCIoXCIsIFwicGFyYW1ldGVyIGxpc3Qgb3BlblwiLCBwYXJhbWV0ZXJzKVxuICBwYXJhbWV0ZXJzLmZvckVhY2goKHBhcmFtZXRlciwgaW5kZXgpID0+IHtcbiAgICBpZiAoaW5kZXgpIHdyaXRlci5zeW50aGV0aWMoXCIsIFwiLCBcInBhcmFtZXRlciBzZXBhcmF0b3JcIiwgcGFyYW1ldGVycylcbiAgICB3cml0ZXIubWFwcGVkKHBhcmFtZXRlci5uYW1lLCB7bWFwcGluZ0tpbmQ6IFwiZXhhY3RcIiwgbm9kZTogcGFyYW1ldGVyLCBwYXRoOiBgJHtwYXRofS8ke2luZGV4fWAsIHJvbGU6IFwibmFtZVwifSlcbiAgfSlcbiAgd3JpdGVyLnN5bnRoZXRpYyhcIilcIiwgXCJwYXJhbWV0ZXIgbGlzdCBjbG9zZVwiLCBwYXJhbWV0ZXJzKVxufVxuXG4vKipcbiAqIEVtaXRzIGEgc3RhbmRhbG9uZSBKU0RvYyB0ZW1wbGF0ZSBibG9jay5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi93cml0ZXIuanNcIikuU291cmNlV3JpdGVyfSB3cml0ZXIgLSBTb3VyY2UtYXdhcmUgd3JpdGVyLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5UeXBlUGFyYW1ldGVyW119IHBhcmFtZXRlcnMgLSBPcmRlcmVkIHR5cGUgcGFyYW1ldGVycy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIC0gVHlwZS1wYXJhbWV0ZXIgY29sbGVjdGlvbiBwYXRoLlxuICogQHBhcmFtIHtzdHJpbmd9IHRhcmdldCAtIFRhcmdldCBsYWJlbC5cbiAqL1xuZnVuY3Rpb24gZW1pdFRlbXBsYXRlRG9jdW1lbnRhdGlvbih3cml0ZXIsIHBhcmFtZXRlcnMsIHBhdGgsIHRhcmdldCkge1xuICBpZiAocGFyYW1ldGVycy5sZW5ndGggPT0gMCkgcmV0dXJuXG4gIHdyaXRlci5zeW50aGV0aWMoXCIvKipcXG5cIiwgYCR7dGFyZ2V0fSB0eXBlIHBhcmFtZXRlciBzY2FmZm9sZGluZ2AsIHBhcmFtZXRlcnMpXG4gIHBhcmFtZXRlcnMuZm9yRWFjaCgocGFyYW1ldGVyLCBpbmRleCkgPT4ge1xuICAgIHdyaXRlci5zeW50aGV0aWMoXCIgKiBAdGVtcGxhdGUgXCIsIGAke3RhcmdldH0gdHlwZSBwYXJhbWV0ZXIgc2NhZmZvbGRpbmdgLCBbcGFyYW1ldGVyXSwgW2Ake3BhdGh9LyR7aW5kZXh9YF0pXG4gICAgd3JpdGVyLm1hcHBlZChwYXJhbWV0ZXIubmFtZSwge21hcHBpbmdLaW5kOiBcImV4YWN0XCIsIG5vZGU6IHBhcmFtZXRlciwgcGF0aDogYCR7cGF0aH0vJHtpbmRleH1gLCByb2xlOiBcIm5hbWVcIn0pXG4gICAgd3JpdGVyLnN5bnRoZXRpYyhcIlxcblwiLCBcImxpbmUgYnJlYWtcIiwgW3BhcmFtZXRlcl0pXG4gIH0pXG4gIHdyaXRlci5zeW50aGV0aWMoXCIgKi9cXG5cIiwgYCR7dGFyZ2V0fSB0eXBlIHBhcmFtZXRlciBzY2FmZm9sZGluZ2AsIHBhcmFtZXRlcnMpXG59XG5cbi8qKlxuICogRW1pdHMgZ3JvdXBlZCBuYW1lZCBFU00gaW1wb3J0cyBmb3IgYSBwcm9ncmFtIG1vZHVsZS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNNb2R1bGV9IG1vZHVsZSAtIEN1cnJlbnQgbW9kdWxlLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3dyaXRlci5qc1wiKS5Tb3VyY2VXcml0ZXJ9IHdyaXRlciAtIFNvdXJjZS1hd2FyZSB3cml0ZXIuXG4gKi9cbmZ1bmN0aW9uIGVtaXRQcm9ncmFtSW1wb3J0cyhtb2R1bGUsIHdyaXRlcikge1xuICBpZiAoIXdyaXRlci5wcm9ncmFtKSByZXR1cm5cbiAgY29uc3QgaW1wb3J0cyA9IC8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNQcm9ncmFtTW9kdWxlfSAqLyAoLyoqIEB0eXBlIHt1bmtub3dufSAqLyAobW9kdWxlKSkuaW1wb3J0c1xuICBjb25zdCBtb2R1bGVJZHMgPSBbLi4ubmV3IFNldChpbXBvcnRzLm1hcCgoe21vZHVsZUlkfSkgPT4gbW9kdWxlSWQpKV1cblxuICBmb3IgKGNvbnN0IG1vZHVsZUlkIG9mIG1vZHVsZUlkcykge1xuICAgIGNvbnN0IHNlbGVjdGVkID0gaW1wb3J0cy5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0ubW9kdWxlSWQgPT0gbW9kdWxlSWQpXG5cbiAgICB3cml0ZXIuc3ludGhldGljKFwiaW1wb3J0IHtcIiwgXCJFU00gaW1wb3J0IGRlY2xhcmF0aW9uXCIsIHNlbGVjdGVkKVxuICAgIHNlbGVjdGVkLmZvckVhY2goKGl0ZW0sIGluZGV4KSA9PiB7XG4gICAgICBjb25zdCBpdGVtUGF0aCA9IGAvaW1wb3J0cy8ke2ltcG9ydHMuaW5kZXhPZihpdGVtKX1gXG4gICAgICBjb25zdCBsb2NhbE5hbWUgPSB3cml0ZXIuaW1wb3J0TmFtZUZvcihpdGVtKVxuXG4gICAgICBpZiAoaW5kZXgpIHdyaXRlci5zeW50aGV0aWMoXCIsIFwiLCBcIkVTTSBpbXBvcnQgc2VwYXJhdG9yXCIsIHNlbGVjdGVkKVxuICAgICAgd3JpdGVyLm1hcHBlZChpdGVtLmltcG9ydGVkTmFtZSwge21hcHBpbmdLaW5kOiBcImV4YWN0XCIsIG5vZGU6IGl0ZW0sIHBhdGg6IGl0ZW1QYXRoLCByb2xlOiBcImltcG9ydGVkTmFtZVwifSlcbiAgICAgIGlmIChsb2NhbE5hbWUgIT0gaXRlbS5pbXBvcnRlZE5hbWUpIHtcbiAgICAgICAgd3JpdGVyLnN5bnRoZXRpYyhcIiBhcyBcIiwgXCJFU00gaW1wb3J0IGFsaWFzXCIsIFtpdGVtXSwgW2l0ZW1QYXRoXSlcbiAgICAgICAgd3JpdGVyLm1hcHBlZChsb2NhbE5hbWUsIHttYXBwaW5nS2luZDogXCJleGFjdFwiLCBub2RlOiBpdGVtLCBwYXRoOiBpdGVtUGF0aCwgcm9sZTogXCJsb2NhbE5hbWVcIn0pXG4gICAgICB9XG4gICAgfSlcbiAgICB3cml0ZXIuc3ludGhldGljKFwifSBmcm9tIFwiLCBcIkVTTSBpbXBvcnQgc291cmNlXCIsIHNlbGVjdGVkKVxuICAgIHdyaXRlci5tYXBwZWQoSlNPTi5zdHJpbmdpZnkod3JpdGVyLnJlbGF0aXZlTW9kdWxlU3BlY2lmaWVyKG1vZHVsZUlkLCBcIi5qc1wiKSksIHtcbiAgICAgIG1hcHBpbmdLaW5kOiBcImFuY2hvclwiLCBub2RlOiBzZWxlY3RlZFswXSwgcGF0aDogYC9pbXBvcnRzLyR7aW1wb3J0cy5pbmRleE9mKHNlbGVjdGVkWzBdKX1gLCByb2xlOiBcInBhdGhcIlxuICAgIH0pXG4gICAgd3JpdGVyLnN5bnRoZXRpYyhcIlxcblwiLCBcIkVTTSBpbXBvcnQgdGVybWluYXRvclwiLCBzZWxlY3RlZClcbiAgfVxuICBpZiAobW9kdWxlSWRzLmxlbmd0aCA+IDApIHdyaXRlci5zeW50aGV0aWMoXCJcXG5cIiwgXCJFU00gaW1wb3J0IHNlcGFyYXRvclwiLCBbbW9kdWxlXSlcbiAgZW1pdFN0ZGxpYlByb3ZpZGVySW1wb3J0cyhtb2R1bGUsIHdyaXRlcilcbn1cblxuLyoqXG4gKiBFbWl0cyB0aGUgZ3JvdXBlZCBuYW1lZCBFU00gaW1wb3J0IGZvciBvbmUgbGlua2VkIHN0ZGxpYiBwcm92aWRlci5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNNb2R1bGV9IG1vZHVsZSAtIEN1cnJlbnQgbW9kdWxlLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3dyaXRlci5qc1wiKS5Tb3VyY2VXcml0ZXJ9IHdyaXRlciAtIFNvdXJjZS1hd2FyZSB3cml0ZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlbWl0U3RkbGliUHJvdmlkZXJJbXBvcnRzKG1vZHVsZSwgd3JpdGVyKSB7XG4gIGNvbnN0IG5hbWVzID0gd3JpdGVyLnN0ZGxpYlByb3ZpZGVySW1wb3J0c1xuXG4gIGlmICghd3JpdGVyLnByb2dyYW0gfHwgIW5hbWVzIHx8IG5hbWVzLmxlbmd0aCA9PSAwKSByZXR1cm5cblxuICB3cml0ZXIuc3ludGhldGljKFwiaW1wb3J0IHtcIiwgXCJFU00gc3RkbGliIHByb3ZpZGVyIGltcG9ydCBkZWNsYXJhdGlvblwiLCBbbW9kdWxlXSlcbiAgbmFtZXMuZm9yRWFjaCgobmFtZSwgaW5kZXgpID0+IHtcbiAgICBpZiAoaW5kZXgpIHdyaXRlci5zeW50aGV0aWMoXCIsIFwiLCBcIkVTTSBzdGRsaWIgcHJvdmlkZXIgaW1wb3J0IHNlcGFyYXRvclwiLCBbbW9kdWxlXSlcbiAgICB3cml0ZXIuc3ludGhldGljKG5hbWUsIFwiRVNNIHN0ZGxpYiBwcm92aWRlciBpbXBvcnQgbmFtZVwiLCBbbW9kdWxlXSlcbiAgfSlcbiAgd3JpdGVyLnN5bnRoZXRpYyhcIn0gZnJvbSBcIiwgXCJFU00gc3RkbGliIHByb3ZpZGVyIGltcG9ydCBzb3VyY2VcIiwgW21vZHVsZV0pXG4gIHdyaXRlci5zeW50aGV0aWMoSlNPTi5zdHJpbmdpZnkod3JpdGVyLnN0ZGxpYlByb3ZpZGVyU3BlY2lmaWVyKFwiLmpzXCIpKSwgXCJFU00gc3RkbGliIHByb3ZpZGVyIGltcG9ydCBwYXRoXCIsIFttb2R1bGVdKVxuICB3cml0ZXIuc3ludGhldGljKFwiXFxuXCIsIFwiRVNNIHN0ZGxpYiBwcm92aWRlciBpbXBvcnQgdGVybWluYXRvclwiLCBbbW9kdWxlXSlcbiAgd3JpdGVyLnN5bnRoZXRpYyhcIlxcblwiLCBcIkVTTSBzdGRsaWIgcHJvdmlkZXIgaW1wb3J0IHNlcGFyYXRvclwiLCBbbW9kdWxlXSlcbn1cblxuLyoqXG4gKiBFbWl0cyBleHBsaWNpdCBFU00gZXhwb3J0IGNsYXVzZXMgZm9yIHNvdXJjZSBhbGlhc2VzLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY01vZHVsZX0gbW9kdWxlIC0gQ3VycmVudCBtb2R1bGUuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vd3JpdGVyLmpzXCIpLlNvdXJjZVdyaXRlcn0gd3JpdGVyIC0gU291cmNlLWF3YXJlIHdyaXRlci5cbiAqL1xuZnVuY3Rpb24gZW1pdEFsaWFzZWRFeHBvcnRzKG1vZHVsZSwgd3JpdGVyKSB7XG4gIGlmICghd3JpdGVyLnByb2dyYW0pIHJldHVyblxuICBjb25zdCBwcm9ncmFtTW9kdWxlID0gLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY1Byb2dyYW1Nb2R1bGV9ICovICgvKiogQHR5cGUge3Vua25vd259ICovIChtb2R1bGUpKVxuICBjb25zdCBhbGlhc2VzID0gcHJvZ3JhbU1vZHVsZS5leHBvcnRzLmZpbHRlcigoaXRlbSkgPT4gIXdyaXRlci5pc0RpcmVjdEV4cG9ydChpdGVtKSlcblxuICBpZiAoYWxpYXNlcy5sZW5ndGggPT0gMCkgcmV0dXJuXG4gIHdyaXRlci5zeW50aGV0aWMoXCJcXG5cXG5leHBvcnQge1wiLCBcIkVTTSBhbGlhc2VkIGV4cG9ydHNcIiwgW21vZHVsZV0pXG4gIGFsaWFzZXMuZm9yRWFjaCgoaXRlbSwgaW5kZXgpID0+IHtcbiAgICBpZiAoaW5kZXgpIHdyaXRlci5zeW50aGV0aWMoXCIsIFwiLCBcIkVTTSBleHBvcnQgc2VwYXJhdG9yXCIsIFttb2R1bGVdKVxuICAgIGNvbnN0IGRlY2xhcmF0aW9uID0gWy4uLnByb2dyYW1Nb2R1bGUuZnVuY3Rpb25zLCAuLi5wcm9ncmFtTW9kdWxlLnJlY29yZHMgPz8gW10sIC4uLnByb2dyYW1Nb2R1bGUuZXJyb3JzID8/IFtdXS5maW5kKCh7aWR9KSA9PiBpZCA9PSBpdGVtLmRlY2xhcmF0aW9uSWQpXG5cbiAgICBpZiAoIWRlY2xhcmF0aW9uKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgVW5rbm93biBleHBvcnRlZCBkZWNsYXJhdGlvbiAnJHtpdGVtLmRlY2xhcmF0aW9uSWR9Jy5gKVxuICAgIGNvbnN0IGV4cG9ydFBhdGggPSBgL2V4cG9ydHMvJHtwcm9ncmFtTW9kdWxlLmV4cG9ydHMuaW5kZXhPZihpdGVtKX1gXG5cbiAgICB3cml0ZXIubWFwcGVkKGRlY2xhcmF0aW9uLm5hbWUsIHttYXBwaW5nS2luZDogXCJleGFjdFwiLCBuYW1lOiBkZWNsYXJhdGlvbi5uYW1lLCBub2RlOiBpdGVtLCBwYXRoOiBleHBvcnRQYXRoLCByb2xlOiBcImxvY2FsTmFtZVwifSlcbiAgICB3cml0ZXIuc3ludGhldGljKFwiIGFzIFwiLCBcIkVTTSBhbGlhc2VkIGV4cG9ydCBvcGVyYXRvclwiLCBbaXRlbV0sIFtleHBvcnRQYXRoXSlcbiAgICB3cml0ZXIubWFwcGVkKGl0ZW0uZXhwb3J0ZWROYW1lLCB7bWFwcGluZ0tpbmQ6IFwiZXhhY3RcIiwgbmFtZTogaXRlbS5leHBvcnRlZE5hbWUsIG5vZGU6IGl0ZW0sIHBhdGg6IGV4cG9ydFBhdGgsIHJvbGU6IFwiZXhwb3J0ZWROYW1lXCJ9KVxuICB9KVxuICB3cml0ZXIuc3ludGhldGljKFwifVwiLCBcIkVTTSBhbGlhc2VkIGV4cG9ydCBjbG9zZVwiLCBbbW9kdWxlXSlcbn1cblxuLyoqXG4gKiBFbWl0cyBvbmUgb3JkZXJlZCBKYXZhU2NyaXB0IGJsb2NrIGJvZHkuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vd3JpdGVyLmpzXCIpLlNvdXJjZVdyaXRlcn0gd3JpdGVyIC0gU291cmNlLWF3YXJlIHdyaXRlci5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuQmxvY2t9IGJsb2NrIC0gU2VtYW50aWMgYmxvY2suXG4gKiBAcGFyYW0ge3N0cmluZ30gaW5kZW50IC0gSW5kZW50YXRpb24uXG4gKiBAcGFyYW0ge3N0cmluZ30gYmxvY2tQYXRoIC0gRXhhY3QgSlNPTiBQb2ludGVyIGZvciB0aGUgYmxvY2suXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGNhbm9uaWNhbGl6ZVplcm8gLSBXaGV0aGVyIHByaW50ZWQgaW50ZWdlciB6ZXJvIG11c3QgYmUgY2Fub25pY2FsaXplZC5cbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5mdW5jdGlvbiBlbWl0QmxvY2sod3JpdGVyLCBibG9jaywgaW5kZW50LCBibG9ja1BhdGgsIGNhbm9uaWNhbGl6ZVplcm8pIHtcbiAgYmxvY2suc3RhdGVtZW50cy5mb3JFYWNoKChzdGF0ZW1lbnQsIGluZGV4KSA9PiBlbWl0U3RhdGVtZW50KFxuICAgIHdyaXRlciwgc3RhdGVtZW50LCBpbmRlbnQsIGAke2Jsb2NrUGF0aH0vc3RhdGVtZW50cy8ke2luZGV4fWAsIGNhbm9uaWNhbGl6ZVplcm9cbiAgKSlcbn1cblxuLyoqXG4gKiBFbWl0cyBvbmUgSmF2YVNjcmlwdCBzdGF0ZW1lbnQuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vd3JpdGVyLmpzXCIpLlNvdXJjZVdyaXRlcn0gd3JpdGVyIC0gU291cmNlLWF3YXJlIHdyaXRlci5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU3RhdGVtZW50fSBzdGF0ZW1lbnQgLSBTZW1hbnRpYyBzdGF0ZW1lbnQuXG4gKiBAcGFyYW0ge3N0cmluZ30gaW5kZW50IC0gSW5kZW50YXRpb24uXG4gKiBAcGFyYW0ge3N0cmluZ30gcGF0aCAtIEV4YWN0IHN0YXRlbWVudCBwYXRoLlxuICogQHBhcmFtIHtib29sZWFufSBjYW5vbmljYWxpemVaZXJvIC0gV2hldGhlciBwcmludGVkIGludGVnZXIgemVybyBtdXN0IGJlIGNhbm9uaWNhbGl6ZWQuXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZnVuY3Rpb24gZW1pdFN0YXRlbWVudCh3cml0ZXIsIHN0YXRlbWVudCwgaW5kZW50LCBwYXRoLCBjYW5vbmljYWxpemVaZXJvKSB7XG4gIGVtaXRFZmZlY3RQcmVmaXhlcyh3cml0ZXIsIHN0YXRlbWVudCwgaW5kZW50LCBwYXRoLCBcImphdmFzY3JpcHRcIixcbiAgICAoZXhwcmVzc2lvbiwgZXhwcmVzc2lvblBhdGgpID0+IGVtaXRFeHByZXNzaW9uKHdyaXRlciwgZXhwcmVzc2lvbiwgZXhwcmVzc2lvblBhdGgsIFwiamF2YXNjcmlwdFwiLCBpZGVudGl0eSkpXG4gIGlmIChzdGF0ZW1lbnQua2luZCA9PSBcIkxvY2FsRGVjbGFyYXRpb25cIiB8fCBzdGF0ZW1lbnQua2luZCA9PSBcIkFzc2lnbm1lbnRTdGF0ZW1lbnRcIikgcmV0dXJuIGVtaXRMb2NhbCh3cml0ZXIsIHN0YXRlbWVudCwgaW5kZW50LCBwYXRoKVxuXG4gIHdyaXRlci5zeW50aGV0aWMoaW5kZW50LCBcImluZGVudGF0aW9uXCIsIFtzdGF0ZW1lbnRdLCBbcGF0aF0pXG4gIGlmIChzdGF0ZW1lbnQua2luZCA9PSBcIlByaXZhdGVGaWVsZFdyaXRlU3RhdGVtZW50XCIpIHtcbiAgICBlbWl0RXhwcmVzc2lvbih3cml0ZXIsIHN0YXRlbWVudC5yZWNlaXZlciwgYCR7cGF0aH0vcmVjZWl2ZXJgLCBcImphdmFzY3JpcHRcIiwgaWRlbnRpdHkpXG4gICAgY29uc3QgZmllbGQgPSB3cml0ZXIucHJpdmF0ZUZpZWxkRm9ySWQoc3RhdGVtZW50LmZpZWxkKVxuXG4gICAgd3JpdGVyLm1hcHBlZChgLiMke2ZpZWxkLm5hbWV9YCwge21hcHBpbmdLaW5kOiBcImV4YWN0XCIsIG5hbWU6IGZpZWxkLm5hbWUsIG5vZGU6IHN0YXRlbWVudCwgcGF0aCwgcm9sZTogXCJtZW1iZXJcIn0pXG4gICAgd3JpdGVyLnN5bnRoZXRpYyhcIiA9IFwiLCBcInByaXZhdGUgZmllbGQgYXNzaWdubWVudFwiLCBbc3RhdGVtZW50XSwgW3BhdGhdKVxuICAgIGVtaXRFeHByZXNzaW9uKHdyaXRlciwgc3RhdGVtZW50LmV4cHJlc3Npb24sIGAke3BhdGh9L2V4cHJlc3Npb25gLCBcImphdmFzY3JpcHRcIiwgaWRlbnRpdHkpXG4gICAgd3JpdGVyLnN5bnRoZXRpYyhcIlxcblwiLCBcImxpbmUgYnJlYWtcIiwgW3N0YXRlbWVudF0sIFtwYXRoXSlcbiAgICByZXR1cm5cbiAgfVxuICBpZiAoc3RhdGVtZW50LmtpbmQgPT0gXCJCcmVha1N0YXRlbWVudFwiIHx8IHN0YXRlbWVudC5raW5kID09IFwiQ29udGludWVTdGF0ZW1lbnRcIikge1xuICAgIHdyaXRlci5tYXBwZWQoc3RhdGVtZW50LmtpbmQgPT0gXCJCcmVha1N0YXRlbWVudFwiID8gXCJicmVha1wiIDogXCJjb250aW51ZVwiLCB7bWFwcGluZ0tpbmQ6IFwiZXhhY3RcIiwgbm9kZTogc3RhdGVtZW50LCBwYXRofSlcbiAgICB3cml0ZXIuc3ludGhldGljKFwiXFxuXCIsIFwibGluZSBicmVha1wiLCBbc3RhdGVtZW50XSwgW3BhdGhdKVxuICAgIHJldHVyblxuICB9XG4gIGlmIChzdGF0ZW1lbnQua2luZCA9PSBcIldoaWxlU3RhdGVtZW50XCIpIHtcbiAgICB3cml0ZXIubWFwcGVkKFwid2hpbGVcIiwge21hcHBpbmdLaW5kOiBcImV4YWN0XCIsIG5vZGU6IHN0YXRlbWVudCwgcGF0aH0pXG4gICAgd3JpdGVyLnN5bnRoZXRpYyhcIiAoXCIsIFwiY29uZGl0aW9uLWNvbnRyb2xsZWQgbG9vcCBzcGFjaW5nXCIsIFtzdGF0ZW1lbnRdLCBbcGF0aF0pXG4gICAgZW1pdEV4cHJlc3Npb24od3JpdGVyLCBzdGF0ZW1lbnQuY29uZGl0aW9uLCBgJHtwYXRofS9jb25kaXRpb25gLCBcImphdmFzY3JpcHRcIiwgaWRlbnRpdHkpXG4gICAgd3JpdGVyLnN5bnRoZXRpYyhcIikgXCIsIFwiY29uZGl0aW9uLWNvbnRyb2xsZWQgbG9vcCBzcGFjaW5nXCIsIFtzdGF0ZW1lbnRdLCBbcGF0aF0pXG4gICAgd3JpdGVyLm1hcHBlZChcIntcIiwge21hcHBpbmdLaW5kOiBcImFuY2hvclwiLCBub2RlOiBzdGF0ZW1lbnQuYm9keSwgcGF0aDogYCR7cGF0aH0vYm9keWB9KVxuICAgIHdyaXRlci5zeW50aGV0aWMoXCJcXG5cIiwgXCJsaW5lIGJyZWFrXCIsIFtzdGF0ZW1lbnRdLCBbcGF0aF0pXG4gICAgZW1pdEJsb2NrKHdyaXRlciwgc3RhdGVtZW50LmJvZHksIGAke2luZGVudH0gIGAsIGAke3BhdGh9L2JvZHlgLCBjYW5vbmljYWxpemVaZXJvKVxuICAgIHdyaXRlci5zeW50aGV0aWMoaW5kZW50LCBcImluZGVudGF0aW9uXCIsIFtzdGF0ZW1lbnRdLCBbcGF0aF0pXG4gICAgd3JpdGVyLm1hcHBlZChcIn1cIiwge21hcHBpbmdLaW5kOiBcImFuY2hvclwiLCBub2RlOiBzdGF0ZW1lbnQuYm9keSwgcGF0aDogYCR7cGF0aH0vYm9keWB9KVxuICAgIHdyaXRlci5zeW50aGV0aWMoXCJcXG5cIiwgXCJsaW5lIGJyZWFrXCIsIFtzdGF0ZW1lbnRdLCBbcGF0aF0pXG4gICAgcmV0dXJuXG4gIH1cbiAgaWYgKHN0YXRlbWVudC5raW5kID09IFwiRm9yRWFjaFN0YXRlbWVudFwiKSB7XG4gICAgd3JpdGVyLm1hcHBlZChcImZvclwiLCB7bWFwcGluZ0tpbmQ6IFwiYW5jaG9yXCIsIG5vZGU6IHN0YXRlbWVudCwgcGF0aH0pXG4gICAgd3JpdGVyLnN5bnRoZXRpYyhcIiAoY29uc3QgXCIsIFwibG9vcCBzY2FmZm9sZGluZ1wiLCBbc3RhdGVtZW50XSwgW3BhdGhdKVxuICAgIHdyaXRlci5tYXBwZWQoc3RhdGVtZW50LnZhbHVlQmluZGluZy5uYW1lLCB7XG4gICAgICBtYXBwaW5nS2luZDogXCJleGFjdFwiLCBub2RlOiBzdGF0ZW1lbnQudmFsdWVCaW5kaW5nLCBwYXRoOiBgJHtwYXRofS92YWx1ZUJpbmRpbmdgLCByb2xlOiBcIm5hbWVcIlxuICAgIH0pXG4gICAgd3JpdGVyLnN5bnRoZXRpYyhcIiBvZiBcIiwgXCJsb29wIHNjYWZmb2xkaW5nXCIsIFtzdGF0ZW1lbnRdLCBbcGF0aF0pXG4gICAgZW1pdEV4cHJlc3Npb24od3JpdGVyLCBzdGF0ZW1lbnQubGlzdCwgYCR7cGF0aH0vbGlzdGAsIFwiamF2YXNjcmlwdFwiLCBpZGVudGl0eSlcbiAgICB3cml0ZXIuc3ludGhldGljKFwiKSBcIiwgXCJsb29wIHNjYWZmb2xkaW5nXCIsIFtzdGF0ZW1lbnRdLCBbcGF0aF0pXG4gICAgd3JpdGVyLm1hcHBlZChcIntcIiwge21hcHBpbmdLaW5kOiBcImFuY2hvclwiLCBub2RlOiBzdGF0ZW1lbnQuYm9keSwgcGF0aDogYCR7cGF0aH0vYm9keWB9KVxuICAgIHdyaXRlci5zeW50aGV0aWMoXCJcXG5cIiwgXCJsaW5lIGJyZWFrXCIsIFtzdGF0ZW1lbnRdLCBbcGF0aF0pXG4gICAgZW1pdEJsb2NrKHdyaXRlciwgc3RhdGVtZW50LmJvZHksIGAke2luZGVudH0gIGAsIGAke3BhdGh9L2JvZHlgLCBjYW5vbmljYWxpemVaZXJvKVxuICAgIHdyaXRlci5zeW50aGV0aWMoaW5kZW50LCBcImluZGVudGF0aW9uXCIsIFtzdGF0ZW1lbnRdLCBbcGF0aF0pXG4gICAgd3JpdGVyLm1hcHBlZChcIn1cIiwge21hcHBpbmdLaW5kOiBcImFuY2hvclwiLCBub2RlOiBzdGF0ZW1lbnQuYm9keSwgcGF0aDogYCR7cGF0aH0vYm9keWB9KVxuICAgIHdyaXRlci5zeW50aGV0aWMoXCJcXG5cIiwgXCJsaW5lIGJyZWFrXCIsIFtzdGF0ZW1lbnRdLCBbcGF0aF0pXG4gICAgcmV0dXJuXG4gIH1cbiAgaWYgKHN0YXRlbWVudC5raW5kID09IFwiRm9yRWFjaE1hcFN0YXRlbWVudFwiKSB7XG4gICAgd3JpdGVyLm1hcHBlZChcImZvclwiLCB7bWFwcGluZ0tpbmQ6IFwiYW5jaG9yXCIsIG5vZGU6IHN0YXRlbWVudCwgcGF0aH0pXG4gICAgd3JpdGVyLnN5bnRoZXRpYyhcIiAoY29uc3QgW1wiLCBcIm1hcCBsb29wIHNjYWZmb2xkaW5nXCIsIFtzdGF0ZW1lbnRdLCBbcGF0aF0pXG4gICAgd3JpdGVyLm1hcHBlZChzdGF0ZW1lbnQua2V5QmluZGluZy5uYW1lLCB7XG4gICAgICBtYXBwaW5nS2luZDogXCJleGFjdFwiLCBub2RlOiBzdGF0ZW1lbnQua2V5QmluZGluZywgcGF0aDogYCR7cGF0aH0va2V5QmluZGluZ2AsIHJvbGU6IFwibmFtZVwiXG4gICAgfSlcbiAgICB3cml0ZXIuc3ludGhldGljKFwiLCBcIiwgXCJtYXAgaXRlcmF0aW9uIGJpbmRpbmcgc2VwYXJhdG9yXCIsIFtzdGF0ZW1lbnRdLCBbcGF0aF0pXG4gICAgd3JpdGVyLm1hcHBlZChzdGF0ZW1lbnQudmFsdWVCaW5kaW5nLm5hbWUsIHtcbiAgICAgIG1hcHBpbmdLaW5kOiBcImV4YWN0XCIsIG5vZGU6IHN0YXRlbWVudC52YWx1ZUJpbmRpbmcsIHBhdGg6IGAke3BhdGh9L3ZhbHVlQmluZGluZ2AsIHJvbGU6IFwibmFtZVwiXG4gICAgfSlcbiAgICB3cml0ZXIuc3ludGhldGljKFwiXSBvZiBcIiwgXCJtYXAgbG9vcCBzY2FmZm9sZGluZ1wiLCBbc3RhdGVtZW50XSwgW3BhdGhdKVxuICAgIGVtaXRFeHByZXNzaW9uKHdyaXRlciwgc3RhdGVtZW50Lm1hcCwgYCR7cGF0aH0vbWFwYCwgXCJqYXZhc2NyaXB0XCIsIGlkZW50aXR5KVxuICAgIHdyaXRlci5zeW50aGV0aWMoXCIpIFwiLCBcIm1hcCBsb29wIHNjYWZmb2xkaW5nXCIsIFtzdGF0ZW1lbnRdLCBbcGF0aF0pXG4gICAgd3JpdGVyLm1hcHBlZChcIntcIiwge21hcHBpbmdLaW5kOiBcImFuY2hvclwiLCBub2RlOiBzdGF0ZW1lbnQuYm9keSwgcGF0aDogYCR7cGF0aH0vYm9keWB9KVxuICAgIHdyaXRlci5zeW50aGV0aWMoXCJcXG5cIiwgXCJsaW5lIGJyZWFrXCIsIFtzdGF0ZW1lbnRdLCBbcGF0aF0pXG4gICAgZW1pdEJsb2NrKHdyaXRlciwgc3RhdGVtZW50LmJvZHksIGAke2luZGVudH0gIGAsIGAke3BhdGh9L2JvZHlgLCBjYW5vbmljYWxpemVaZXJvKVxuICAgIHdyaXRlci5zeW50aGV0aWMoaW5kZW50LCBcImluZGVudGF0aW9uXCIsIFtzdGF0ZW1lbnRdLCBbcGF0aF0pXG4gICAgd3JpdGVyLm1hcHBlZChcIn1cIiwge21hcHBpbmdLaW5kOiBcImFuY2hvclwiLCBub2RlOiBzdGF0ZW1lbnQuYm9keSwgcGF0aDogYCR7cGF0aH0vYm9keWB9KVxuICAgIHdyaXRlci5zeW50aGV0aWMoXCJcXG5cIiwgXCJsaW5lIGJyZWFrXCIsIFtzdGF0ZW1lbnRdLCBbcGF0aF0pXG4gICAgcmV0dXJuXG4gIH1cbiAgaWYgKHN0YXRlbWVudC5raW5kID09IFwiUmFpc2VTdGF0ZW1lbnRcIikge1xuICAgIGNvbnN0IHR5cGUgPSBzdGF0ZW1lbnQuZXJyb3IuZXJyb3JcbiAgICBjb25zdCBlcnJvciA9IHdyaXRlci5lcnJvckZvcklkKHR5cGUuZGVjbGFyYXRpb25JZClcblxuICAgIHdyaXRlci5tYXBwZWQoXCJ0aHJvd1wiLCB7bWFwcGluZ0tpbmQ6IFwiYW5jaG9yXCIsIG5vZGU6IHN0YXRlbWVudCwgcGF0aH0pXG4gICAgd3JpdGVyLnN5bnRoZXRpYyhcIiBuZXcgXCIsIFwiZXJyb3IgY29uc3RydWN0aW9uIHNjYWZmb2xkaW5nXCIsIFtzdGF0ZW1lbnQuZXJyb3JdLCBbYCR7cGF0aH0vZXJyb3JgXSlcbiAgICB3cml0ZXIubWFwcGVkKHdyaXRlci5lcnJvck5hbWVGb3JJZCh0eXBlLmRlY2xhcmF0aW9uSWQpLCB7bWFwcGluZ0tpbmQ6IFwiZXhhY3RcIiwgbmFtZTogZXJyb3IubmFtZSwgbm9kZTogc3RhdGVtZW50LmVycm9yLCBwYXRoOiBgJHtwYXRofS9lcnJvcmAsIHJvbGU6IFwidHlwZVwifSlcbiAgICB3cml0ZXIuc3ludGhldGljKFwiKFwiLCBcImVycm9yIGNvbnN0cnVjdGlvbiBvcGVuXCIsIFtzdGF0ZW1lbnQuZXJyb3JdLCBbYCR7cGF0aH0vZXJyb3JgXSlcbiAgICBlbWl0RXhwcmVzc2lvbih3cml0ZXIsIHN0YXRlbWVudC5lcnJvci5tZXNzYWdlLCBgJHtwYXRofS9lcnJvci9tZXNzYWdlYCwgXCJqYXZhc2NyaXB0XCIsIGlkZW50aXR5KVxuICAgIHdyaXRlci5zeW50aGV0aWMoXCIpXFxuXCIsIFwiZXJyb3IgY29uc3RydWN0aW9uIGNsb3NlXCIsIFtzdGF0ZW1lbnQuZXJyb3JdLCBbYCR7cGF0aH0vZXJyb3JgXSlcbiAgICByZXR1cm5cbiAgfVxuICBpZiAoc3RhdGVtZW50LmtpbmQgPT0gXCJUcnlTdGF0ZW1lbnRcIikge1xuICAgIGNvbnN0IGNhdWdodCA9IHdyaXRlci5lcnJvckZvcklkKHN0YXRlbWVudC5jYXRjaFR5cGUuZGVjbGFyYXRpb25JZClcbiAgICBjb25zdCB0YXJnZXROYW1lID0gd3JpdGVyLmVycm9yTmFtZUZvcklkKHN0YXRlbWVudC5jYXRjaFR5cGUuZGVjbGFyYXRpb25JZClcblxuICAgIHdyaXRlci5tYXBwZWQoXCJ0cnlcIiwge21hcHBpbmdLaW5kOiBcImFuY2hvclwiLCBub2RlOiBzdGF0ZW1lbnQsIHBhdGh9KVxuICAgIHdyaXRlci5zeW50aGV0aWMoXCIgXCIsIFwidHJ5IHNwYWNpbmdcIiwgW3N0YXRlbWVudF0sIFtwYXRoXSlcbiAgICB3cml0ZXIubWFwcGVkKFwie1wiLCB7bWFwcGluZ0tpbmQ6IFwiYW5jaG9yXCIsIG5vZGU6IHN0YXRlbWVudC5ib2R5LCBwYXRoOiBgJHtwYXRofS9ib2R5YH0pXG4gICAgd3JpdGVyLnN5bnRoZXRpYyhcIlxcblwiLCBcImxpbmUgYnJlYWtcIiwgW3N0YXRlbWVudF0sIFtwYXRoXSlcbiAgICBlbWl0QmxvY2sod3JpdGVyLCBzdGF0ZW1lbnQuYm9keSwgYCR7aW5kZW50fSAgYCwgYCR7cGF0aH0vYm9keWAsIGNhbm9uaWNhbGl6ZVplcm8pXG4gICAgd3JpdGVyLnN5bnRoZXRpYyhpbmRlbnQsIFwiaW5kZW50YXRpb25cIiwgW3N0YXRlbWVudF0sIFtwYXRoXSlcbiAgICB3cml0ZXIubWFwcGVkKFwifVwiLCB7bWFwcGluZ0tpbmQ6IFwiYW5jaG9yXCIsIG5vZGU6IHN0YXRlbWVudC5ib2R5LCBwYXRoOiBgJHtwYXRofS9ib2R5YH0pXG4gICAgd3JpdGVyLnN5bnRoZXRpYyhcIiBcIiwgXCJjYXRjaCBzcGFjaW5nXCIsIFtzdGF0ZW1lbnRdLCBbcGF0aF0pXG4gICAgd3JpdGVyLm1hcHBlZChcImNhdGNoXCIsIHttYXBwaW5nS2luZDogXCJhbmNob3JcIiwgbm9kZTogc3RhdGVtZW50LCBwYXRoLCByb2xlOiBcImNhdGNoXCJ9KVxuICAgIHdyaXRlci5zeW50aGV0aWMoXCIgKFwiLCBcImNhdGNoIGJpbmRpbmcgc2NhZmZvbGRpbmdcIiwgW3N0YXRlbWVudC5jYXRjaEJpbmRpbmddLCBbYCR7cGF0aH0vY2F0Y2hCaW5kaW5nYF0pXG4gICAgd3JpdGVyLm1hcHBlZChzdGF0ZW1lbnQuY2F0Y2hCaW5kaW5nLm5hbWUsIHttYXBwaW5nS2luZDogXCJleGFjdFwiLCBub2RlOiBzdGF0ZW1lbnQuY2F0Y2hCaW5kaW5nLCBwYXRoOiBgJHtwYXRofS9jYXRjaEJpbmRpbmdgLCByb2xlOiBcIm5hbWVcIn0pXG4gICAgd3JpdGVyLnN5bnRoZXRpYyhcIikge1xcblwiLCBcImNhdGNoIGJpbmRpbmcgc2NhZmZvbGRpbmdcIiwgW3N0YXRlbWVudC5jYXRjaEJpbmRpbmddLCBbYCR7cGF0aH0vY2F0Y2hCaW5kaW5nYF0pXG4gICAgd3JpdGVyLnN5bnRoZXRpYyhgJHtpbmRlbnR9ICBpZiAoIShgLCBcImV4YWN0IGNhdGNoIGd1YXJkXCIsIFtzdGF0ZW1lbnRdLCBbcGF0aF0pXG4gICAgd3JpdGVyLm1hcHBlZChzdGF0ZW1lbnQuY2F0Y2hCaW5kaW5nLm5hbWUsIHttYXBwaW5nS2luZDogXCJleGFjdFwiLCBub2RlOiBzdGF0ZW1lbnQuY2F0Y2hCaW5kaW5nLCBwYXRoOiBgJHtwYXRofS9jYXRjaEJpbmRpbmdgLCByb2xlOiBcIm5hbWVcIn0pXG4gICAgd3JpdGVyLnN5bnRoZXRpYyhcIiBpbnN0YW5jZW9mIFwiLCBcImV4YWN0IGNhdGNoIGd1YXJkXCIsIFtzdGF0ZW1lbnRdLCBbcGF0aF0pXG4gICAgd3JpdGVyLm1hcHBlZCh0YXJnZXROYW1lLCB7bWFwcGluZ0tpbmQ6IFwiZXhhY3RcIiwgbmFtZTogY2F1Z2h0Lm5hbWUsIG5vZGU6IHN0YXRlbWVudC5jYXRjaFR5cGUsIHBhdGg6IGAke3BhdGh9L2NhdGNoVHlwZWAsIHJvbGU6IFwidHlwZVwifSlcbiAgICB3cml0ZXIuc3ludGhldGljKGApKSB7XFxuJHtpbmRlbnR9ICAgIHRocm93IGAsIFwidW5tYXRjaGVkIGVycm9yIHByb3BhZ2F0aW9uXCIsIFtzdGF0ZW1lbnRdLCBbcGF0aF0pXG4gICAgd3JpdGVyLm1hcHBlZChzdGF0ZW1lbnQuY2F0Y2hCaW5kaW5nLm5hbWUsIHttYXBwaW5nS2luZDogXCJleGFjdFwiLCBub2RlOiBzdGF0ZW1lbnQuY2F0Y2hCaW5kaW5nLCBwYXRoOiBgJHtwYXRofS9jYXRjaEJpbmRpbmdgLCByb2xlOiBcIm5hbWVcIn0pXG4gICAgd3JpdGVyLnN5bnRoZXRpYyhgXFxuJHtpbmRlbnR9ICB9XFxuYCwgXCJ1bm1hdGNoZWQgZXJyb3IgcHJvcGFnYXRpb25cIiwgW3N0YXRlbWVudF0sIFtwYXRoXSlcbiAgICBlbWl0QmxvY2sod3JpdGVyLCBzdGF0ZW1lbnQuY2F0Y2hCb2R5LCBgJHtpbmRlbnR9ICBgLCBgJHtwYXRofS9jYXRjaEJvZHlgLCBjYW5vbmljYWxpemVaZXJvKVxuICAgIHdyaXRlci5zeW50aGV0aWMoaW5kZW50LCBcImluZGVudGF0aW9uXCIsIFtzdGF0ZW1lbnRdLCBbcGF0aF0pXG4gICAgd3JpdGVyLm1hcHBlZChcIn1cIiwge21hcHBpbmdLaW5kOiBcImFuY2hvclwiLCBub2RlOiBzdGF0ZW1lbnQuY2F0Y2hCb2R5LCBwYXRoOiBgJHtwYXRofS9jYXRjaEJvZHlgfSlcbiAgICB3cml0ZXIuc3ludGhldGljKFwiXFxuXCIsIFwibGluZSBicmVha1wiLCBbc3RhdGVtZW50XSwgW3BhdGhdKVxuICAgIHJldHVyblxuICB9XG4gIGlmIChzdGF0ZW1lbnQua2luZCA9PSBcIlJldHVyblN0YXRlbWVudFwiKSB7XG4gICAgd3JpdGVyLm1hcHBlZChcInJldHVyblwiLCB7bWFwcGluZ0tpbmQ6IFwiYW5jaG9yXCIsIG5vZGU6IHN0YXRlbWVudCwgcGF0aH0pXG4gICAgaWYgKHN0YXRlbWVudC5leHByZXNzaW9uKSB7XG4gICAgICB3cml0ZXIuc3ludGhldGljKFwiIFwiLCBcInJldHVybiBzcGFjaW5nXCIsIFtzdGF0ZW1lbnRdLCBbcGF0aF0pXG4gICAgICBlbWl0RXhwcmVzc2lvbih3cml0ZXIsIHN0YXRlbWVudC5leHByZXNzaW9uLCBgJHtwYXRofS9leHByZXNzaW9uYCwgXCJqYXZhc2NyaXB0XCIsIGlkZW50aXR5KVxuICAgIH1cbiAgICB3cml0ZXIuc3ludGhldGljKFwiXFxuXCIsIFwibGluZSBicmVha1wiLCBbc3RhdGVtZW50XSwgW3BhdGhdKVxuICAgIHJldHVyblxuICB9XG4gIGlmIChzdGF0ZW1lbnQua2luZCA9PSBcIkV4cHJlc3Npb25TdGF0ZW1lbnRcIikge1xuICAgIGVtaXRFeHByZXNzaW9uKHdyaXRlciwgc3RhdGVtZW50LmV4cHJlc3Npb24sIGAke3BhdGh9L2V4cHJlc3Npb25gLCBcImphdmFzY3JpcHRcIiwgaWRlbnRpdHkpXG4gICAgd3JpdGVyLnN5bnRoZXRpYyhcIlxcblwiLCBcImxpbmUgYnJlYWtcIiwgW3N0YXRlbWVudF0sIFtwYXRoXSlcbiAgICByZXR1cm5cbiAgfVxuICBpZiAoc3RhdGVtZW50LmtpbmQgPT0gXCJQcmludFN0YXRlbWVudFwiKSB7XG4gICAgd3JpdGVyLm1hcHBlZChcImNvbnNvbGUubG9nXCIsIHttYXBwaW5nS2luZDogXCJhbmNob3JcIiwgbm9kZTogc3RhdGVtZW50LCBwYXRofSlcbiAgICB3cml0ZXIubWFwcGVkKFwiKFwiLCB7bWFwcGluZ0tpbmQ6IFwiYW5jaG9yXCIsIG5vZGU6IHN0YXRlbWVudCwgcGF0aH0pXG4gICAgaWYgKGNhbm9uaWNhbGl6ZVplcm8pIHdyaXRlci5zeW50aGV0aWMoXCIoXCIsIFwiY2Fub25pY2FsIGludGVnZXIgb3V0cHV0XCIsIFtzdGF0ZW1lbnRdLCBbcGF0aF0pXG4gICAgZW1pdEV4cHJlc3Npb24od3JpdGVyLCBzdGF0ZW1lbnQuZXhwcmVzc2lvbiwgYCR7cGF0aH0vZXhwcmVzc2lvbmAsIFwiamF2YXNjcmlwdFwiLCBpZGVudGl0eSlcbiAgICBpZiAoY2Fub25pY2FsaXplWmVybykgd3JpdGVyLnN5bnRoZXRpYyhcIikudG9TdHJpbmcoKVwiLCBcImNhbm9uaWNhbCBpbnRlZ2VyIG91dHB1dFwiLCBbc3RhdGVtZW50XSwgW3BhdGhdKVxuICAgIHdyaXRlci5tYXBwZWQoXCIpXCIsIHttYXBwaW5nS2luZDogXCJhbmNob3JcIiwgbm9kZTogc3RhdGVtZW50LCBwYXRofSlcbiAgICB3cml0ZXIuc3ludGhldGljKFwiXFxuXCIsIFwibGluZSBicmVha1wiLCBbc3RhdGVtZW50XSwgW3BhdGhdKVxuICAgIHJldHVyblxuICB9XG5cbiAgd3JpdGVyLm1hcHBlZChcImlmXCIsIHttYXBwaW5nS2luZDogXCJhbmNob3JcIiwgbm9kZTogc3RhdGVtZW50LCBwYXRofSlcbiAgd3JpdGVyLnN5bnRoZXRpYyhcIiBcIiwgXCJjb25kaXRpb25hbCBzcGFjaW5nXCIsIFtzdGF0ZW1lbnRdLCBbcGF0aF0pXG4gIHdyaXRlci5tYXBwZWQoXCIoXCIsIHttYXBwaW5nS2luZDogXCJhbmNob3JcIiwgbm9kZTogc3RhdGVtZW50LCBwYXRofSlcbiAgZW1pdEV4cHJlc3Npb24od3JpdGVyLCBzdGF0ZW1lbnQuY29uZGl0aW9uLCBgJHtwYXRofS9jb25kaXRpb25gLCBcImphdmFzY3JpcHRcIiwgaWRlbnRpdHkpXG4gIHdyaXRlci5tYXBwZWQoXCIpXCIsIHttYXBwaW5nS2luZDogXCJhbmNob3JcIiwgbm9kZTogc3RhdGVtZW50LCBwYXRofSlcbiAgd3JpdGVyLnN5bnRoZXRpYyhcIiBcIiwgXCJjb25kaXRpb25hbCBzcGFjaW5nXCIsIFtzdGF0ZW1lbnRdLCBbcGF0aF0pXG4gIHdyaXRlci5tYXBwZWQoXCJ7XCIsIHttYXBwaW5nS2luZDogXCJhbmNob3JcIiwgbm9kZTogc3RhdGVtZW50LmNvbnNlcXVlbnQsIHBhdGg6IGAke3BhdGh9L2NvbnNlcXVlbnRgfSlcbiAgd3JpdGVyLnN5bnRoZXRpYyhcIlxcblwiLCBcImxpbmUgYnJlYWtcIiwgW3N0YXRlbWVudF0sIFtwYXRoXSlcbiAgZW1pdEJsb2NrKHdyaXRlciwgc3RhdGVtZW50LmNvbnNlcXVlbnQsIGAke2luZGVudH0gIGAsIGAke3BhdGh9L2NvbnNlcXVlbnRgLCBjYW5vbmljYWxpemVaZXJvKVxuICB3cml0ZXIuc3ludGhldGljKGluZGVudCwgXCJpbmRlbnRhdGlvblwiLCBbc3RhdGVtZW50XSwgW3BhdGhdKVxuICB3cml0ZXIubWFwcGVkKFwifVwiLCB7bWFwcGluZ0tpbmQ6IFwiYW5jaG9yXCIsIG5vZGU6IHN0YXRlbWVudC5jb25zZXF1ZW50LCBwYXRoOiBgJHtwYXRofS9jb25zZXF1ZW50YH0pXG4gIGlmIChzdGF0ZW1lbnQuYWx0ZXJuYXRlKSB7XG4gICAgd3JpdGVyLnN5bnRoZXRpYyhcIiBcIiwgXCJjb25kaXRpb25hbCBzcGFjaW5nXCIsIFtzdGF0ZW1lbnRdLCBbcGF0aF0pXG4gICAgd3JpdGVyLm1hcHBlZChcImVsc2VcIiwge21hcHBpbmdLaW5kOiBcImFuY2hvclwiLCBub2RlOiBzdGF0ZW1lbnQsIHBhdGh9KVxuICAgIHdyaXRlci5zeW50aGV0aWMoXCIgXCIsIFwiY29uZGl0aW9uYWwgc3BhY2luZ1wiLCBbc3RhdGVtZW50XSwgW3BhdGhdKVxuICAgIHdyaXRlci5tYXBwZWQoXCJ7XCIsIHttYXBwaW5nS2luZDogXCJhbmNob3JcIiwgbm9kZTogc3RhdGVtZW50LmFsdGVybmF0ZSwgcGF0aDogYCR7cGF0aH0vYWx0ZXJuYXRlYH0pXG4gICAgd3JpdGVyLnN5bnRoZXRpYyhcIlxcblwiLCBcImxpbmUgYnJlYWtcIiwgW3N0YXRlbWVudF0sIFtwYXRoXSlcbiAgICBlbWl0QmxvY2sod3JpdGVyLCBzdGF0ZW1lbnQuYWx0ZXJuYXRlLCBgJHtpbmRlbnR9ICBgLCBgJHtwYXRofS9hbHRlcm5hdGVgLCBjYW5vbmljYWxpemVaZXJvKVxuICAgIHdyaXRlci5zeW50aGV0aWMoaW5kZW50LCBcImluZGVudGF0aW9uXCIsIFtzdGF0ZW1lbnRdLCBbcGF0aF0pXG4gICAgd3JpdGVyLm1hcHBlZChcIn1cIiwge21hcHBpbmdLaW5kOiBcImFuY2hvclwiLCBub2RlOiBzdGF0ZW1lbnQuYWx0ZXJuYXRlLCBwYXRoOiBgJHtwYXRofS9hbHRlcm5hdGVgfSlcbiAgfVxuICB3cml0ZXIuc3ludGhldGljKFwiXFxuXCIsIFwibGluZSBicmVha1wiLCBbc3RhdGVtZW50XSwgW3BhdGhdKVxufVxuXG4vKipcbiAqIEVtaXRzIG9uZSBKYXZhU2NyaXB0IGxvY2FsIHN0YXRlbWVudCBhbmQgaXRzIEpTRG9jIHR5cGUgY2Fycmllci5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi93cml0ZXIuanNcIikuU291cmNlV3JpdGVyfSB3cml0ZXIgLSBTb3VyY2UtYXdhcmUgd3JpdGVyLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5Mb2NhbFN0YXRlbWVudH0gc3RhdGVtZW50IC0gTG9jYWwgc3RhdGVtZW50LlxuICogQHBhcmFtIHtzdHJpbmd9IGluZGVudCAtIExlYWRpbmcgaW5kZW50YXRpb24uXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RhdGVtZW50UGF0aCAtIEV4YWN0IEpTT04gUG9pbnRlciBmb3IgdGhpcyBzdGF0ZW1lbnQgb2NjdXJyZW5jZS5cbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5mdW5jdGlvbiBlbWl0TG9jYWwod3JpdGVyLCBzdGF0ZW1lbnQsIGluZGVudCwgc3RhdGVtZW50UGF0aCkge1xuICB3cml0ZXIuc3ludGhldGljKGluZGVudCwgXCJpbmRlbnRhdGlvblwiLCBbc3RhdGVtZW50XSwgW3N0YXRlbWVudFBhdGhdKVxuXG4gIGlmIChzdGF0ZW1lbnQua2luZCA9PSBcIkFzc2lnbm1lbnRTdGF0ZW1lbnRcIikge1xuICAgIHdyaXRlci5tYXBwZWQoc3RhdGVtZW50LnRhcmdldC5uYW1lLCB7bWFwcGluZ0tpbmQ6IFwiZXhhY3RcIiwgbm9kZTogc3RhdGVtZW50LnRhcmdldCwgcGF0aDogYCR7c3RhdGVtZW50UGF0aH0vdGFyZ2V0YCwgcm9sZTogXCJuYW1lXCJ9KVxuICAgIHdyaXRlci5zeW50aGV0aWMoXCIgXCIsIFwiYXNzaWdubWVudCBzcGFjaW5nXCIsIFtzdGF0ZW1lbnRdLCBbc3RhdGVtZW50UGF0aF0pXG4gICAgd3JpdGVyLm1hcHBlZChcIj1cIiwge21hcHBpbmdLaW5kOiBcImV4YWN0XCIsIG5vZGU6IHN0YXRlbWVudCwgcGF0aDogc3RhdGVtZW50UGF0aCwgcm9sZTogXCJvcGVyYXRvclwifSlcbiAgICB3cml0ZXIuc3ludGhldGljKFwiIFwiLCBcImFzc2lnbm1lbnQgc3BhY2luZ1wiLCBbc3RhdGVtZW50XSwgW3N0YXRlbWVudFBhdGhdKVxuICAgIGVtaXRFeHByZXNzaW9uKHdyaXRlciwgc3RhdGVtZW50LmV4cHJlc3Npb24sIGAke3N0YXRlbWVudFBhdGh9L2V4cHJlc3Npb25gLCBcImphdmFzY3JpcHRcIiwgaWRlbnRpdHkpXG4gICAgd3JpdGVyLnN5bnRoZXRpYyhcIlxcblwiLCBcImxpbmUgYnJlYWtcIiwgW3N0YXRlbWVudF0sIFtzdGF0ZW1lbnRQYXRoXSlcbiAgICByZXR1cm5cbiAgfVxuXG4gIHdyaXRlci5zeW50aGV0aWMoXCIvKiogQHR5cGUge1wiLCBcIkphdmFTY3JpcHQgbG9jYWwgdHlwZSBzY2FmZm9sZGluZ1wiLCBbc3RhdGVtZW50XSwgW3N0YXRlbWVudFBhdGhdKVxuICBlbWl0VHlwZSh3cml0ZXIsIHN0YXRlbWVudC50eXBlLCBgJHtzdGF0ZW1lbnRQYXRofS90eXBlYCwgXCJqYXZhc2NyaXB0XCIpXG4gIHdyaXRlci5zeW50aGV0aWMoXCJ9ICovXFxuXCIsIFwiSmF2YVNjcmlwdCBsb2NhbCB0eXBlIHNjYWZmb2xkaW5nXCIsIFtzdGF0ZW1lbnRdLCBbc3RhdGVtZW50UGF0aF0pXG4gIHdyaXRlci5zeW50aGV0aWMoaW5kZW50LCBcImluZGVudGF0aW9uXCIsIFtzdGF0ZW1lbnRdLCBbc3RhdGVtZW50UGF0aF0pXG4gIHdyaXRlci5tYXBwZWQoc3RhdGVtZW50Lm11dGFibGUgPyBcImxldFwiIDogXCJjb25zdFwiLCB7bWFwcGluZ0tpbmQ6IFwiYW5jaG9yXCIsIG5vZGU6IHN0YXRlbWVudCwgcGF0aDogc3RhdGVtZW50UGF0aH0pXG4gIHdyaXRlci5zeW50aGV0aWMoXCIgXCIsIFwiZGVjbGFyYXRpb24gc3BhY2luZ1wiLCBbc3RhdGVtZW50XSwgW3N0YXRlbWVudFBhdGhdKVxuICB3cml0ZXIubWFwcGVkKHN0YXRlbWVudC5uYW1lLCB7bWFwcGluZ0tpbmQ6IFwiZXhhY3RcIiwgbm9kZTogc3RhdGVtZW50LCBwYXRoOiBzdGF0ZW1lbnRQYXRoLCByb2xlOiBcIm5hbWVcIn0pXG4gIHdyaXRlci5zeW50aGV0aWMoXCIgXCIsIFwiYXNzaWdubWVudCBzcGFjaW5nXCIsIFtzdGF0ZW1lbnRdLCBbc3RhdGVtZW50UGF0aF0pXG4gIHdyaXRlci5tYXBwZWQoXCI9XCIsIHttYXBwaW5nS2luZDogXCJleGFjdFwiLCBub2RlOiBzdGF0ZW1lbnQsIHBhdGg6IHN0YXRlbWVudFBhdGgsIHJvbGU6IFwib3BlcmF0b3JcIn0pXG4gIHdyaXRlci5zeW50aGV0aWMoXCIgXCIsIFwiYXNzaWdubWVudCBzcGFjaW5nXCIsIFtzdGF0ZW1lbnRdLCBbc3RhdGVtZW50UGF0aF0pXG4gIGVtaXRFeHByZXNzaW9uKHdyaXRlciwgc3RhdGVtZW50LmluaXRpYWxpemVyLCBgJHtzdGF0ZW1lbnRQYXRofS9pbml0aWFsaXplcmAsIFwiamF2YXNjcmlwdFwiLCBpZGVudGl0eSlcbiAgd3JpdGVyLnN5bnRoZXRpYyhcIlxcblwiLCBcImxpbmUgYnJlYWtcIiwgW3N0YXRlbWVudF0sIFtzdGF0ZW1lbnRQYXRoXSlcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGFuIHVuY2hhbmdlZCBKYXZhU2NyaXB0IGlkZW50aWZpZXIuXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIElkZW50aWZpZXIuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBJZGVudGlmaWVyLlxuICovXG5mdW5jdGlvbiBpZGVudGl0eShuYW1lKSB7XG4gIHJldHVybiBuYW1lXG59XG4iXX0=
|