semantifold 0.1.1 → 0.3.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 +42 -10
- package/build/index.d.ts +32 -3
- package/build/index.d.ts.map +1 -1
- package/build/index.js +99 -4
- package/build/src/acceptance.d.ts +32 -0
- package/build/src/acceptance.d.ts.map +1 -0
- package/build/src/acceptance.js +358 -0
- package/build/src/array.d.ts +7 -0
- package/build/src/array.d.ts.map +1 -0
- package/build/src/array.js +18 -0
- package/build/src/artifact-path.d.ts +13 -0
- package/build/src/artifact-path.d.ts.map +1 -0
- package/build/src/artifact-path.js +30 -0
- package/build/src/artifacts.d.ts +7 -0
- package/build/src/artifacts.d.ts.map +1 -0
- package/build/src/artifacts.js +389 -0
- package/build/src/backends/c-runtime.d.ts +3 -0
- package/build/src/backends/c-runtime.d.ts.map +1 -0
- package/build/src/backends/c-runtime.js +151 -0
- package/build/src/backends/c-validation.d.ts +12 -0
- package/build/src/backends/c-validation.d.ts.map +1 -0
- package/build/src/backends/c-validation.js +85 -0
- package/build/src/backends/c.d.ts +31 -0
- package/build/src/backends/c.d.ts.map +1 -0
- package/build/src/backends/c.js +308 -0
- package/build/src/backends/cpp-runtime.d.ts +3 -0
- package/build/src/backends/cpp-runtime.d.ts.map +1 -0
- package/build/src/backends/cpp-runtime.js +99 -0
- package/build/src/backends/cpp-validation.d.ts +9 -0
- package/build/src/backends/cpp-validation.d.ts.map +1 -0
- package/build/src/backends/cpp-validation.js +74 -0
- package/build/src/backends/cpp.d.ts +16 -0
- package/build/src/backends/cpp.d.ts.map +1 -0
- package/build/src/backends/cpp.js +285 -0
- package/build/src/backends/csharp.d.ts +20 -0
- package/build/src/backends/csharp.d.ts.map +1 -0
- package/build/src/backends/csharp.js +259 -0
- package/build/src/backends/go.d.ts +20 -0
- package/build/src/backends/go.d.ts.map +1 -0
- package/build/src/backends/go.js +374 -0
- package/build/src/backends/identifiers.d.ts +12 -0
- package/build/src/backends/identifiers.d.ts.map +1 -1
- package/build/src/backends/identifiers.js +79 -2
- package/build/src/backends/index.d.ts.map +1 -1
- package/build/src/backends/index.js +27 -37
- package/build/src/backends/native-validation.d.ts +9 -0
- package/build/src/backends/native-validation.d.ts.map +1 -0
- package/build/src/backends/native-validation.js +59 -0
- package/build/src/backends/ordered-expressions.d.ts +74 -0
- package/build/src/backends/ordered-expressions.d.ts.map +1 -0
- package/build/src/backends/ordered-expressions.js +159 -0
- package/build/src/backends/python.d.ts +8 -0
- package/build/src/backends/python.d.ts.map +1 -0
- package/build/src/backends/python.js +162 -0
- package/build/src/backends/scalars.d.ts.map +1 -1
- package/build/src/backends/scalars.js +8 -2
- package/build/src/backends/shared.d.ts.map +1 -1
- package/build/src/backends/shared.js +67 -19
- package/build/src/binary-mapping.d.ts +32 -0
- package/build/src/binary-mapping.d.ts.map +1 -0
- package/build/src/binary-mapping.js +285 -0
- package/build/src/diagnostic.d.ts +36 -4
- package/build/src/diagnostic.d.ts.map +1 -1
- package/build/src/diagnostic.js +42 -3
- package/build/src/frontends/c-parser.d.ts +20 -0
- package/build/src/frontends/c-parser.d.ts.map +1 -0
- package/build/src/frontends/c-parser.js +14 -0
- package/build/src/frontends/c.d.ts +220 -0
- package/build/src/frontends/c.d.ts.map +1 -0
- package/build/src/frontends/c.js +750 -0
- package/build/src/frontends/cpp-parser.d.ts +11 -0
- package/build/src/frontends/cpp-parser.d.ts.map +1 -0
- package/build/src/frontends/cpp-parser.js +15 -0
- package/build/src/frontends/cpp.d.ts +227 -0
- package/build/src/frontends/cpp.d.ts.map +1 -0
- package/build/src/frontends/cpp.js +784 -0
- package/build/src/frontends/csharp.d.ts +14 -0
- package/build/src/frontends/csharp.d.ts.map +1 -0
- package/build/src/frontends/csharp.js +708 -0
- package/build/src/frontends/go.d.ts +15 -0
- package/build/src/frontends/go.d.ts.map +1 -0
- package/build/src/frontends/go.js +712 -0
- package/build/src/frontends/index.d.ts.map +1 -1
- package/build/src/frontends/index.js +5 -23
- package/build/src/frontends/python.d.ts +14 -0
- package/build/src/frontends/python.d.ts.map +1 -0
- package/build/src/frontends/python.js +615 -0
- package/build/src/frontends/scalars.d.ts.map +1 -1
- package/build/src/frontends/scalars.js +21 -1
- package/build/src/language-registry.d.ts +113 -0
- package/build/src/language-registry.d.ts.map +1 -0
- package/build/src/language-registry.js +421 -0
- package/build/src/mapping.js +3 -2
- package/build/src/semantic/location.d.ts +7 -0
- package/build/src/semantic/location.d.ts.map +1 -1
- package/build/src/semantic/location.js +10 -1
- package/build/src/semantic/provenance.js +3 -3
- package/build/src/semantic/types.d.ts +399 -2
- package/build/src/semantic/types.d.ts.map +1 -1
- package/build/src/semantic/types.js +110 -2
- package/build/src/subprocess.d.ts +38 -0
- package/build/src/subprocess.d.ts.map +1 -0
- package/build/src/subprocess.js +233 -0
- package/build/src/timeout.d.ts +8 -0
- package/build/src/timeout.d.ts.map +1 -0
- package/build/src/timeout.js +11 -0
- package/build/src/toolchains.d.ts +107 -0
- package/build/src/toolchains.d.ts.map +1 -0
- package/build/src/toolchains.js +417 -0
- package/docs/architecture.md +23 -5
- package/docs/c.md +60 -0
- package/docs/cpp.md +61 -0
- package/docs/goals.md +4 -2
- package/docs/language-support.md +46 -6
- package/docs/parser-qualification.md +219 -0
- package/docs/plans/2026-09-05-standard-library-portability.md +46 -0
- package/docs/source-maps.md +38 -5
- package/docs/standard-library-portability.md +190 -0
- package/docs/testing.md +131 -3
- package/index.js +109 -4
- package/node_modules/node-addon-api/LICENSE.md +9 -0
- package/node_modules/node-addon-api/README.md +95 -0
- package/node_modules/node-addon-api/common.gypi +21 -0
- package/node_modules/node-addon-api/except.gypi +25 -0
- package/node_modules/node-addon-api/index.js +14 -0
- package/node_modules/node-addon-api/napi-inl.deprecated.h +186 -0
- package/node_modules/node-addon-api/napi-inl.h +7250 -0
- package/node_modules/node-addon-api/napi.h +3463 -0
- package/node_modules/node-addon-api/node_addon_api.gyp +42 -0
- package/node_modules/node-addon-api/node_api.gyp +9 -0
- package/node_modules/node-addon-api/noexcept.gypi +26 -0
- package/node_modules/node-addon-api/nothing.c +0 -0
- package/node_modules/node-addon-api/package-support.json +21 -0
- package/node_modules/node-addon-api/package.json +481 -0
- package/node_modules/node-addon-api/tools/README.md +73 -0
- package/node_modules/node-addon-api/tools/check-napi.js +99 -0
- package/node_modules/node-addon-api/tools/clang-format.js +71 -0
- package/node_modules/node-addon-api/tools/conversion.js +301 -0
- package/node_modules/node-gyp-build/LICENSE +21 -0
- package/node_modules/node-gyp-build/README.md +58 -0
- package/node_modules/node-gyp-build/SECURITY.md +5 -0
- package/node_modules/node-gyp-build/bin.js +84 -0
- package/node_modules/node-gyp-build/build-test.js +19 -0
- package/node_modules/node-gyp-build/index.js +6 -0
- package/node_modules/node-gyp-build/node-gyp-build.js +207 -0
- package/node_modules/node-gyp-build/optional.js +7 -0
- package/node_modules/node-gyp-build/package.json +43 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/LICENSE +15 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/README.md +7 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/LICENSE +21 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/README.md +90 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/binding.gyp +79 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/index.js +895 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/package.json +62 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/prebuilds/darwin-arm64/tree-sitter.node +0 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/prebuilds/darwin-x64/tree-sitter.node +0 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/prebuilds/linux-x64/tree-sitter.node +0 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/prebuilds/win32-x64/tree-sitter.node +0 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/addon_data.h +47 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/binding.cc +35 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/conversions.cc +140 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/conversions.h +22 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/language.cc +106 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/language.h +17 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/logger.cc +70 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/logger.h +19 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/lookaheaditerator.cc +122 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/lookaheaditerator.h +33 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/node.cc +1056 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/node.h +30 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/parser.cc +298 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/parser.h +35 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/query.cc +383 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/query.h +39 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/tree.cc +307 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/tree.h +45 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/tree_cursor.cc +213 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/tree_cursor.h +52 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/tree-sitter.d.ts +211 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/include/tree_sitter/api.h +1266 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/alloc.c +48 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/alloc.h +41 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/array.h +290 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/atomic.h +68 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/clock.h +146 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/error_costs.h +11 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/get_changed_ranges.c +501 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/get_changed_ranges.h +36 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/host.h +21 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/language.c +221 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/language.h +299 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/length.h +52 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/lexer.c +419 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/lexer.h +49 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/lib.c +14 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/node.c +774 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/parser.c +2151 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/parser.h +230 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/point.h +62 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/query.c +4134 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/reduce_action.h +34 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/reusable_node.h +95 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/stack.c +899 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/stack.h +133 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/subtree.c +1060 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/subtree.h +382 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/tree.c +165 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/tree.h +31 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/tree_cursor.c +714 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/tree_cursor.h +48 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/ICU_SHA +1 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/LICENSE +414 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/README.md +29 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/ptypes.h +1 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/umachine.h +448 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/urename.h +1 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/utf.h +1 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/utf16.h +733 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/utf8.h +881 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode.h +50 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/wasm/stdlib-symbols.txt +23 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/wasm/stdlib.c +109 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/wasm/wasm-stdlib.h +1294 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/wasm_store.c +1823 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/wasm_store.h +31 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/LICENSE +21 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/README.md +18 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/binding.gyp +29 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/bindings/node/binding.cc +20 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/bindings/node/binding_test.js +9 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/bindings/node/index.d.ts +28 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/bindings/node/index.js +11 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/grammar.js +1470 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/package.json +60 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/prebuilds/darwin-arm64/tree-sitter-c.node +0 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/prebuilds/darwin-x64/tree-sitter-c.node +0 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/prebuilds/linux-arm64/tree-sitter-c.node +0 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/prebuilds/linux-x64/tree-sitter-c.node +0 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/prebuilds/win32-arm64/tree-sitter-c.node +0 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/prebuilds/win32-x64/tree-sitter-c.node +0 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/queries/highlights.scm +81 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/queries/tags.scm +9 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/src/grammar.json +9735 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/src/node-types.json +4614 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/src/parser.c +119615 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/src/tree_sitter/alloc.h +54 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/src/tree_sitter/array.h +290 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/src/tree_sitter/parser.h +266 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/tree-sitter-c.wasm +0 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/tree-sitter.json +43 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/LICENSE +21 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/README.md +22 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/binding.gyp +30 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/bindings/node/binding.cc +20 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/bindings/node/binding_test.js +9 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/bindings/node/index.d.ts +28 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/bindings/node/index.js +11 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/grammar.js +1436 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/package.json +61 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/prebuilds/darwin-arm64/tree-sitter-cpp.node +0 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/prebuilds/darwin-x64/tree-sitter-cpp.node +0 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/prebuilds/linux-arm64/tree-sitter-cpp.node +0 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/prebuilds/linux-x64/tree-sitter-cpp.node +0 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/prebuilds/win32-arm64/tree-sitter-cpp.node +0 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/prebuilds/win32-x64/tree-sitter-cpp.node +0 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/queries/highlights.scm +70 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/queries/injections.scm +3 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/queries/tags.scm +15 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/src/grammar.json +17084 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/src/node-types.json +7997 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/src/parser.c +530368 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/src/scanner.c +148 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/src/tree_sitter/alloc.h +54 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/src/tree_sitter/array.h +290 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/src/tree_sitter/parser.h +266 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/tree-sitter-cpp.wasm +0 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/tree-sitter.json +55 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/package.json +22 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/src/c.js +152 -0
- package/node_modules/tree-sitter/LICENSE +21 -0
- package/node_modules/tree-sitter/README.md +128 -0
- package/node_modules/tree-sitter/binding.gyp +88 -0
- package/node_modules/tree-sitter/index.js +950 -0
- package/node_modules/tree-sitter/package.json +76 -0
- package/node_modules/tree-sitter/prebuilds/darwin-arm64/tree-sitter.node +0 -0
- package/node_modules/tree-sitter/prebuilds/darwin-x64/tree-sitter.node +0 -0
- package/node_modules/tree-sitter/prebuilds/linux-arm64/tree-sitter.node +0 -0
- package/node_modules/tree-sitter/prebuilds/linux-x64/tree-sitter.node +0 -0
- package/node_modules/tree-sitter/prebuilds/win32-arm64/tree-sitter.node +0 -0
- package/node_modules/tree-sitter/prebuilds/win32-x64/tree-sitter.node +0 -0
- package/node_modules/tree-sitter/src/addon_data.h +47 -0
- package/node_modules/tree-sitter/src/binding.cc +35 -0
- package/node_modules/tree-sitter/src/conversions.cc +140 -0
- package/node_modules/tree-sitter/src/conversions.h +22 -0
- package/node_modules/tree-sitter/src/language.cc +105 -0
- package/node_modules/tree-sitter/src/language.h +17 -0
- package/node_modules/tree-sitter/src/logger.cc +70 -0
- package/node_modules/tree-sitter/src/logger.h +19 -0
- package/node_modules/tree-sitter/src/lookaheaditerator.cc +122 -0
- package/node_modules/tree-sitter/src/lookaheaditerator.h +33 -0
- package/node_modules/tree-sitter/src/node.cc +1088 -0
- package/node_modules/tree-sitter/src/node.h +30 -0
- package/node_modules/tree-sitter/src/parser.cc +332 -0
- package/node_modules/tree-sitter/src/parser.h +35 -0
- package/node_modules/tree-sitter/src/query.cc +425 -0
- package/node_modules/tree-sitter/src/query.h +40 -0
- package/node_modules/tree-sitter/src/tree.cc +316 -0
- package/node_modules/tree-sitter/src/tree.h +45 -0
- package/node_modules/tree-sitter/src/tree_cursor.cc +213 -0
- package/node_modules/tree-sitter/src/tree_cursor.h +52 -0
- package/node_modules/tree-sitter/tree-sitter.d.ts +1083 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/include/tree_sitter/api.h +1478 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/alloc.c +48 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/alloc.h +41 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/array.h +291 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/atomic.h +68 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/clock.h +146 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/error_costs.h +11 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/get_changed_ranges.c +523 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/get_changed_ranges.h +36 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/host.h +21 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/language.c +293 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/language.h +293 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/length.h +52 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/lexer.c +483 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/lexer.h +54 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/lib.c +12 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/node.c +875 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/parser.c +2297 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/parser.h +286 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/point.h +48 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/portable/endian.h +241 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/query.c +4347 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/reduce_action.h +34 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/reusable_node.h +95 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/stack.c +912 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/stack.h +133 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/subtree.c +1034 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/subtree.h +399 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/tree.c +170 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/tree.h +31 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/tree_cursor.c +716 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/tree_cursor.h +48 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/ts_assert.h +11 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/ICU_SHA +1 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/LICENSE +414 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/README.md +29 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/ptypes.h +1 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/umachine.h +448 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/urename.h +1 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/utf.h +1 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/utf16.h +733 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/utf8.h +881 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode.h +75 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/wasm/stdlib-symbols.txt +24 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/wasm/stdlib.c +137 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/wasm/wasm-stdlib.h +1314 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/wasm_store.c +1937 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/wasm_store.h +31 -0
- package/package.json +24 -6
- package/src/acceptance.js +380 -0
- package/src/array.js +19 -0
- package/src/artifact-path.js +34 -0
- package/src/artifacts.js +420 -0
- package/src/backends/c-runtime.js +151 -0
- package/src/backends/c-validation.js +83 -0
- package/src/backends/c.js +308 -0
- package/src/backends/cpp-runtime.js +99 -0
- package/src/backends/cpp-validation.js +70 -0
- package/src/backends/cpp.js +285 -0
- package/src/backends/csharp.js +270 -0
- package/src/backends/go.js +383 -0
- package/src/backends/identifiers.js +80 -1
- package/src/backends/index.js +23 -32
- package/src/backends/native-validation.js +64 -0
- package/src/backends/ordered-expressions.js +161 -0
- package/src/backends/python.js +175 -0
- package/src/backends/scalars.js +8 -1
- package/src/backends/shared.js +64 -17
- package/src/binary-mapping.js +305 -0
- package/src/diagnostic.js +34 -2
- package/src/frontends/c-parser.js +17 -0
- package/src/frontends/c.js +780 -0
- package/src/frontends/cpp-parser.js +18 -0
- package/src/frontends/cpp.js +816 -0
- package/src/frontends/csharp.js +759 -0
- package/src/frontends/go.js +770 -0
- package/src/frontends/index.js +5 -20
- package/src/frontends/python.js +689 -0
- package/src/frontends/scalars.js +20 -0
- package/src/language-registry.js +454 -0
- package/src/mapping.js +2 -1
- package/src/semantic/location.js +10 -0
- package/src/semantic/provenance.js +2 -2
- package/src/semantic/types.js +124 -1
- package/src/subprocess.js +232 -0
- package/src/timeout.js +12 -0
- package/src/toolchains.js +448 -0
- package/tsconfig.json +1 -0
|
@@ -0,0 +1,712 @@
|
|
|
1
|
+
// @ts-check
|
|
2
|
+
import Parser from "tree-sitter";
|
|
3
|
+
import GoLanguage from "tree-sitter-go/bindings/node/index.js";
|
|
4
|
+
import { missingType, parseFailure, SemantifoldDiagnostic, unsupportedSyntax } from "../diagnostic.js";
|
|
5
|
+
import { locationFromOffsets, moduleLocation, utf8ByteOffsetToUtf16Offset } from "../semantic/location.js";
|
|
6
|
+
import { withAdaptedOperation } from "../semantic/operators.js";
|
|
7
|
+
import { withParserRanges } from "../semantic/provenance.js";
|
|
8
|
+
import { hasOnlyUnicodeScalars } from "../semantic/scalars.js";
|
|
9
|
+
import { validateParsedModule } from "../semantic/validate.js";
|
|
10
|
+
import { sourceScalarType } from "./scalars.js";
|
|
11
|
+
const parser = new Parser();
|
|
12
|
+
parser.setLanguage(/** @type {import("tree-sitter").Language} */ ( /** @type {unknown} */(GoLanguage)));
|
|
13
|
+
const immutableMarker = "// @semantifold-immutable";
|
|
14
|
+
const goKeywords = new Set([
|
|
15
|
+
"break", "default", "func", "interface", "select", "case", "defer", "go", "map", "struct", "chan",
|
|
16
|
+
"else", "goto", "package", "switch", "const", "fallthrough", "if", "range", "type", "continue",
|
|
17
|
+
"for", "import", "return", "var"
|
|
18
|
+
]);
|
|
19
|
+
const functionReserved = new Set(["main", "init", "fmt", "int64", "bool", "string", "true", "false"]);
|
|
20
|
+
const bindingReserved = new Set(["fmt", "int64", "bool", "string", "true", "false"]);
|
|
21
|
+
const binaryOperations = new Map([
|
|
22
|
+
["+", "Add"], ["-", "Subtract"], ["*", "Multiply"], ["==", "Equal"], ["!=", "NotEqual"],
|
|
23
|
+
["<", "LessThan"], ["<=", "LessThanOrEqual"], [">", "GreaterThan"], [">=", "GreaterThanOrEqual"],
|
|
24
|
+
["&&", "And"], ["||", "Or"]
|
|
25
|
+
]);
|
|
26
|
+
/** @typedef {{comments: import("tree-sitter").SyntaxNode[], usedMarkers: Set<import("tree-sitter").SyntaxNode>, assignmentTargets: Set<string>}} GoContext */
|
|
27
|
+
/**
|
|
28
|
+
* Verifies one binding UTF-16 index through the shared byte converter.
|
|
29
|
+
* @param {string} source Complete source.
|
|
30
|
+
* @param {number} index Binding-reported UTF-16 index.
|
|
31
|
+
* @returns {number} Verified UTF-16 offset.
|
|
32
|
+
*/
|
|
33
|
+
function bindingIndexToUtf16Offset(source, index) {
|
|
34
|
+
if (!Number.isInteger(index) || index < 0 || index > source.length ||
|
|
35
|
+
index > 0 && index < source.length && /[\uD800-\uDBFF]/u.test(source[index - 1]) && /[\uDC00-\uDFFF]/u.test(source[index])) {
|
|
36
|
+
throw new RangeError("Invalid Tree-sitter source index: " + index);
|
|
37
|
+
}
|
|
38
|
+
return utf8ByteOffsetToUtf16Offset(source, new TextEncoder().encode(source.slice(0, index)).length);
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Finds an unpaired UTF-16 surrogate.
|
|
42
|
+
* @param {string} source Complete source.
|
|
43
|
+
* @returns {number} Invalid offset or -1.
|
|
44
|
+
*/
|
|
45
|
+
function firstLoneSurrogateOffset(source) {
|
|
46
|
+
for (let index = 0; index < source.length; index += 1) {
|
|
47
|
+
const unit = source.charCodeAt(index);
|
|
48
|
+
if (unit >= 0xD800 && unit <= 0xDBFF) {
|
|
49
|
+
const next = source.charCodeAt(index + 1);
|
|
50
|
+
if (next >= 0xDC00 && next <= 0xDFFF)
|
|
51
|
+
index += 1;
|
|
52
|
+
else
|
|
53
|
+
return index;
|
|
54
|
+
}
|
|
55
|
+
else if (unit >= 0xDC00 && unit <= 0xDFFF)
|
|
56
|
+
return index;
|
|
57
|
+
}
|
|
58
|
+
return -1;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Converts one CST range.
|
|
62
|
+
* @param {import("tree-sitter").SyntaxNode} node CST node.
|
|
63
|
+
* @param {string} filename Source filename.
|
|
64
|
+
* @param {string} source Complete source.
|
|
65
|
+
* @returns {import("../semantic/types.js").SourceLocation} Exact location.
|
|
66
|
+
*/
|
|
67
|
+
function nodeLocation(node, filename, source) {
|
|
68
|
+
return locationFromOffsets(filename, source, bindingIndexToUtf16Offset(source, node.startIndex), bindingIndexToUtf16Offset(source, node.endIndex));
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Requires one grammar field.
|
|
72
|
+
* @param {import("tree-sitter").SyntaxNode} node Field owner.
|
|
73
|
+
* @param {string} field Field name.
|
|
74
|
+
* @param {string} filename Source filename.
|
|
75
|
+
* @param {string} source Complete source.
|
|
76
|
+
* @returns {import("tree-sitter").SyntaxNode} Required child.
|
|
77
|
+
*/
|
|
78
|
+
function requiredField(node, field, filename, source) {
|
|
79
|
+
const child = node.childForFieldName(field);
|
|
80
|
+
if (!child)
|
|
81
|
+
return unsupportedSyntax("go", node.type + " without " + field, nodeLocation(node, filename, source));
|
|
82
|
+
return child;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Traverses every named and anonymous node before conversion.
|
|
86
|
+
* @param {import("tree-sitter").SyntaxNode} node Current node.
|
|
87
|
+
* @param {string} filename Source filename.
|
|
88
|
+
* @param {string} source Complete source.
|
|
89
|
+
* @returns {void}
|
|
90
|
+
*/
|
|
91
|
+
function validateParserTree(node, filename, source) {
|
|
92
|
+
if (node.hasError || node.isError || node.isMissing) {
|
|
93
|
+
throw new SemantifoldDiagnostic({
|
|
94
|
+
code: "PARSE_ERROR",
|
|
95
|
+
language: "go",
|
|
96
|
+
location: nodeLocation(node, filename, source),
|
|
97
|
+
message: "Tree-sitter exposed recovery at '" + node.type + "'."
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
if (!node.isNamed && node.type == ";") {
|
|
101
|
+
return unsupportedSyntax("go", "explicit semicolon", nodeLocation(node, filename, source));
|
|
102
|
+
}
|
|
103
|
+
for (let index = 0; index < node.childCount; index += 1) {
|
|
104
|
+
const child = node.child(index);
|
|
105
|
+
if (!child)
|
|
106
|
+
throw new Error("Tree-sitter omitted child " + index + " of " + node.type + ".");
|
|
107
|
+
validateParserTree(child, filename, source);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Selects semantic children while retaining comments for metadata validation.
|
|
112
|
+
* @param {import("tree-sitter").SyntaxNode} node Parent node.
|
|
113
|
+
* @returns {import("tree-sitter").SyntaxNode[]} Non-comment named children.
|
|
114
|
+
*/
|
|
115
|
+
function semanticChildren(node) {
|
|
116
|
+
return node.namedChildren.filter((child) => child.type != "comment");
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Validates one Go identifier.
|
|
120
|
+
* @param {import("tree-sitter").SyntaxNode} node Identifier node.
|
|
121
|
+
* @param {"function" | "parameter" | "local" | "assignment target" | "reference" | "callee"} role Identifier role.
|
|
122
|
+
* @param {string} filename Source filename.
|
|
123
|
+
* @param {string} source Complete source.
|
|
124
|
+
* @returns {string} Accepted spelling.
|
|
125
|
+
*/
|
|
126
|
+
function identifier(node, role, filename, source) {
|
|
127
|
+
const name = node.text;
|
|
128
|
+
const reserved = ["function", "callee"].includes(role) ? functionReserved : ["parameter", "local", "assignment target"].includes(role)
|
|
129
|
+
? bindingReserved
|
|
130
|
+
: new Set();
|
|
131
|
+
if (node.type != "identifier" || !/^[A-Za-z_][A-Za-z0-9_]*$/u.test(name) || name == "_" ||
|
|
132
|
+
goKeywords.has(name) || reserved.has(name)) {
|
|
133
|
+
return unsupportedSyntax("go", role + " identifier '" + name + "'", nodeLocation(node, filename, source));
|
|
134
|
+
}
|
|
135
|
+
return name;
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Converts an explicit scalar.
|
|
139
|
+
* @param {import("tree-sitter").SyntaxNode | null} node Type node.
|
|
140
|
+
* @param {string} subject Diagnostic subject.
|
|
141
|
+
* @param {import("../semantic/types.js").SourceLocation} ownerLocation Owner location.
|
|
142
|
+
* @param {string} filename Source filename.
|
|
143
|
+
* @param {string} source Complete source.
|
|
144
|
+
* @returns {import("../semantic/types.js").TypeReference} Semantic type.
|
|
145
|
+
*/
|
|
146
|
+
function convertType(node, subject, ownerLocation, filename, source) {
|
|
147
|
+
if (!node)
|
|
148
|
+
return missingType("go", subject, ownerLocation);
|
|
149
|
+
const location = nodeLocation(node, filename, source);
|
|
150
|
+
const type = sourceScalarType("go", node.text, location);
|
|
151
|
+
if (!type || node.type != "type_identifier") {
|
|
152
|
+
return unsupportedSyntax("go", "unsupported scalar type '" + node.text + "'", location);
|
|
153
|
+
}
|
|
154
|
+
return type;
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Finds exactly one accepted operator token.
|
|
158
|
+
* @param {import("tree-sitter").SyntaxNode} node Operation node.
|
|
159
|
+
* @param {Set<string>} spellings Accepted spellings.
|
|
160
|
+
* @param {string} filename Source filename.
|
|
161
|
+
* @param {string} source Complete source.
|
|
162
|
+
* @returns {import("tree-sitter").SyntaxNode} Operator token.
|
|
163
|
+
*/
|
|
164
|
+
function operatorToken(node, spellings, filename, source) {
|
|
165
|
+
const field = node.childForFieldName("operator");
|
|
166
|
+
const candidates = field ? [field] : node.children.filter((child) => !child.isNamed && spellings.has(child.type));
|
|
167
|
+
if (candidates.length != 1 || !spellings.has(candidates[0].type)) {
|
|
168
|
+
return unsupportedSyntax("go", node.type + " operator", nodeLocation(node, filename, source));
|
|
169
|
+
}
|
|
170
|
+
return candidates[0];
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Requires one expression in an expression list.
|
|
174
|
+
* @param {import("tree-sitter").SyntaxNode} node Expression list.
|
|
175
|
+
* @param {string} subject Diagnostic subject.
|
|
176
|
+
* @param {string} filename Source filename.
|
|
177
|
+
* @param {string} source Complete source.
|
|
178
|
+
* @returns {import("tree-sitter").SyntaxNode} Sole expression.
|
|
179
|
+
*/
|
|
180
|
+
function soleExpression(node, subject, filename, source) {
|
|
181
|
+
const children = semanticChildren(node);
|
|
182
|
+
if (node.type != "expression_list" || children.length != 1) {
|
|
183
|
+
return unsupportedSyntax("go", subject, nodeLocation(node, filename, source));
|
|
184
|
+
}
|
|
185
|
+
return children[0];
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Converts one expression.
|
|
189
|
+
* @param {import("tree-sitter").SyntaxNode} node Expression node.
|
|
190
|
+
* @param {string} filename Source filename.
|
|
191
|
+
* @param {string} source Complete source.
|
|
192
|
+
* @returns {import("../semantic/types.js").Expression} Semantic expression.
|
|
193
|
+
*/
|
|
194
|
+
function convertExpression(node, filename, source) {
|
|
195
|
+
const location = nodeLocation(node, filename, source);
|
|
196
|
+
if (node.type == "parenthesized_expression") {
|
|
197
|
+
const children = semanticChildren(node);
|
|
198
|
+
if (children.length != 1)
|
|
199
|
+
return unsupportedSyntax("go", node.type, location);
|
|
200
|
+
return convertExpression(children[0], filename, source);
|
|
201
|
+
}
|
|
202
|
+
if (node.type == "identifier") {
|
|
203
|
+
const name = identifier(node, "reference", filename, source);
|
|
204
|
+
return withParserRanges({ kind: /** @type {const} */ ("IdentifierExpression"), location, name }, { name: location });
|
|
205
|
+
}
|
|
206
|
+
if (node.type == "int_literal") {
|
|
207
|
+
if (!/^(?:0|[1-9][0-9]*)$/u.test(node.text))
|
|
208
|
+
return unsupportedSyntax("go", "noncanonical integer literal", location);
|
|
209
|
+
const value = Number(BigInt(node.text));
|
|
210
|
+
if (!Number.isSafeInteger(value))
|
|
211
|
+
return unsupportedSyntax("go", "non-safe integer literal", location);
|
|
212
|
+
return withParserRanges({ kind: /** @type {const} */ ("IntegerLiteral"), location, value }, { literal: location });
|
|
213
|
+
}
|
|
214
|
+
if (node.type == "true" || node.type == "false") {
|
|
215
|
+
return withParserRanges({ kind: /** @type {const} */ ("BooleanLiteral"), location, value: node.type == "true" }, { literal: location });
|
|
216
|
+
}
|
|
217
|
+
if (node.type == "interpreted_string_literal") {
|
|
218
|
+
return withParserRanges({ kind: /** @type {const} */ ("StringLiteral"), location, value: decodeString(node, filename, source) }, {
|
|
219
|
+
literal: location
|
|
220
|
+
});
|
|
221
|
+
}
|
|
222
|
+
if (node.type == "unary_expression") {
|
|
223
|
+
const operand = requiredField(node, "operand", filename, source);
|
|
224
|
+
const operator = operatorToken(node, new Set(["!", "-"]), filename, source);
|
|
225
|
+
if (semanticChildren(node).length != 1)
|
|
226
|
+
return unsupportedSyntax("go", "unary expression shape", location);
|
|
227
|
+
return /** @type {import("../semantic/types.js").Expression} */ ( /** @type {unknown} */(withAdaptedOperation(withParserRanges({
|
|
228
|
+
kind: "UnaryExpression",
|
|
229
|
+
location,
|
|
230
|
+
operand: convertExpression(operand, filename, source)
|
|
231
|
+
}, { operator: nodeLocation(operator, filename, source) }), operator.type == "!" ? "Not" : "Negate")));
|
|
232
|
+
}
|
|
233
|
+
if (node.type == "binary_expression") {
|
|
234
|
+
const left = requiredField(node, "left", filename, source);
|
|
235
|
+
const right = requiredField(node, "right", filename, source);
|
|
236
|
+
const operator = operatorToken(node, new Set(binaryOperations.keys()), filename, source);
|
|
237
|
+
const adapted = binaryOperations.get(operator.type);
|
|
238
|
+
if (!adapted || semanticChildren(node).length != 2)
|
|
239
|
+
return unsupportedSyntax("go", "binary expression shape", location);
|
|
240
|
+
return /** @type {import("../semantic/types.js").Expression} */ ( /** @type {unknown} */(withAdaptedOperation(withParserRanges({
|
|
241
|
+
kind: "BinaryExpression",
|
|
242
|
+
left: convertExpression(left, filename, source),
|
|
243
|
+
location,
|
|
244
|
+
right: convertExpression(right, filename, source)
|
|
245
|
+
}, { operator: nodeLocation(operator, filename, source) }), /** @type {import("../semantic/operators.js").AdaptedOperation} */ (adapted))));
|
|
246
|
+
}
|
|
247
|
+
if (node.type == "call_expression") {
|
|
248
|
+
const calleeNode = requiredField(node, "function", filename, source);
|
|
249
|
+
const argumentsNode = requiredField(node, "arguments", filename, source);
|
|
250
|
+
if (calleeNode.type != "identifier" || argumentsNode.type != "argument_list" || semanticChildren(node).length != 2) {
|
|
251
|
+
return unsupportedSyntax("go", "qualified or dynamic call", location);
|
|
252
|
+
}
|
|
253
|
+
const callee = identifier(calleeNode, "callee", filename, source);
|
|
254
|
+
const arguments_ = semanticChildren(argumentsNode).map((argument) => convertExpression(argument, filename, source));
|
|
255
|
+
return withParserRanges({ arguments: arguments_, callee, kind: /** @type {const} */ ("CallExpression"), location }, {
|
|
256
|
+
callee: nodeLocation(calleeNode, filename, source)
|
|
257
|
+
});
|
|
258
|
+
}
|
|
259
|
+
return unsupportedSyntax("go", node.type, location);
|
|
260
|
+
}
|
|
261
|
+
/**
|
|
262
|
+
* Decodes an interpreted Go string to valid Unicode scalar text.
|
|
263
|
+
* @param {import("tree-sitter").SyntaxNode} node Literal node.
|
|
264
|
+
* @param {string} filename Source filename.
|
|
265
|
+
* @param {string} source Complete source.
|
|
266
|
+
* @returns {string} Decoded value.
|
|
267
|
+
*/
|
|
268
|
+
function decodeString(node, filename, source) {
|
|
269
|
+
const location = nodeLocation(node, filename, source);
|
|
270
|
+
const text = node.text;
|
|
271
|
+
if (!text.startsWith('"') || !text.endsWith('"') || /[\r\n]/u.test(text)) {
|
|
272
|
+
return unsupportedSyntax("go", "noncanonical interpreted string literal", location);
|
|
273
|
+
}
|
|
274
|
+
/** @type {number[]} */
|
|
275
|
+
const bytes = [];
|
|
276
|
+
/**
|
|
277
|
+
* Appends one UTF-8 text segment.
|
|
278
|
+
* @param {string} value Text segment.
|
|
279
|
+
* @returns {number} New byte length.
|
|
280
|
+
*/
|
|
281
|
+
const appendText = (value) => bytes.push(...new TextEncoder().encode(value));
|
|
282
|
+
const simple = new Map([
|
|
283
|
+
["a", 7], ["b", 8], ["f", 12], ["n", 10], ["r", 13], ["t", 9], ["v", 11], ["\\", 92], ['"', 34]
|
|
284
|
+
]);
|
|
285
|
+
for (let index = 1; index < text.length - 1; index += 1) {
|
|
286
|
+
const character = text[index];
|
|
287
|
+
if (character != "\\") {
|
|
288
|
+
const codePoint = text.codePointAt(index);
|
|
289
|
+
if (codePoint === undefined)
|
|
290
|
+
return unsupportedSyntax("go", "invalid string literal", location);
|
|
291
|
+
appendText(String.fromCodePoint(codePoint));
|
|
292
|
+
if (codePoint > 0xFFFF)
|
|
293
|
+
index += 1;
|
|
294
|
+
continue;
|
|
295
|
+
}
|
|
296
|
+
const escape = text[++index];
|
|
297
|
+
if (escape === undefined)
|
|
298
|
+
return unsupportedSyntax("go", "invalid string escape", location);
|
|
299
|
+
if (simple.has(escape)) {
|
|
300
|
+
bytes.push(/** @type {number} */ (simple.get(escape)));
|
|
301
|
+
continue;
|
|
302
|
+
}
|
|
303
|
+
if (escape == "x") {
|
|
304
|
+
const digits = text.slice(index + 1, index + 3);
|
|
305
|
+
if (!/^[0-9A-Fa-f]{2}$/u.test(digits))
|
|
306
|
+
return unsupportedSyntax("go", "invalid byte escape", location);
|
|
307
|
+
bytes.push(Number.parseInt(digits, 16));
|
|
308
|
+
index += 2;
|
|
309
|
+
continue;
|
|
310
|
+
}
|
|
311
|
+
if (/[0-7]/u.test(escape)) {
|
|
312
|
+
const digits = text.slice(index, index + 3);
|
|
313
|
+
if (!/^[0-7]{3}$/u.test(digits))
|
|
314
|
+
return unsupportedSyntax("go", "invalid octal escape", location);
|
|
315
|
+
const value = Number.parseInt(digits, 8);
|
|
316
|
+
if (value > 255)
|
|
317
|
+
return unsupportedSyntax("go", "octal escape outside byte range", location);
|
|
318
|
+
bytes.push(value);
|
|
319
|
+
index += 2;
|
|
320
|
+
continue;
|
|
321
|
+
}
|
|
322
|
+
const width = escape == "u" ? 4 : escape == "U" ? 8 : 0;
|
|
323
|
+
const digits = text.slice(index + 1, index + 1 + width);
|
|
324
|
+
if (!width || digits.length != width || !/^[0-9A-Fa-f]+$/u.test(digits)) {
|
|
325
|
+
return unsupportedSyntax("go", "unsupported string escape", location);
|
|
326
|
+
}
|
|
327
|
+
const value = Number.parseInt(digits, 16);
|
|
328
|
+
if (value > 0x10FFFF || value >= 0xD800 && value <= 0xDFFF) {
|
|
329
|
+
return unsupportedSyntax("go", "invalid Unicode string escape", location);
|
|
330
|
+
}
|
|
331
|
+
appendText(String.fromCodePoint(value));
|
|
332
|
+
index += width;
|
|
333
|
+
}
|
|
334
|
+
let decoded;
|
|
335
|
+
try {
|
|
336
|
+
decoded = new TextDecoder("utf-8", { fatal: true }).decode(Uint8Array.from(bytes));
|
|
337
|
+
}
|
|
338
|
+
catch {
|
|
339
|
+
return unsupportedSyntax("go", "string byte escapes do not form valid UTF-8", location);
|
|
340
|
+
}
|
|
341
|
+
if (!hasOnlyUnicodeScalars(decoded))
|
|
342
|
+
return unsupportedSyntax("go", "invalid Unicode string literal", location);
|
|
343
|
+
return decoded;
|
|
344
|
+
}
|
|
345
|
+
/**
|
|
346
|
+
* Collects plain assignment targets in one root function.
|
|
347
|
+
* @param {import("tree-sitter").SyntaxNode} body Root body.
|
|
348
|
+
* @returns {Set<string>} Assigned names.
|
|
349
|
+
*/
|
|
350
|
+
function collectAssignmentTargets(body) {
|
|
351
|
+
const names = new Set();
|
|
352
|
+
for (const assignment of body.descendantsOfType("assignment_statement")) {
|
|
353
|
+
const left = assignment.childForFieldName("left");
|
|
354
|
+
const children = left ? semanticChildren(left) : [];
|
|
355
|
+
if (left?.type == "expression_list" && children.length == 1 && children[0].type == "identifier") {
|
|
356
|
+
names.add(children[0].text);
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
return names;
|
|
360
|
+
}
|
|
361
|
+
/**
|
|
362
|
+
* Claims an exact adjacent immutable marker.
|
|
363
|
+
* @param {import("tree-sitter").SyntaxNode} node Local declaration.
|
|
364
|
+
* @param {GoContext} context Comment context.
|
|
365
|
+
* @returns {boolean} Whether marked immutable.
|
|
366
|
+
*/
|
|
367
|
+
function takeImmutableMarker(node, context) {
|
|
368
|
+
const marker = context.comments.find((comment) => comment.text == immutableMarker &&
|
|
369
|
+
comment.endPosition.row + 1 == node.startPosition.row && comment.startPosition.column == node.startPosition.column);
|
|
370
|
+
if (!marker)
|
|
371
|
+
return false;
|
|
372
|
+
context.usedMarkers.add(marker);
|
|
373
|
+
return true;
|
|
374
|
+
}
|
|
375
|
+
/**
|
|
376
|
+
* Converts one exact initialized local.
|
|
377
|
+
* @param {import("tree-sitter").SyntaxNode} node Declaration node.
|
|
378
|
+
* @param {GoContext} context Function context.
|
|
379
|
+
* @param {string} filename Source filename.
|
|
380
|
+
* @param {string} source Complete source.
|
|
381
|
+
* @returns {import("../semantic/types.js").LocalDeclaration} Semantic local.
|
|
382
|
+
*/
|
|
383
|
+
function convertLocal(node, context, filename, source) {
|
|
384
|
+
const location = nodeLocation(node, filename, source);
|
|
385
|
+
const children = semanticChildren(node);
|
|
386
|
+
if (children.length != 1 || children[0].type != "var_spec")
|
|
387
|
+
return unsupportedSyntax("go", "local declaration shape", location);
|
|
388
|
+
const spec = children[0];
|
|
389
|
+
const nameNode = requiredField(spec, "name", filename, source);
|
|
390
|
+
const typeNode = spec.childForFieldName("type");
|
|
391
|
+
const valueNode = requiredField(spec, "value", filename, source);
|
|
392
|
+
if (semanticChildren(spec).length != (typeNode ? 3 : 2))
|
|
393
|
+
return unsupportedSyntax("go", "local declaration shape", location);
|
|
394
|
+
const expressionNode = soleExpression(valueNode, "local initializer count", filename, source);
|
|
395
|
+
const name = identifier(nameNode, "local", filename, source);
|
|
396
|
+
const markedImmutable = takeImmutableMarker(node, context);
|
|
397
|
+
const operator = operatorToken(spec, new Set(["="]), filename, source);
|
|
398
|
+
return withParserRanges({
|
|
399
|
+
initializer: convertExpression(expressionNode, filename, source),
|
|
400
|
+
kind: /** @type {const} */ ("LocalDeclaration"),
|
|
401
|
+
location,
|
|
402
|
+
mutable: !markedImmutable && context.assignmentTargets.has(name),
|
|
403
|
+
name,
|
|
404
|
+
type: convertType(typeNode, "Local '" + name + "'", location, filename, source)
|
|
405
|
+
}, { name: nodeLocation(nameNode, filename, source), operator: nodeLocation(operator, filename, source) });
|
|
406
|
+
}
|
|
407
|
+
/**
|
|
408
|
+
* Converts one plain assignment.
|
|
409
|
+
* @param {import("tree-sitter").SyntaxNode} node Assignment node.
|
|
410
|
+
* @param {string} filename Source filename.
|
|
411
|
+
* @param {string} source Complete source.
|
|
412
|
+
* @returns {import("../semantic/types.js").AssignmentStatement} Semantic assignment.
|
|
413
|
+
*/
|
|
414
|
+
function convertAssignment(node, filename, source) {
|
|
415
|
+
const location = nodeLocation(node, filename, source);
|
|
416
|
+
const leftList = requiredField(node, "left", filename, source);
|
|
417
|
+
const rightList = requiredField(node, "right", filename, source);
|
|
418
|
+
const operator = operatorToken(node, new Set(["="]), filename, source);
|
|
419
|
+
const left = soleExpression(leftList, "assignment target count", filename, source);
|
|
420
|
+
const right = soleExpression(rightList, "assignment value count", filename, source);
|
|
421
|
+
if (left.type != "identifier" || semanticChildren(node).length != 2) {
|
|
422
|
+
return unsupportedSyntax("go", "assignment shape", location);
|
|
423
|
+
}
|
|
424
|
+
const name = identifier(left, "assignment target", filename, source);
|
|
425
|
+
const nameLocation = nodeLocation(left, filename, source);
|
|
426
|
+
return withParserRanges({
|
|
427
|
+
expression: convertExpression(right, filename, source),
|
|
428
|
+
kind: /** @type {const} */ ("AssignmentStatement"),
|
|
429
|
+
location,
|
|
430
|
+
target: withParserRanges({ kind: /** @type {const} */ ("IdentifierExpression"), location: nameLocation, name }, { name: nameLocation })
|
|
431
|
+
}, { operator: nodeLocation(operator, filename, source) });
|
|
432
|
+
}
|
|
433
|
+
/**
|
|
434
|
+
* Recognizes exact fmt.Println.
|
|
435
|
+
* @param {import("tree-sitter").SyntaxNode} node Candidate selector.
|
|
436
|
+
* @returns {boolean} Exact print receiver.
|
|
437
|
+
*/
|
|
438
|
+
function isPrintReceiver(node) {
|
|
439
|
+
return node.type == "selector_expression" && semanticChildren(node).length == 2 &&
|
|
440
|
+
node.childForFieldName("operand")?.type == "identifier" && node.childForFieldName("operand")?.text == "fmt" &&
|
|
441
|
+
node.childForFieldName("field")?.type == "field_identifier" && node.childForFieldName("field")?.text == "Println";
|
|
442
|
+
}
|
|
443
|
+
/**
|
|
444
|
+
* Converts one print expression statement.
|
|
445
|
+
* @param {import("tree-sitter").SyntaxNode} node Expression statement.
|
|
446
|
+
* @param {string} filename Source filename.
|
|
447
|
+
* @param {string} source Complete source.
|
|
448
|
+
* @returns {import("../semantic/types.js").PrintStatement} Semantic print.
|
|
449
|
+
*/
|
|
450
|
+
function convertPrint(node, filename, source) {
|
|
451
|
+
const location = nodeLocation(node, filename, source);
|
|
452
|
+
const children = semanticChildren(node);
|
|
453
|
+
if (children.length != 1 || children[0].type != "call_expression") {
|
|
454
|
+
return unsupportedSyntax("go", "expression statement other than print", location);
|
|
455
|
+
}
|
|
456
|
+
const call = children[0];
|
|
457
|
+
const callee = requiredField(call, "function", filename, source);
|
|
458
|
+
const argumentsNode = requiredField(call, "arguments", filename, source);
|
|
459
|
+
const arguments_ = semanticChildren(argumentsNode);
|
|
460
|
+
if (!isPrintReceiver(callee) || semanticChildren(call).length != 2 || argumentsNode.type != "argument_list" ||
|
|
461
|
+
arguments_.length != 1) {
|
|
462
|
+
return unsupportedSyntax("go", "print call shape", nodeLocation(call, filename, source));
|
|
463
|
+
}
|
|
464
|
+
return { expression: convertExpression(arguments_[0], filename, source), kind: /** @type {const} */ ("PrintStatement"), location };
|
|
465
|
+
}
|
|
466
|
+
/**
|
|
467
|
+
* Converts one conditional.
|
|
468
|
+
* @param {import("tree-sitter").SyntaxNode} node If node.
|
|
469
|
+
* @param {GoContext} context Function context.
|
|
470
|
+
* @param {string} filename Source filename.
|
|
471
|
+
* @param {string} source Complete source.
|
|
472
|
+
* @returns {import("../semantic/types.js").IfStatement} Semantic conditional.
|
|
473
|
+
*/
|
|
474
|
+
function convertIf(node, context, filename, source) {
|
|
475
|
+
const location = nodeLocation(node, filename, source);
|
|
476
|
+
const condition = requiredField(node, "condition", filename, source);
|
|
477
|
+
const consequence = requiredField(node, "consequence", filename, source);
|
|
478
|
+
const alternative = node.childForFieldName("alternative");
|
|
479
|
+
const expectedChildren = alternative ? 3 : 2;
|
|
480
|
+
if (semanticChildren(node).length != expectedChildren)
|
|
481
|
+
return unsupportedSyntax("go", "if initializer or shape", location);
|
|
482
|
+
return {
|
|
483
|
+
...(alternative ? { alternate: alternative.type == "if_statement"
|
|
484
|
+
? { kind: /** @type {const} */ ("Block"), location: nodeLocation(alternative, filename, source),
|
|
485
|
+
statements: [convertIf(alternative, context, filename, source)] }
|
|
486
|
+
: convertBlock(alternative, context, filename, source) } : {}),
|
|
487
|
+
condition: convertExpression(condition, filename, source),
|
|
488
|
+
consequent: convertBlock(consequence, context, filename, source),
|
|
489
|
+
kind: /** @type {const} */ ("IfStatement"),
|
|
490
|
+
location
|
|
491
|
+
};
|
|
492
|
+
}
|
|
493
|
+
/**
|
|
494
|
+
* Converts one supported statement.
|
|
495
|
+
* @param {import("tree-sitter").SyntaxNode} node Statement node.
|
|
496
|
+
* @param {GoContext} context Function context.
|
|
497
|
+
* @param {string} filename Source filename.
|
|
498
|
+
* @param {string} source Complete source.
|
|
499
|
+
* @returns {import("../semantic/types.js").Statement} Semantic statement.
|
|
500
|
+
*/
|
|
501
|
+
function convertStatement(node, context, filename, source) {
|
|
502
|
+
const location = nodeLocation(node, filename, source);
|
|
503
|
+
if (node.type == "var_declaration")
|
|
504
|
+
return convertLocal(node, context, filename, source);
|
|
505
|
+
if (node.type == "assignment_statement")
|
|
506
|
+
return convertAssignment(node, filename, source);
|
|
507
|
+
if (node.type == "if_statement")
|
|
508
|
+
return convertIf(node, context, filename, source);
|
|
509
|
+
if (node.type == "expression_statement")
|
|
510
|
+
return convertPrint(node, filename, source);
|
|
511
|
+
if (node.type == "return_statement") {
|
|
512
|
+
const children = semanticChildren(node);
|
|
513
|
+
if (children.length != 1)
|
|
514
|
+
return unsupportedSyntax("go", "return without one expression", location);
|
|
515
|
+
return {
|
|
516
|
+
expression: convertExpression(soleExpression(children[0], "return expression count", filename, source), filename, source),
|
|
517
|
+
kind: /** @type {const} */ ("ReturnStatement"),
|
|
518
|
+
location
|
|
519
|
+
};
|
|
520
|
+
}
|
|
521
|
+
return unsupportedSyntax("go", node.type, location);
|
|
522
|
+
}
|
|
523
|
+
/**
|
|
524
|
+
* Converts one lexical block.
|
|
525
|
+
* @param {import("tree-sitter").SyntaxNode} node Block node.
|
|
526
|
+
* @param {GoContext} context Function context.
|
|
527
|
+
* @param {string} filename Source filename.
|
|
528
|
+
* @param {string} source Complete source.
|
|
529
|
+
* @returns {import("../semantic/types.js").Block} Semantic block.
|
|
530
|
+
*/
|
|
531
|
+
function convertBlock(node, context, filename, source) {
|
|
532
|
+
const location = nodeLocation(node, filename, source);
|
|
533
|
+
const children = semanticChildren(node);
|
|
534
|
+
if (node.type != "block" || children.length > 1 || children[0]?.type != "statement_list") {
|
|
535
|
+
if (!(node.type == "block" && children.length == 0))
|
|
536
|
+
return unsupportedSyntax("go", "block shape", location);
|
|
537
|
+
}
|
|
538
|
+
const statements = children.length == 0 ? [] : semanticChildren(children[0]);
|
|
539
|
+
return { kind: /** @type {const} */ ("Block"), location,
|
|
540
|
+
statements: statements.map((statement) => convertStatement(statement, context, filename, source)) };
|
|
541
|
+
}
|
|
542
|
+
/**
|
|
543
|
+
* Converts one parameter.
|
|
544
|
+
* @param {import("tree-sitter").SyntaxNode} node Parameter node.
|
|
545
|
+
* @param {string} filename Source filename.
|
|
546
|
+
* @param {string} source Complete source.
|
|
547
|
+
* @returns {import("../semantic/types.js").Parameter} Semantic parameter.
|
|
548
|
+
*/
|
|
549
|
+
function convertParameter(node, filename, source) {
|
|
550
|
+
const location = nodeLocation(node, filename, source);
|
|
551
|
+
const nameNode = requiredField(node, "name", filename, source);
|
|
552
|
+
const typeNode = node.childForFieldName("type");
|
|
553
|
+
if (node.type != "parameter_declaration" || semanticChildren(node).length != 2) {
|
|
554
|
+
return unsupportedSyntax("go", "parameter shape", location);
|
|
555
|
+
}
|
|
556
|
+
const name = identifier(nameNode, "parameter", filename, source);
|
|
557
|
+
return withParserRanges({
|
|
558
|
+
kind: /** @type {const} */ ("Parameter"),
|
|
559
|
+
location,
|
|
560
|
+
name,
|
|
561
|
+
type: convertType(typeNode, "Parameter '" + name + "'", location, filename, source)
|
|
562
|
+
}, { name: nodeLocation(nameNode, filename, source) });
|
|
563
|
+
}
|
|
564
|
+
/**
|
|
565
|
+
* Converts one semantic function.
|
|
566
|
+
* @param {import("tree-sitter").SyntaxNode} node Function node.
|
|
567
|
+
* @param {GoContext} baseContext File context.
|
|
568
|
+
* @param {string} filename Source filename.
|
|
569
|
+
* @param {string} source Complete source.
|
|
570
|
+
* @returns {import("../semantic/types.js").FunctionDeclaration} Semantic function.
|
|
571
|
+
*/
|
|
572
|
+
function convertFunction(node, baseContext, filename, source) {
|
|
573
|
+
const location = nodeLocation(node, filename, source);
|
|
574
|
+
const nameNode = requiredField(node, "name", filename, source);
|
|
575
|
+
const parametersNode = requiredField(node, "parameters", filename, source);
|
|
576
|
+
const resultNode = node.childForFieldName("result");
|
|
577
|
+
const bodyNode = requiredField(node, "body", filename, source);
|
|
578
|
+
if (node.type != "function_declaration" || semanticChildren(node).length != (resultNode ? 4 : 3) ||
|
|
579
|
+
node.childForFieldName("receiver") || node.childForFieldName("type_parameters")) {
|
|
580
|
+
return unsupportedSyntax("go", "function declaration shape", location);
|
|
581
|
+
}
|
|
582
|
+
const name = identifier(nameNode, "function", filename, source);
|
|
583
|
+
const parameterNodes = semanticChildren(parametersNode);
|
|
584
|
+
if (parameterNodes.length != 2 || parameterNodes.some((parameter) => parameter.type != "parameter_declaration")) {
|
|
585
|
+
return unsupportedSyntax("go", "function parameter count or shape", nodeLocation(parametersNode, filename, source));
|
|
586
|
+
}
|
|
587
|
+
const context = { ...baseContext, assignmentTargets: collectAssignmentTargets(bodyNode) };
|
|
588
|
+
return withParserRanges({
|
|
589
|
+
body: convertBlock(bodyNode, context, filename, source),
|
|
590
|
+
kind: /** @type {const} */ ("FunctionDeclaration"),
|
|
591
|
+
location,
|
|
592
|
+
name,
|
|
593
|
+
parameters: parameterNodes.map((parameter) => convertParameter(parameter, filename, source)),
|
|
594
|
+
returnType: convertType(resultNode, "Function '" + name + "' return", location, filename, source)
|
|
595
|
+
}, { name: nodeLocation(nameNode, filename, source) });
|
|
596
|
+
}
|
|
597
|
+
/**
|
|
598
|
+
* Converts the exact final func main() entry.
|
|
599
|
+
* @param {import("tree-sitter").SyntaxNode} node Main node.
|
|
600
|
+
* @param {GoContext} baseContext File context.
|
|
601
|
+
* @param {string} filename Source filename.
|
|
602
|
+
* @param {string} source Complete source.
|
|
603
|
+
* @returns {import("../semantic/types.js").EntryPoint} Semantic entry.
|
|
604
|
+
*/
|
|
605
|
+
function convertMain(node, baseContext, filename, source) {
|
|
606
|
+
const location = nodeLocation(node, filename, source);
|
|
607
|
+
const name = requiredField(node, "name", filename, source);
|
|
608
|
+
const parameters = requiredField(node, "parameters", filename, source);
|
|
609
|
+
const body = requiredField(node, "body", filename, source);
|
|
610
|
+
if (semanticChildren(node).length != 3 || name.text != "main" || semanticChildren(parameters).length != 0 ||
|
|
611
|
+
node.childForFieldName("result") || node.childForFieldName("receiver") || node.childForFieldName("type_parameters")) {
|
|
612
|
+
return unsupportedSyntax("go", "main scaffolding", location);
|
|
613
|
+
}
|
|
614
|
+
const context = { ...baseContext, assignmentTargets: collectAssignmentTargets(body) };
|
|
615
|
+
return { body: convertBlock(body, context, filename, source), kind: /** @type {const} */ ("EntryPoint"), location };
|
|
616
|
+
}
|
|
617
|
+
/**
|
|
618
|
+
* Reports whether any print exists.
|
|
619
|
+
* @param {import("../semantic/types.js").SemanticModule} module Module.
|
|
620
|
+
* @returns {boolean} Print presence.
|
|
621
|
+
*/
|
|
622
|
+
function hasPrint(module) {
|
|
623
|
+
/**
|
|
624
|
+
* Reports whether one nested block prints.
|
|
625
|
+
* @type {(block: import("../semantic/types.js").Block) => boolean}
|
|
626
|
+
*/
|
|
627
|
+
const blockHasPrint = (block) => block.statements.some((statement) => statement.kind == "PrintStatement" ||
|
|
628
|
+
statement.kind == "IfStatement" && (blockHasPrint(statement.consequent) || Boolean(statement.alternate && blockHasPrint(statement.alternate))));
|
|
629
|
+
return module.functions.some(({ body }) => blockHasPrint(body)) || blockHasPrint(module.entryPoint.body);
|
|
630
|
+
}
|
|
631
|
+
/**
|
|
632
|
+
* Parses the strict Task 024 Go profile.
|
|
633
|
+
* @param {{filename: string, source: string}} input Parser input.
|
|
634
|
+
* @returns {import("../semantic/types.js").SemanticModule} Semantic module.
|
|
635
|
+
*/
|
|
636
|
+
export function parseGo({ filename, source }) {
|
|
637
|
+
if (!hasOnlyUnicodeScalars(source)) {
|
|
638
|
+
const offset = firstLoneSurrogateOffset(source);
|
|
639
|
+
throw new SemantifoldDiagnostic({
|
|
640
|
+
code: "PARSE_ERROR",
|
|
641
|
+
language: "go",
|
|
642
|
+
location: locationFromOffsets(filename, source, offset, offset + 1),
|
|
643
|
+
message: "Go source contains an invalid lone UTF-16 surrogate."
|
|
644
|
+
});
|
|
645
|
+
}
|
|
646
|
+
let tree;
|
|
647
|
+
try {
|
|
648
|
+
tree = parser.parse(source);
|
|
649
|
+
}
|
|
650
|
+
catch (error) {
|
|
651
|
+
return parseFailure("go", error);
|
|
652
|
+
}
|
|
653
|
+
const root = tree.rootNode;
|
|
654
|
+
validateParserTree(root, filename, source);
|
|
655
|
+
if (root.type != "source_file")
|
|
656
|
+
throw new Error("Tree-sitter returned Go root '" + root.type + "'.");
|
|
657
|
+
const location = moduleLocation(filename, source);
|
|
658
|
+
const comments = root.descendantsOfType("comment");
|
|
659
|
+
for (const comment of comments) {
|
|
660
|
+
if (/^\/\/go:/u.test(comment.text) || /^\/\/ \+build(?:\s|$)/u.test(comment.text) ||
|
|
661
|
+
/^\/\/line(?:\s|$)/u.test(comment.text) || /^\/\*line(?:\s|$)/u.test(comment.text)) {
|
|
662
|
+
return unsupportedSyntax("go", "source directive", nodeLocation(comment, filename, source));
|
|
663
|
+
}
|
|
664
|
+
if (comment.text.includes("@semantifold") && comment.text != immutableMarker) {
|
|
665
|
+
return unsupportedSyntax("go", "invalid Semantifold metadata comment", nodeLocation(comment, filename, source));
|
|
666
|
+
}
|
|
667
|
+
}
|
|
668
|
+
const children = semanticChildren(root);
|
|
669
|
+
if (children.length < 3 || children[0].type != "package_clause") {
|
|
670
|
+
return unsupportedSyntax("go", "compilation-unit scaffolding", location);
|
|
671
|
+
}
|
|
672
|
+
const packageChildren = semanticChildren(children[0]);
|
|
673
|
+
if (packageChildren.length != 1 || packageChildren[0].type != "package_identifier" || packageChildren[0].text != "main") {
|
|
674
|
+
return unsupportedSyntax("go", "package main scaffolding", nodeLocation(children[0], filename, source));
|
|
675
|
+
}
|
|
676
|
+
let memberStart = 1;
|
|
677
|
+
let hasFmtImport = false;
|
|
678
|
+
if (children[1]?.type == "import_declaration") {
|
|
679
|
+
const declaration = children[1];
|
|
680
|
+
const imports = semanticChildren(declaration);
|
|
681
|
+
if (imports.length != 1 || imports[0].type != "import_spec" || semanticChildren(imports[0]).length != 1 ||
|
|
682
|
+
imports[0].childForFieldName("path")?.type != "interpreted_string_literal" ||
|
|
683
|
+
imports[0].childForFieldName("path")?.text != '"fmt"') {
|
|
684
|
+
return unsupportedSyntax("go", "fmt import scaffolding", nodeLocation(declaration, filename, source));
|
|
685
|
+
}
|
|
686
|
+
hasFmtImport = true;
|
|
687
|
+
memberStart = 2;
|
|
688
|
+
}
|
|
689
|
+
const members = children.slice(memberStart);
|
|
690
|
+
if (members.length < 2 || members.some((member) => member.type != "function_declaration")) {
|
|
691
|
+
return unsupportedSyntax("go", "top-level declarations", location);
|
|
692
|
+
}
|
|
693
|
+
const mainNodes = members.filter((member) => member.childForFieldName("name")?.text == "main");
|
|
694
|
+
if (mainNodes.length != 1 || members.at(-1)?.id != mainNodes[0].id) {
|
|
695
|
+
return unsupportedSyntax("go", "main ordering", location);
|
|
696
|
+
}
|
|
697
|
+
const baseContext = { assignmentTargets: new Set(), comments, usedMarkers: new Set() };
|
|
698
|
+
const module = {
|
|
699
|
+
entryPoint: convertMain(mainNodes[0], baseContext, filename, source),
|
|
700
|
+
functions: members.slice(0, -1).map((member) => convertFunction(member, baseContext, filename, source)),
|
|
701
|
+
kind: /** @type {const} */ ("Module"),
|
|
702
|
+
location
|
|
703
|
+
};
|
|
704
|
+
const invalidMarker = comments.find((comment) => comment.text == immutableMarker && !baseContext.usedMarkers.has(comment));
|
|
705
|
+
if (invalidMarker)
|
|
706
|
+
return unsupportedSyntax("go", "unattached immutable marker", nodeLocation(invalidMarker, filename, source));
|
|
707
|
+
if (hasFmtImport != hasPrint(module))
|
|
708
|
+
return unsupportedSyntax("go", "fmt import and print usage mismatch", location);
|
|
709
|
+
validateParsedModule(module, "go");
|
|
710
|
+
return module;
|
|
711
|
+
}
|
|
712
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ28uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZnJvbnRlbmRzL2dvLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLE1BQU0sTUFBTSxhQUFhLENBQUE7QUFDaEMsT0FBTyxVQUFVLE1BQU0sdUNBQXVDLENBQUE7QUFDOUQsT0FBTyxFQUFDLFdBQVcsRUFBRSxZQUFZLEVBQUUscUJBQXFCLEVBQUUsaUJBQWlCLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQTtBQUNwRyxPQUFPLEVBQUMsbUJBQW1CLEVBQUUsY0FBYyxFQUFFLDJCQUEyQixFQUFDLE1BQU0seUJBQXlCLENBQUE7QUFDeEcsT0FBTyxFQUFDLG9CQUFvQixFQUFDLE1BQU0sMEJBQTBCLENBQUE7QUFDN0QsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sMkJBQTJCLENBQUE7QUFDMUQsT0FBTyxFQUFDLHFCQUFxQixFQUFDLE1BQU0sd0JBQXdCLENBQUE7QUFDNUQsT0FBTyxFQUFDLG9CQUFvQixFQUFDLE1BQU0seUJBQXlCLENBQUE7QUFDNUQsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sY0FBYyxDQUFBO0FBRTdDLE1BQU0sTUFBTSxHQUFHLElBQUksTUFBTSxFQUFFLENBQUE7QUFFM0IsTUFBTSxDQUFDLFdBQVcsQ0FBQyw2Q0FBNkMsQ0FBQyxFQUFDLHNCQUF1QixDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQTtBQUV2RyxNQUFNLGVBQWUsR0FBRywyQkFBMkIsQ0FBQTtBQUNuRCxNQUFNLFVBQVUsR0FBRyxJQUFJLEdBQUcsQ0FBQztJQUN6QixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsTUFBTTtJQUNqRyxNQUFNLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsT0FB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O0lBQ3JILG9CQUFvQixDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQTtJQUNsQyxPQUFPLE1BQU0sQ0FBQTtBQUNmLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0IFBhcnNlciBmcm9tIFwidHJlZS1zaXR0ZXJcIlxuaW1wb3J0IEdvTGFuZ3VhZ2UgZnJvbSBcInRyZWUtc2l0dGVyLWdvL2JpbmRpbmdzL25vZGUvaW5kZXguanNcIlxuaW1wb3J0IHttaXNzaW5nVHlwZSwgcGFyc2VGYWlsdXJlLCBTZW1hbnRpZm9sZERpYWdub3N0aWMsIHVuc3VwcG9ydGVkU3ludGF4fSBmcm9tIFwiLi4vZGlhZ25vc3RpYy5qc1wiXG5pbXBvcnQge2xvY2F0aW9uRnJvbU9mZnNldHMsIG1vZHVsZUxvY2F0aW9uLCB1dGY4Qnl0ZU9mZnNldFRvVXRmMTZPZmZzZXR9IGZyb20gXCIuLi9zZW1hbnRpYy9sb2NhdGlvbi5qc1wiXG5pbXBvcnQge3dpdGhBZGFwdGVkT3BlcmF0aW9ufSBmcm9tIFwiLi4vc2VtYW50aWMvb3BlcmF0b3JzLmpzXCJcbmltcG9ydCB7d2l0aFBhcnNlclJhbmdlc30gZnJvbSBcIi4uL3NlbWFudGljL3Byb3ZlbmFuY2UuanNcIlxuaW1wb3J0IHtoYXNPbmx5VW5pY29kZVNjYWxhcnN9IGZyb20gXCIuLi9zZW1hbnRpYy9zY2FsYXJzLmpzXCJcbmltcG9ydCB7dmFsaWRhdGVQYXJzZWRNb2R1bGV9IGZyb20gXCIuLi9zZW1hbnRpYy92YWxpZGF0ZS5qc1wiXG5pbXBvcnQge3NvdXJjZVNjYWxhclR5cGV9IGZyb20gXCIuL3NjYWxhcnMuanNcIlxuXG5jb25zdCBwYXJzZXIgPSBuZXcgUGFyc2VyKClcblxucGFyc2VyLnNldExhbmd1YWdlKC8qKiBAdHlwZSB7aW1wb3J0KFwidHJlZS1zaXR0ZXJcIikuTGFuZ3VhZ2V9ICovICgvKiogQHR5cGUge3Vua25vd259ICovIChHb0xhbmd1YWdlKSkpXG5cbmNvbnN0IGltbXV0YWJsZU1hcmtlciA9IFwiLy8gQHNlbWFudGlmb2xkLWltbXV0YWJsZVwiXG5jb25zdCBnb0tleXdvcmRzID0gbmV3IFNldChbXG4gIFwiYnJlYWtcIiwgXCJkZWZhdWx0XCIsIFwiZnVuY1wiLCBcImludGVyZmFjZVwiLCBcInNlbGVjdFwiLCBcImNhc2VcIiwgXCJkZWZlclwiLCBcImdvXCIsIFwibWFwXCIsIFwic3RydWN0XCIsIFwiY2hhblwiLFxuICBcImVsc2VcIiwgXCJnb3RvXCIsIFwicGFja2FnZVwiLCBcInN3aXRjaFwiLCBcImNvbnN0XCIsIFwiZmFsbHRocm91Z2hcIiwgXCJpZlwiLCBcInJhbmdlXCIsIFwidHlwZVwiLCBcImNvbnRpbnVlXCIsXG4gIFwiZm9yXCIsIFwiaW1wb3J0XCIsIFwicmV0dXJuXCIsIFwidmFyXCJcbl0pXG5jb25zdCBmdW5jdGlvblJlc2VydmVkID0gbmV3IFNldChbXCJtYWluXCIsIFwiaW5pdFwiLCBcImZtdFwiLCBcImludDY0XCIsIFwiYm9vbFwiLCBcInN0cmluZ1wiLCBcInRydWVcIiwgXCJmYWxzZVwiXSlcbmNvbnN0IGJpbmRpbmdSZXNlcnZlZCA9IG5ldyBTZXQoW1wiZm10XCIsIFwiaW50NjRcIiwgXCJib29sXCIsIFwic3RyaW5nXCIsIFwidHJ1ZVwiLCBcImZhbHNlXCJdKVxuY29uc3QgYmluYXJ5T3BlcmF0aW9ucyA9IG5ldyBNYXAoW1xuICBbXCIrXCIsIFwiQWRkXCJdLCBbXCItXCIsIFwiU3VidHJhY3RcIl0sIFtcIipcIiwgXCJNdWx0aXBseVwiXSwgW1wiPT1cIiwgXCJFcXVhbFwiXSwgW1wiIT1cIiwgXCJOb3RFcXVhbFwiXSxcbiAgW1wiPFwiLCBcIkxlc3NUaGFuXCJdLCBbXCI8PVwiLCBcIkxlc3NUaGFuT3JFcXVhbFwiXSwgW1wiPlwiLCBcIkdyZWF0ZXJUaGFuXCJdLCBbXCI+PVwiLCBcIkdyZWF0ZXJUaGFuT3JFcXVhbFwiXSxcbiAgW1wiJiZcIiwgXCJBbmRcIl0sIFtcInx8XCIsIFwiT3JcIl1cbl0pXG5cbi8qKiBAdHlwZWRlZiB7e2NvbW1lbnRzOiBpbXBvcnQoXCJ0cmVlLXNpdHRlclwiKS5TeW50YXhOb2RlW10sIHVzZWRNYXJrZXJzOiBTZXQ8aW1wb3J0KFwidHJlZS1zaXR0ZXJcIikuU3ludGF4Tm9kZT4sIGFzc2lnbm1lbnRUYXJnZXRzOiBTZXQ8c3RyaW5nPn19IEdvQ29udGV4dCAqL1xuXG4vKipcbiAqIFZlcmlmaWVzIG9uZSBiaW5kaW5nIFVURi0xNiBpbmRleCB0aHJvdWdoIHRoZSBzaGFyZWQgYnl0ZSBjb252ZXJ0ZXIuXG4gKiBAcGFyYW0ge3N0cmluZ30gc291cmNlIENvbXBsZXRlIHNvdXJjZS5cbiAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCBCaW5kaW5nLXJlcG9ydGVkIFVURi0xNiBpbmRleC5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFZlcmlmaWVkIFVURi0xNiBvZmZzZXQuXG4gKi9cbmZ1bmN0aW9uIGJpbmRpbmdJbmRleFRvVXRmMTZPZmZzZXQoc291cmNlLCBpbmRleCkge1xuICBpZiAoIU51bWJlci5pc0ludGVnZXIoaW5kZXgpIHx8IGluZGV4IDwgMCB8fCBpbmRleCA+IHNvdXJjZS5sZW5ndGggfHxcbiAgICBpbmRleCA+IDAgJiYgaW5kZXggPCBzb3VyY2UubGVuZ3RoICYmIC9bXFx1RDgwMC1cXHVEQkZGXS91LnRlc3Qoc291cmNlW2luZGV4IC0gMV0pICYmIC9bXFx1REMwMC1cXHVERkZGXS91LnRlc3Qoc291cmNlW2luZGV4XSkpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkludmFsaWQgVHJlZS1zaXR0ZXIgc291cmNlIGluZGV4OiBcIiArIGluZGV4KVxuICB9XG4gIHJldHVybiB1dGY4Qnl0ZU9mZnNldFRvVXRmMTZPZmZzZXQoc291cmNlLCBuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoc291cmNlLnNsaWNlKDAsIGluZGV4KSkubGVuZ3RoKVxufVxuXG4vKipcbiAqIEZpbmRzIGFuIHVucGFpcmVkIFVURi0xNiBzdXJyb2dhdGUuXG4gKiBAcGFyYW0ge3N0cmluZ30gc291cmNlIENvbXBsZXRlIHNvdXJjZS5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IEludmFsaWQgb2Zmc2V0IG9yIC0xLlxuICovXG5mdW5jdGlvbiBmaXJzdExvbmVTdXJyb2dhdGVPZmZzZXQoc291cmNlKSB7XG4gIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBzb3VyY2UubGVuZ3RoOyBpbmRleCArPSAxKSB7XG4gICAgY29uc3QgdW5pdCA9IHNvdXJjZS5jaGFyQ29kZUF0KGluZGV4KVxuXG4gICAgaWYgKHVuaXQgPj0gMHhEODAwICYmIHVuaXQgPD0gMHhEQkZGKSB7XG4gICAgICBjb25zdCBuZXh0ID0gc291cmNlLmNoYXJDb2RlQXQoaW5kZXggKyAxKVxuXG4gICAgICBpZiAobmV4dCA+PSAweERDMDAgJiYgbmV4dCA8PSAweERGRkYpIGluZGV4ICs9IDFcbiAgICAgIGVsc2UgcmV0dXJuIGluZGV4XG4gICAgfSBlbHNlIGlmICh1bml0ID49IDB4REMwMCAmJiB1bml0IDw9IDB4REZGRikgcmV0dXJuIGluZGV4XG4gIH1cbiAgcmV0dXJuIC0xXG59XG5cbi8qKlxuICogQ29udmVydHMgb25lIENTVCByYW5nZS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwidHJlZS1zaXR0ZXJcIikuU3ludGF4Tm9kZX0gbm9kZSBDU1Qgbm9kZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBmaWxlbmFtZSBTb3VyY2UgZmlsZW5hbWUuXG4gKiBAcGFyYW0ge3N0cmluZ30gc291cmNlIENvbXBsZXRlIHNvdXJjZS5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5Tb3VyY2VMb2NhdGlvbn0gRXhhY3QgbG9jYXRpb24uXG4gKi9cbmZ1bmN0aW9uIG5vZGVMb2NhdGlvbihub2RlLCBmaWxlbmFtZSwgc291cmNlKSB7XG4gIHJldHVybiBsb2NhdGlvbkZyb21PZmZzZXRzKGZpbGVuYW1lLCBzb3VyY2UsIGJpbmRpbmdJbmRleFRvVXRmMTZPZmZzZXQoc291cmNlLCBub2RlLnN0YXJ0SW5kZXgpLFxuICAgIGJpbmRpbmdJbmRleFRvVXRmMTZPZmZzZXQoc291cmNlLCBub2RlLmVuZEluZGV4KSlcbn1cblxuLyoqXG4gKiBSZXF1aXJlcyBvbmUgZ3JhbW1hciBmaWVsZC5cbiAqIEBwYXJhbSB7aW1wb3J0KFwidHJlZS1zaXR0ZXJcIikuU3ludGF4Tm9kZX0gbm9kZSBGaWVsZCBvd25lci5cbiAqIEBwYXJhbSB7c3RyaW5nfSBmaWVsZCBGaWVsZCBuYW1lLlxuICogQHBhcmFtIHtzdHJpbmd9IGZpbGVuYW1lIFNvdXJjZSBmaWxlbmFtZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBzb3VyY2UgQ29tcGxldGUgc291cmNlLlxuICogQHJldHVybnMge2ltcG9ydChcInRyZWUtc2l0dGVyXCIpLlN5bnRheE5vZGV9IFJlcXVpcmVkIGNoaWxkLlxuICovXG5mdW5jdGlvbiByZXF1aXJlZEZpZWxkKG5vZGUsIGZpZWxkLCBmaWxlbmFtZSwgc291cmNlKSB7XG4gIGNvbnN0IGNoaWxkID0gbm9kZS5jaGlsZEZvckZpZWxkTmFtZShmaWVsZClcblxuICBpZiAoIWNoaWxkKSByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJnb1wiLCBub2RlLnR5cGUgKyBcIiB3aXRob3V0IFwiICsgZmllbGQsIG5vZGVMb2NhdGlvbihub2RlLCBmaWxlbmFtZSwgc291cmNlKSlcbiAgcmV0dXJuIGNoaWxkXG59XG5cbi8qKlxuICogVHJhdmVyc2VzIGV2ZXJ5IG5hbWVkIGFuZCBhbm9ueW1vdXMgbm9kZSBiZWZvcmUgY29udmVyc2lvbi5cbiAqIEBwYXJhbSB7aW1wb3J0KFwidHJlZS1zaXR0ZXJcIikuU3ludGF4Tm9kZX0gbm9kZSBDdXJyZW50IG5vZGUuXG4gKiBAcGFyYW0ge3N0cmluZ30gZmlsZW5hbWUgU291cmNlIGZpbGVuYW1lLlxuICogQHBhcmFtIHtzdHJpbmd9IHNvdXJjZSBDb21wbGV0ZSBzb3VyY2UuXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVQYXJzZXJUcmVlKG5vZGUsIGZpbGVuYW1lLCBzb3VyY2UpIHtcbiAgaWYgKG5vZGUuaGFzRXJyb3IgfHwgbm9kZS5pc0Vycm9yIHx8IG5vZGUuaXNNaXNzaW5nKSB7XG4gICAgdGhyb3cgbmV3IFNlbWFudGlmb2xkRGlhZ25vc3RpYyh7XG4gICAgICBjb2RlOiBcIlBBUlNFX0VSUk9SXCIsXG4gICAgICBsYW5ndWFnZTogXCJnb1wiLFxuICAgICAgbG9jYXRpb246IG5vZGVMb2NhdGlvbihub2RlLCBmaWxlbmFtZSwgc291cmNlKSxcbiAgICAgIG1lc3NhZ2U6IFwiVHJlZS1zaXR0ZXIgZXhwb3NlZCByZWNvdmVyeSBhdCAnXCIgKyBub2RlLnR5cGUgKyBcIicuXCJcbiAgICB9KVxuICB9XG4gIGlmICghbm9kZS5pc05hbWVkICYmIG5vZGUudHlwZSA9PSBcIjtcIikge1xuICAgIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcImdvXCIsIFwiZXhwbGljaXQgc2VtaWNvbG9uXCIsIG5vZGVMb2NhdGlvbihub2RlLCBmaWxlbmFtZSwgc291cmNlKSlcbiAgfVxuICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgbm9kZS5jaGlsZENvdW50OyBpbmRleCArPSAxKSB7XG4gICAgY29uc3QgY2hpbGQgPSBub2RlLmNoaWxkKGluZGV4KVxuXG4gICAgaWYgKCFjaGlsZCkgdGhyb3cgbmV3IEVycm9yKFwiVHJlZS1zaXR0ZXIgb21pdHRlZCBjaGlsZCBcIiArIGluZGV4ICsgXCIgb2YgXCIgKyBub2RlLnR5cGUgKyBcIi5cIilcbiAgICB2YWxpZGF0ZVBhcnNlclRyZWUoY2hpbGQsIGZpbGVuYW1lLCBzb3VyY2UpXG4gIH1cbn1cblxuLyoqXG4gKiBTZWxlY3RzIHNlbWFudGljIGNoaWxkcmVuIHdoaWxlIHJldGFpbmluZyBjb21tZW50cyBmb3IgbWV0YWRhdGEgdmFsaWRhdGlvbi5cbiAqIEBwYXJhbSB7aW1wb3J0KFwidHJlZS1zaXR0ZXJcIikuU3ludGF4Tm9kZX0gbm9kZSBQYXJlbnQgbm9kZS5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCJ0cmVlLXNpdHRlclwiKS5TeW50YXhOb2RlW119IE5vbi1jb21tZW50IG5hbWVkIGNoaWxkcmVuLlxuICovXG5mdW5jdGlvbiBzZW1hbnRpY0NoaWxkcmVuKG5vZGUpIHtcbiAgcmV0dXJuIG5vZGUubmFtZWRDaGlsZHJlbi5maWx0ZXIoKGNoaWxkKSA9PiBjaGlsZC50eXBlICE9IFwiY29tbWVudFwiKVxufVxuXG4vKipcbiAqIFZhbGlkYXRlcyBvbmUgR28gaWRlbnRpZmllci5cbiAqIEBwYXJhbSB7aW1wb3J0KFwidHJlZS1zaXR0ZXJcIikuU3ludGF4Tm9kZX0gbm9kZSBJZGVudGlmaWVyIG5vZGUuXG4gKiBAcGFyYW0ge1wiZnVuY3Rpb25cIiB8IFwicGFyYW1ldGVyXCIgfCBcImxvY2FsXCIgfCBcImFzc2lnbm1lbnQgdGFyZ2V0XCIgfCBcInJlZmVyZW5jZVwiIHwgXCJjYWxsZWVcIn0gcm9sZSBJZGVudGlmaWVyIHJvbGUuXG4gKiBAcGFyYW0ge3N0cmluZ30gZmlsZW5hbWUgU291cmNlIGZpbGVuYW1lLlxuICogQHBhcmFtIHtzdHJpbmd9IHNvdXJjZSBDb21wbGV0ZSBzb3VyY2UuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBBY2NlcHRlZCBzcGVsbGluZy5cbiAqL1xuZnVuY3Rpb24gaWRlbnRpZmllcihub2RlLCByb2xlLCBmaWxlbmFtZSwgc291cmNlKSB7XG4gIGNvbnN0IG5hbWUgPSBub2RlLnRleHRcbiAgY29uc3QgcmVzZXJ2ZWQgPSBbXCJmdW5jdGlvblwiLCBcImNhbGxlZVwiXS5pbmNsdWRlcyhyb2xlKSA/IGZ1bmN0aW9uUmVzZXJ2ZWQgOiBbXCJwYXJhbWV0ZXJcIiwgXCJsb2NhbFwiLCBcImFzc2lnbm1lbnQgdGFyZ2V0XCJdLmluY2x1ZGVzKHJvbGUpXG4gICAgPyBiaW5kaW5nUmVzZXJ2ZWRcbiAgICA6IG5ldyBTZXQoKVxuXG4gIGlmIChub2RlLnR5cGUgIT0gXCJpZGVudGlmaWVyXCIgfHwgIS9eW0EtWmEtel9dW0EtWmEtejAtOV9dKiQvdS50ZXN0KG5hbWUpIHx8IG5hbWUgPT0gXCJfXCIgfHxcbiAgICBnb0tleXdvcmRzLmhhcyhuYW1lKSB8fCByZXNlcnZlZC5oYXMobmFtZSkpIHtcbiAgICByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJnb1wiLCByb2xlICsgXCIgaWRlbnRpZmllciAnXCIgKyBuYW1lICsgXCInXCIsIG5vZGVMb2NhdGlvbihub2RlLCBmaWxlbmFtZSwgc291cmNlKSlcbiAgfVxuICByZXR1cm4gbmFtZVxufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIGV4cGxpY2l0IHNjYWxhci5cbiAqIEBwYXJhbSB7aW1wb3J0KFwidHJlZS1zaXR0ZXJcIikuU3ludGF4Tm9kZSB8IG51bGx9IG5vZGUgVHlwZSBub2RlLlxuICogQHBhcmFtIHtzdHJpbmd9IHN1YmplY3QgRGlhZ25vc3RpYyBzdWJqZWN0LlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5Tb3VyY2VMb2NhdGlvbn0gb3duZXJMb2NhdGlvbiBPd25lciBsb2NhdGlvbi5cbiAqIEBwYXJhbSB7c3RyaW5nfSBmaWxlbmFtZSBTb3VyY2UgZmlsZW5hbWUuXG4gKiBAcGFyYW0ge3N0cmluZ30gc291cmNlIENvbXBsZXRlIHNvdXJjZS5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5UeXBlUmVmZXJlbmNlfSBTZW1hbnRpYyB0eXBlLlxuICovXG5mdW5jdGlvbiBjb252ZXJ0VHlwZShub2RlLCBzdWJqZWN0LCBvd25lckxvY2F0aW9uLCBmaWxlbmFtZSwgc291cmNlKSB7XG4gIGlmICghbm9kZSkgcmV0dXJuIG1pc3NpbmdUeXBlKFwiZ29cIiwgc3ViamVjdCwgb3duZXJMb2NhdGlvbilcbiAgY29uc3QgbG9jYXRpb24gPSBub2RlTG9jYXRpb24obm9kZSwgZmlsZW5hbWUsIHNvdXJjZSlcbiAgY29uc3QgdHlwZSA9IHNvdXJjZVNjYWxhclR5cGUoXCJnb1wiLCBub2RlLnRleHQsIGxvY2F0aW9uKVxuXG4gIGlmICghdHlwZSB8fCBub2RlLnR5cGUgIT0gXCJ0eXBlX2lkZW50aWZpZXJcIikge1xuICAgIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcImdvXCIsIFwidW5zdXBwb3J0ZWQgc2NhbGFyIHR5cGUgJ1wiICsgbm9kZS50ZXh0ICsgXCInXCIsIGxvY2F0aW9uKVxuICB9XG4gIHJldHVybiB0eXBlXG59XG5cbi8qKlxuICogRmluZHMgZXhhY3RseSBvbmUgYWNjZXB0ZWQgb3BlcmF0b3IgdG9rZW4uXG4gKiBAcGFyYW0ge2ltcG9ydChcInRyZWUtc2l0dGVyXCIpLlN5bnRheE5vZGV9IG5vZGUgT3BlcmF0aW9uIG5vZGUuXG4gKiBAcGFyYW0ge1NldDxzdHJpbmc+fSBzcGVsbGluZ3MgQWNjZXB0ZWQgc3BlbGxpbmdzLlxuICogQHBhcmFtIHtzdHJpbmd9IGZpbGVuYW1lIFNvdXJjZSBmaWxlbmFtZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBzb3VyY2UgQ29tcGxldGUgc291cmNlLlxuICogQHJldHVybnMge2ltcG9ydChcInRyZWUtc2l0dGVyXCIpLlN5bnRheE5vZGV9IE9wZXJhdG9yIHRva2VuLlxuICovXG5mdW5jdGlvbiBvcGVyYXRvclRva2VuKG5vZGUsIHNwZWxsaW5ncywgZmlsZW5hbWUsIHNvdXJjZSkge1xuICBjb25zdCBmaWVsZCA9IG5vZGUuY2hpbGRGb3JGaWVsZE5hbWUoXCJvcGVyYXRvclwiKVxuICBjb25zdCBjYW5kaWRhdGVzID0gZmllbGQgPyBbZmllbGRdIDogbm9kZS5jaGlsZHJlbi5maWx0ZXIoKGNoaWxkKSA9PiAhY2hpbGQuaXNOYW1lZCAmJiBzcGVsbGluZ3MuaGFzKGNoaWxkLnR5cGUpKVxuXG4gIGlmIChjYW5kaWRhdGVzLmxlbmd0aCAhPSAxIHx8ICFzcGVsbGluZ3MuaGFzKGNhbmRpZGF0ZXNbMF0udHlwZSkpIHtcbiAgICByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJnb1wiLCBub2RlLnR5cGUgKyBcIiBvcGVyYXRvclwiLCBub2RlTG9jYXRpb24obm9kZSwgZmlsZW5hbWUsIHNvdXJjZSkpXG4gIH1cbiAgcmV0dXJuIGNhbmRpZGF0ZXNbMF1cbn1cblxuLyoqXG4gKiBSZXF1aXJlcyBvbmUgZXhwcmVzc2lvbiBpbiBhbiBleHByZXNzaW9uIGxpc3QuXG4gKiBAcGFyYW0ge2ltcG9ydChcInRyZWUtc2l0dGVyXCIpLlN5bnRheE5vZGV9IG5vZGUgRXhwcmVzc2lvbiBsaXN0LlxuICogQHBhcmFtIHtzdHJpbmd9IHN1YmplY3QgRGlhZ25vc3RpYyBzdWJqZWN0LlxuICogQHBhcmFtIHtzdHJpbmd9IGZpbGVuYW1lIFNvdXJjZSBmaWxlbmFtZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBzb3VyY2UgQ29tcGxldGUgc291cmNlLlxuICogQHJldHVybnMge2ltcG9ydChcInRyZWUtc2l0dGVyXCIpLlN5bnRheE5vZGV9IFNvbGUgZXhwcmVzc2lvbi5cbiAqL1xuZnVuY3Rpb24gc29sZUV4cHJlc3Npb24obm9kZSwgc3ViamVjdCwgZmlsZW5hbWUsIHNvdXJjZSkge1xuICBjb25zdCBjaGlsZHJlbiA9IHNlbWFudGljQ2hpbGRyZW4obm9kZSlcblxuICBpZiAobm9kZS50eXBlICE9IFwiZXhwcmVzc2lvbl9saXN0XCIgfHwgY2hpbGRyZW4ubGVuZ3RoICE9IDEpIHtcbiAgICByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJnb1wiLCBzdWJqZWN0LCBub2RlTG9jYXRpb24obm9kZSwgZmlsZW5hbWUsIHNvdXJjZSkpXG4gIH1cbiAgcmV0dXJuIGNoaWxkcmVuWzBdXG59XG5cbi8qKlxuICogQ29udmVydHMgb25lIGV4cHJlc3Npb24uXG4gKiBAcGFyYW0ge2ltcG9ydChcInRyZWUtc2l0dGVyXCIpLlN5bnRheE5vZGV9IG5vZGUgRXhwcmVzc2lvbiBub2RlLlxuICogQHBhcmFtIHtzdHJpbmd9IGZpbGVuYW1lIFNvdXJjZSBmaWxlbmFtZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBzb3VyY2UgQ29tcGxldGUgc291cmNlLlxuICogQHJldHVybnMge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLkV4cHJlc3Npb259IFNlbWFudGljIGV4cHJlc3Npb24uXG4gKi9cbmZ1bmN0aW9uIGNvbnZlcnRFeHByZXNzaW9uKG5vZGUsIGZpbGVuYW1lLCBzb3VyY2UpIHtcbiAgY29uc3QgbG9jYXRpb24gPSBub2RlTG9jYXRpb24obm9kZSwgZmlsZW5hbWUsIHNvdXJjZSlcblxuICBpZiAobm9kZS50eXBlID09IFwicGFyZW50aGVzaXplZF9leHByZXNzaW9uXCIpIHtcbiAgICBjb25zdCBjaGlsZHJlbiA9IHNlbWFudGljQ2hpbGRyZW4obm9kZSlcblxuICAgIGlmIChjaGlsZHJlbi5sZW5ndGggIT0gMSkgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwiZ29cIiwgbm9kZS50eXBlLCBsb2NhdGlvbilcbiAgICByZXR1cm4gY29udmVydEV4cHJlc3Npb24oY2hpbGRyZW5bMF0sIGZpbGVuYW1lLCBzb3VyY2UpXG4gIH1cbiAgaWYgKG5vZGUudHlwZSA9PSBcImlkZW50aWZpZXJcIikge1xuICAgIGNvbnN0IG5hbWUgPSBpZGVudGlmaWVyKG5vZGUsIFwicmVmZXJlbmNlXCIsIGZpbGVuYW1lLCBzb3VyY2UpXG5cbiAgICByZXR1cm4gd2l0aFBhcnNlclJhbmdlcyh7a2luZDogLyoqIEB0eXBlIHtjb25zdH0gKi8gKFwiSWRlbnRpZmllckV4cHJlc3Npb25cIiksIGxvY2F0aW9uLCBuYW1lfSwge25hbWU6IGxvY2F0aW9ufSlcbiAgfVxuICBpZiAobm9kZS50eXBlID09IFwiaW50X2xpdGVyYWxcIikge1xuICAgIGlmICghL14oPzowfFsxLTldWzAtOV0qKSQvdS50ZXN0KG5vZGUudGV4dCkpIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcImdvXCIsIFwibm9uY2Fub25pY2FsIGludGVnZXIgbGl0ZXJhbFwiLCBsb2NhdGlvbilcbiAgICBjb25zdCB2YWx1ZSA9IE51bWJlcihCaWdJbnQobm9kZS50ZXh0KSlcblxuICAgIGlmICghTnVtYmVyLmlzU2FmZUludGVnZXIodmFsdWUpKSByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJnb1wiLCBcIm5vbi1zYWZlIGludGVnZXIgbGl0ZXJhbFwiLCBsb2NhdGlvbilcbiAgICByZXR1cm4gd2l0aFBhcnNlclJhbmdlcyh7a2luZDogLyoqIEB0eXBlIHtjb25zdH0gKi8gKFwiSW50ZWdlckxpdGVyYWxcIiksIGxvY2F0aW9uLCB2YWx1ZX0sIHtsaXRlcmFsOiBsb2NhdGlvbn0pXG4gIH1cbiAgaWYgKG5vZGUudHlwZSA9PSBcInRydWVcIiB8fCBub2RlLnR5cGUgPT0gXCJmYWxzZVwiKSB7XG4gICAgcmV0dXJuIHdpdGhQYXJzZXJSYW5nZXMoe2tpbmQ6IC8qKiBAdHlwZSB7Y29uc3R9ICovIChcIkJvb2xlYW5MaXRlcmFsXCIpLCBsb2NhdGlvbiwgdmFsdWU6IG5vZGUudHlwZSA9PSBcInRydWVcIn0sIHtsaXRlcmFsOiBsb2NhdGlvbn0pXG4gIH1cbiAgaWYgKG5vZGUudHlwZSA9PSBcImludGVycHJldGVkX3N0cmluZ19saXRlcmFsXCIpIHtcbiAgICByZXR1cm4gd2l0aFBhcnNlclJhbmdlcyh7a2luZDogLyoqIEB0eXBlIHtjb25zdH0gKi8gKFwiU3RyaW5nTGl0ZXJhbFwiKSwgbG9jYXRpb24sIHZhbHVlOiBkZWNvZGVTdHJpbmcobm9kZSwgZmlsZW5hbWUsIHNvdXJjZSl9LCB7XG4gICAgICBsaXRlcmFsOiBsb2NhdGlvblxuICAgIH0pXG4gIH1cbiAgaWYgKG5vZGUudHlwZSA9PSBcInVuYXJ5X2V4cHJlc3Npb25cIikge1xuICAgIGNvbnN0IG9wZXJhbmQgPSByZXF1aXJlZEZpZWxkKG5vZGUsIFwib3BlcmFuZFwiLCBmaWxlbmFtZSwgc291cmNlKVxuICAgIGNvbnN0IG9wZXJhdG9yID0gb3BlcmF0b3JUb2tlbihub2RlLCBuZXcgU2V0KFtcIiFcIiwgXCItXCJdKSwgZmlsZW5hbWUsIHNvdXJjZSlcblxuICAgIGlmIChzZW1hbnRpY0NoaWxkcmVuKG5vZGUpLmxlbmd0aCAhPSAxKSByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJnb1wiLCBcInVuYXJ5IGV4cHJlc3Npb24gc2hhcGVcIiwgbG9jYXRpb24pXG4gICAgcmV0dXJuIC8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuRXhwcmVzc2lvbn0gKi8gKC8qKiBAdHlwZSB7dW5rbm93bn0gKi8gKHdpdGhBZGFwdGVkT3BlcmF0aW9uKHdpdGhQYXJzZXJSYW5nZXMoe1xuICAgICAga2luZDogXCJVbmFyeUV4cHJlc3Npb25cIixcbiAgICAgIGxvY2F0aW9uLFxuICAgICAgb3BlcmFuZDogY29udmVydEV4cHJlc3Npb24ob3BlcmFuZCwgZmlsZW5hbWUsIHNvdXJjZSlcbiAgICB9LCB7b3BlcmF0b3I6IG5vZGVMb2NhdGlvbihvcGVyYXRvciwgZmlsZW5hbWUsIHNvdXJjZSl9KSwgb3BlcmF0b3IudHlwZSA9PSBcIiFcIiA/IFwiTm90XCIgOiBcIk5lZ2F0ZVwiKSkpXG4gIH1cbiAgaWYgKG5vZGUudHlwZSA9PSBcImJpbmFyeV9leHByZXNzaW9uXCIpIHtcbiAgICBjb25zdCBsZWZ0ID0gcmVxdWlyZWRGaWVsZChub2RlLCBcImxlZnRcIiwgZmlsZW5hbWUsIHNvdXJjZSlcbiAgICBjb25zdCByaWdodCA9IHJlcXVpcmVkRmllbGQobm9kZSwgXCJyaWdodFwiLCBmaWxlbmFtZSwgc291cmNlKVxuICAgIGNvbnN0IG9wZXJhdG9yID0gb3BlcmF0b3JUb2tlbihub2RlLCBuZXcgU2V0KGJpbmFyeU9wZXJhdGlvbnMua2V5cygpKSwgZmlsZW5hbWUsIHNvdXJjZSlcbiAgICBjb25zdCBhZGFwdGVkID0gYmluYXJ5T3BlcmF0aW9ucy5nZXQob3BlcmF0b3IudHlwZSlcblxuICAgIGlmICghYWRhcHRlZCB8fCBzZW1hbnRpY0NoaWxkcmVuKG5vZGUpLmxlbmd0aCAhPSAyKSByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJnb1wiLCBcImJpbmFyeSBleHByZXNzaW9uIHNoYXBlXCIsIGxvY2F0aW9uKVxuICAgIHJldHVybiAvKiogQHR5cGUge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLkV4cHJlc3Npb259ICovICgvKiogQHR5cGUge3Vua25vd259ICovICh3aXRoQWRhcHRlZE9wZXJhdGlvbih3aXRoUGFyc2VyUmFuZ2VzKHtcbiAgICAgIGtpbmQ6IFwiQmluYXJ5RXhwcmVzc2lvblwiLFxuICAgICAgbGVmdDogY29udmVydEV4cHJlc3Npb24obGVmdCwgZmlsZW5hbWUsIHNvdXJjZSksXG4gICAgICBsb2NhdGlvbixcbiAgICAgIHJpZ2h0OiBjb252ZXJ0RXhwcmVzc2lvbihyaWdodCwgZmlsZW5hbWUsIHNvdXJjZSlcbiAgICB9LCB7b3BlcmF0b3I6IG5vZGVMb2NhdGlvbihvcGVyYXRvciwgZmlsZW5hbWUsIHNvdXJjZSl9KSwgLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy9vcGVyYXRvcnMuanNcIikuQWRhcHRlZE9wZXJhdGlvbn0gKi8gKGFkYXB0ZWQpKSkpXG4gIH1cbiAgaWYgKG5vZGUudHlwZSA9PSBcImNhbGxfZXhwcmVzc2lvblwiKSB7XG4gICAgY29uc3QgY2FsbGVlTm9kZSA9IHJlcXVpcmVkRmllbGQobm9kZSwgXCJmdW5jdGlvblwiLCBmaWxlbmFtZSwgc291cmNlKVxuICAgIGNvbnN0IGFyZ3VtZW50c05vZGUgPSByZXF1aXJlZEZpZWxkKG5vZGUsIFwiYXJndW1lbnRzXCIsIGZpbGVuYW1lLCBzb3VyY2UpXG5cbiAgICBpZiAoY2FsbGVlTm9kZS50eXBlICE9IFwiaWRlbnRpZmllclwiIHx8IGFyZ3VtZW50c05vZGUudHlwZSAhPSBcImFyZ3VtZW50X2xpc3RcIiB8fCBzZW1hbnRpY0NoaWxkcmVuKG5vZGUpLmxlbmd0aCAhPSAyKSB7XG4gICAgICByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJnb1wiLCBcInF1YWxpZmllZCBvciBkeW5hbWljIGNhbGxcIiwgbG9jYXRpb24pXG4gICAgfVxuICAgIGNvbnN0IGNhbGxlZSA9IGlkZW50aWZpZXIoY2FsbGVlTm9kZSwgXCJjYWxsZWVcIiwgZmlsZW5hbWUsIHNvdXJjZSlcbiAgICBjb25zdCBhcmd1bWVudHNfID0gc2VtYW50aWNDaGlsZHJlbihhcmd1bWVudHNOb2RlKS5tYXAoKGFyZ3VtZW50KSA9PiBjb252ZXJ0RXhwcmVzc2lvbihhcmd1bWVudCwgZmlsZW5hbWUsIHNvdXJjZSkpXG5cbiAgICByZXR1cm4gd2l0aFBhcnNlclJhbmdlcyh7YXJndW1lbnRzOiBhcmd1bWVudHNfLCBjYWxsZWUsIGtpbmQ6IC8qKiBAdHlwZSB7Y29uc3R9ICovIChcIkNhbGxFeHByZXNzaW9uXCIpLCBsb2NhdGlvbn0sIHtcbiAgICAgIGNhbGxlZTogbm9kZUxvY2F0aW9uKGNhbGxlZU5vZGUsIGZpbGVuYW1lLCBzb3VyY2UpXG4gICAgfSlcbiAgfVxuICByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJnb1wiLCBub2RlLnR5cGUsIGxvY2F0aW9uKVxufVxuXG4vKipcbiAqIERlY29kZXMgYW4gaW50ZXJwcmV0ZWQgR28gc3RyaW5nIHRvIHZhbGlkIFVuaWNvZGUgc2NhbGFyIHRleHQuXG4gKiBAcGFyYW0ge2ltcG9ydChcInRyZWUtc2l0dGVyXCIpLlN5bnRheE5vZGV9IG5vZGUgTGl0ZXJhbCBub2RlLlxuICogQHBhcmFtIHtzdHJpbmd9IGZpbGVuYW1lIFNvdXJjZSBmaWxlbmFtZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBzb3VyY2UgQ29tcGxldGUgc291cmNlLlxuICogQHJldHVybnMge3N0cmluZ30gRGVjb2RlZCB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gZGVjb2RlU3RyaW5nKG5vZGUsIGZpbGVuYW1lLCBzb3VyY2UpIHtcbiAgY29uc3QgbG9jYXRpb24gPSBub2RlTG9jYXRpb24obm9kZSwgZmlsZW5hbWUsIHNvdXJjZSlcbiAgY29uc3QgdGV4dCA9IG5vZGUudGV4dFxuXG4gIGlmICghdGV4dC5zdGFydHNXaXRoKCdcIicpIHx8ICF0ZXh0LmVuZHNXaXRoKCdcIicpIHx8IC9bXFxyXFxuXS91LnRlc3QodGV4dCkpIHtcbiAgICByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJnb1wiLCBcIm5vbmNhbm9uaWNhbCBpbnRlcnByZXRlZCBzdHJpbmcgbGl0ZXJhbFwiLCBsb2NhdGlvbilcbiAgfVxuICAvKiogQHR5cGUge251bWJlcltdfSAqL1xuICBjb25zdCBieXRlcyA9IFtdXG4gIC8qKlxuICAgKiBBcHBlbmRzIG9uZSBVVEYtOCB0ZXh0IHNlZ21lbnQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZSBUZXh0IHNlZ21lbnQuXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IE5ldyBieXRlIGxlbmd0aC5cbiAgICovXG4gIGNvbnN0IGFwcGVuZFRleHQgPSAodmFsdWUpID0+IGJ5dGVzLnB1c2goLi4ubmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKHZhbHVlKSlcbiAgY29uc3Qgc2ltcGxlID0gbmV3IE1hcChbXG4gICAgW1wiYVwiLCA3XSwgW1wiYlwiLCA4XSwgW1wiZlwiLCAxMl0sIFtcIm5cIiwgMTBdLCBbXCJyXCIsIDEzXSwgW1widFwiLCA5XSwgW1widlwiLCAxMV0sIFtcIlxcXFxcIiwgOTJdLCBbJ1wiJywgMzRdXG4gIF0pXG5cbiAgZm9yIChsZXQgaW5kZXggPSAxOyBpbmRleCA8IHRleHQubGVuZ3RoIC0gMTsgaW5kZXggKz0gMSkge1xuICAgIGNvbnN0IGNoYXJhY3RlciA9IHRleHRbaW5kZXhdXG5cbiAgICBpZiAoY2hhcmFjdGVyICE9IFwiXFxcXFwiKSB7XG4gICAgICBjb25zdCBjb2RlUG9pbnQgPSB0ZXh0LmNvZGVQb2ludEF0KGluZGV4KVxuXG4gICAgICBpZiAoY29kZVBvaW50ID09PSB1bmRlZmluZWQpIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcImdvXCIsIFwiaW52YWxpZCBzdHJpbmcgbGl0ZXJhbFwiLCBsb2NhdGlvbilcbiAgICAgIGFwcGVuZFRleHQoU3RyaW5nLmZyb21Db2RlUG9pbnQoY29kZVBvaW50KSlcbiAgICAgIGlmIChjb2RlUG9pbnQgPiAweEZGRkYpIGluZGV4ICs9IDFcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuICAgIGNvbnN0IGVzY2FwZSA9IHRleHRbKytpbmRleF1cblxuICAgIGlmIChlc2NhcGUgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwiZ29cIiwgXCJpbnZhbGlkIHN0cmluZyBlc2NhcGVcIiwgbG9jYXRpb24pXG4gICAgaWYgKHNpbXBsZS5oYXMoZXNjYXBlKSkge1xuICAgICAgYnl0ZXMucHVzaCgvKiogQHR5cGUge251bWJlcn0gKi8gKHNpbXBsZS5nZXQoZXNjYXBlKSkpXG4gICAgICBjb250aW51ZVxuICAgIH1cbiAgICBpZiAoZXNjYXBlID09IFwieFwiKSB7XG4gICAgICBjb25zdCBkaWdpdHMgPSB0ZXh0LnNsaWNlKGluZGV4ICsgMSwgaW5kZXggKyAzKVxuXG4gICAgICBpZiAoIS9eWzAtOUEtRmEtZl17Mn0kL3UudGVzdChkaWdpdHMpKSByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJnb1wiLCBcImludmFsaWQgYnl0ZSBlc2NhcGVcIiwgbG9jYXRpb24pXG4gICAgICBieXRlcy5wdXNoKE51bWJlci5wYXJzZUludChkaWdpdHMsIDE2KSlcbiAgICAgIGluZGV4ICs9IDJcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuICAgIGlmICgvWzAtN10vdS50ZXN0KGVzY2FwZSkpIHtcbiAgICAgIGNvbnN0IGRpZ2l0cyA9IHRleHQuc2xpY2UoaW5kZXgsIGluZGV4ICsgMylcblxuICAgICAgaWYgKCEvXlswLTddezN9JC91LnRlc3QoZGlnaXRzKSkgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwiZ29cIiwgXCJpbnZhbGlkIG9jdGFsIGVzY2FwZVwiLCBsb2NhdGlvbilcbiAgICAgIGNvbnN0IHZhbHVlID0gTnVtYmVyLnBhcnNlSW50KGRpZ2l0cywgOClcblxuICAgICAgaWYgKHZhbHVlID4gMjU1KSByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJnb1wiLCBcIm9jdGFsIGVzY2FwZSBvdXRzaWRlIGJ5dGUgcmFuZ2VcIiwgbG9jYXRpb24pXG4gICAgICBieXRlcy5wdXNoKHZhbHVlKVxuICAgICAgaW5kZXggKz0gMlxuICAgICAgY29udGludWVcbiAgICB9XG4gICAgY29uc3Qgd2lkdGggPSBlc2NhcGUgPT0gXCJ1XCIgPyA0IDogZXNjYXBlID09IFwiVVwiID8gOCA6IDBcbiAgICBjb25zdCBkaWdpdHMgPSB0ZXh0LnNsaWNlKGluZGV4ICsgMSwgaW5kZXggKyAxICsgd2lkdGgpXG5cbiAgICBpZiAoIXdpZHRoIHx8IGRpZ2l0cy5sZW5ndGggIT0gd2lkdGggfHwgIS9eWzAtOUEtRmEtZl0rJC91LnRlc3QoZGlnaXRzKSkge1xuICAgICAgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwiZ29cIiwgXCJ1bnN1cHBvcnRlZCBzdHJpbmcgZXNjYXBlXCIsIGxvY2F0aW9uKVxuICAgIH1cbiAgICBjb25zdCB2YWx1ZSA9IE51bWJlci5wYXJzZUludChkaWdpdHMsIDE2KVxuXG4gICAgaWYgKHZhbHVlID4gMHgxMEZGRkYgfHwgdmFsdWUgPj0gMHhEODAwICYmIHZhbHVlIDw9IDB4REZGRikge1xuICAgICAgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwiZ29cIiwgXCJpbnZhbGlkIFVuaWNvZGUgc3RyaW5nIGVzY2FwZVwiLCBsb2NhdGlvbilcbiAgICB9XG4gICAgYXBwZW5kVGV4dChTdHJpbmcuZnJvbUNvZGVQb2ludCh2YWx1ZSkpXG4gICAgaW5kZXggKz0gd2lkdGhcbiAgfVxuICBsZXQgZGVjb2RlZFxuXG4gIHRyeSB7XG4gICAgZGVjb2RlZCA9IG5ldyBUZXh0RGVjb2RlcihcInV0Zi04XCIsIHtmYXRhbDogdHJ1ZX0pLmRlY29kZShVaW50OEFycmF5LmZyb20oYnl0ZXMpKVxuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJnb1wiLCBcInN0cmluZyBieXRlIGVzY2FwZXMgZG8gbm90IGZvcm0gdmFsaWQgVVRGLThcIiwgbG9jYXRpb24pXG4gIH1cbiAgaWYgKCFoYXNPbmx5VW5pY29kZVNjYWxhcnMoZGVjb2RlZCkpIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcImdvXCIsIFwiaW52YWxpZCBVbmljb2RlIHN0cmluZyBsaXRlcmFsXCIsIGxvY2F0aW9uKVxuICByZXR1cm4gZGVjb2RlZFxufVxuXG4vKipcbiAqIENvbGxlY3RzIHBsYWluIGFzc2lnbm1lbnQgdGFyZ2V0cyBpbiBvbmUgcm9vdCBmdW5jdGlvbi5cbiAqIEBwYXJhbSB7aW1wb3J0KFwidHJlZS1zaXR0ZXJcIikuU3ludGF4Tm9kZX0gYm9keSBSb290IGJvZHkuXG4gKiBAcmV0dXJucyB7U2V0PHN0cmluZz59IEFzc2lnbmVkIG5hbWVzLlxuICovXG5mdW5jdGlvbiBjb2xsZWN0QXNzaWdubWVudFRhcmdldHMoYm9keSkge1xuICBjb25zdCBuYW1lcyA9IG5ldyBTZXQoKVxuXG4gIGZvciAoY29uc3QgYXNzaWdubWVudCBvZiBib2R5LmRlc2NlbmRhbnRzT2ZUeXBlKFwiYXNzaWdubWVudF9zdGF0ZW1lbnRcIikpIHtcbiAgICBjb25zdCBsZWZ0ID0gYXNzaWdubWVudC5jaGlsZEZvckZpZWxkTmFtZShcImxlZnRcIilcbiAgICBjb25zdCBjaGlsZHJlbiA9IGxlZnQgPyBzZW1hbnRpY0NoaWxkcmVuKGxlZnQpIDogW11cblxuICAgIGlmIChsZWZ0Py50eXBlID09IFwiZXhwcmVzc2lvbl9saXN0XCIgJiYgY2hpbGRyZW4ubGVuZ3RoID09IDEgJiYgY2hpbGRyZW5bMF0udHlwZSA9PSBcImlkZW50aWZpZXJcIikge1xuICAgICAgbmFtZXMuYWRkKGNoaWxkcmVuWzBdLnRleHQpXG4gICAgfVxuICB9XG4gIHJldHVybiBuYW1lc1xufVxuXG4vKipcbiAqIENsYWltcyBhbiBleGFjdCBhZGphY2VudCBpbW11dGFibGUgbWFya2VyLlxuICogQHBhcmFtIHtpbXBvcnQoXCJ0cmVlLXNpdHRlclwiKS5TeW50YXhOb2RlfSBub2RlIExvY2FsIGRlY2xhcmF0aW9uLlxuICogQHBhcmFtIHtHb0NvbnRleHR9IGNvbnRleHQgQ29tbWVudCBjb250ZXh0LlxuICogQHJldHVybnMge2Jvb2xlYW59IFdoZXRoZXIgbWFya2VkIGltbXV0YWJsZS5cbiAqL1xuZnVuY3Rpb24gdGFrZUltbXV0YWJsZU1hcmtlcihub2RlLCBjb250ZXh0KSB7XG4gIGNvbnN0IG1hcmtlciA9IGNvbnRleHQuY29tbWVudHMuZmluZCgoY29tbWVudCkgPT4gY29tbWVudC50ZXh0ID09IGltbXV0YWJsZU1hcmtlciAmJlxuICAgIGNvbW1lbnQuZW5kUG9zaXRpb24ucm93ICsgMSA9PSBub2RlLnN0YXJ0UG9zaXRpb24ucm93ICYmIGNvbW1lbnQuc3RhcnRQb3NpdGlvbi5jb2x1bW4gPT0gbm9kZS5zdGFydFBvc2l0aW9uLmNvbHVtbilcblxuICBpZiAoIW1hcmtlcikgcmV0dXJuIGZhbHNlXG4gIGNvbnRleHQudXNlZE1hcmtlcnMuYWRkKG1hcmtlcilcbiAgcmV0dXJuIHRydWVcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBvbmUgZXhhY3QgaW5pdGlhbGl6ZWQgbG9jYWwuXG4gKiBAcGFyYW0ge2ltcG9ydChcInRyZWUtc2l0dGVyXCIpLlN5bnRheE5vZGV9IG5vZGUgRGVjbGFyYXRpb24gbm9kZS5cbiAqIEBwYXJhbSB7R29Db250ZXh0fSBjb250ZXh0IEZ1bmN0aW9uIGNvbnRleHQuXG4gKiBAcGFyYW0ge3N0cmluZ30gZmlsZW5hbWUgU291cmNlIGZpbGVuYW1lLlxuICogQHBhcmFtIHtzdHJpbmd9IHNvdXJjZSBDb21wbGV0ZSBzb3VyY2UuXG4gKiBAcmV0dXJucyB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuTG9jYWxEZWNsYXJhdGlvbn0gU2VtYW50aWMgbG9jYWwuXG4gKi9cbmZ1bmN0aW9uIGNvbnZlcnRMb2NhbChub2RlLCBjb250ZXh0LCBmaWxlbmFtZSwgc291cmNlKSB7XG4gIGNvbnN0IGxvY2F0aW9uID0gbm9kZUxvY2F0aW9uKG5vZGUsIGZpbGVuYW1lLCBzb3VyY2UpXG4gIGNvbnN0IGNoaWxkcmVuID0gc2VtYW50aWNDaGlsZHJlbihub2RlKVxuXG4gIGlmIChjaGlsZHJlbi5sZW5ndGggIT0gMSB8fCBjaGlsZHJlblswXS50eXBlICE9IFwidmFyX3NwZWNcIikgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwiZ29cIiwgXCJsb2NhbCBkZWNsYXJhdGlvbiBzaGFwZVwiLCBsb2NhdGlvbilcbiAgY29uc3Qgc3BlYyA9IGNoaWxkcmVuWzBdXG4gIGNvbnN0IG5hbWVOb2RlID0gcmVxdWlyZWRGaWVsZChzcGVjLCBcIm5hbWVcIiwgZmlsZW5hbWUsIHNvdXJjZSlcbiAgY29uc3QgdHlwZU5vZGUgPSBzcGVjLmNoaWxkRm9yRmllbGROYW1lKFwidHlwZVwiKVxuICBjb25zdCB2YWx1ZU5vZGUgPSByZXF1aXJlZEZpZWxkKHNwZWMsIFwidmFsdWVcIiwgZmlsZW5hbWUsIHNvdXJjZSlcblxuICBpZiAoc2VtYW50aWNDaGlsZHJlbihzcGVjKS5sZW5ndGggIT0gKHR5cGVOb2RlID8gMyA6IDIpKSByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJnb1wiLCBcImxvY2FsIGRlY2xhcmF0aW9uIHNoYXBlXCIsIGxvY2F0aW9uKVxuICBjb25zdCBleHByZXNzaW9uTm9kZSA9IHNvbGVFeHByZXNzaW9uKHZhbHVlTm9kZSwgXCJsb2NhbCBpbml0aWFsaXplciBjb3VudFwiLCBmaWxlbmFtZSwgc291cmNlKVxuICBjb25zdCBuYW1lID0gaWRlbnRpZmllcihuYW1lTm9kZSwgXCJsb2NhbFwiLCBmaWxlbmFtZSwgc291cmNlKVxuICBjb25zdCBtYXJrZWRJbW11dGFibGUgPSB0YWtlSW1tdXRhYmxlTWFya2VyKG5vZGUsIGNvbnRleHQpXG4gIGNvbnN0IG9wZXJhdG9yID0gb3BlcmF0b3JUb2tlbihzcGVjLCBuZXcgU2V0KFtcIj1cIl0pLCBmaWxlbmFtZSwgc291cmNlKVxuXG4gIHJldHVybiB3aXRoUGFyc2VyUmFuZ2VzKHtcbiAgICBpbml0aWFsaXplcjogY29udmVydEV4cHJlc3Npb24oZXhwcmVzc2lvbk5vZGUsIGZpbGVuYW1lLCBzb3VyY2UpLFxuICAgIGtpbmQ6IC8qKiBAdHlwZSB7Y29uc3R9ICovIChcIkxvY2FsRGVjbGFyYXRpb25cIiksXG4gICAgbG9jYXRpb24sXG4gICAgbXV0YWJsZTogIW1hcmtlZEltbXV0YWJsZSAmJiBjb250ZXh0LmFzc2lnbm1lbnRUYXJnZXRzLmhhcyhuYW1lKSxcbiAgICBuYW1lLFxuICAgIHR5cGU6IGNvbnZlcnRUeXBlKHR5cGVOb2RlLCBcIkxvY2FsICdcIiArIG5hbWUgKyBcIidcIiwgbG9jYXRpb24sIGZpbGVuYW1lLCBzb3VyY2UpXG4gIH0sIHtuYW1lOiBub2RlTG9jYXRpb24obmFtZU5vZGUsIGZpbGVuYW1lLCBzb3VyY2UpLCBvcGVyYXRvcjogbm9kZUxvY2F0aW9uKG9wZXJhdG9yLCBmaWxlbmFtZSwgc291cmNlKX0pXG59XG5cbi8qKlxuICogQ29udmVydHMgb25lIHBsYWluIGFzc2lnbm1lbnQuXG4gKiBAcGFyYW0ge2ltcG9ydChcInRyZWUtc2l0dGVyXCIpLlN5bnRheE5vZGV9IG5vZGUgQXNzaWdubWVudCBub2RlLlxuICogQHBhcmFtIHtzdHJpbmd9IGZpbGVuYW1lIFNvdXJjZSBmaWxlbmFtZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBzb3VyY2UgQ29tcGxldGUgc291cmNlLlxuICogQHJldHVybnMge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLkFzc2lnbm1lbnRTdGF0ZW1lbnR9IFNlbWFudGljIGFzc2lnbm1lbnQuXG4gKi9cbmZ1bmN0aW9uIGNvbnZlcnRBc3NpZ25tZW50KG5vZGUsIGZpbGVuYW1lLCBzb3VyY2UpIHtcbiAgY29uc3QgbG9jYXRpb24gPSBub2RlTG9jYXRpb24obm9kZSwgZmlsZW5hbWUsIHNvdXJjZSlcbiAgY29uc3QgbGVmdExpc3QgPSByZXF1aXJlZEZpZWxkKG5vZGUsIFwibGVmdFwiLCBmaWxlbmFtZSwgc291cmNlKVxuICBjb25zdCByaWdodExpc3QgPSByZXF1aXJlZEZpZWxkKG5vZGUsIFwicmlnaHRcIiwgZmlsZW5hbWUsIHNvdXJjZSlcbiAgY29uc3Qgb3BlcmF0b3IgPSBvcGVyYXRvclRva2VuKG5vZGUsIG5ldyBTZXQoW1wiPVwiXSksIGZpbGVuYW1lLCBzb3VyY2UpXG4gIGNvbnN0IGxlZnQgPSBzb2xlRXhwcmVzc2lvbihsZWZ0TGlzdCwgXCJhc3NpZ25tZW50IHRhcmdldCBjb3VudFwiLCBmaWxlbmFtZSwgc291cmNlKVxuICBjb25zdCByaWdodCA9IHNvbGVFeHByZXNzaW9uKHJpZ2h0TGlzdCwgXCJhc3NpZ25tZW50IHZhbHVlIGNvdW50XCIsIGZpbGVuYW1lLCBzb3VyY2UpXG5cbiAgaWYgKGxlZnQudHlwZSAhPSBcImlkZW50aWZpZXJcIiB8fCBzZW1hbnRpY0NoaWxkcmVuKG5vZGUpLmxlbmd0aCAhPSAyKSB7XG4gICAgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwiZ29cIiwgXCJhc3NpZ25tZW50IHNoYXBlXCIsIGxvY2F0aW9uKVxuICB9XG4gIGNvbnN0IG5hbWUgPSBpZGVudGlmaWVyKGxlZnQsIFwiYXNzaWdubWVudCB0YXJnZXRcIiwgZmlsZW5hbWUsIHNvdXJjZSlcbiAgY29uc3QgbmFtZUxvY2F0aW9uID0gbm9kZUxvY2F0aW9uKGxlZnQsIGZpbGVuYW1lLCBzb3VyY2UpXG5cbiAgcmV0dXJuIHdpdGhQYXJzZXJSYW5nZXMoe1xuICAgIGV4cHJlc3Npb246IGNvbnZlcnRFeHByZXNzaW9uKHJpZ2h0LCBmaWxlbmFtZSwgc291cmNlKSxcbiAgICBraW5kOiAvKiogQHR5cGUge2NvbnN0fSAqLyAoXCJBc3NpZ25tZW50U3RhdGVtZW50XCIpLFxuICAgIGxvY2F0aW9uLFxuICAgIHRhcmdldDogd2l0aFBhcnNlclJhbmdlcyh7a2luZDogLyoqIEB0eXBlIHtjb25zdH0gKi8gKFwiSWRlbnRpZmllckV4cHJlc3Npb25cIiksIGxvY2F0aW9uOiBuYW1lTG9jYXRpb24sIG5hbWV9LCB7bmFtZTogbmFtZUxvY2F0aW9ufSlcbiAgfSwge29wZXJhdG9yOiBub2RlTG9jYXRpb24ob3BlcmF0b3IsIGZpbGVuYW1lLCBzb3VyY2UpfSlcbn1cblxuLyoqXG4gKiBSZWNvZ25pemVzIGV4YWN0IGZtdC5QcmludGxuLlxuICogQHBhcmFtIHtpbXBvcnQoXCJ0cmVlLXNpdHRlclwiKS5TeW50YXhOb2RlfSBub2RlIENhbmRpZGF0ZSBzZWxlY3Rvci5cbiAqIEByZXR1cm5zIHtib29sZWFufSBFeGFjdCBwcmludCByZWNlaXZlci5cbiAqL1xuZnVuY3Rpb24gaXNQcmludFJlY2VpdmVyKG5vZGUpIHtcbiAgcmV0dXJuIG5vZGUudHlwZSA9PSBcInNlbGVjdG9yX2V4cHJlc3Npb25cIiAmJiBzZW1hbnRpY0NoaWxkcmVuKG5vZGUpLmxlbmd0aCA9PSAyICYmXG4gICAgbm9kZS5jaGlsZEZvckZpZWxkTmFtZShcIm9wZXJhbmRcIik/LnR5cGUgPT0gXCJpZGVudGlmaWVyXCIgJiYgbm9kZS5jaGlsZEZvckZpZWxkTmFtZShcIm9wZXJhbmRcIik/LnRleHQgPT0gXCJmbXRcIiAmJlxuICAgIG5vZGUuY2hpbGRGb3JGaWVsZE5hbWUoXCJmaWVsZFwiKT8udHlwZSA9PSBcImZpZWxkX2lkZW50aWZpZXJcIiAmJiBub2RlLmNoaWxkRm9yRmllbGROYW1lKFwiZmllbGRcIik/LnRleHQgPT0gXCJQcmludGxuXCJcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBvbmUgcHJpbnQgZXhwcmVzc2lvbiBzdGF0ZW1lbnQuXG4gKiBAcGFyYW0ge2ltcG9ydChcInRyZWUtc2l0dGVyXCIpLlN5bnRheE5vZGV9IG5vZGUgRXhwcmVzc2lvbiBzdGF0ZW1lbnQuXG4gKiBAcGFyYW0ge3N0cmluZ30gZmlsZW5hbWUgU291cmNlIGZpbGVuYW1lLlxuICogQHBhcmFtIHtzdHJpbmd9IHNvdXJjZSBDb21wbGV0ZSBzb3VyY2UuXG4gKiBAcmV0dXJucyB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuUHJpbnRTdGF0ZW1lbnR9IFNlbWFudGljIHByaW50LlxuICovXG5mdW5jdGlvbiBjb252ZXJ0UHJpbnQobm9kZSwgZmlsZW5hbWUsIHNvdXJjZSkge1xuICBjb25zdCBsb2NhdGlvbiA9IG5vZGVMb2NhdGlvbihub2RlLCBmaWxlbmFtZSwgc291cmNlKVxuICBjb25zdCBjaGlsZHJlbiA9IHNlbWFudGljQ2hpbGRyZW4obm9kZSlcblxuICBpZiAoY2hpbGRyZW4ubGVuZ3RoICE9IDEgfHwgY2hpbGRyZW5bMF0udHlwZSAhPSBcImNhbGxfZXhwcmVzc2lvblwiKSB7XG4gICAgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwiZ29cIiwgXCJleHByZXNzaW9uIHN0YXRlbWVudCBvdGhlciB0aGFuIHByaW50XCIsIGxvY2F0aW9uKVxuICB9XG4gIGNvbnN0IGNhbGwgPSBjaGlsZHJlblswXVxuICBjb25zdCBjYWxsZWUgPSByZXF1aXJlZEZpZWxkKGNhbGwsIFwiZnVuY3Rpb25cIiwgZmlsZW5hbWUsIHNvdXJjZSlcbiAgY29uc3QgYXJndW1lbnRzTm9kZSA9IHJlcXVpcmVkRmllbGQoY2FsbCwgXCJhcmd1bWVudHNcIiwgZmlsZW5hbWUsIHNvdXJjZSlcbiAgY29uc3QgYXJndW1lbnRzXyA9IHNlbWFudGljQ2hpbGRyZW4oYXJndW1lbnRzTm9kZSlcblxuICBpZiAoIWlzUHJpbnRSZWNlaXZlcihjYWxsZWUpIHx8IHNlbWFudGljQ2hpbGRyZW4oY2FsbCkubGVuZ3RoICE9IDIgfHwgYXJndW1lbnRzTm9kZS50eXBlICE9IFwiYXJndW1lbnRfbGlzdFwiIHx8XG4gICAgYXJndW1lbnRzXy5sZW5ndGggIT0gMSkge1xuICAgIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcImdvXCIsIFwicHJpbnQgY2FsbCBzaGFwZVwiLCBub2RlTG9jYXRpb24oY2FsbCwgZmlsZW5hbWUsIHNvdXJjZSkpXG4gIH1cbiAgcmV0dXJuIHtleHByZXNzaW9uOiBjb252ZXJ0RXhwcmVzc2lvbihhcmd1bWVudHNfWzBdLCBmaWxlbmFtZSwgc291cmNlKSwga2luZDogLyoqIEB0eXBlIHtjb25zdH0gKi8gKFwiUHJpbnRTdGF0ZW1lbnRcIiksIGxvY2F0aW9ufVxufVxuXG4vKipcbiAqIENvbnZlcnRzIG9uZSBjb25kaXRpb25hbC5cbiAqIEBwYXJhbSB7aW1wb3J0KFwidHJlZS1zaXR0ZXJcIikuU3ludGF4Tm9kZX0gbm9kZSBJZiBub2RlLlxuICogQHBhcmFtIHtHb0NvbnRleHR9IGNvbnRleHQgRnVuY3Rpb24gY29udGV4dC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBmaWxlbmFtZSBTb3VyY2UgZmlsZW5hbWUuXG4gKiBAcGFyYW0ge3N0cmluZ30gc291cmNlIENvbXBsZXRlIHNvdXJjZS5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5JZlN0YXRlbWVudH0gU2VtYW50aWMgY29uZGl0aW9uYWwuXG4gKi9cbmZ1bmN0aW9uIGNvbnZlcnRJZihub2RlLCBjb250ZXh0LCBmaWxlbmFtZSwgc291cmNlKSB7XG4gIGNvbnN0IGxvY2F0aW9uID0gbm9kZUxvY2F0aW9uKG5vZGUsIGZpbGVuYW1lLCBzb3VyY2UpXG4gIGNvbnN0IGNvbmRpdGlvbiA9IHJlcXVpcmVkRmllbGQobm9kZSwgXCJjb25kaXRpb25cIiwgZmlsZW5hbWUsIHNvdXJjZSlcbiAgY29uc3QgY29uc2VxdWVuY2UgPSByZXF1aXJlZEZpZWxkKG5vZGUsIFwiY29uc2VxdWVuY2VcIiwgZmlsZW5hbWUsIHNvdXJjZSlcbiAgY29uc3QgYWx0ZXJuYXRpdmUgPSBub2RlLmNoaWxkRm9yRmllbGROYW1lKFwiYWx0ZXJuYXRpdmVcIilcbiAgY29uc3QgZXhwZWN0ZWRDaGlsZHJlbiA9IGFsdGVybmF0aXZlID8gMyA6IDJcblxuICBpZiAoc2VtYW50aWNDaGlsZHJlbihub2RlKS5sZW5ndGggIT0gZXhwZWN0ZWRDaGlsZHJlbikgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwiZ29cIiwgXCJpZiBpbml0aWFsaXplciBvciBzaGFwZVwiLCBsb2NhdGlvbilcbiAgcmV0dXJuIHtcbiAgICAuLi4oYWx0ZXJuYXRpdmUgPyB7YWx0ZXJuYXRlOiBhbHRlcm5hdGl2ZS50eXBlID09IFwiaWZfc3RhdGVtZW50XCJcbiAgICAgID8ge2tpbmQ6IC8qKiBAdHlwZSB7Y29uc3R9ICovIChcIkJsb2NrXCIpLCBsb2NhdGlvbjogbm9kZUxvY2F0aW9uKGFsdGVybmF0aXZlLCBmaWxlbmFtZSwgc291cmNlKSxcbiAgICAgICAgICBzdGF0ZW1lbnRzOiBbY29udmVydElmKGFsdGVybmF0aXZlLCBjb250ZXh0LCBmaWxlbmFtZSwgc291cmNlKV19XG4gICAgICA6IGNvbnZlcnRCbG9jayhhbHRlcm5hdGl2ZSwgY29udGV4dCwgZmlsZW5hbWUsIHNvdXJjZSl9IDoge30pLFxuICAgIGNvbmRpdGlvbjogY29udmVydEV4cHJlc3Npb24oY29uZGl0aW9uLCBmaWxlbmFtZSwgc291cmNlKSxcbiAgICBjb25zZXF1ZW50OiBjb252ZXJ0QmxvY2soY29uc2VxdWVuY2UsIGNvbnRleHQsIGZpbGVuYW1lLCBzb3VyY2UpLFxuICAgIGtpbmQ6IC8qKiBAdHlwZSB7Y29uc3R9ICovIChcIklmU3RhdGVtZW50XCIpLFxuICAgIGxvY2F0aW9uXG4gIH1cbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBvbmUgc3VwcG9ydGVkIHN0YXRlbWVudC5cbiAqIEBwYXJhbSB7aW1wb3J0KFwidHJlZS1zaXR0ZXJcIikuU3ludGF4Tm9kZX0gbm9kZSBTdGF0ZW1lbnQgbm9kZS5cbiAqIEBwYXJhbSB7R29Db250ZXh0fSBjb250ZXh0IEZ1bmN0aW9uIGNvbnRleHQuXG4gKiBAcGFyYW0ge3N0cmluZ30gZmlsZW5hbWUgU291cmNlIGZpbGVuYW1lLlxuICogQHBhcmFtIHtzdHJpbmd9IHNvdXJjZSBDb21wbGV0ZSBzb3VyY2UuXG4gKiBAcmV0dXJucyB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU3RhdGVtZW50fSBTZW1hbnRpYyBzdGF0ZW1lbnQuXG4gKi9cbmZ1bmN0aW9uIGNvbnZlcnRTdGF0ZW1lbnQobm9kZSwgY29udGV4dCwgZmlsZW5hbWUsIHNvdXJjZSkge1xuICBjb25zdCBsb2NhdGlvbiA9IG5vZGVMb2NhdGlvbihub2RlLCBmaWxlbmFtZSwgc291cmNlKVxuXG4gIGlmIChub2RlLnR5cGUgPT0gXCJ2YXJfZGVjbGFyYXRpb25cIikgcmV0dXJuIGNvbnZlcnRMb2NhbChub2RlLCBjb250ZXh0LCBmaWxlbmFtZSwgc291cmNlKVxuICBpZiAobm9kZS50eXBlID09IFwiYXNzaWdubWVudF9zdGF0ZW1lbnRcIikgcmV0dXJuIGNvbnZlcnRBc3NpZ25tZW50KG5vZGUsIGZpbGVuYW1lLCBzb3VyY2UpXG4gIGlmIChub2RlLnR5cGUgPT0gXCJpZl9zdGF0ZW1lbnRcIikgcmV0dXJuIGNvbnZlcnRJZihub2RlLCBjb250ZXh0LCBmaWxlbmFtZSwgc291cmNlKVxuICBpZiAobm9kZS50eXBlID09IFwiZXhwcmVzc2lvbl9zdGF0ZW1lbnRcIikgcmV0dXJuIGNvbnZlcnRQcmludChub2RlLCBmaWxlbmFtZSwgc291cmNlKVxuICBpZiAobm9kZS50eXBlID09IFwicmV0dXJuX3N0YXRlbWVudFwiKSB7XG4gICAgY29uc3QgY2hpbGRyZW4gPSBzZW1hbnRpY0NoaWxkcmVuKG5vZGUpXG5cbiAgICBpZiAoY2hpbGRyZW4ubGVuZ3RoICE9IDEpIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcImdvXCIsIFwicmV0dXJuIHdpdGhvdXQgb25lIGV4cHJlc3Npb25cIiwgbG9jYXRpb24pXG4gICAgcmV0dXJuIHtcbiAgICAgIGV4cHJlc3Npb246IGNvbnZlcnRFeHByZXNzaW9uKHNvbGVFeHByZXNzaW9uKGNoaWxkcmVuWzBdLCBcInJldHVybiBleHByZXNzaW9uIGNvdW50XCIsIGZpbGVuYW1lLCBzb3VyY2UpLCBmaWxlbmFtZSwgc291cmNlKSxcbiAgICAgIGtpbmQ6IC8qKiBAdHlwZSB7Y29uc3R9ICovIChcIlJldHVyblN0YXRlbWVudFwiKSxcbiAgICAgIGxvY2F0aW9uXG4gICAgfVxuICB9XG4gIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcImdvXCIsIG5vZGUudHlwZSwgbG9jYXRpb24pXG59XG5cbi8qKlxuICogQ29udmVydHMgb25lIGxleGljYWwgYmxvY2suXG4gKiBAcGFyYW0ge2ltcG9ydChcInRyZWUtc2l0dGVyXCIpLlN5bnRheE5vZGV9IG5vZGUgQmxvY2sgbm9kZS5cbiAqIEBwYXJhbSB7R29Db250ZXh0fSBjb250ZXh0IEZ1bmN0aW9uIGNvbnRleHQuXG4gKiBAcGFyYW0ge3N0cmluZ30gZmlsZW5hbWUgU291cmNlIGZpbGVuYW1lLlxuICogQHBhcmFtIHtzdHJpbmd9IHNvdXJjZSBDb21wbGV0ZSBzb3VyY2UuXG4gKiBAcmV0dXJucyB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuQmxvY2t9IFNlbWFudGljIGJsb2NrLlxuICovXG5mdW5jdGlvbiBjb252ZXJ0QmxvY2sobm9kZSwgY29udGV4dCwgZmlsZW5hbWUsIHNvdXJjZSkge1xuICBjb25zdCBsb2NhdGlvbiA9IG5vZGVMb2NhdGlvbihub2RlLCBmaWxlbmFtZSwgc291cmNlKVxuICBjb25zdCBjaGlsZHJlbiA9IHNlbWFudGljQ2hpbGRyZW4obm9kZSlcblxuICBpZiAobm9kZS50eXBlICE9IFwiYmxvY2tcIiB8fCBjaGlsZHJlbi5sZW5ndGggPiAxIHx8IGNoaWxkcmVuWzBdPy50eXBlICE9IFwic3RhdGVtZW50X2xpc3RcIikge1xuICAgIGlmICghKG5vZGUudHlwZSA9PSBcImJsb2NrXCIgJiYgY2hpbGRyZW4ubGVuZ3RoID09IDApKSByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJnb1wiLCBcImJsb2NrIHNoYXBlXCIsIGxvY2F0aW9uKVxuICB9XG4gIGNvbnN0IHN0YXRlbWVudHMgPSBjaGlsZHJlbi5sZW5ndGggPT0gMCA/IFtdIDogc2VtYW50aWNDaGlsZHJlbihjaGlsZHJlblswXSlcblxuICByZXR1cm4ge2tpbmQ6IC8qKiBAdHlwZSB7Y29uc3R9ICovIChcIkJsb2NrXCIpLCBsb2NhdGlvbixcbiAgICBzdGF0ZW1lbnRzOiBzdGF0ZW1lbnRzLm1hcCgoc3RhdGVtZW50KSA9PiBjb252ZXJ0U3RhdGVtZW50KHN0YXRlbWVudCwgY29udGV4dCwgZmlsZW5hbWUsIHNvdXJjZSkpfVxufVxuXG4vKipcbiAqIENvbnZlcnRzIG9uZSBwYXJhbWV0ZXIuXG4gKiBAcGFyYW0ge2ltcG9ydChcInRyZWUtc2l0dGVyXCIpLlN5bnRheE5vZGV9IG5vZGUgUGFyYW1ldGVyIG5vZGUuXG4gKiBAcGFyYW0ge3N0cmluZ30gZmlsZW5hbWUgU291cmNlIGZpbGVuYW1lLlxuICogQHBhcmFtIHtzdHJpbmd9IHNvdXJjZSBDb21wbGV0ZSBzb3VyY2UuXG4gKiBAcmV0dXJucyB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuUGFyYW1ldGVyfSBTZW1hbnRpYyBwYXJhbWV0ZXIuXG4gKi9cbmZ1bmN0aW9uIGNvbnZlcnRQYXJhbWV0ZXIobm9kZSwgZmlsZW5hbWUsIHNvdXJjZSkge1xuICBjb25zdCBsb2NhdGlvbiA9IG5vZGVMb2NhdGlvbihub2RlLCBmaWxlbmFtZSwgc291cmNlKVxuICBjb25zdCBuYW1lTm9kZSA9IHJlcXVpcmVkRmllbGQobm9kZSwgXCJuYW1lXCIsIGZpbGVuYW1lLCBzb3VyY2UpXG4gIGNvbnN0IHR5cGVOb2RlID0gbm9kZS5jaGlsZEZvckZpZWxkTmFtZShcInR5cGVcIilcblxuICBpZiAobm9kZS50eXBlICE9IFwicGFyYW1ldGVyX2RlY2xhcmF0aW9uXCIgfHwgc2VtYW50aWNDaGlsZHJlbihub2RlKS5sZW5ndGggIT0gMikge1xuICAgIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcImdvXCIsIFwicGFyYW1ldGVyIHNoYXBlXCIsIGxvY2F0aW9uKVxuICB9XG4gIGNvbnN0IG5hbWUgPSBpZGVudGlmaWVyKG5hbWVOb2RlLCBcInBhcmFtZXRlclwiLCBmaWxlbmFtZSwgc291cmNlKVxuXG4gIHJldHVybiB3aXRoUGFyc2VyUmFuZ2VzKHtcbiAgICBraW5kOiAvKiogQHR5cGUge2NvbnN0fSAqLyAoXCJQYXJhbWV0ZXJcIiksXG4gICAgbG9jYXRpb24sXG4gICAgbmFtZSxcbiAgICB0eXBlOiBjb252ZXJ0VHlwZSh0eXBlTm9kZSwgXCJQYXJhbWV0ZXIgJ1wiICsgbmFtZSArIFwiJ1wiLCBsb2NhdGlvbiwgZmlsZW5hbWUsIHNvdXJjZSlcbiAgfSwge25hbWU6IG5vZGVMb2NhdGlvbihuYW1lTm9kZSwgZmlsZW5hbWUsIHNvdXJjZSl9KVxufVxuXG4vKipcbiAqIENvbnZlcnRzIG9uZSBzZW1hbnRpYyBmdW5jdGlvbi5cbiAqIEBwYXJhbSB7aW1wb3J0KFwidHJlZS1zaXR0ZXJcIikuU3ludGF4Tm9kZX0gbm9kZSBGdW5jdGlvbiBub2RlLlxuICogQHBhcmFtIHtHb0NvbnRleHR9IGJhc2VDb250ZXh0IEZpbGUgY29udGV4dC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBmaWxlbmFtZSBTb3VyY2UgZmlsZW5hbWUuXG4gKiBAcGFyYW0ge3N0cmluZ30gc291cmNlIENvbXBsZXRlIHNvdXJjZS5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5GdW5jdGlvbkRlY2xhcmF0aW9ufSBTZW1hbnRpYyBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gY29udmVydEZ1bmN0aW9uKG5vZGUsIGJhc2VDb250ZXh0LCBmaWxlbmFtZSwgc291cmNlKSB7XG4gIGNvbnN0IGxvY2F0aW9uID0gbm9kZUxvY2F0aW9uKG5vZGUsIGZpbGVuYW1lLCBzb3VyY2UpXG4gIGNvbnN0IG5hbWVOb2RlID0gcmVxdWlyZWRGaWVsZChub2RlLCBcIm5hbWVcIiwgZmlsZW5hbWUsIHNvdXJjZSlcbiAgY29uc3QgcGFyYW1ldGVyc05vZGUgPSByZXF1aXJlZEZpZWxkKG5vZGUsIFwicGFyYW1ldGVyc1wiLCBmaWxlbmFtZSwgc291cmNlKVxuICBjb25zdCByZXN1bHROb2RlID0gbm9kZS5jaGlsZEZvckZpZWxkTmFtZShcInJlc3VsdFwiKVxuICBjb25zdCBib2R5Tm9kZSA9IHJlcXVpcmVkRmllbGQobm9kZSwgXCJib2R5XCIsIGZpbGVuYW1lLCBzb3VyY2UpXG5cbiAgaWYgKG5vZGUudHlwZSAhPSBcImZ1bmN0aW9uX2RlY2xhcmF0aW9uXCIgfHwgc2VtYW50aWNDaGlsZHJlbihub2RlKS5sZW5ndGggIT0gKHJlc3VsdE5vZGUgPyA0IDogMykgfHxcbiAgICBub2RlLmNoaWxkRm9yRmllbGROYW1lKFwicmVjZWl2ZXJcIikgfHwgbm9kZS5jaGlsZEZvckZpZWxkTmFtZShcInR5cGVfcGFyYW1ldGVyc1wiKSkge1xuICAgIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcImdvXCIsIFwiZnVuY3Rpb24gZGVjbGFyYXRpb24gc2hhcGVcIiwgbG9jYXRpb24pXG4gIH1cbiAgY29uc3QgbmFtZSA9IGlkZW50aWZpZXIobmFtZU5vZGUsIFwiZnVuY3Rpb25cIiwgZmlsZW5hbWUsIHNvdXJjZSlcbiAgY29uc3QgcGFyYW1ldGVyTm9kZXMgPSBzZW1hbnRpY0NoaWxkcmVuKHBhcmFtZXRlcnNOb2RlKVxuXG4gIGlmIChwYXJhbWV0ZXJOb2Rlcy5sZW5ndGggIT0gMiB8fCBwYXJhbWV0ZXJOb2Rlcy5zb21lKChwYXJhbWV0ZXIpID0+IHBhcmFtZXRlci50eXBlICE9IFwicGFyYW1ldGVyX2RlY2xhcmF0aW9uXCIpKSB7XG4gICAgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwiZ29cIiwgXCJmdW5jdGlvbiBwYXJhbWV0ZXIgY291bnQgb3Igc2hhcGVcIiwgbm9kZUxvY2F0aW9uKHBhcmFtZXRlcnNOb2RlLCBmaWxlbmFtZSwgc291cmNlKSlcbiAgfVxuICBjb25zdCBjb250ZXh0ID0gey4uLmJhc2VDb250ZXh0LCBhc3NpZ25tZW50VGFyZ2V0czogY29sbGVjdEFzc2lnbm1lbnRUYXJnZXRzKGJvZHlOb2RlKX1cblxuICByZXR1cm4gd2l0aFBhcnNlclJhbmdlcyh7XG4gICAgYm9keTogY29udmVydEJsb2NrKGJvZHlOb2RlLCBjb250ZXh0LCBmaWxlbmFtZSwgc291cmNlKSxcbiAgICBraW5kOiAvKiogQHR5cGUge2NvbnN0fSAqLyAoXCJGdW5jdGlvbkRlY2xhcmF0aW9uXCIpLFxuICAgIGxvY2F0aW9uLFxuICAgIG5hbWUsXG4gICAgcGFyYW1ldGVyczogcGFyYW1ldGVyTm9kZXMubWFwKChwYXJhbWV0ZXIpID0+IGNvbnZlcnRQYXJhbWV0ZXIocGFyYW1ldGVyLCBmaWxlbmFtZSwgc291cmNlKSksXG4gICAgcmV0dXJuVHlwZTogY29udmVydFR5cGUocmVzdWx0Tm9kZSwgXCJGdW5jdGlvbiAnXCIgKyBuYW1lICsgXCInIHJldHVyblwiLCBsb2NhdGlvbiwgZmlsZW5hbWUsIHNvdXJjZSlcbiAgfSwge25hbWU6IG5vZGVMb2NhdGlvbihuYW1lTm9kZSwgZmlsZW5hbWUsIHNvdXJjZSl9KVxufVxuXG4vKipcbiAqIENvbnZlcnRzIHRoZSBleGFjdCBmaW5hbCBmdW5jIG1haW4oKSBlbnRyeS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwidHJlZS1zaXR0ZXJcIikuU3ludGF4Tm9kZX0gbm9kZSBNYWluIG5vZGUuXG4gKiBAcGFyYW0ge0dvQ29udGV4dH0gYmFzZUNvbnRleHQgRmlsZSBjb250ZXh0LlxuICogQHBhcmFtIHtzdHJpbmd9IGZpbGVuYW1lIFNvdXJjZSBmaWxlbmFtZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBzb3VyY2UgQ29tcGxldGUgc291cmNlLlxuICogQHJldHVybnMge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLkVudHJ5UG9pbnR9IFNlbWFudGljIGVudHJ5LlxuICovXG5mdW5jdGlvbiBjb252ZXJ0TWFpbihub2RlLCBiYXNlQ29udGV4dCwgZmlsZW5hbWUsIHNvdXJjZSkge1xuICBjb25zdCBsb2NhdGlvbiA9IG5vZGVMb2NhdGlvbihub2RlLCBmaWxlbmFtZSwgc291cmNlKVxuICBjb25zdCBuYW1lID0gcmVxdWlyZWRGaWVsZChub2RlLCBcIm5hbWVcIiwgZmlsZW5hbWUsIHNvdXJjZSlcbiAgY29uc3QgcGFyYW1ldGVycyA9IHJlcXVpcmVkRmllbGQobm9kZSwgXCJwYXJhbWV0ZXJzXCIsIGZpbGVuYW1lLCBzb3VyY2UpXG4gIGNvbnN0IGJvZHkgPSByZXF1aXJlZEZpZWxkKG5vZGUsIFwiYm9keVwiLCBmaWxlbmFtZSwgc291cmNlKVxuXG4gIGlmIChzZW1hbnRpY0NoaWxkcmVuKG5vZGUpLmxlbmd0aCAhPSAzIHx8IG5hbWUudGV4dCAhPSBcIm1haW5cIiB8fCBzZW1hbnRpY0NoaWxkcmVuKHBhcmFtZXRlcnMpLmxlbmd0aCAhPSAwIHx8XG4gICAgbm9kZS5jaGlsZEZvckZpZWxkTmFtZShcInJlc3VsdFwiKSB8fCBub2RlLmNoaWxkRm9yRmllbGROYW1lKFwicmVjZWl2ZXJcIikgfHwgbm9kZS5jaGlsZEZvckZpZWxkTmFtZShcInR5cGVfcGFyYW1ldGVyc1wiKSkge1xuICAgIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcImdvXCIsIFwibWFpbiBzY2FmZm9sZGluZ1wiLCBsb2NhdGlvbilcbiAgfVxuICBjb25zdCBjb250ZXh0ID0gey4uLmJhc2VDb250ZXh0LCBhc3NpZ25tZW50VGFyZ2V0czogY29sbGVjdEFzc2lnbm1lbnRUYXJnZXRzKGJvZHkpfVxuXG4gIHJldHVybiB7Ym9keTogY29udmVydEJsb2NrKGJvZHksIGNvbnRleHQsIGZpbGVuYW1lLCBzb3VyY2UpLCBraW5kOiAvKiogQHR5cGUge2NvbnN0fSAqLyAoXCJFbnRyeVBvaW50XCIpLCBsb2NhdGlvbn1cbn1cblxuLyoqXG4gKiBSZXBvcnRzIHdoZXRoZXIgYW55IHByaW50IGV4aXN0cy5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNNb2R1bGV9IG1vZHVsZSBNb2R1bGUuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUHJpbnQgcHJlc2VuY2UuXG4gKi9cbmZ1bmN0aW9uIGhhc1ByaW50KG1vZHVsZSkge1xuICAvKipcbiAgICogUmVwb3J0cyB3aGV0aGVyIG9uZSBuZXN0ZWQgYmxvY2sgcHJpbnRzLlxuICAgKiBAdHlwZSB7KGJsb2NrOiBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5CbG9jaykgPT4gYm9vbGVhbn1cbiAgICovXG4gIGNvbnN0IGJsb2NrSGFzUHJpbnQgPSAoYmxvY2spID0+IGJsb2NrLnN0YXRlbWVudHMuc29tZSgoc3RhdGVtZW50KSA9PiBzdGF0ZW1lbnQua2luZCA9PSBcIlByaW50U3RhdGVtZW50XCIgfHxcbiAgICBzdGF0ZW1lbnQua2luZCA9PSBcIklmU3RhdGVtZW50XCIgJiYgKGJsb2NrSGFzUHJpbnQoc3RhdGVtZW50LmNvbnNlcXVlbnQpIHx8IEJvb2xlYW4oc3RhdGVtZW50LmFsdGVybmF0ZSAmJiBibG9ja0hhc1ByaW50KHN0YXRlbWVudC5hbHRlcm5hdGUpKSkpXG5cbiAgcmV0dXJuIG1vZHVsZS5mdW5jdGlvbnMuc29tZSgoe2JvZHl9KSA9PiBibG9ja0hhc1ByaW50KGJvZHkpKSB8fCBibG9ja0hhc1ByaW50KG1vZHVsZS5lbnRyeVBvaW50LmJvZHkpXG59XG5cbi8qKlxuICogUGFyc2VzIHRoZSBzdHJpY3QgVGFzayAwMjQgR28gcHJvZmlsZS5cbiAqIEBwYXJhbSB7e2ZpbGVuYW1lOiBzdHJpbmcsIHNvdXJjZTogc3RyaW5nfX0gaW5wdXQgUGFyc2VyIGlucHV0LlxuICogQHJldHVybnMge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljTW9kdWxlfSBTZW1hbnRpYyBtb2R1bGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUdvKHtmaWxlbmFtZSwgc291cmNlfSkge1xuICBpZiAoIWhhc09ubHlVbmljb2RlU2NhbGFycyhzb3VyY2UpKSB7XG4gICAgY29uc3Qgb2Zmc2V0ID0gZmlyc3RMb25lU3Vycm9nYXRlT2Zmc2V0KHNvdXJjZSlcblxuICAgIHRocm93IG5ldyBTZW1hbnRpZm9sZERpYWdub3N0aWMoe1xuICAgICAgY29kZTogXCJQQVJTRV9FUlJPUlwiLFxuICAgICAgbGFuZ3VhZ2U6IFwiZ29cIixcbiAgICAgIGxvY2F0aW9uOiBsb2NhdGlvbkZyb21PZmZzZXRzKGZpbGVuYW1lLCBzb3VyY2UsIG9mZnNldCwgb2Zmc2V0ICsgMSksXG4gICAgICBtZXNzYWdlOiBcIkdvIHNvdXJjZSBjb250YWlucyBhbiBpbnZhbGlkIGxvbmUgVVRGLTE2IHN1cnJvZ2F0ZS5cIlxuICAgIH0pXG4gIH1cbiAgbGV0IHRyZWVcblxuICB0cnkge1xuICAgIHRyZWUgPSBwYXJzZXIucGFyc2Uoc291cmNlKVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJldHVybiBwYXJzZUZhaWx1cmUoXCJnb1wiLCBlcnJvcilcbiAgfVxuICBjb25zdCByb290ID0gdHJlZS5yb290Tm9kZVxuXG4gIHZhbGlkYXRlUGFyc2VyVHJlZShyb290LCBmaWxlbmFtZSwgc291cmNlKVxuICBpZiAocm9vdC50eXBlICE9IFwic291cmNlX2ZpbGVcIikgdGhyb3cgbmV3IEVycm9yKFwiVHJlZS1zaXR0ZXIgcmV0dXJuZWQgR28gcm9vdCAnXCIgKyByb290LnR5cGUgKyBcIicuXCIpXG4gIGNvbnN0IGxvY2F0aW9uID0gbW9kdWxlTG9jYXRpb24oZmlsZW5hbWUsIHNvdXJjZSlcbiAgY29uc3QgY29tbWVudHMgPSByb290LmRlc2NlbmRhbnRzT2ZUeXBlKFwiY29tbWVudFwiKVxuXG4gIGZvciAoY29uc3QgY29tbWVudCBvZiBjb21tZW50cykge1xuICAgIGlmICgvXlxcL1xcL2dvOi91LnRlc3QoY29tbWVudC50ZXh0KSB8fCAvXlxcL1xcLyBcXCtidWlsZCg/Olxcc3wkKS91LnRlc3QoY29tbWVudC50ZXh0KSB8fFxuICAgICAgL15cXC9cXC9saW5lKD86XFxzfCQpL3UudGVzdChjb21tZW50LnRleHQpIHx8IC9eXFwvXFwqbGluZSg/Olxcc3wkKS91LnRlc3QoY29tbWVudC50ZXh0KSkge1xuICAgICAgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwiZ29cIiwgXCJzb3VyY2UgZGlyZWN0aXZlXCIsIG5vZGVMb2NhdGlvbihjb21tZW50LCBmaWxlbmFtZSwgc291cmNlKSlcbiAgICB9XG4gICAgaWYgKGNvbW1lbnQudGV4dC5pbmNsdWRlcyhcIkBzZW1hbnRpZm9sZFwiKSAmJiBjb21tZW50LnRleHQgIT0gaW1tdXRhYmxlTWFya2VyKSB7XG4gICAgICByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJnb1wiLCBcImludmFsaWQgU2VtYW50aWZvbGQgbWV0YWRhdGEgY29tbWVudFwiLCBub2RlTG9jYXRpb24oY29tbWVudCwgZmlsZW5hbWUsIHNvdXJjZSkpXG4gICAgfVxuICB9XG4gIGNvbnN0IGNoaWxkcmVuID0gc2VtYW50aWNDaGlsZHJlbihyb290KVxuXG4gIGlmIChjaGlsZHJlbi5sZW5ndGggPCAzIHx8IGNoaWxkcmVuWzBdLnR5cGUgIT0gXCJwYWNrYWdlX2NsYXVzZVwiKSB7XG4gICAgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwiZ29cIiwgXCJjb21waWxhdGlvbi11bml0IHNjYWZmb2xkaW5nXCIsIGxvY2F0aW9uKVxuICB9XG4gIGNvbnN0IHBhY2thZ2VDaGlsZHJlbiA9IHNlbWFudGljQ2hpbGRyZW4oY2hpbGRyZW5bMF0pXG5cbiAgaWYgKHBhY2thZ2VDaGlsZHJlbi5sZW5ndGggIT0gMSB8fCBwYWNrYWdlQ2hpbGRyZW5bMF0udHlwZSAhPSBcInBhY2thZ2VfaWRlbnRpZmllclwiIHx8IHBhY2thZ2VDaGlsZHJlblswXS50ZXh0ICE9IFwibWFpblwiKSB7XG4gICAgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwiZ29cIiwgXCJwYWNrYWdlIG1haW4gc2NhZmZvbGRpbmdcIiwgbm9kZUxvY2F0aW9uKGNoaWxkcmVuWzBdLCBmaWxlbmFtZSwgc291cmNlKSlcbiAgfVxuICBsZXQgbWVtYmVyU3RhcnQgPSAxXG4gIGxldCBoYXNGbXRJbXBvcnQgPSBmYWxzZVxuXG4gIGlmIChjaGlsZHJlblsxXT8udHlwZSA9PSBcImltcG9ydF9kZWNsYXJhdGlvblwiKSB7XG4gICAgY29uc3QgZGVjbGFyYXRpb24gPSBjaGlsZHJlblsxXVxuICAgIGNvbnN0IGltcG9ydHMgPSBzZW1hbnRpY0NoaWxkcmVuKGRlY2xhcmF0aW9uKVxuXG4gICAgaWYgKGltcG9ydHMubGVuZ3RoICE9IDEgfHwgaW1wb3J0c1swXS50eXBlICE9IFwiaW1wb3J0X3NwZWNcIiB8fCBzZW1hbnRpY0NoaWxkcmVuKGltcG9ydHNbMF0pLmxlbmd0aCAhPSAxIHx8XG4gICAgICBpbXBvcnRzWzBdLmNoaWxkRm9yRmllbGROYW1lKFwicGF0aFwiKT8udHlwZSAhPSBcImludGVycHJldGVkX3N0cmluZ19saXRlcmFsXCIgfHxcbiAgICAgIGltcG9ydHNbMF0uY2hpbGRGb3JGaWVsZE5hbWUoXCJwYXRoXCIpPy50ZXh0ICE9ICdcImZtdFwiJykge1xuICAgICAgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwiZ29cIiwgXCJmbXQgaW1wb3J0IHNjYWZmb2xkaW5nXCIsIG5vZGVMb2NhdGlvbihkZWNsYXJhdGlvbiwgZmlsZW5hbWUsIHNvdXJjZSkpXG4gICAgfVxuICAgIGhhc0ZtdEltcG9ydCA9IHRydWVcbiAgICBtZW1iZXJTdGFydCA9IDJcbiAgfVxuICBjb25zdCBtZW1iZXJzID0gY2hpbGRyZW4uc2xpY2UobWVtYmVyU3RhcnQpXG5cbiAgaWYgKG1lbWJlcnMubGVuZ3RoIDwgMiB8fCBtZW1iZXJzLnNvbWUoKG1lbWJlcikgPT4gbWVtYmVyLnR5cGUgIT0gXCJmdW5jdGlvbl9kZWNsYXJhdGlvblwiKSkge1xuICAgIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcImdvXCIsIFwidG9wLWxldmVsIGRlY2xhcmF0aW9uc1wiLCBsb2NhdGlvbilcbiAgfVxuICBjb25zdCBtYWluTm9kZXMgPSBtZW1iZXJzLmZpbHRlcigobWVtYmVyKSA9PiBtZW1iZXIuY2hpbGRGb3JGaWVsZE5hbWUoXCJuYW1lXCIpPy50ZXh0ID09IFwibWFpblwiKVxuXG4gIGlmIChtYWluTm9kZXMubGVuZ3RoICE9IDEgfHwgbWVtYmVycy5hdCgtMSk/LmlkICE9IG1haW5Ob2Rlc1swXS5pZCkge1xuICAgIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcImdvXCIsIFwibWFpbiBvcmRlcmluZ1wiLCBsb2NhdGlvbilcbiAgfVxuICBjb25zdCBiYXNlQ29udGV4dCA9IHthc3NpZ25tZW50VGFyZ2V0czogbmV3IFNldCgpLCBjb21tZW50cywgdXNlZE1hcmtlcnM6IG5ldyBTZXQoKX1cbiAgY29uc3QgbW9kdWxlID0ge1xuICAgIGVudHJ5UG9pbnQ6IGNvbnZlcnRNYWluKG1haW5Ob2Rlc1swXSwgYmFzZUNvbnRleHQsIGZpbGVuYW1lLCBzb3VyY2UpLFxuICAgIGZ1bmN0aW9uczogbWVtYmVycy5zbGljZSgwLCAtMSkubWFwKChtZW1iZXIpID0+IGNvbnZlcnRGdW5jdGlvbihtZW1iZXIsIGJhc2VDb250ZXh0LCBmaWxlbmFtZSwgc291cmNlKSksXG4gICAga2luZDogLyoqIEB0eXBlIHtjb25zdH0gKi8gKFwiTW9kdWxlXCIpLFxuICAgIGxvY2F0aW9uXG4gIH1cbiAgY29uc3QgaW52YWxpZE1hcmtlciA9IGNvbW1lbnRzLmZpbmQoKGNvbW1lbnQpID0+IGNvbW1lbnQudGV4dCA9PSBpbW11dGFibGVNYXJrZXIgJiYgIWJhc2VDb250ZXh0LnVzZWRNYXJrZXJzLmhhcyhjb21tZW50KSlcblxuICBpZiAoaW52YWxpZE1hcmtlcikgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwiZ29cIiwgXCJ1bmF0dGFjaGVkIGltbXV0YWJsZSBtYXJrZXJcIiwgbm9kZUxvY2F0aW9uKGludmFsaWRNYXJrZXIsIGZpbGVuYW1lLCBzb3VyY2UpKVxuICBpZiAoaGFzRm10SW1wb3J0ICE9IGhhc1ByaW50KG1vZHVsZSkpIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcImdvXCIsIFwiZm10IGltcG9ydCBhbmQgcHJpbnQgdXNhZ2UgbWlzbWF0Y2hcIiwgbG9jYXRpb24pXG4gIHZhbGlkYXRlUGFyc2VkTW9kdWxlKG1vZHVsZSwgXCJnb1wiKVxuICByZXR1cm4gbW9kdWxlXG59XG4iXX0=
|